我已经定义了以下知识库:
leaf(_).
tree(X) :- leaf(X).
并且正在查询:
leaf(X) = tree(X).
返回true .
,因为根据定义,任何叶子都应该是一棵树。
不幸的是,激活跟踪不会产生任何有用的结果。 如果您想尝试一下,这是这个最小示例的link。
答案 0 :(得分:1)
简短答案:您在此处检查是否可以将术语leaf(X)
与tree(X)
统一。由于这些术语由不同的函子组成,因此将失败。
语句tree/1
中的leaf/1
和leaf(X) = tree(X)
不是谓词。您基本上在这里写的是:
=(leaf(X), tree(X))
因此,您用(=)/2
和leaf(X)
术语来调用tree(X)
谓词。
现在,在Prolog中,如果满足以下条件,则两个词是 unifiable :
由于函子leaf/1
与函子tree/1
不相等,这意味着leaf(X)
和tree(X)
不能相等。
即使我们要定义一个谓词以检查两个谓词是否在语义上相同,也会失败。在这里,您的基本目的是解决Equivalence problem,这是不确定的。这意味着,一般来说,无法构建一种算法来验证两台图灵机是否确定相同的语言。 Prolog是一种 Turing完整语言,我们基本上可以在Turing机器中翻译任何谓词,反之亦然。因此,这意味着我们无法计算两个谓词是否接受相同的输入。