Программирование на языке Пролог для искусственного интеллекта

       

Принципы реализации



14. 6. 3.    Принципы реализации

Давайте сначала расширим правила языка, с тем чтобы получить возможность работать с неопределенностью. К каждому, правилу мы можем добавить "силовой модификатор", определяемый двумя неотрицательными действительными числами  S  и  N.   Вот соответствующий формат:

        Имя Правила:      если
                                              Условие
                                       то
                                              Заключение
                                       с
                                              Сила( N, S).

Примеры правил Рисунок 14.14 можно изобразить в этой форме так:

        прав1 :         если
                                  не давлоткр и
                                  открклап
                            то
                                  открклрано
                            с
                                  сила( 0.001, 2000).

        прав2 :         если
                                  сепзапвд
                            то
                                  давлоткр
                            с
                                  сила( 0.05, 400).

Для того, чтобы произвести соответствующее расширение оболочки экспертной системы (разд. 14.5), нам понадобится внести изменения в большинство процедур. Давайте сосредоточимся только на одной из них, а именно на процедуре

        рассмотреть( Цель, Трасса, Ответ)

Мы предположим, что утверждение Цель не содержит переменных (как это сделано в Prospector'e и в AL/X). Это сильно упростит дело (особенно в процедуре ответпольз). Таким образом, Цель будет логической комбинацией элементарных утверждений. Например:

        не давлоткр и открклап

Цепочку целей-предков и правил Трасса можно представить таким же способом, как это сделано в разд. 14.5. Однако форму представления объекта Ответ придется модифицировать для того, чтобы включить в нее вероятности. Цель и ее вероятность можно соединить в один терм следующим образом:

        Цель : Вероятность

Получим такой пример объекта Ответ:

        индоткр : 1 было сказано

Смысл ответа: пользователь сообщил системе, что событие индоткр произошло, и что это абсолютно достоверно.

Представление объекта Ответ требует еще одной модификации, в связи с тем, что в одно и то же событие могут вести несколько независимых связей, которые все окажут влияние на вероятность этого события - его шанс будет помножен (Рисунок 14.15) на все множители. В этом случае Ответ будет содержать список всех ветвей вывода заключения. Приведем пример ответа такого рода для сети Рисунок 14.14 (для наглядности расположенный на нескольких строках):

        давлоткр : 1 было 'выведено по'
                [ прав2 из сепзапвд : 1 было сказано,
                   прав5 из диагсеп : 1 было сказано ]

Процедура рассмотреть, выдающая ответы в такой форме, показана на Рисунок 14.16. Она обращается к предикату

        импликация( Р0, Р, Сила, Вер0, Вер)

соответствующему отношению "мягкой импликации" (см. Рисунок 14.15).  Р0  -   априорная вероятность события  Е,   а  Р  - его апостериорная вероятность. Сила - сила импликации, представленная как

        сила( N, S)

Вер0 и Вер - соответственно априорная и апостериорная вероятности гипотезы   H.

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

Наконец, несколько замечаний относительно новой версии процедуры ответпольз. Она будет проще, чем процедура Рисунок 14.11, так как в запросах, передаваемых пользователю, уже не будет переменных. На этот раз пользователь в качестве ответа введет некоторую вероятность (вместо "да" или "нет"). Если пользователю ничего неизвестно о событии, содержащемся в вопросе, то вероятность этого события не изменится. Пользователь может также задать вопрос "почему" и получить изображение объекта Трасса в качестве объяснения. Кроме того, следует разрешить пользователю задавать вопрос: "Какова текущая вероятность моей гипотезы?" Тогда, если он устал вводить новую информацию (или у него мало времени), он может прекратить консультационный сеанс, довольствуясь ответом системы, полученным на основании неполной информации.

line();

% Процедура
% рассмотреть( Цель, Трасса, Ответ)
%
% находит степень правдоподобия утверждения "цель это правда".
% Оценка правдоподобия содержится в объекте Ответ. Трасса - это
% цепочка целей-предшественников и правил, которую можно
% использовать в объяснении типа "почему"

        рассмотреть( Цель, Трасса, ( Цель: Вер) было
                                    'выведено по' ПравОтв) :-
                bagof( Прав: если Условие то Цель с Сила, Правила),

                                    % Все правила, относящиеся к цели
                априори( Цель, Вер0),
                                    % Априорная вероятность цели
                модиф( Вер0, Правила, Трасса, Вер, ПравОтв).
                                    % Модифицировать априорные вероятности

        рассмотреть( Цель1 и Цель2, Трасса,
                                ( Цель1 и Цель2 : Вер было 'выведено из'
                                ( Ответ1 и Ответ2) ) :-
                !,
                рассмотреть( Цель1, Трасса, Ответ1),
                рассмотреть( Цель2, Трасса, Ответ2),
                вероятность( Ответ1, В1),
                вероятность( Ответ2, В2),
                мин( В1, В2, Вер).

        рассмотреть( Цель1 или Цель2, Трасса,
                                ( Цель или Цель2:Вер) было 'выведено из'
                                ( Ответ1 и Ответ2) ) :-
                !,
                рассмотреть( Цель1, Трасса, Ответ1),
                рассмотреть( Цель2, Трасса, Ответ2),
                вероятность( Ответ1, В1),
                вероятность( Ответ2, В2),
                макс( В1, В2, Вер).

        рассмотреть( не Цель, Трасса,
                        ( не Цель:Вер) было 'выведено из' Ответ) :-
                !,
                рассмотреть( Цель, Трасса, Ответ),
                вероятность( Ответ, В),
                обратить( В, Вер).

        рассмотреть( Цель, Трасса, ( Цель: Вер) было сказано) :-
                ответпольз( Цель, Трасса, Вер).
                                   
% Ответ, выведенный пользователем

% Отношение
%
% модиф( Вер0, Правила, Трасса, Вер, ПравОтв)
%
% Существует Цель с априорной вероятностью Вер0. Правила имеют
% отношение к утверждению Цель; суммарное влияние этих правил
% (точнее, их условных частей) на Вер0 приводит к тому,
% что Вер0 заменяется на апостериорную вероятность Вер;
% Трасса - список целей-предков и правил, использовавшихся
% при выводе утверждения Цель;
% ПравОтв - результаты анализа условных частей
% правил из списка Правила.

        модиф( Вер0, [ ], Трасса, Вер0, [ ]).
                                    % Нет правил - нет модификации

        модиф( Вер0,
                        [ Прав : если Усл то Цель с Сила | Правила],
                        Трасса, Вер, [Прав из Ответ | ПравОтв] ):-
                рассмотреть( Усл, [Цель по Прав | Трасса], Ответ),

                                    % Условие из первого правила
                априори( Усл, В0),
                вероятность( Ответ, В),
                импликация( В0, В, Сила, Вер0, Вер1),

                                    % "Мягкая" импликация
                модиф( Вер1, Правила, Трасса, Вер, ПравОтв).

line();



Содержание раздела