我即将参加逻辑考试,并且一直在学习课程中的一些过去的论文。我遇到了有关版本化的问题,并将其发布在下面;
通过使用它来表示变量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)
如果有人可以向我显示上述查询,但使用了验证,我们将不胜感激。
首先,尝试您的查询:
?- 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
不成立。
如果您想对约束本身进行推理,则将约束具体化可能会很有用。例如,这允许您表示一定数量的列表元素必须等于给定的整数。我把解决这个问题作为一个更有意义的练习来理解具体化。
小智 5
从文档:
/2、#=/2、#\=/2、#/2、#==/2 中的约束可以具体化,这意味着将它们的真值反映为由整数 0 和 1 表示的布尔值。让 P 和Q 表示可具体化的约束或布尔变量,则:
...
P #\/ Q True iff either P or Q
...
Run Code Online (Sandbox Code Playgroud)
对你来说,它似乎P
是B #= 1
和Q
是B #= 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] 中。
可能性是无止境 :)