lisp - 演绎检索器示例

标签 lisp

在 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 课上的一个例子,我希望你能帮助我理解这个猎犬。 谢谢。

最佳答案

要理解这个问题,我认为您首先需要掌握两个关键概念:反向链接统一

通过粗略的简化,后向链接的工作原理如下:尝试是否有可能将目标(在您的示例中“询问”的第一个参数)与任何规则的头部统一(注意不确定性);如果是,则将该规则的主体(可能为空)添加为子目标并存储统一的结果(一组变量绑定(bind))。递归地将上述过程应用于具有累积绑定(bind)的每个子目标,直到 (1) 没有适用的规则,这意味着证明失败,或者 (2) 没有更多的子目标,这意味着证明成功。在后一种情况下,目标变量(第二个参数)的绑定(bind)就是答案。

关于lisp - 演绎检索器示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1836725/

相关文章:

python - 我应该使用什么方法从 URL 中提取关键字?

lisp - 学习 Lisp 的资源

Clojure:超出 gc 开销限制、懒惰评估、pi 序列

lisp - Common Lisp 等效于 `man`

functional-programming - 我的展平功能有什么问题

lisp - 在 Emacs Lisp 中,如何获得单个哈希键?

tree - 检查 Common Lisp 中的 n 叉树是否平衡

list - 删除列表中的特定项目?

windows - Windows 中普通 lisp emacs + slime + sbcl 的自动缩进

arrays - Lisp 为什么我的对象是同一个实例?