约束 - SWI- Prolog查询

时间:2016-04-21 19:09:12

标签: prolog clpfd

我的考试即将开始,我将通过过去的论文来帮助理解。

我遇到了以下过去的纸质问题:

请考虑以下查询和答案。一些答案恰逢其时 什么SWI-Prolog会推断,而其他人则是错误的。指出哪个 答案是真实的,哪些是假的(没有解释你的答案 是必需的。)

(i) |?- [A, B, C] ins 0 .. 2, A #= B + C.

A = 0..2 B = 0..2 C = 0..2

(ii) |?- A in 0 .. 3, A * A #= A.

A = 0..2

(iii) |?- [A, B] ins -1 .. 1, A #= B.

A = 1 B = 1

(iv) |?- [A, B] ins 0 .. 3, A #= B + 1.

A = 1..3 B = 1..2 

我正在努力想知道每一个是真还是假。有人能够向我解释如何解决这些问题。

谢谢,非常感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

决定哪些答案可以接受,哪些答案不可接受的关键原则是查看剩余程序是否与原始查询声明性地等效。如果残差约束条件允许原始查询没有的任何解决方案,或者相反,那么答案是假的(或者您在CLP(FD)求解器中发现了错误)。如果显示的答案在语法上没有效果,那么答案肯定 假。

我们这样做:

  1. (i)|?- [A, B, C] ins 0 .. 2, A #= B + C.

    建议回答:A = 0..2 B = 0..2 C = 0..2

    <强> WRONG !原始查询将变量约束为整数,但这个答案甚至不是语法上有效的Prolog程序。

  2. (ii)|?- A in 0 .. 3, A * A #= A.

    建议回答:A = 0..2

    错误!原始查询将A约束为整数,但根据此剩余程序,A = 0..2是有效的解决方案。术语..(0, 2)不是整数。

  3. (iii)|?- [A, B] ins -1 .. 1, A #= B.

    建议回答:A = 1 B = 1

    <强> WRONG !在语法上没有效力。

  4. (iv)|?- [A, B] ins 0 .. 3, A #= B + 1.

    建议回答:A = 1..3 B = 1..2

    <强> WRONG !在语法上没有效力。

  5. 请注意,即使所有显示的答案在语法上都有效, =/2在{i},(ii)和(iv)的剩余目标中被in/2替换,这些答案仍然都是错误的,因为在每种情况下,您都可以找到原始查询或剩余目标不允许的解决方案,但不能同时找到两者。我将解决这些案例作为练习,例如,假设各自的答案是:

    1. A in 0..2, B in 0..2, C in 0..2.
    2. A in 0..2.
    3. A = 1, B = 1.
    4. A in 1..3, B in 1..2.
    5. 并找到每个案例的见证人,以证明剩余目标在语义上与相应的原始查询不同。

      例如,在情况(1)中,根据残差约束,A = B = C = 2将是有效的解决方案,但显然原始约束不包括此解决方案,因为2 #= 2 + 2 hold!

答案 1 :(得分:0)

变量总是被限制为获取其域中包含的值,并且算术约束仅减少所涉及变量的域。

因此,请尝试标记&#39;所有变量 - 即从报告的域中分配值。当然,如果不满足算术关系,你可以说答案是假的。以ii)为例。是否适用于A = 0?那么A = 2?

这个&#39;测试&#39;当然,回答所有问题都不够。一些报告的域名较窄。例如,参考iii)。你能看到任何排除-1或0的理由。如果你不能,你应该把答案标记为假。