为啥这个表达不统一

Posted

技术标签:

【中文标题】为啥这个表达不统一【英文标题】:Why does this expression not unifiy为什么这个表达不统一 【发布时间】:2019-05-04 00:50:12 【问题描述】:

我定义了以下知识库

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

并且期待查询:

leaf(X) = tree(X).

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

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

【问题讨论】:

如果你解释你得出这个结论的逻辑in your question,而不仅仅是because for any arbitrary value X this equation should hold.,这会有所帮助,就像对不了解Prolog的人一样解释它。我可以很容易地想到很多方法来回答这个问题,但除非我帮助你纠正你对 Prolog 如何执行目标的理解的错误,否则我只会随机猜测。这是一个很好的问题,但目前你的问题可能会引发一场讨论,这将浪费我和你的时间。 @GuyCoder 非常感谢您的反馈。我希望我已经澄清了我的推理。 感谢您的澄清。这种可能性甚至不在我的清单上。 谓词不是返回值的函数。所以leaf(X) = tree(X) 不会评估leaf(X)tree(X) 并尝试比较它们或统一某种结果。一个合理的查询可能是leaf(X), tree(Y), X = Y。但是,您的事实并不完全有意义。 leaf(_). 表示 anything 是一片叶子。例如,leaf([a,b,foo(x,y),2,3]) 成功。 @lurker 我知道谓词不返回值,但我希望统一算法能够找出它可以用tree 代替leaf,然后统一leaf(X)=leaf(X)。跨度> 【参考方案1】:

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

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

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

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

现在在 Prolog 中,两个术语是 unifiable 如果:

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

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

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

【讨论】:

或者更具体地说,我会说“...在 Prolog 中,两个术语是 unifiable 如果:(1)术语是相同的 atom,或 (2) 术语具有相同的函子/数量,并且参数是元素方面的unifiable”。否则,您必须定义“等效”术语的含义。 @lurker:同意,这是一种更好的指定方式:)

以上是关于为啥这个表达不统一的主要内容,如果未能解决你的问题,请参考以下文章

为啥 emplace_back() 不使用统一初始化?

如何使用 C# 创建一个对象以统一在两个位置之间移动,为啥我的代码不起作用?

为啥事件触发器在统一 2d 中不起作用?

为啥我尝试保存游戏时出现错误?统一 C#

为啥统一初始化没有显式构造函数[重复]

为啥 unityplayer.SkipPermissionsDialog 不能与统一 2018.3.14 一起使用?