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

       

Процедура рассмотреть


Центральной процедурой оболочки является процедура

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

которая будет находить ответ Ответ на заданный вопрос Цель, используя принципы, намеченные в общих чертах в разд. 14.4.1: найти Цель среди фактов базы знаний, или применить правило из базы знаний, или спросить пользователя, или же обработать Цель как И / ИЛИ-комбинацию подцелей.

Аргументы имеют следующий смысл и следующую структуру:

Цель              вопрос, подлежащий рассмотрению, представленный
                       как И / ИЛИ-комбинация простых утверждений, например

                       X имеет перья или X летает или
                       X откладывает яйца

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

                       Цель  по  Прав



что означает:  Цель рассматривалась с использованием правила  Прав. Например, пусть исходной целью будет "питер это тигр", а текущей целью - "питер ест мясо". В соответствии с базой знаний рис. 14.5 имеем трассу

                      [( питер это хищник) по прав3,
                        ( питер это тигр) по прав5 ]


Смысл ее можно выразить так:

Я могу использовать " питер ест мясо" для того, чтобы проверить по прав3, что "питер это хищник".

Далее, я могу использовать "питер это хищник" для того, чтобы проверить по прав5, что "питер это тигр".

Ответ        решающее И / ИЛИ-дерево для вопроса  Цель. Общая форма
                   представления для объекта Ответ:

                       Заключение было Найдено

где Найдено - это обоснование для результата Заключение. Следующие три примера иллюстрируют различные варианты ответов:

(1)        ( соед( радиатор, предохр1) это правда) было
                                                        'найдено как факт'

(2)        (питер ест мясо) это ложь было сказано
(3)        (питер это хищник) это правда было
                    ( 'выведено по' прав3 из
            (питер это млекопитающее) это правда было
                    ( 'выведено по' прав1 из
            (питер имеет шерсть) это правда было сказано)
            и
            (питер ест мясо) это правда было сказано )




На рис. 14. 10 показана прологовская программа для процедуры рассмотреть. В этой программе реализованы принципы разд. 14.4.1 с использованием только что описанных структур данных.

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

        :-ор( 900, xfx, :).
        :-ор( 800, xfx, было).
        :-ор( 870, fx, если).
        :-ор( 880, xfx, то).
        :-ор( 550, xfy, или).
        :-ор( 540, xfy, и).
        :- ор( 300, fx, 'выведено по').
        :- ор( 600, xfx, из).
        :- ор( 600, xfx, по).


% В программе предполагается,что ор( 700, хfх, это), ор( 500, fx, не)

        рассмотреть( Цель, Трасса, Цель это правда
                                                было 'найдено как факт') :-
                факт : Цель.


% Предполагается, что для каждого типа цели
% существует только одно правило

        рассмотреть( Цель, Трасса,
                Цель это ПравдаЛожь
                было 'выведено по' Прав из Ответ) :-


            Прав : если Условие то Цель,

                                    % Правило, относящееся к цели
            рассмотреть( Условие, [Цель по Прав | Трасса], Ответ),
            истинность( Ответ, ПравдаЛожь).


        рассмотреть( Цель1 и Цель2, Трасса, Ответ) :-  !,
                рассмотреть( Цель1, Трасса, Ответ1),
                продолжить( Ответ1, Цель1 и Цель2, Трасса, Ответ).


        рассмотреть( Цель1 или Цель2, Трасса, Ответ) :-
                рассм_да( Цель1, Трасса, Ответ);

                                    % Положительный ответ на Цель1
                рассм_да( Цель2, Трасса, Ответ).
                                    % Положительный ответ на Цель2

        рассмотреть( Цель1 или Цель2, Трасса,
                                                                Ответ1 и Ответ2) :-  !,


                not рассм_да( Цель1, Трасса, _ ),
                not рассм_да( Цель2, Трасса, _ ),

                                    % Нет положительного ответа
                рассмотреть( Цель1, Трасса, Ответ1),
                                    % Ответ1 отрицательный
                рассмотреть( Цель2, Трасса, Ответ2).
                                    % Ответ2 отрицательный

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




        продолжить( Ответ1, Цель1 и Цель2, Трасса, Ответ) :-
                положительный( Ответ1),
                рассмотреть( Цель2, Трасса, Ответ2),
                ( положительный( Ответ2), Ответ = Ответ1 и Ответ2;
                отрицательный( Ответ2), Ответ = Ответ2).


        продолжить( Ответ1, Цель1 и Цель2, _, Ответ1) :-
                отрицательный( Ответ1).


        истинность( Вопрос это ПравдаЛожь было Найдено,
                                                                            ПравдаЛожь) :-  !.


        истинность( Ответ1 и Ответ2, ПравдаЛожь) :-
                истинность( Ответ1, правда),
                истинность( Ответ2, правда),  !,
                ПравдаЛожь = правда;
                ПравдаЛожь = ложь.


        положительный( Ответ) :-
                истинность( Ответ, правда).


        отрицательный( Ответ) :-
                истинность( Ответ, ложь).


line(); Рис. 14. 10.  Основная процедура оболочки экспертной системы.


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