if-statement - 析取 G1 ; G2 vs. If-then-else Cond -> G1 ; G2
问题描述
我遇到了一个包含嵌套 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.
第一个查询有两个答案,但第二个只有一个。不同行为的原因是什么?
PS:我知道其中的区别,但是我还没有找到一个可以处理这种相当混乱的现象的 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。
推荐阅读
- r - R中定积分的蒙特卡罗方法
- kotlin - 使用 javax.script.ScriptEngineManager 在 JVM 中评估 Kotlin 的问题
- java - 从 char 到 int 的转换:为什么 (int)givenString.charAt(2) 在 givenString = "11001" 的情况下给出 48?
- ruby-on-rails - 如何使用 Searchkick 分别搜索多个字段?
- javascript - React Native - 在不影响性能/渲染的情况下处理繁重 JS 代码的最佳方法
- javascript - Google App Script 按时间获取表单响应
- python - Altair 和 GeoJSON 文件
- asp.net-mvc - 我可以使用参数更改请求的 uri 吗?
- python - 如何在 Python 中将 x 刻度调整为字符串值
- swift - 在 activityViewController 中更改 barTintColor