if-statement - 分离 G1 ; G2 vs. If-then-else Cond -> G1 ; G2

标签 if-statement syntax prolog iso-prolog

我遇到了一个包含嵌套 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 问题。那么为什么不以这种方式记录它呢?

最佳答案

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

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。

关于if-statement - 分离 G1 ; G2 vs. If-then-else Cond -> G1 ; G2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56484994/

相关文章:

if-statement - 如何比较 Google 表格中的两个公式(计算)单元格

python - 在Python中: How to use the index number in an if-statement that is nested in a for-loop?

c 如何检查数组的第一个字符

php - 在 VIM 中验证 PHP 语法

scala - 在 Scala 中使用 "val capacity : Int"而不是 "val Int Capacity"的任何原因

测试文件时 Linux 意外的运算符/操作数

java - 没有显示答案。有任何想法吗?

numbers - Prolog 数字生成器列表

prolog - 序言中输入/输出参数之间的区别

path - Prolog图路径搜索与循环路径