Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pol_Grem_-_ANSI_Common_Lisp_High_tech_-_2012.pdf
Скачиваний:
28
Добавлен:
12.03.2016
Размер:
4.85 Mб
Скачать

15.4. Анализ

261

 

 

 

 

Если­ мы выпол­ним­ (clrhash

*rules*) и затем­ опре­де­лим­ следую­щие­

 

прави­ла­ и факты:­

 

 

(<- (parent donald nancy))

 

 

(<- (parent donald debbie))

 

 

(<- (male donald))

 

 

(<- (father ?x ?y) (and (parent ?x ?y) (male ?x)))

 

(<- (= ?x ?y))

 

 

(<- (sibling ?x ?y) (and (parent ?z ?x)

 

(parent ?z ?y)

 

(not (= ?x ?y))))

 

то сможем­ сделать­ следую­щие­ выво­ды:­

 

> (with-answer (father ?x ?y)

 

 

(format t "~A is the father of ~A.~%" ?x ?y))

 

DONALD is the father of DEBBIE.

 

DONALD is the father of NANCY.

 

NIL

 

 

> (with-answer (sibling ?x ?y)

 

(format t "~A is the sibling of ~A.~%" ?x ?y))

 

DEBBIE is the sibling of NANCY.

 

NANCY is the sibling of DEBBIE.

 

NIL

 

 

 

 

Рис. 15.7. Програм­ма­ в рабо­те­

 

15.4. Анализ

Может­ пока­зать­ся,­ что напи­сан­ный­ нами­ код явля­ет­ся­ простым­ и есте­­ ствен­­ным реше­ни­ем­ постав­лен­­ной зада­чи­. На самом­ деле,­ он крайне­ не­ эффек­ти­вен­. В дейст­ви­тель­но­сти,­ мы напи­са­ли,­ по сути,­ интер­пре­та­­ тор, в то время­ как могли­ создать­ компи­ля­тор­.

Приве­дем­ набро­сок­ того,­ как это может­ быть сдела­но­. Основ­ная­ идея заклю­ча­ет­ся­ в запа­ков­ке­ всей програм­мы­ в макро­сы­ <- и with-answer. В таком­ случае­ основ­ная­ часть рабо­ты­ будет­ выпол­нять­ся­ на этапе­ ком­ пиля­ции,­ тогда­ как сейчас­ она выпол­ня­ет­ся­ непо­сред­ст­вен­­но во время­ запус­ка­. (Заро­дыш­ этой идеи мож­но увидеть­ в avg на стр. 181.) Будем­ представлять­ прави­ла­ как функции,­ а не как списки­. Вместо­ функций­ типа­ prove и prove-and, интер­пре­ти­рую­щих­ выра­же­ния­ в процес­се­ рабо­­ ты, у нас будут­ функции­ для преоб­ра­зо­ва­ния­ выра­же­ний­ в код. Выра­­ жения­ стано­вят­ся­ доступ­ны­ в момент­ опре­де­ле­ния­ прави­ла­. Зачем­ ждать, пока­ выра­же­ние­ будет­ исполь­зо­ва­но,­ чтобы­ его проана­ли­зи­ро­­ вать? Это отно­сит­ся­ и к with-answer, кото­рый­ будет­ вызы­­вать функции­ типа­ <- для гене­ра­ции­ своего­ раскры­тия­.

262

Глава 15. Пример: логический вывод

Кажет­ся,­ что подоб­ная­ програм­ма­ будет­ значи­тель­но­ сложнее­ напи­сан­­ ной в этой главе,­ но на деле­ реали­за­ция­ предло­жен­ной­ идеи зай­мет все­ го в два-три раза больше­ време­ни­. Чита­те­лям,­ желаю­щим­ узнать­ боль­ ше о подоб­ных­ мето­ди­ках,­ реко­мен­ду­ет­ся­ посмот­реть­ книги­ «On Lisp» и «Paradigms of Artificial Intelligence Programming»1, кото­рые­ содер­­ жат приме­ры­ программ,­ напи­сан­ных­ в таком­ стиле­.

1Peter Norvig «Paradigms of Artificial Intelligence Programming», Morgan Kaufman,­ 1992. Эта книга,­ также­ извест­ная­ как PAIP, рассмат­ри­ва­ет­ про­ грамми­ро­ва­ние­ задач­ искус­ст­вен­но­го­ интел­лек­та­. Автор­ исполь­зу­ет­ Com­ mon Lisp и сопро­во­ж­да­ет­ книгу­ большим­ коли­че­ст­вом­ кода,­ кото­рый­ до­ ступен­ по адре­су­: http://norvig.com/paip/README.html. – Прим. перев­.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]