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

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

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

关于prolog - 如何确定约束逻辑编程的查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37148350/

相关文章:

functional-programming - Prolog 创建字典

prolog - 在Prolog上计算二叉树的节点数?

linux - 如何理解这个 SWI-Prolog makefile - Linux 可执行文件是如何创建的?

prolog - 如何在 SWI-Prolog 中复制预定义长度/2 的行为?

Prolog 剪切行为对我来说没有意义

Prolog - 重新加载咨询 ('filename' ) 到解释器

bash - 从 bash 调用时 screen 以不同方式转义

prolog - 如何卡住变量列表的目标?

prolog - 约束 - SWI- Prolog 查询

prolog - ECLiPSe Prolog - 'nonvar/1' 的意外行为