在Lisp中,假设我在知识库中有这两个规则:
(append nil ?x ?x)
(<- (append (cons ?x ?l1) ?l2 (cons ?x ?l3))
(append ?l1 ?l2 ?l3))
那么如果我们问
,怎么能推断出来呢?(ask '(append (cons a (cons b nil))
(cons c nil)
?l)
'?l))
我们会得到结果'((cons a (cons b (cons c nil)))
?
这是我的Lisp课程中的一个例子,我希望你能帮我理解这个猎犬。 谢谢。
答案 0 :(得分:1)
要理解这个问题,我认为您首先需要获得两个关键概念:向后链接和统一。
通过粗略的简化,这里是反向链接的工作方式:尝试是否可以将目标(在您的示例中为'ask'的第一个参数)与任何规则的头部统一(注意非确定性);如果是,则将该规则的主体(可能为空)添加为子目标并存储统一结果(一组变量绑定)。递归地将上述程序应用于具有累积绑定的每个子目标,直到(1)没有适用的规则,这意味着证明失败,或者(2)没有更多的子目标,这意味着证明成功。在后一种情况下,目标变量(第二个参数)的绑定将是答案。