Чтение онлайн

на главную - закладки

Жанры

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

Братко Иван

Шрифт:

формат( Атом, Имя, Атом, Перем, Перем) :-

 atomic( Атом), !,

 atomic( Имя).

формат( Цель, Форм, Вопрос, Перем0, Перем) :-

 Цель =.. [Функтор | Apг1],

 Форм =.. [Функтор | Форм1],

 формвсе( Apг1, Форм1, Арг2, Перем0, Перем),

 Вопрос =.. [Функтор | Арг2].

формвсе( [], [], [], Перем, Перем).

формвсе( [X |
СпХ], [Ф | СпФ], [В | СпВ], Перем0, Перем) :-

 формвсе( СпХ, СпФ, СпВ, Перем0, Перем1),

 формат( X, Ф, В, Перем1, Перем).

запрос_перем( []).

запрос_перем( [Переменная/Имя | Переменные]) :-

 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плюс1) :-

 var( Терм), !, % Переменная?

 Терм =
пер/N,

 Nплюс1 is N + 1.

нумпер( Терм, 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) и координирует их работу. Например:

?- эксперт.

Пожалуйста, спрашивайте: % Приглашение пользователю

X это животное и голиаф это X. % Вопрос пользователя

Это правда: голиаф имеет шерсть?

...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Поделиться:
Популярные книги

Дракон - не подарок

Суббота Светлана
2. Королевская академия Драко
Фантастика:
фэнтези
6.74
рейтинг книги
Дракон - не подарок

Бастард Императора. Том 8

Орлов Андрей Юрьевич
8. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 8

Чужая дочь

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Чужая дочь

Эра Мангуста. Том 2

Третьяков Андрей
2. Рос: Мангуст
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эра Мангуста. Том 2

Идеальный мир для Лекаря 14

Сапфир Олег
14. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 14

Один на миллион. Трилогия

Земляной Андрей Борисович
Один на миллион
Фантастика:
боевая фантастика
8.95
рейтинг книги
Один на миллион. Трилогия

Помещицы из будущего

Порохня Анна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Помещицы из будущего

Шлейф сандала

Лерн Анна
Фантастика:
фэнтези
6.00
рейтинг книги
Шлейф сандала

Черный маг императора 2

Герда Александр
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Черный маг императора 2

Император

Рави Ивар
7. Прометей
Фантастика:
фэнтези
7.11
рейтинг книги
Император

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Князь Серединного мира

Земляной Андрей Борисович
4. Страж
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Князь Серединного мира

Чайлдфри

Тоцка Тала
Любовные романы:
современные любовные романы
6.51
рейтинг книги
Чайлдфри