追加形式如何运作? (SICP关于逻辑编程的部分)

时间:2010-12-10 09:00:25

标签: sicp logic-programming

我目前正在完成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))

我会对执行规则匹配所需的特定心理步骤感兴趣。

提前谢谢。

1 个答案:

答案 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方案中)并调整它,例如添加跟踪。