2009-12-02 1 views
1

В Лиспе, предположим, что у меня есть эти два правила в базе знаний:Deductive Retriever Пример

(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

ответ

1

Чтобы понять эту проблему, я думаю, вам нужно приобрести две основные концепции первой: назад цепочки и объединение.

С грубым упрощением, вот как работает обратная цепочка: попробуйте, если можно объединить цель (первый аргумент для «спросить» в вашем примере) с главой любого из правил (обратите внимание на недетерминизм); если да, добавьте тело (которое может быть пустым) этого правила в качестве подцелей и запишите результат объединения (набор переменных привязок). Рекурсивно применяйте описанную выше процедуру к каждому подцелю с накопленными привязками, пока (1) не будет применено правило, что означает, что доказательство не выполнено, или (2) больше нет подцелья, что означает, что доказательство завершается успешно. В последнем случае привязка целевой переменной (второй аргумент) будет ответом.