2009-12-02 99 views
1

在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類的一個例子,我希望你能幫助我理解這個獵犬。 謝謝。

+1

這看起來像一個Lispy Prolog,也許是來自PAIP(http://norvig.com/paip.html)的一個。它當然不是標準Common Lisp(或Scheme,或Emacs Lisp ...)的一部分。如果你更關注它的來源,我們可能會更有幫助。 – Pillsy 2009-12-03 15:53:30

回答

1

要理解這個問題,我認爲你需要先獲得兩個重要概念:反向鏈接統一。如果可以將目標(在你的例子中是'ask'的第一個參數)與任何規則的頭部統一起來(注意不確定性),那麼嘗試是否可以將目標統一起來。如果是,請將該規則的主體(可能爲空)添加爲子目標並存儲統一結果(一組變量綁定)。 (1)沒有適用的規則,這意味着證明失敗,或者(2)沒有更多的子目標,這意味着證明成功了,遞歸地將上述過程應用於每個子目標。在後一種情況下,目標變量(第二個參數)的綁定將成爲答案。