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

How to determine the outcome of queries for constraint logic programming

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

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

这就是问题

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. 显示的答案是语法上有效的序言目标吗?如果不是,那么答案肯定是假的,因为实际的顶层只发出语法上有效的剩余目标。
  2. 继续:是否存在原始查询的任何解决方案被显示的剩余目标排除?如果是(= 不完整),那么答案是假的,因为实际的顶层只发出与原始查询语义等价的剩余目标。
  3. 相反,残差目标是否承认初始查询不承认的解决方案?如果是(=过于笼统),那么答案就是假的。练习:为什么?

在您的例子中,显示的答案 语法上有效的连词,因此它绝对是正确解决方案的候选者。但是,答案承认原始查询没有的解决方案(练习:哪个?),因此答案是 不正确