如何确定约束逻辑编程的查询结果

时间:2016-05-10 20:28:37

标签: prolog swi-prolog clpfd

我正在对约束逻辑编程进行一些修改,并希望知道如何阅读以下查询以正确地预测它们的结果。

基本上有一个问题,询问以下查询提供的答案是否正确。

所以这就是问题

Consider the following queries and answers. Some answers coincide
with what SWI-Prolog would infer whereas others are erroneous.
Indicate which answers are genuine and which ones are fake (no
explanation is required).

(i) ?- [X, Y, Z] ins 0 .. 4, X #= Y + 1.
X in 1..4, Y in 0..3, Z in 0..4.

(ii) ?- [X, Y, Z] ins 0 .. 4, X #= Y + Z.
X in 0..4, Y in 0..2, Z in 0..2.

(iii) ?- [X, Y, Z] ins 0 .. 4, X #= Z - Y.
X in 0..4, Y in 0..4, Z in 0..4.

(iv) ?- [X, Y, Z] ins 0 .. 4, X #= Y * Y, Z #= -Y.
Y = 0, Z = 0.

我的问题是,为了确定答案是否正确,阅读查询的最佳方法是什么。

1 个答案:

答案 0 :(得分:4)

几个步骤:

  1. 显示的答案是语法上有效的 Prolog目标吗?如果没有,那么答案肯定是假的,因为实际的顶层只会发出语法上有效的剩余目标。
  2. 继续:原始查询的解决方案是否被所显示的剩余目标排除?如果是(= 不完整),则答案是假的,因为实际的顶层仅发出与原始查询语义等效的剩余目标。
  3. 相反,剩余目标是否允许初始查询没有的解决方案?如果是(= 过于笼统的),那么答案是假的。练习:为什么?
  4. 在您的情况下,显示的答案 是一个语法上有效的连词,因此它绝对是正确解决方案的候选者。但是,答案承认原始查询没有的解决方案(练习:哪个?),因此答案不正确