НОВОСТИ   БИБЛИОТЕКА   ЮМОР   КАРТА САЙТА   ССЫЛКИ   О САЙТЕ  




предыдущая главасодержаниеследующая глава

2.11. На пути к естественному языку

Значительное внимание исследователи, работающие над проблемами искусственного интеллекта, уделяют вопросам облегчения взаимодействий человека с машиной*. Достичь удобного для человека диалога можно, применяя световое перо, сенсорный экран или устройства типа "мышь", позволяющие быстро выбрать требуемую информацию из меню. Все эти средства чрезвычайно полезны"; даже совершенно неподготовленные, пользователи после непродолжительной тренировки могут их использовать. Кроме того, применение таких устройств позволяет освободить пользователей от трудоемких операций, связанных с набором на клавиатуре. Однако все это весьма далеко от использования для взаимодействия с ЭВМ обычной человеческой речи. Хотя в последнее время достигнут определенный прогресс в области анализа и распознавания речи, следует отметить, что существующие системы "понимают" лишь небольшое число слов.

Использование Пролога предоставляет программисту более широкие возможности для организации диалога с ЭВМ на языке, близком к естественному. Так правильная с точки зрения естественного языка формулировка запроса приводит к удобному для восприятия человеком ответу машины. Например", запрос

all (x is older than у: х older у)

в этой точки зрения лучше запроса

all (x у: х older у)

Преимущество первого запроса становится особенно очевидным, если результаты работы программы предназначены для людей, далеких от вычислительной техники. Предпочтительнее именно такие расширенные формы запросов. Но программисты могут добиться и большего, если будут более тщательно продумывать тексты отношений. Тем самым они освободят пользователей от необходимости придавать протоколам работы программ вид текстов на естественном языке.

Проиллюстрировать изложенное выше проще всего на примере отношения, содержащего предикат is-told, например older. Естественно, что для этого придется внести несколько изменений в правило, описывающее это отношение. После модификации отношение older будет выглядеть так:

X older Y if

 (Compare with which person X) is-told and

 X aged Z and

 (Input a name Y and an age x for comparison) is-told and

 x LESS Z

Диалог между пользователем и ЭВМ примет теперь более естественный вид:

all (x is older than у: х older у)

[определить все (х старше чем у: х старше у)]

Compare with which person X ? ans Alan

1С кем необходимо провести сравнение ? ответ Алан]

Input a name X and anage Y for comparison ? ans Ted 5

[Введите имя X и возраст Y для сравнения ? ответ Тед 5]

Alan is older than Ted

[Алан старше чем Тед]

Input a name X and a name Y for comparison ? just Tom 9

[Введите имя X и возраст Y для сравнения ? ответ Том 9]

Alan is older than Tom

[Алан старше чем Том]

Compare with which person X ? no

[С кем необходимо провести сравнение ? нет]

No (more) answers

[Ответов (больше) нет]

Отметим, что ответ пользователя just Том 9 заставляет программу перейти от одной формы запроса к другой. Не должно смущать то; что в программе для представления имени и возраста использованы переменные Y и х, в то время как при выводе запроса для тех же самых величин используются обозначения X и Y. Важно понять, что переменные в Прологе не имеют постоянных или глобальных значений. Наша программа сравниваег значения, сообщенные последователем, используя для этого механизм сопоставления образцов, который временно связывает с переменными эти значения.

Существует возможность сделать программу еще более удобной для пользователя. Например, можно освободить пользователя от необходимости вводить в запрос текст "х is older than у" (это делалось для того, чтобы этот текст появлялся в процессе диалога). Перед тем как модифицировать программу, рассмотрим стандартную форму запросов. Напомним, что до сих пор мы пользовались средствами диалоговой системы SIMPLE, которая позволяет составлять запросы на языке, близком к естественному. Первое, что необходимо отметить, заключается в том, что в стандартном синтаксисе Пролога не существует эквивалента для отношения all. Запрос на стандартном Паскале будет выглядеть так:

? ((older x у))

Символ "?" используется для обозначения запроса. После него следует сам запрос, заключенный в двойные скобки. Любой запрос, касающийся отношения и его аргументов, должен иметь тот же самый вид, который имеет отношение, записанное в соответствии с правилами стандартного синтаксиса. Для того чтобы вывести на экран стандартное описание отношения, достаточно использовать команду LIST. Например,

& LIST aged

((aged Alan 15))

((aged Bill 42))

((aged Colin 28))

Теперь можно ввести запрос

? ((aged x у))

В ответ программа напечатает &. Это означает, что найдены такие значения х и у, которые содержатся в утверждении типа ((aged x у)), т. е. такой ответ полностью соответствует YES, получаемому в ответ на запрос в случае использования системы SIMPLE.

Рассмотрим еще один запрос

? ((aged x 90))

В ответ система напечатает знак вопроса и следом за ним символ & . Это означает, что ответ на запрос отрицателен, т. е. не существует такого х, который содержится в утверждении типа

((aged х 90))

Отметим, что знак вопроса в стандартном синтаксисе соответствует NO в случае использования SIMPLE.

Ни в первом, ни во втором случаях никакая дополнительная информация не появляется. Если же результат необходимо напечатать, следует использовать следующую конструкцию:

&? ((aged х у) (РР х у))

Alan 15

&.

Запроc ? (aged х у) позволяет определить искомые значения х и у и по команде (РР х у) эти найденные значения печатаются. РР означает красивая печать (pretty print). В данном случае использование команды РР позволяет после печати пары значений переходить на другую строку. Если бы использовалась команда Р (print), все печаталось бы подряд на одной строке. Не существует команды, предписывающей программе найти все остальные значения х и у, удовлетворяющие отношению

(aged х у)

Если пользователям такая команда нужна, то они должны реализовать ее сами. Пользователям дается возможность определять командные отношения так же свободно, как и обычные отношения. Это позволяет создавать программы, ориентированные на решение задач конкретной проблемной области. В дальнейшем будет показано, как компактно записать текст отношения, удовлетворяющий требованиям стандартного синтаксиса. Но сейчас остановимся на ивпользовании двух стандартных отношений (примитивов), описанных выше.

Напомним, что основной задачей считается создание таких отношений, использование которых освобождает пользователей от необходимости конструирования сложных запросов. Сложные запросы, близкие к предложениям естественного языка, создаются для того, чтобы ответы ЭВМ содержали максимально возможное количество информации в удобной для восприятия форме. Это . особенно необходимо в тех случаях, когда протоколы работы программ распространяются среди заинтересованных лиц.

Предположим, в ЭВМ находятся три следующих утверждения:

Alan aged 15

Bill aged 42

Colin aged 28

Диалог между пользователем и ЭВМ вида

& all (x у: х aged у)

[определить вве (х у: х имеет возраст у)

Alan 15

[Алан 15]

Bill 42

[Билл 42]

Colin 28

[Колин 28]

может легко быть изменен на следующий:

& all (x is у years old: x aged у)

[определить все (возраст человека по имени х - у: х имеет возраст у)]

Alan is 15 years old

[Возраст человека по имени Алан - 15]

Bill is 42 years old

[Возраст человека по имени Билл - 42 ]

Colin is 28 years old

[Возраст человека по имени Колин - 28 ]

Последний вариант протокола более удобен для восприятия. Кроме того, он позволяет однозначно интерпретировать выдаваемую информацию. Например, 15 может означать число детей Алана, или число его земельных владений, или что-либо подобное. Ведь очевидно, что сообщение

Alan 15

может трактоваться по-разному. Конечно, можно организовать строго форматированный вывод, где возраст, число детей и т. п. будут печататься в отдельных снабженных заголовками столбцах таблицы. Но такой способ не позволит добиться нужной гибкости и будет слишком расточительным в тех случаях, когда требуется лишь небольшое число данных, характеризующих ту или иную личность.

В данный момент наша задача заключается в том, чтобы освободить пользователей от необходимости формирования длинных запросов вида

all (x is у years old: x aged у)

Чтобы получить от ЭВМ удобные для восприятия сообщения достаточно использовать в каждом отношении команду печати Например,

(Bill aged 42)

заменить на

(Bill aged 42 if ((PP Bill is 42 years old)) ?)

Заметим, что знак вопроса появляется теперь сразу после команды печати. Это наиболее легкий путь, позволяющий включать стандартные команды непосредственно в тексты утверждений, удовлетворяющих требованиям системы SIMPLE. Рассмотрим теперь, какова будет реакция Пролог-системы на один из возможных запросов

all (x у: х aged у)

[определить все (х у: х имеет возраст у)]

Alan 15

[Алан 15]

Bill is 42 years old

[Возраст человека по имени Билл - 42]

Bill 42

[Билл 42]

Colin 28

[Колин 28]

&.

Видно, что информация, касающаяся отношений, которые не были изменены, печатается в том же виде, что и раньше; в то же время данные о Билле печатаются как в старом, так и в новом форматах. Это объясняется тем, что используемое в запросе отношение all предусматривает команду печати, и, кроме того, команда печати явно присутствует в утверждении, определяющем возраст Билла. Устранить ненужную печать можно, используя следующий запрос:

all (: х aged у)

[определить все (: х имеет возраст у)

Bill is 42 years old

[Возраст человека по имени Билл - 42]

No (more) answers

[Ответов (больше) нет]

Но все же, хотя сообщения типа

Alan 15

появляться теперь не будут, на месте каждого из них в протоколе будет оставлена пустая строка. Это происходит потому, что перед двоеточием, где обычно появляются имена переменных, предназначенных для вывода на печать, теперь ничего нет. Другими словами, в данном случае факт возникновения пустых строк говорит о том, что по команде all ничего не печатается.

Отметим несколько недостатков метода, основанного на включении команд печати во все утверждения программы. Во-первых, этот процесс потребует для большой программы значительного времени; во-вторых, будет занято много дополнительной памяти; в-третьих, новые термы могут создать дополнительные трудности для понимания некоторых достаточно длинных утверждений программы. Естественно, было бы лучше, если бы удалось добавить к каждому отношению одно специальное отношение, определяющее вывод нужной информации. На выполнение действий, связанных с обычными отношениями, эти новые отношения влиять не будут. Было бы удобно дать отношениям печати имена, похожие на имена тех отношений, для работы с которыми они предназначаются. Например, для рассматриваемого отношения aged отношение, определяющее вывод на печать, можно назвать age или print-age или, наконец, paged. Автору больше нравится последний вариант. В общем любому отношению можно поставить в соответствие отношение печати, определяющее требуемую форму вывода информации. Теперь можно перейти к определению отношения paged:

X paged Y if

X aged Y and

((PP X is Y years old)) ?

Работает это отношение так:

& all (: х paged у)

[определить все (: х печ.-имеет-возраст у)]

Alan is 15 years old

[Возраст человека по имени Алан - 15]

Bill is 42 years old

[Возраст человека по имени Билл - 42]

Colin is 28 years old

[Возраст человека по имени Колин - 28]

&.

Пустые строки между ответами появляются потому, что отношение all выполняет собственную команду печати, а форма запроса такова, что печатать ничего не надо. Если все же желательно избежать появления пустых строк, то можно заменить команду РР в отношении paged на команду Р:

((Р X is Y years old)) ?

Выполнение команды Р не приводит к переводу строки. Ответы будут теперь печататься на следующих друг за другом строках, поскольку перевод строки выполнит команда РР, не явно присутствующая в all.

Упражнение 2.12

а. Объясните, что будет получено в ответ на запрос?

all (: х aged у)

б. Сформируйте отношение older, определяющее, когда х старше у, и отношение polder, обеспечивающее вывод информации

из отношения older.

Упражнение 2.13

Определите отношения, ориентированные на хранение данных, которые приведены в таблице; обеспечьте красивую печать. Приведите примеры такой печати для различных характеристик личности, указанных в табл. 2.1.

Таблица 2.1
Таблица 2.1

Упражнение 2.14

Определите отношение, которое будет выводить на печать всю информацию, отноеящуются к данной личности, в следующей форме (на примере Колина):

"Колин, 28 лет, учитель, родился 4-9-67, годовой доход составляет 9850 фунтов стерлингов, стаж работы 7 лет, живет в доме номер 3 в течение 2 лет".

Для программы из упражнения 2.12 требуется немного памяти. Используя команду

? ((SPACE X) (РР X))

можно определить, сколько памяти остается незанятой; такой памяти в данном случае должно быть около 4К. Как уже отмечалось, команда SPACE осуществляет чистку памяти от данных, оставшихся в ней после обработки предыдущих запросов. Не надо забывать, что программа не должна занимать всю свободную память, поскольку определенная память нужна для обработки запросов. Если вы хотите получить в Ваше распоряжение дополнительный участок памяти, используйте команду kill program-mod. Но имейте в виду, что после этого все вновь вводимые отношения должны быть представлены в форме, удовлетворяющей требованиям стандартного синтаксиса. Кроме того, с помощью команды

kill errmess-mod

может быть освобождено дополнительно 1К памяти. Правда, в этом случае вместо развернутых сообщений о синтаксических и других ошибках будут выдаваться только номера ошибок. Для того чтобы получить тексты диагностических сообщений, надо будет воспользоваться руководством.

Как Вы помните, в упражнении 2.14 требовалось придумать такое отношение, которое обеспечивало бы вывод всей информации, относящейся к данной личности. В Ваших интересах написать свою версию программы и тем самым приобрести определенный опыт программирования на Прологе.

Для тех, кто не может справиться с поставленной задачей, приводим возможный вариант программы:

X pstat Y if

X age Z and

X job x and

not X job ∅

and X born у and

X earns z and

X years-at X1 and

X in Y1 and X

years-in Z1 and

((P X, a Z years old x born on у earns z a year, has been a x

for X1 years, and has lived at number Y1 for Z1 years)) ?

Диалог между пользователем и ЭВМ может иметь следующий вид:

one (: pstat x)

[определить один (: вывод-данных-об-общественном-положении х)]

Bill, a 42 years old butcher born on (12-2-43) earns 12 ∅ ∅ ∅ a year, has been a butcher for 23 years, and has lived at number 19 for 7 years

[Билл, 42 года, мясник, родился (12-2-43), годовой доход составляет 12 000 долларов, стаж работы 23 года, живет в доме номер 19 в течение 7 лет]

more? (у/п) nо

[еще? (да/нет) нет]

& all (: Frances pstat x)

[определить все (: Фрэнсис вывод-данных-об-общественном-положении х)]

Frances, а 25 years old doctor born on (7-9-6 ∅) earns 11 5 ∅ ∅ a year, has been a doctor for 2 years, and has lived at number 2 for 8 years

[Фрэнсис, 25 лет, врач, родился (7-9-60), годовой доход составляет 11 500 долларов, стаж работы 2 года, живет в доме номер 2 в течение 8 лет]

No (more) answers

[Ответов (больше) нет]

Не забудьте при формировании отношения born заключить дату в скобки. В том случае, когда скобки отсутствуют, например:

Frances born 7-9-60

будет получено сообщение об ошибке. Дело в том, что Пролог-система будет интерпретировать 7-9-60 как два аргумента: 7- и 9-60*. Однако можно представить отношение в виде

Frances born Sept-7-60

и ошибки в этом случае не будет.

* (В первом случае выражение начинается с цифры 7. В связи с этим 7 и все последующие цифры (если они есть) интерпретируются как элемент данных арифметического типа. Поскольку за цифрой 7 сразу же идет нецифровой символ, остальная часть выражения считается элементом данных символьного типа.- Прим. ред. пер.)

В качестве имени отношения, обеспечивающего вывод, использовано pstat - сокращение от print status*. Можно, конечно, придумать любое другое имя, но лучше использовать имена, мнемонически отражающие суть выполняемых операций.

* (Вывод на печать данных, характеризующих общественное положение.- Прим. ред. пер.)

Отметим, что в этой главе не рассматривались программы, имеющие какое-либо практическое значение. Главной считалась задача изучения базовых понятий языка Пролог и демонстрация возможностей их применения для решения задач искусственного интеллекта. Автор надеется, что читатель, который одолел эту главу, разобрался в еледующем:

  1. Программа на языке Пролог представляет собой последовательность определяемых пользователями отношений. Каждое отношение состоит из имени отношения и из одного или нескольких аргументов.
  2. В Пролог-сиетеме имеются встроенные отношения. С их помощью пользователь составляет и редактирует программу, а также формирует запросы.
  3. Встроенными являются также такие логические операции, как and, or и т. д. Пролог-система использует эти операции вместе с мощными и встроенными средствами сопоставления для обработки запросов последователей. Широкие возможности Пролога по сопоставлению запросов с утверждениями необходимы для работы, например, с отношением pstat.
  4. Пролог позволяет легко справляться с обработкой различных типов данных (см. предыдущую программу).
  5. Пролог обеспечивает достаточно большую гибкость при работе с базами данных.
  6. Пролог дает возможность осуществлять ввод и вывод сообщений на естественном языке.
предыдущая главасодержаниеследующая глава








© Злыгостев А.С., 2001-2019
При использовании материалов сайта активная ссылка обязательна:
http://informaticslib.ru/ 'Библиотека по информатике'
Рейтинг@Mail.ru
Поможем с курсовой, контрольной, дипломной
1500+ квалифицированных специалистов готовы вам помочь