Читаем Prolog полностью

                nl, write( Имя), write( '='),


                read( Переменная),


                запрос_перем( Переменные).

        выд_трассу( [ ]) :-


                nl, write( 'Это был ваш вопрос'), nl.

        выд_трассу( [Цель по Прав | Трасса] ) :-


                nl, write( 'Чтобы проверить по' ),


                write( Прав), write( ', что'),


                write( Цель),


                выд_трассу( Трасса).

        конкретный( Терм) :-


                нумпер( Терм, 0, 0).                % Нет переменных в Терм'е

% конкретизация( Т1, Т2) означает, что Т2 - конкретизация Т1,


% т.е. терм Т1 - более общий, чем Т2, или той же степени


% общности, что и Т2

        конкретизация( Терм, Терм1) :-


                                        % Терм1 - частный случай Терм 'а


                копия( Терм1, Терм2),


                                        % Копия Терм1 с новыми переменными


                нумпер( Терм2, 0, _),  !,


                Терм = Терм2.            % Успех, если Терм1 - частный случай Терм2

        копия( Терм, НовТерм) :-


                                        % Копия Терм' а с новыми переменными


                asserta( copy( Терм) ),


                retract( сору( НовТерм) ),  !.

        посл_индекс( 0).                 % Начальный индекс для "сказано"

        след_индекс( Инд) :-         % Следующий индекс для "сказано"


                retract( посл_индекс( ПослИнд) ),  !,


                Инд is ПослИнд + 1,


                assert( посл_индекс( Инд) ).

Рис. 14. 11.  Оболочка экспертной системы: Вопросы к пользователю


и ответы на вопросы "почему".

        нумпер( Терм, N, М) :-


                Терм =.. [Функтор | Аргументы],             % Структура или атом


                нумарг( Аргументы, N, M).


                                        % Пронумеровать переменные в аргументах


        нумарг( [ ], N, N) :-  !.

        нумарг( [X | Спис], N, M) :-


                нумпер( X, N, N1),


                нумарг( Спис, N1, М).


14. 5. 4.    Процедура     выдать

Процедура

        выдать( Ответ)

приведенная на рис. 14.12, показывает пользователю окончательный результат консультационного сеанса и дает объяснения типа "как". Ответ включает в себя как ответ на вопрос пользователя, так и дерево вывода, демонстрирующее как система пришла к такому заключению. Сначала процедура выдать представляет пользователю свое заключение. Затем, если пользователь пожелает узнать, как это заключение достигнуто, то печатается дерево вывода в некоторой удобной для восприятия форме - это и есть объяснение типа "как". Форма объяснения показана в примере разд. 14.4.3.


14. 5. 5.    Драйвер верхнего уровня

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

. Драйвер эксперт производит запуск трех основных модулей оболочки (рис. 14.10 - 14.12) и координирует их работу. Например:

% Выдача заключения консультационного сеанса и


% объяснения типа "как"

        выдать( Ответ) :-


                nl, заключение( Ответ),


                nl, write( 'Хотите узнать, как?'),


                принять( Ответ1),


                ( Ответ1 = да,  !,  отобр( Ответ);


                    true).                                                  % Показ решающего дерева

        заключение( Ответ1 и Ответ2) :-  !,


                заключение( Ответ1), write( 'и'),


                заключение( Ответ2).

        заключение( Заключение было Найдено) :-


                write( Заключение).

% "отобр" отображает полное решающее дерево

        отобр( Решение) :-


                nl, отобр( Решение, 0),  !.                            % Отступ 0

        отобр( Ответ1 и Ответ2, Н) :-  !,                      % Отступ Н


                отобр( Ответ1, Н),


                tab( H), write( 'и'), nl,


                отобр( Ответ2, Н).

        отобр( Ответ был Найден, Н) :-                      % Отступ Н


                tab( H), печответ( Ответ),             % Показ заключения


                nl, tab( H),


                write( 'было'),


                отобр1( Найден, Н).                         % Показ доказательства

        отобр1( Выведено из Ответ, Н) :-  !,


                write( Выведено), write( 'из'),        % Показ имени правила


                nl, H1 is H + 4,


                отобр( Ответ, H1).                           % Показ "предшественника"

        отобр1( Найдено, _ ) :-


                                    % Найдено = 'сказано' или 'найдено как факт'


                write( Найдено), nl.

        печответ( Цель это правда) :-  !,


                write( Цель).            % На выходе 'это правда' опускается

        печответ( Ответ) :-                                % Отрицательный ответ


Перейти на страницу:

Похожие книги

Слово о полку Игореве
Слово о полку Игореве

Исследование выдающегося историка Древней Руси А. А. Зимина содержит оригинальную, отличную от общепризнанной, концепцию происхождения и времени создания «Слова о полку Игореве». В книге содержится ценный материал о соотношении текста «Слова» с русскими летописями, историческими повестями XV–XVI вв., неординарные решения ряда проблем «слововедения», а также обстоятельный обзор оценок «Слова» в русской и зарубежной науке XIX–XX вв.Не ознакомившись в полной мере с аргументацией А. А. Зимина, несомненно самого основательного из числа «скептиков», мы не можем продолжать изучение «Слова», в частности проблем его атрибуции и времени создания.Книга рассчитана не только на специалистов по древнерусской литературе, но и на всех, интересующихся спорными проблемами возникновения «Слова».

Александр Александрович Зимин

Литературоведение / Научная литература / Древнерусская литература / Прочая старинная литература / Прочая научная литература / Древние книги