首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >析取G1;G2 vs. If-then-else Cond -> G1;G2

析取G1;G2 vs. If-then-else Cond -> G1;G2
EN

Stack Overflow用户
提问于 2019-06-07 04:57:00
回答 1查看 117关注 0票数 4

我遇到一个Prolog程序,其中包含一个嵌套的if-then-else形式

代码语言:javascript
复制
p(X,Y) :-
     (cond1(X,Y) -> q(X)); true,
     (cond2(X,Y) -> q(Y)); true.

有意想不到的答案。此行为的原因与以下查询中的原因相同:

代码语言:javascript
复制
?- (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.

第一个查询有两个答案,但第二个只有一个。造成这些不同行为的原因是什么?

附言:我知道其中的不同之处,但我还没有发现一个涉及这种令人困惑的现象的问题。那么,为什么不以这种方式进行记录呢?

EN

回答 1

Stack Overflow用户

发布于 2019-06-08 20:22:58

关于析取的可追溯性。这两个查询在结构上不同:

代码语言:javascript
复制
trace, (true -> X=a); X=b.

trace, ((true -> X=a); X=b).

您可以使用write_canonical/1来查看差异:

代码语言:javascript
复制
?- 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.

而且它们的行为也不同:

代码语言:javascript
复制
?- 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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56484994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档