为什么这个表达式不统一
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/1
和 leaf/1
不是 谓词。你基本上在这里写的是:
=(leaf(X), tree(X))
所以你用 leaf(X)
和 tree(X)
项调用 (=)/2
谓词。
现在在 Prolog 中有两个术语 unifiable if:
- 这些是同一个原子;或者
- 它是一个具有相同函子和元数的术语,并且参数在元素上是统一的。
由于函子leaf/1
不等于函子tree/1
,这意味着leaf(X)
和tree(X)
不能相等。
即使我们定义一个谓词以检查两个谓词是否语义相同,这也会失败。在这里,您基本上旨在解决 Equivalence problem,即 undecidable。这意味着,一般来说,无法构建一种算法来验证两台图灵机是否决定相同的语言。 Prolog 是一种图灵完备 语言,我们基本上可以在图灵机中翻译任何谓词,反之亦然。所以这意味着我们无法计算两个谓词是否接受相同的输入。
我定义了以下知识库:
leaf(_).
tree(X) :- leaf(X).
并期待查询:
leaf(X) = tree(X).
到returntrue .
,因为根据定义,任何叶子都应该是树。
不幸的是,激活跟踪没有产生任何有用的结果。 link 如果您想尝试一下,这里是这个最小示例的一个示例。
简答:你在这里检查术语leaf(X)
是否可以与tree(X)
统一。由于这些是由不同的函子组成的术语,因此这将失败。
您的语句 leaf(X) = tree(X)
中的 tree/1
和 leaf/1
不是 谓词。你基本上在这里写的是:
=(leaf(X), tree(X))
所以你用 leaf(X)
和 tree(X)
项调用 (=)/2
谓词。
现在在 Prolog 中有两个术语 unifiable if:
- 这些是同一个原子;或者
- 它是一个具有相同函子和元数的术语,并且参数在元素上是统一的。
由于函子leaf/1
不等于函子tree/1
,这意味着leaf(X)
和tree(X)
不能相等。
即使我们定义一个谓词以检查两个谓词是否语义相同,这也会失败。在这里,您基本上旨在解决 Equivalence problem,即 undecidable。这意味着,一般来说,无法构建一种算法来验证两台图灵机是否决定相同的语言。 Prolog 是一种图灵完备 语言,我们基本上可以在图灵机中翻译任何谓词,反之亦然。所以这意味着我们无法计算两个谓词是否接受相同的输入。