(В приведенных ниже диалогах между пролог-системой и пользователем тексты пользователя даются
полужирным шрифтом, а реплики пролог-системы?- ответпольз( питер ест мясо, [ ], Ответ).
да. % Ответ пользователя
Более интересный пример диалога (с использованием переменных) мог бы выглядеть примерно так:
?- ответпольз( Кто ест Что, [ ], Ответ).
% Пролог дает переменным свои внутренние имена
да.
да.
нет.
14. 5. 3. Усовершенствование процедуры ответпольз
Один из недостатков нашей процедуры ответпольз
, который хорошо виден из приведенного выше диалога, - это появление на выходе системы имен, генерируемых пролог-системой, что выглядит довольно неуклюже. Символы, подобные _17, следовало бы заменить на более осмысленные слова.Другой, более серьезный дефект этой версии процедуры
ответпольз состоит в следующем. Если мы еще раз обратимся к ответпольз, задав ту же самую цель, то пользователю придется повторно вводить все варианты решений. Поэтому, если наша экспертная система придет в процессе рассуждений к рассмотрению той же самой цели второй раз, то, вместо того, чтобы использовать информацию, уже полученную от пользователя, она проведет с пользователем в точности тот же самый скучный диалог.Давайте исправим эти два дефекта. Во-первых, улучшение внешнего вида запросов системы будет основано на введении стандартного формата для каждой "запрашиваемой" цели. Для этого в отношение
можно_спросить мы добавим второй аргумент, который и будет задавать этот формат, как видно из следующего примера:можно_спросить(Х ест Y, 'Животное' ест 'Что-то').
При передаче запроса пользователю каждая переменная вопроса должна быть заменена на ключевое слово, взятое из формата, например:
?- ответпольз( X ест Y, [ ], Ответ).
да.
В улучшенной версии процедуры ответпольз
, показанной на рис. 14.11, такое форматирование запросов выполняется процедуройформат( Цель, ВнешФормат, Вопрос, Перем0, Перем )
Здесь Цель
- утверждение, которое нужно форматировать. ВнешФормат определяет внешний формат этого утверждения, задаваемый отношениемможно_спросить( Цель, ВнешФормат)
Вопрос
- это Цель, отформатированная в соответствии с ВнешФормат. Перем - список переменных, входящих в Цель, вместе с соответствующими ключевыми словами (как указано в ВнешФормат), причем список Перем получается из списка Перем0 добавлением новых переменных. Например:?- формат( X передает документы Y,
'Кто' передает 'Что' 'Кому',
Вопрос, [ ], Перем).
Вопрос = 'Кто' передает документы 'Кому',
Перем = [ Х/'Кто', Y/'Кому'].
Второе усовершенствование, состоящее в устранении повторных вопросов к пользователю, будет более трудным. Во-первых, все ответы пользователя следует запоминать, с тем чтобы их можно было отыскать в памяти в более поздний момент времени. Для этого достаточно сделать ответы пользователя элементами некоторого отношения и применить
assert, напримерassert( сказано( мери передает документы друзьям, правда) ).
В ситуации, когда имеется несколько решений, предложенных пользователем для одной и той же цели, в память относительно нее будет записано несколько фактов. Здесь возникает одно осложнение. Допустим, что в нескольких местах программы встречаются различные варианты некоторой цели (отличающиеся именованием переменных). Например:
( X имеет Y) и
% Первый вариант - Цель1. . .
( X1 имеет Y1) и
% Второй вариант - Цель2. . .