【问题标题】:Constraint - SWI- Prolog Queries约束 - SWI- Prolog 查询
【发布时间】:2016-04-21 19:09:11
【问题描述】:

我要考试了,我正在查看过去的试卷以帮助我理解。

我遇到了以下过去的论文问题:

考虑以下问题和答案。一些答案与 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 

我很难看出每一个是真还是假。有人可以向我解释如何解决这些问题。

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

【问题讨论】:

    标签: prolog clpfd


    【解决方案1】:

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

    让我们开始吧:

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

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

      错误!原始查询将变量限制为 整数,但这个答案甚至不是语法上有效的 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

      错误!语法无效。

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

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

      错误!语法无效。

    请注意,即使所有显示的答案在语法上都是有效的并且=/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.

    并为每个案例找到一个见证人,以表明剩余目标在语义上与各自的原始查询不同。

    例如,在情况 (1) 中,A = B = C = 2 根据残差约束将是一个有效的解决方案,但显然原始约束排除了这个解决方案,因为2 #= 2 + 2 确实不成立!

    【讨论】:

    • mmmh ...实际上,问题没有提到残差。对于案例 i),我得到 A = 0..2 B = 0..2 C = 0..2 和剩余的 B+C#=A。
    • 对于案例 (i),您将获得剩余目标 A in 0..2, B in 0..2, C in 0..2 和 B+C#=A。这在声明上等同于原始查询。如果您只得到A in 0..2, B in 0..2, C in 0..2,那么残差程序将错误地比原始查询更通用。残差程序必须始终声明式地等同于原始查询,如果您在其他残差中得到A = 0..2,那么A 甚至不是整数而是术语0..2。如果像A = 0..2 B = 0..2 一样,答案在语法上甚至都不是有效的,那么它肯定是假的。
    【解决方案2】:

    一个变量总是被限制在其域中获取一个值,而算术约束只会减少所涉及变量的域。

    因此,请尝试“标记”所有变量 - 即,从答案报告的域中分配值。当然,如果算术关系不满足,你可以说答案是伪造的。取 ii)。它适用于 A=0 吗?那么 A=2 呢?

    这个“测试”当然不足以回答所有问题。一些报告的域更窄。例如,采取 iii)。你能看到任何不包括 -1 或 0 的原因吗?如果你不能,你应该将答案标记为伪造的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多