SWI Prolog Clpfd库-修订

5 prolog reification clpfd

我即将参加逻辑考试,并且一直在学习课程中的一些过去的论文。我遇到了有关版本化的问题,并将其发布在下面;

通过使用它来表示变量B可以取值为1或8的属性来说明具体化。

在阅读了一些资源并阅读了SWI Prolog手册后,我仍然发现标准化的概念非常令人困惑(主要是学习Java,因此很难学习Prolog)。必须在序言查询中使用布尔逻辑,这非常令人困惑。

如果没有修正,我将不得不编写以下代码(我知道这太长了,无法给出正确的答案)。

 B in 1..8, B #\= 2,B #\= 3,B #\= 4,B #\= 5,B #\= 6,B #\= 7. 
Run Code Online (Sandbox Code Playgroud)

如果有人可以向我显示上述查询,但使用了验证,我们将不胜感激。

mat*_*mat 5

首先,尝试您的查询:

?- B in 1..8, B #\= 2,B #\= 3,B #\= 4,B #\= 5,B #\= 6,B #\= 7.
 B in 1\/ 8 .

这告诉您您的查询相当于单个目标B in 1\/8

由此,您可以看到不需要具体化来表示有限域变量等于 1 或 8。

物化允许你具体化约束的真值。例如,你可以说:

?- T #<==> B in 1\/8。
T 在 0..1,
B in 1\/8#<==>T。

?- T #<==> B in 1\/8, B = 3。
T = 0,
乙 = 3。

从第二个查询中,您可以看到 if B = 3、 then T = 0,因为在这种情况下约束B in 1\/8 不成立

如果您想约束本身进行推理,则将约束具体化可能会很有用。例如,这允许您表示一定数量的列表元素必须等于给定的整数。我把解决这个问题作为一个更有意义的练习来理解具体化。

  • ...但`B #= 1 #\/ B #= 8` 可能是预期的答案。 (2认同)

小智 5

从文档:

/2、#=/2、#\=/2、#/2、#==/2 中的约束可以具体化,这意味着将它们的真值反映为由整数 0 和 1 表示的布尔值。让 P 和Q 表示可具体化的约束或布尔变量,则:

...
P #\/ Q True iff either P or Q
...
Run Code Online (Sandbox Code Playgroud)

对你来说,它似乎PB #= 1QB #= 8,所以你最终得到:

?- B #= 1 #\/ B #= 8.
B in 1\/8.
Run Code Online (Sandbox Code Playgroud)

如您所见,您并没有真正使用具体化的值。您只是将具体化用作声明变量域的一种迂回方式。B in 1 \/ 8如果您想说“B 是 1 或 8”,那么您查询的答案可能会直接使用。如果您仔细查看 的文档in/2,您应该会看到域可以是整数、范围Lower .. Upper或 的并集Domain1 \/ Domain2。在您的情况下,两个域都是一个整数,1 和 8。

PS:一旦你走上这条路,为什么不:

?- B in 1..8 #/\ #\ B in 2..7.
B in 1\/8.
Run Code Online (Sandbox Code Playgroud)

B 在 [1,8] 中并且 B 不在 [2,7] 中。

可能性是无止境 :)