以下Prolog目标是否令人满意?
croire(X, aime(lila, pizza)) = croire(ali, aime(Y, pizza))?
我找到了一个Prolog文件,询问这个问题,答案是:"不,这个目标在语法上是不正确的#34;但是当我在SWI-Prolog中尝试它时,它没有显示任何错误,它给了我这个答案,我觉得合乎逻辑:
X = ali,
Y = lila.
那么我有没有错过的东西?或者文件答案是错的?
答案 0 :(得分:3)
最重要的是,GNU Prolog中的查询也是可以满足的(请注意,Prolog查询总是以点结尾,而不是问号):
GNU Prolog 1.4.4 (64 bits)
Compiled Aug 3 2017, 08:15:35 with gcc
By Daniel Diaz
Copyright (C) 1999-2013 Daniel Diaz
| ?- croire(X, aime(lila, pizza)) = croire(ali, aime(Y, pizza)).
X = ali
Y = lila
(1 ms) yes
那是什么意思?我们询问是否存在变量X
和Y
的分配,以使术语croire(X, aime(lila, pizza))
和croire(ali, aime(Y, pizza))
相等。 GNU Prolog返回一个答案,即X = ali, Y = lila
。让我们看看我们在应用此替换时获得的条款:
croire(ali, aime(lila, pizza)) = croire(ali, aime(lila, pizza))
由于术语肯定等于自身,因此该替换满足等式谓词。另一方面,X = reine, Y = grenouille
导致
croire(reine, aime(lila, pizza)) = croire(ali, aime(grenouille, pizza))
这是 - 没有进一步的假设 - 是假的。
备注:在这种情况下,我觉得这个词很令人困惑。虽然我应该知道更好,但我仍然在努力描述正在发生的事情,但我会尝试:
Prolog的推理机制是旨在产生矛盾的解决方案,但矛盾是一个不可满足的公式。在这种特殊情况下,我们使用Z != Z
解析croire(X, aime(lila, pizza)) = croire(ali, aime(Y, pizza))
以获取(不可满足的)空句子。
如果我们以积极的方式写下条款,它看起来像这样:
∀Z (Z=Z) ⊃ ∃X ∃Y (croire(X, aime(lila, pizza)) = croire(ali, aime(Y, pizza)))
将量词拉到前面,我们得到:
∃Z ∃X ∃Y ( Z=Z ⊃ (croire(X, aime(lila, pizza)) = croire(ali, aime(Y, pizza))) )
现在,如果Z=Z ⊃ (croire(X, aime(lila, pizza)) = croire(ali, aime(Y, pizza)))
可以满足,那么它的存在闭包是有效的。我发现以这种方式很难准确,通常只是提到查询的答案(替换)。然后我可以调用通过应用不可满足的答案替换而获得的子句集而不会混淆。