【发布时间】: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)。跨度>
标签: prolog unification