【发布时间】:2019-10-22 09:51:17
【问题描述】:
我遇到了一个包含嵌套 if-then-else 形式的 Prolog 程序
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.
第一个查询有两个答案,但第二个只有一个。不同行为的原因是什么?
P.S.:我知道其中的区别,但我还没有找到一个 SO question 来处理这个非常令人困惑的现象。那么为什么不以这种方式记录呢?
【问题讨论】:
-
有趣的行为:
?- (true -> X=a); X=b.我得到X = a.相反:trace, (true -> X=a); X=b.我得到X = a ; X = b。我在网上嗖嗖嗖嗖。 -
这很有趣。我一直认为
p1 -> p2等同于p1, !, p2。但是,(true, !, X=a), true); X = b仅产生一种解决方案X=a,而((true -> X=a), true); X=b.产生两种解决方案。我真的很惊讶它会产生两个。 -
@damianodamiano 很有趣。就在 gprolog 中,
trace, (true -> X=a); X=b.产生两种解决方案,但trace, (true, !, X=a) ; X=b只产生一种 (X=a),这也是我对->的预期行为。 -
Guy Coder:我希望其他人获得积分并最终添加我的解决方案。如果你愿意,我现在可以把它放进去。
-
在这里查看相同的问题:stackoverflow.com/q/56111688/3768871
标签: if-statement syntax prolog iso-prolog