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

на главную

Жанры

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

Братко Иван

Шрифт:

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

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

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

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

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

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

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

 nl, tab( H),

 write( 'было'),

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

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

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

 nl, H1 is H + 4,

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

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

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

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

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

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

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

 write( Ответ).

Рис. 14.12. Оболочка экспертной системы: Отображение окончательного результата и объяснение типа "как".

14.5.6. Одно замечание по поводу программы-оболочки

В некоторых местах нашей программы-оболочки обнаруживается недостаток той "декларативной ясности", которая так характерна для программ, написанных на Прологе. Причина состоит в том, что нам пришлось предусмотреть в этой программе довольно жесткое управление процессом функционирования оболочки. Ведь, согласно нашему замыслу, экспертная система должна была не только находить ответы на вопросы, но и делать это некоторым разумным с точки зрения пользователя способом. В связи с этим нам пришлось реализовать вполне определенное поведение системы в процессе решения задач, а не просто некоторое отношение ввода-вывода. В результате получилась программа более процедурного характера, чем обычно. Все это может послужить примером ситуации, когда, не имея возможности рассчитывать на собственные процедурные механизмы Пролога, мы вынуждены взять на себя детальное описание процедурного поведения системы.

14.5.7. Цели с отрицанием

Использование знака отрицания в левых частях правил, а следовательно, и в вопросах, обрабатываемых процедурой

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

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

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

 обратить( Ответ1, Ответ).

% Получить обратное истинностное значение

обратить( Цель это правда было Найдено,

 ( не Цель) это ложь было Найдено).

обратить( Цель это ложь было Найдено,

 ( не Цель) это правда было Найдено).

% Процедура-драйвер верхнего уровня

эксперт :-

 принять_вопрос( Вопрос),

% Ввести
вопрос пользователя

 ( ответ_да( Вопрос);

% Попытка найти положительный ответ

 ответ_нет( Вопрос) ).

% Если нет положительного ответа, то найти отрицательный

ответ_да( Вопрос) :-

% Искать положительный ответ на Вопрос

 статус( отрицательный),

% Пока еще нет положительного ответа

 рассмотреть( Вопрос, [], Ответ), % Трасса пуста

 положительный( Ответ), % Искать положительный ответ

 статус( положительный),

% Найден положительный ответ

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

 write( 'Нужны еще решения?' ),

 принять( Ответ1), % Прочесть ответ пользователя

 Ответ1 = нет.

% В противном случае возврат к "рассмотреть"

ответ_нет( Вопрос):-

% Искать отрицательный ответ на Вопрос

 retract( пока_нет_положительного_решения), !,

% Не было положительного решения?

 рассмотреть( Вопрос, [], Ответ),

 отрицательный( Ответ),

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

 write( 'Нужны еще решения?' ),

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

 Ответ1 = нет.

% В противном случае - возврат к "рассмотреть"

статус( отрицательный) :-

 assert( пока_нет_положительного_решения).

статус( положительный) :-

 retract( пока_нет_положительного_решения), !; true.

принять_вопрос( Вопрос) :-

 nl, write( 'Пожалуйста, спрашивайте:'), nl,

 read( Вопрос).

Рис. 14.13. Оболочка экспертной системы: драйвер. Обращение к оболочке из Пролога при помощи процедуры

эксперт
.

Если Цель конкретизирована, то все в порядке, если же нет, то возникают трудности. Рассмотрим, например, такой диалог:

?- эксперт.

Пожалуйста, спрашивайте:

не ( X ест мясо).

Есть (еще) решения для : Животное

да.

Животное = тигр.

В этот момент система даст ответ:

не ( тигр ест мясо) это ложь

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

Эффект Фостера

Аллен Селина
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Эффект Фостера

Жена моего брата

Рам Янка
1. Черкасовы-Ольховские
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Жена моего брата

Штуцер и тесак

Дроздов Анатолий Федорович
1. Штуцер и тесак
Фантастика:
боевая фантастика
альтернативная история
8.78
рейтинг книги
Штуцер и тесак

Любовь Носорога

Зайцева Мария
Любовные романы:
современные любовные романы
9.11
рейтинг книги
Любовь Носорога

Возвышение Меркурия

Кронос Александр
1. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия

Мастер Разума III

Кронос Александр
3. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Мастер Разума III

Виконт. Книга 4. Колонист

Юллем Евгений
Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.50
рейтинг книги
Виконт. Книга 4. Колонист

Перерождение

Жгулёв Пётр Николаевич
9. Real-Rpg
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Перерождение

Имперец. Том 1 и Том 2

Романов Михаил Яковлевич
1. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Имперец. Том 1 и Том 2

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Архонт

Прокофьев Роман Юрьевич
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.80
рейтинг книги
Архонт

Смерть может танцевать 4

Вальтер Макс
4. Безликий
Фантастика:
боевая фантастика
5.85
рейтинг книги
Смерть может танцевать 4

Кодекс Охотника. Книга XVI

Винокуров Юрий
16. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVI

Утопающий во лжи 3

Жуковский Лев
3. Утопающий во лжи
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Утопающий во лжи 3