- •Часть III Современные методы программирования на Прологе
- •Глава 14 Недетерминированное программирование
- •14.1. Метод «образовать и проверить»
- •14.2. Недетерминизм с произвольным выбором альтернативы и недетерминизм с неизвестным выбором альтернативы
- •14.3. Моделирование недетерминированных вычислений.
- •14.4. Классические интеллектуальные программы: analogy, eliza и McSam
- •Предложения и данные для тестирования программы
- •14.5. Дополнительные сведения
14.4. Классические интеллектуальные программы: analogy, eliza и McSam
Современные учителя часто прибегают к штампу: «Лучший способ изучить предмет - учить его». По аналогии современные программисты могут сказать, что лучший способ понять программу-написать ее заново. Признавая этот тезис, представим логические реконструкции трех программ, созданных в процессе исследований по искусственному интеллекту. В этих программах легко разобраться и произвести в них желаемые изменения. В упражнениях к разделу читателю предлагается добавить к этим программам новые факты и правила.
Итак, рассмотрим следующие три программы: программу ANALOGY, разработанную Эвансом для решения задач на геометрические аналогии из тестов для оценки умственных способностей; программу ELIZA, созданную Вейценбаумом, которая имитирует или, скорее, пародирует беседу; программу McSAM (версия программы SAM; Me-сокращение от micro), разработанную группой исследования систем обработки концептуальной информации в Йельском университете и предназначенную для «понимания» сюжетов. Каждая из этих логических реконструкций записывается на Прологе весьма просто. Благодаря недетерминизму программ Пролога программисту не приходится заниматься организацией поиска решений.
Рассмотрим, в чем заключаются задачи на геометрические аналогии, которые обычно используют для испытания умственных способностей. В каждой задаче такого рода предлагается несколько фигур. На рис. 14.6 представлен вариант простой задачи на отыскание геометрических аналогий. Часть фигур (на рисунке-нижний ряд)-возможные ответы. Используя фигуры А, В и С и фигуры. представляющие собой варианты решений, следует дать ответ на вопрос: «Фигура А относится к фигуре B, как фигура С относится к ... «К какой фигуре? Ответ надо выбрать из трех вариантов решений в нижнем ряду».
Интуитивные представления позволяют записать следующий алгоритм для решения этой задачи (такие понятия, как «найти», «применить» и «правило», здесь не описаны):
найти правило, определяющее связь фигур A и B,
применить это правило к фигуре С, чтобы перейти к фигуре X,
найти среди ответов фигуру Х или ее ближайший эквивалент.
В рассматриваемой задаче (см, рис. 14.6) связь фигуры А с фигурой В определяется обменом местами (с соответствующим изменением масштабов) изображений квадрата и треугольника. «Очевидный» ответ для фигуры С - обмен местами изображе-

Рис. 14.6. Задача на геометрические аналогии.
ний квадрата и круга. Соответствующая фигура имеет в нижнем ряду номер 2.
Программа 14.18 предназначена для решения простых задач на геометрические аналогии. Ее основным отношением является отношение analogy (Pair l,Pair2, Answers). в котором каждая пара Pair представляется формой X is_to Y. В программе, конечно, должно быть дано определение инфиксному оператору is_to. Элементы пары Pair1 находятся в таком же отношении, как и элементы пары Pair2, а второй элемент пары Pair2 принадлежит множеству ответов Answers. Следующее определение отношения analogy соответствует приведенному выше интуитивному алгоритму:
analogy(A is. to В, С is .to X, Answers)
match (А, В, Operation), match(C.X,Operation),member(X, Answers).
Большое значение имеет выбор способа представления фигур в рассматриваемой задаче. Этот выбор оказывает существенное влияние на «интеллектуальность» программы. В программе 14.18 фигуры представлены термами Пролога. Например, фигура А на рис. 14.16-квадрат в треугольнике-представляется термом inside (square,triangle).
Связь между фигурами отыскивается с помощью предиката match (А. В,Operation). Это отношение истинно, если операция Operation сопоставляет А и В. Для решения рассматриваемой задачи применяется операция invert, которая ооеспечи-вает обмен местами ее аргументов.
analogy( Pair I, Pair2. Answers)
Существует аналогия между двумя парами геометрических фигур Pair1 и Pair2. Второй элемент в паре Pair2-один из элементов списка возможных ответов Answers.
analogy (A is_to В, С is_to X, Answers)
match(A,B,Rule),
match(C,X,Rule),
member (X, Answers).
match (inside (Figure I, Figure 2),
inside(Figure2,Figurel),invert).
match(above(Figurel,Figure2),
above(Figure2,Figurel),invert),
Программа 14. 18. Программа для нахождения геометрических аналогий.
Предложения и данные для тестирования
test_analogy(Name,X)
figures(Name. А, В, С),
answers(Name, Answers),
ana1ogy(A is_to B,C is_to X.Answers).
figures(test1 ,inside(square,triangle),
inside(triangle, square),
inside(circle,square)).
answers(test1,[inside(circle,triangle),
inside(square,circle),
inside(triangle, square)]).
Программа 14.19. Тестовые данные для программы решения задач на геометрические аналогии.
Предикат match в программе 14.18 используется двояко. В первом случае с его помощью производится сопоставление двух данных фигур. Во втором случае для заданных операции и фигуры подбирается вторая фигура. Однако эти детали несущественны для недетерминированного поведения программы. Наконец, с помощью предиката member проверяется, принадлежит ли данная фигура множеству ответов.
Теперь рассмотрим следующий классический пример программы из области искусственного интеллекта - упрощенную версию программы ELIZA. Эта программа предназначена для имитации беседы. Пользователь печатает предложение, а программа ELIZA отвечает либо соответствующим вопросом, либо комментарием. На самом деле ELIZA не понимает смысла вводимых предложений, а лишь распознает словесные шаблоны и реагирует на них подходящими шаблонными ответами. Чтобы сделать шаблоны ответов более достоверными, при их формировании учитываются психологические аспекты ведения беседы. Пример ведения беседы с программой ELIZA дан в виде протокола интерактивного взаимодействия, представленного на рис. 14,7. Ответам компьютера предшествует знак ».
I am unhappy.
Я опечален.
» How long have you been unhappy.
Сколько времени длится Ваша печаль.
Six months. Can you help me.
Шесть месяцев. Не могли бы Вы мне помочь.
» What makes you think I help you.
Как Вы думаете, чем я могу помочь Вам.
You remind me of my father and brother.
Вы напоминаете мне отца и брата.
» Can you tell me more about father.
Могли бы Вы рассказать мне подробнее об отце.
I like teasing father.
Я люблю дразнить отца.
» Does anyone else in your family like teasing father.
Любит ли кто-нибудь еще в Вашей семье дразнить отца.
No, only me.
Нет, только я.
» Please, go on.
Продолжайте, пожалуйста.
Рис. 14.7. Пример беседы с программой ELISA.
Центральной частью программы ELIZA является процедура для сопоставления входного предложения с шаблоном. Полученная в результате сопоставления пара применяется к другому шаблону для определения ответа программы. Пара шаблонов может рассматриваться как пара стимул/отклик; входное предложение сопоставляется со стимулом, а ответ генерируется с использованием отклика. Типичной парой стимул/отклик является пара:
I am <утверждение>
How long have you been <утверждение>?
При использовании этой пары ответом программы на входное заявление "I am unhappy" будет вопрос "How long have you been unhappy?" Элемент предложения <утверждение> может рассматриваться как поле в формате ответа, подлежащее заполнению.
Программа 14.20-простая версия программы ELIZA. В ней реализуется следующий алгоритм:
считать входное предложение.
пока поступают входные данные,
выбрать пару стимул/отклик,
сопоставить входное предложение со стимулом,
генерировать ответ с использованием отклика и
результата сопоставления на предыдущем шаге,
выдать ответ,
считать следующее входное предложение.
Пары стимул/отклик представляются фактами вида pattern (Stimulus, Response), где и стимул Stimulus, и отклик Response являются списками слов и полей. Поля в шаблонах представляются целыми числами. Предикат match(Pattern, Table, Words) используется на втором и третьем шагах приведенного выше алгоритма. Он выражает связь между шаблоном Pattern, списком слов Words и таблицей Table, в которую производится запись при заполнении полей шаблона. Центральную роль в процедуре match играет недетерминированное использование предиката append для разбиения списка слов. Таблица представляется неполной структурой данных; такие структуры данных будут более подробно изучаться в следующей главе. Текст процедуры lookup/3 будет дан в разд. 15.3. Ответ генерируется процедурой reply (Words) - вариантом процедуры written, который обеспечивает печать пробелов между словами.
Последней в этом разделе рассматривается программа MicroSAM, или McSAM. Она представляет собой упрощенную версию программы SAM (Script Аррlieг Mechanism), разработанную в группе, проводящей исследования в области «понимания» естественных языков с помощью ЭВМ в Йельском университете. Цель программы McSAM-«понимать» сюжеты. По данному сюжету с помощью программы McSAM находится подходящий сценарий и осуществляется сопоставление отдельных событий сюжета с шаблонами сценария. В этом процессе сценарий пополняется событиями, явно не упоминаемыми в сюжете.
Для представления сюжета и сценария используется теория концептуальной зависимости, развитая Р. Шенком. Рассмотрим, например, сюжет на рис. 14.8, он используется для примера в нашей версии программы McSAM. Сюжет, записанный на английском языке,
"John went to Leones, ate a hamburger and left"
представляется в программе в виде списка списков:
[[ptrans,john,john,X1,leonesJ,
[ingest, Х2, hamburger, X3], [ptrans,Aclor,Actor,X4,X5]].
eliza
Имитирует беседу с использованием побочных эффектов.
eliza read_word_1ist(Input), eliza(Input),!.
eliza([bye]) writeln(['Goodbye-1 hope 1 have helped you']). eliza(Input)
pattern(Stimulus, Response),
match(Stimulus, Dictionary, Input),
match(Response, Dictionary, Output),
reply(Output),
read_word_list(Input1),
!,eliza(Inputl).
match(Pattern. Dictionary, Words)
Шаблон Pattern сопоставляется со списком слов Words, результат сопоставления записывается в словарь Dictionary.
match([N | Pattern],Dictionary, Target)
integer(N), lookup(N, Dictionary, LeftTarget),
append (LeftTarget, RightTarget, Target),
match (Pattern, Dictionary, RightTarget).
match ([Word | Pattern], Dictionary, [Word | Target])
atom (Word),match(Pattern,Dictionary,Target).
match([ ], Dictionary, [ ]).
lookup(Key, Dictionary, Value) См. программу 15.8.
pattern (Stimulus, Response)
Response - шаблон ответа, соответствующий шаблону Stimulus.
pattern([i,am,1], [how, long, have, you, been, 1,?]),
pattern([l, you, 2, me], [what, makes, you, think, i,2,you,?]).
pattern([i, like, l],[does, anyone, else, in, your, family, like, l,?]).
pattern ([i, feel,!], [do, you, often, feel, that, way,?]).
pattern([l,X,2],[can, you, tell, me, more, about, X]) important(X).
pattern([l],[please, go, on]).
important (father). important (mother).
important (son). important (sister).
important (brother). important (daughter).
reply([Head | Tail]) write(Head),write(' '), reply(Tail).
reply([ ])nl
read_word_list(Xs) См. программу 12.2.
Программа 14.20. Программа ELIZA.
Первый элемент каждого списка, например ptrans или ingest- термин из теории концептуальной зависимости. Выбор представления сюжета в виде списка списков - дань первоначальной версии этой программы, написанной на Лиспе.
Программа McSAM легко записывается на Прологе (см. программу 14.21). Отношение верхнего уровня в этой программе mcsam (Story, Script) обеспечивает развитие некоторого сюжета Story в ее «понятный» эквивалент относительно подходящего сценария Script. Сценарий ищется посредством предиката find (Story, Script, Defaults). Текст сюжета просматривается для отыскания устойчивого аргумента. который инициирует имя соответствующего сценария. В нашем примере Джон
mcsam (Story,Script)
Сценарий Script описывает сюжет Story.
mcsam (Story, Script)
find(Slory,Script, Defaults),
match,(Script, Story),
name._defaults(Defaults).
find (Story, Script, Defaults)
filler(Slot, Story).
frigger(Slot,Naine),
script (Name, Script, Defaults).
match (Script,Story)
Сюжет Story является подпоследовательностью сценария Script.
match(Script,[ ]).
match([Line | Script], [Line | Story]) match (Script, Story).
match([Line | Script], Story) match (Script, Story).
filler (Slot, Story)
Slot- некоторое слово в сюжете Story.
filler(Slot, Story)
member([Action | Args], Story),
member(Slot, Args).
name_defaults (Defaults)
Унифицирует пары по умолчанию в Defaults.
name_defautts([ ]).
name_defaults([[N,N] | L]) name_defaults(L).
name_defaults([[Nl,N2] | L]) Nl N2,name_defaults(L).
Программа 14.21. Программа McSAM,
