lambda - 在 prolog 中的谓词内定义谓词

标签 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).

(上面的语法显然是错误的。)

稍后 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)).

如何去做呢?

最佳答案

我不确定明白这一点,但这有效:

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 => 有用的评论,像往常一样!

关于lambda - 在 prolog 中的谓词内定义谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14916802/

相关文章:

c# - 这个 object-lifetime-extending-closure 是 C# 编译器错误吗?

C++11 "overloaded lambda"带有可变参数模板和变量捕获

c++ - std::function 作为自定义流操纵器

java - 流API异常模式

prolog - 使用动态openList/1时“operator expected after expression”

ruby - Module#const_set 和 Module#module_eval 之间的区别

c++ - 通过其基础匹配派生类型的模板

Python自动备忘

没有 if 和 else 语句的 Prolog

prolog - 我们如何从 Prolog 给出的解决方案列表中选择一个随机数据集?