首先,查询在 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))) 是可满足的,那么它的存在闭包是有效的。我发现很难以这种方式精确,通常只说查询的答案(替代)。然后我可以将通过应用答案替换获得的子句集称为不可满足而不会混淆。