为什么这个表达式不统一

Why does this expression not unifiy

我定义了以下知识库:

leaf(_).
tree(X) :- leaf(X).

并期待查询:

leaf(X) = tree(X).

到returntrue .,因为根据定义,任何叶子都应该是树。

不幸的是,激活跟踪没有产生任何有用的结果。 link 如果您想尝试一下,这里是这个最小示例的一个示例。

简答:你在这里检查术语leaf(X)是否可以与tree(X)统一。由于这些是由不同的函子组成的术语,因此这将失败。

您的语句 leaf(X) = tree(X) 中的 tree/1leaf/1 不是 谓词。你基本上在这里写的是:

=(leaf(X), tree(X))

所以你用 leaf(X)tree(X) 项调用 (=)/2 谓词。

现在在 Prolog 中有两个术语 unifiable if:

  1. 这些是同一个原子;或者
  2. 它是一个具有相同函子和元数的术语,并且参数在元素上是统一的。

由于函子leaf/1不等于函子tree/1,这意味着leaf(X)tree(X)不能相等。

即使我们定义一个谓词以检查两个谓词是否语义相同,这也会失败。在这里,您基本上旨在解决 Equivalence problem,即 undecidable。这意味着,一般来说,无法构建一种算法来验证两台图灵机是否决定相同的语言。 Prolog 是一种图灵完备 语言,我们基本上可以在图灵机中翻译任何谓词,反之亦然。所以这意味着我们无法计算两个谓词是否接受相同的输入。