2010-12-10 18 views
3

我目前正在通過SICP的邏輯編程部分工作,但我陷入了關於邏輯推理的例子,尤其是附加到表單的規則。他們如何工作?我不太明白的是第二條規則是如何降低第一份名單的。例如,給定:附加到表單如何工作? (SICP關於邏輯編程的部分)

(規則(追加到形式()Y Y)?)

(規則(追加到形式(U,V,)Y(U???? ?Z)) (追加到v型ŸZ))

一)我們如何到達的:???

;;; Query input: 
(append-to-form (a b) (c d) ?z) 

to 

;;; Query results: 
(append-to-form (a b) (c d) (a b c d)) 

二)什麼布特這樣一條:

;;; 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)) 

我是否有興趣進行規則匹配所需的特定心理的步驟。

預先感謝您。

回答

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),就像car/cdr'ing list時一樣。

這些綁定被應用到規則(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)? (b。?z_3),?z被定義爲(a。?z2)

將原始查詢(append-to-form (a b) (c d) ?z)應用於其中?z =(a。 (b(CD)。)),並返回(append-to-form (a b) (c d) (a b c d))

的練習的其餘留給讀者;)

這裏的關鍵概念是模式匹配和統一可在section 4.2.2找到。整個查詢評估器是SICP中最難的部分,所以不要灰心。這是非常值得的努力。嘗試運行代碼(在R5RS計劃中)並擺弄它,例如添加跟蹤。

+0

謝謝你的迴應,牛肉。實際上,我爲此感到困惑,因爲評估者的功能在本章後面解釋。我應該事先閱讀這些例子之後的部分。 – motxilo 2011-01-05 14:47:28