为什么这个表达不统一

时间:2018-12-02 15:26:01

标签: prolog unification

我已经定义了以下知识库:

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

并且正在查询:

leaf(X) = tree(X).

返回true .,因为根据定义,任何叶子都应该是一棵树。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

因此,您用(=)/2leaf(X)术语来调用tree(X)谓词。

现在,在Prolog中,如果满足以下条件,则两个词是 unifiable

    这些是同一个原子;或
  1. 这是一个具有相同的函子和arity的术语,并且论点在元素上是不可确定的。

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

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