在swi-prolog中,->的含义是什么?

3

我有一个swi-prolog程序,其中有一个运算符(?) ->,这是我第一次遇到,不知道它的作用是什么。以下是代码片段,我不理解:

swf([PP->Q|F], [PP|L], X):- swf(F, L, X), axioms(X, PP->Q, F).

我发现当我们有了
X -> Y ; Z

如果X为真,则执行Y,否则执行Z。但我不明白它在上面的案例中如何工作。
提前感谢您。
编辑:
说实话,这是Arrow定理计算机辅助证明的一部分(更准确地说是基本情况),这是整个代码(来自Proving Arrow's theorem by PROLOG,Kenryo Indo):
p(Q) :- permutation(Q, [a, b, c]).

p((X, Y), Q) :- p(Q), append(_, [X|B], Q), member(Y, B).

pp((Q1,Q2)) :- p(Q1), p(Q2).

all_pp(L) :- findall(QQ, pp(QQ), L).

axioms(arrow, V, F) :- p(Q), V=(PP->Q), pareto(V), iia(V, F).

swf([], [], _).
swf([PP->Q|F], [PP|L], X):- swf(F, L, X), axioms(X, PP->Q, F).
swf(F, X) :- all_pp(L), swf(F, L, X).

pp(XY, agree, (Q1,Q2)) :- p(XY, Q1), p(XY, Q2).
pp((X, Y), opposite, (Q1, Q2)) :- p((X, Y), Q1), p((Y, X), Q2).

pareto(PP->R) :- \+ (pp(XY, agree, PP), \+ p(XY, R)).

dictator(J, F) :- member(J:PP, [1:(P, _), 2:(_, P)]),
\+ (member(PP->R, F), pp(_, opposite, (P, R))).


agree(+, XY, QQ) :- pp(XY, agree, QQ).
agree(-,(X,Y), QQ) :- pp((Y, X), agree, QQ).

iia(PP->R, F) :- \+ (F \= [], pp(XY, A, PP), member(QQ->S, F),
pp(XY, A, QQ), \+ agree(_, XY, (R, S))).

不过,我并不知道如何处理 ->。存在一系列 X->Y 的使用方式: swf - 公理 - 帕累托和 swf - iia - 成员。

1个回答

4
在Prolog中,运算符只是嵌套项的语法糖。例如,我们可以写X is 1+2来代替写is(X, +(1,2)),因为(is)/2和+都有适当的op/3声明。关于这些术语的解释,在某个地方会有一个类似is(X, V) :- eval_expression(V, X).的子句。
现在,(->)/2是一个if/then/else操作符(或者更好地说是if/then,else由分离操作符(;)/2引入),当作为一个目标使用时。但在你展示的代码中,它作为模式选择器工作,大概率如此。也就是说,如果有其他的swf/3子句存在,那么axioms/3就有可能使用该表达式,我猜这意味着“蕴涵”。
还有一些问题需要注意,如图所示:enter image description here。其中PP在axioms(arrow, V, F)中未被使用,而swf(F, X)从未被调用(可能是参数丢失?)。dicatator/2是入口子句。我不知道这个定理(我没有文档可参考),但我希望能有一个关于社会实体的预测。
第一个问题不存在,因为PP将在pareto/1中使用。真正的问题应该是swf缺少参数,应该像swf(F, L, X) :- ...这样写,但这会导致循环。

最终查询为: swf(F,arrow),\ + dictator(_,F)。 - Grzes
谓词swf在这种情况下生成结果,而不是检查它。 该程序返回以下内容: ?- swf(F,arrow)。 F = [([a,b,c],[a,b,c] - > [a,b,c]),([a,b,c],[b,a,c] - > [b,a,c]),([a,b,c],[c,a,b] - > [c,a,b]),([a,b,c],[a,c,b] - > [a,c,b]),([a,b,c],[b,c,a] - > [b,c,a]),([a,b,c],[c,b,a] - > [c,b,a]), ...] 现在很清楚,正如您之前提到的那样,“->”是模式选择器。 非常感谢! - Grzes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接