我目前正在完成SICP关于逻辑编程的部分,但我仍然陷入有关逻辑推理的例子中,尤其是附加形式规则。他们是如何工作的?我不太明白的是第二个规则如何cdr-downs第一个列表。例如,给定:
(规则(追加形式()?y?y))
(规则(追加形式(?u。?v)?y(?u。?z)) (追加形式?v?y?z))
a)我们如何与以下人员联系:
;;; Query input:
(append-to-form (a b) (c d) ?z)
to
;;; Query results:
(append-to-form (a b) (c d) (a b c d))
b)这个是什么:
;;; Query input:
(append-to-form (a b) ?y (a b c d))
to
;;; Query results:
(append-to-form (a b) (c d) (a b c d))
c)最后:
;;; Query input:
(append-to-form ?x ?y (a b c d))
to
;;; Query results:
(append-to-form () (a b c d) (a b c d))
(append-to-form (a) (b c d) (a b c d))
(append-to-form (a b) (c d) (a b c d))
(append-to-form (a b c) (d) (a b c d))
(append-to-form (a b c d) () (a b c d))
我会对执行规则匹配所需的特定心理步骤感兴趣。
提前谢谢。
答案 0 :(得分:3)
通过拿一张纸并写下每一步来演奏翻译。对于每一步,您都要记下哪个规则是/可以触发的,哪个变量绑定到什么值。
例如:
(append-to-form (a b) (c d) ?z)
触发规则
(rule (append-to-form (?u . ?v) ?y (?u . ?z))
(append-to-form ?v ?y ?z))
与
?u = a, ?v = (b), ?y = (c d), ?z = (a . ?z_2)
注意:原始查询中的?z应该是规则体中与?z不同的变量,因此将规则的?z重命名为?z_2。匹配到(?a。?b)时的列表(1 2 3)产生?a = 1,?b =(2 3),就像汽车/ cdr一个列表一样。
这些绑定应用于规则(append-to-form ?v ?y ?z)
的主体。所以我们得到
(append-to-form (b) (c d) ?z_2)
再次成为
(append-to-form () (c d) ?z_3)
并触发不同的规则:(rule (append-to-form () ?y ?y))
绑定?z_3到(c d)。
然后递归,?z_2定义为(b。?z_3),?z定义为(a。?z2)
原始查询(append-to-form (a b) (c d) ?z)
将应用于绑定,其中?z =(a。(b。(c d)))并返回(append-to-form (a b) (c d) (a b c d))
其余的练习留给读者;)
这里的关键概念是模式匹配和统一,可以在section 4.2.2找到。整个查询评估器确实是SICP中最难的部分,所以不要气馁。这是值得的努力。尝试运行代码(在R5RS方案中)并调整它,例如添加跟踪。