Lambda 在prolog中的谓词内定义谓词

Lambda 在prolog中的谓词内定义谓词,lambda,prolog,metaprogramming,predicate,Lambda,Prolog,Metaprogramming,Predicate,我试图定义一个内联谓词,将其传递给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). (上面的语法显然是错误的。) 稍后,call将调用g12 % Test if a

我试图定义一个内联谓词,将其传递给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).
(上面的语法显然是错误的。)

稍后,
call将调用
g12

% 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_属性

% 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)).

一个人如何着手做这件事?

我不确定是否能抓住要点,但这是可行的:

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=>有用的评论,一如既往

对不起,我不明白重点。你知道吗?不知道,但是在这里使用它似乎有点过分了。谢谢你的链接。不要使用
(=..)/2
来模拟高阶编程。改用call/N。它更通用,并且允许使用。别忘了通过收回temp谓词来清理。是的,使用retractall(g12(,))可以。谢谢,这很有效。这实际上是我实际代码的简化版本,但我希望在这里需要定义一个内联谓词还是有意义的。@RihardsKrišlauks:在某些_属性中/2 combine(G1,G2)将被这样调用:call(combine(G1,G2),Q,C)有效地调用combine(G1,G2,Q,C)@Rihards:如果参数的顺序不完美,并且需要添加更多参数,则需要lambda。但是要注意变量的范围:在上面,它应该是
Pred={G1,G2}+\Z^T^combine(G1,G2,Z,T),