我遇到一个Prolog程序,其中包含一个嵌套的if-then-else形式
p(X,Y) :-
(cond1(X,Y) -> q(X)); true,
(cond2(X,Y) -> q(Y)); true.有意想不到的答案。此行为的原因与以下查询中的原因相同:
?- (true, (true -> X=a)); X=b.
X = a ;
X = b.
?- ((true -> X=a), true); X=b.
X = a ;
X = b.
?- (true -> X=a); X=b.
X = a.第一个查询有两个答案,但第二个只有一个。造成这些不同行为的原因是什么?
附言:我知道其中的不同之处,但我还没有发现一个涉及这种令人困惑的现象的问题。那么,为什么不以这种方式进行记录呢?
发布于 2019-06-08 20:22:58
关于析取的可追溯性。这两个查询在结构上不同:
trace, (true -> X=a); X=b.
trace, ((true -> X=a); X=b).您可以使用write_canonical/1来查看差异:
?- write_canonical((trace, (true -> X=a); X=b)), nl.
;(','(trace,->(true,=(A,a))),=(A,b))
true.
?- write_canonical((trace, ((true -> X=a); X=b))), nl.
','(trace,;(->(true,=(A,a)),=(A,b)))
true.而且它们的行为也不同:
?- trace, (true -> X=a); X=b.
Call: (9) true ? creep
Exit: (9) true ? creep
Call: (9) _428=a ? creep
Exit: (9) a=a ? creep
X = a
Call: (9) _428=b ? creep
Exit: (9) b=b ? creep
X = b.
[trace] ?- trace, ((true -> X=a); X=b).
Call: (9) true ? creep
Exit: (9) true ? creep
Call: (9) _706=a ? creep
Exit: (9) a=a ? creep
X = a.只有第二个查询将测试(true -> X=a);X=b。
https://stackoverflow.com/questions/56484994
复制相似问题