Определение предиката внутри предиката в prolog
Я пытаюсь определить предикат inline, чтобы передать его другому предикату в Prolog.
% Test if a "product" of graphs G1 and G2 has a "mini-loop" starting from Q
test_property_combined(G1,G2,Q):-
(g12(Q1,Q2) :- combine(G1,G2,Q1,Q2)),
some_property(g12,Q).
(синтаксис выше явно неправильный.)
позже g12
будет вызван call
% Test if a graph G has a "mini-loop" starting from Q
some_property(G,Q):-
Goal1 =.. [G,Q,C],
Goal2 =.. [G,C,Q],
call(Goal1),
call(Goal2).
проблема сохраняется, потому что я хочу проверить some_property
о какой-то агрегации ранее определенных предикатов.
% Create a "product" of graphs G1 and G2
combine(G1,G2,(Q1,Q2),(Q3,Q4)):-
Goal1 =.. [G1,Q1,Q3],
Goal2 =.. [G2,Q2,Q4],
call(Goal1),
call(Goal2).
указанные предикаты и пример теста запрос:
% g1 and g2 are graphs
g1(a,b).
g1(b,a).
g2(c,d).
g2(d,c).
?- test_property_combined(g1,g2,(a,c)).
как это делается?
1 ответов
Я не уверен, чтобы получить точку, но это работает :
test_property_combined(G1,G2,Q):-
assert((g12(Q1,Q2) :- combine(G1,G2,Q1,Q2))),
some_property(g12,Q).
хорошо, может быть что-то вроде этого
:- use_module(library(lambda)).
test_property_combined(G1,G2,Q):-
% (g12(Q1,Q2) :- combine(G1,G2,Q1,Q2)),
Pred = \Z^T^combine(G1,G2,Z,T),
some_property(Pred,Q).
combine(G1,G2,(Q1,Q2),(Q3,Q4)):-
Goal1 =.. [G1,Q1,Q3],
Goal2 =.. [G2,Q2,Q4],
call(Goal1),
call(Goal2).
some_property(G,Q):-
call(G, Q, C),
call(G, C, Q).
последнее редактирование (надеюсь, что так) с полным кодом:
test_property_combined(G1,G2,Q):-
some_property(combine(G1,G2),Q).
combine(G1,G2,(Q1,Q2),(Q3,Q4)):-
call(G1,Q1,Q3),
call(G2,Q2,Q4).
some_property(G,Q):-
call(G, Q, C),
call(G, C, Q).
g1(a,b).
g1(b,a).
g2(c,d).
g2(d,c).
@false = > полезные замечания, как обычно !