
- •Предисловие
- •Глава 1 Введение в Пролог
- •Глава 2 Синтаксис и унификация
- •2.1. Синтаксис термы
- •Константы
- •Переменные
- •Область действия переменных
- •Сложные термы, или структуры
- •Синтаксис операторов
- •Синтаксис списков
- •Синтаксис строк
- •Утверждения
- •Запросы
- •Ввод программ
- •2.2 Унификация
- •Глава 3 Арифметические выражения
- •3.1. Введение
- •3.2. Арифметические выражения
- •3.3. Арифметические операторы
- •3.4. Вычисление арифметических выражений
- •3.5. Сравнение результатов арифметических выражений
- •Глава 4 Рекурсия
- •4.1. Стратегия «разделяй и властвуй»
- •Пример 4.1.1
- •Фаза разбиения
- •Фаза решения задачи
- •4.2. Восходящая стратегия
- •4.3. Рекурсия и эффективность
- •Пример 4.3.2
- •Глава 5 Структуры данных
- •5.1. Списки списковая форма записи
- •А на запрос
- •Некоторые стандартные целевые утверждения для обработки списков
- •5.2. Бинарные деревья представление бинарных деревьев
- •Бинарное дерево на рис.5.2.1 имеет левое поддерево
- •Представление множеств с помощью бинарных деревьев
- •Будем называть линейным представление такого вида, как на рис.5.2.3, и сбалансированным - такое, как на рис.5.2.2.
- •Левому поддереву соответствует отсортированный список
- •Глава 6 Операторы
- •6.1. Операторы и структуры синтаксис операторов
- •Свойства операторов
- •6.2. Позиция операторов
- •6.3. Приоритет операторов
- •6.4. Ассоциативность операторов
- •6.5. Спецификаторы
- •6.6. Операторы объявления
- •6.7. Пример: вычисление многочленов
- •6.8. Системные операторы
- •Глава 7 Механизм возврата и процедурная семантика
- •7.1. Механизм возврата
- •7.2. Пример: задача поиска пути в лабиринте
- •Целевое утверждение не удается согласовать с первым утверждением
- •Если мы введем
- •Если затем мы введем
- •7.3. Обработка фактов с помощью механизма возврата
- •7.4. Предикат repeat
- •7.5. Декларативная и процедурная семантики
- •Характеристики процедуры
- •7.6. Вопросы эффективности
- •Глава 8 Отсечение
- •8.1. Почему используют отсечение?
- •8.2. Использование отсечения
- •Выдав запрос
- •Обратившись к системе с запросом
- •8.3. Ловушки отсечения
- •Глава 9 Встроенные предикаты
- •9.1. Встроенные предикаты
- •9.2. Обновление базы данных Пролога
- •Добавление и удаление утверждений
- •Считывание утверждений в базу данных
- •Предикаты сохранения и восстановления
- •9.3. Особенности ввода и вывода чтение символов
- •Запись символов
- •Считывание термов Предикаты
- •Запись термов
- •9.4. Обработка файлов
- •Редактирование программ на прологе
- •Распечатка предикатов
- •Глава 10 Модули. Пример разработки системы
- •10.1. Модули
- •Пример 10.1.1
- •10.2. Пример разработки системы: деревья решений
- •Описание дерева решений
- •Разработка системы
- •Целевое утверждение
- •Глава 11 Отладка
- •11.1. Трассировка
- •Включение и выключение механизма трассировки
- •Необязательные параметры трассировки
- •Предикаты трассировки
- •Режимы трассировки
- •11.2. Установка контрольных точек
- •Возможные действия в контрольной точке
- •Включение и выключение режима контрольных точек
- •Необязательные параметры режима контрольных точек
- •Предикаты для работы с контрольными точками
- •Режимы, связанные с контрольными точками
- •Основные отладочные предикаты
- •Статистическая информация
Целевое утверждение
уничт_список(Дуги,дуга(Д,Вид), Дуги2)
уничтожает дугу дуга(Д,Вид) в списке Дуги, в результате чего получается список Дуги2. Предикат уничт_список импортируется из модуля список.
Добавляя дугу, следует проверить, не содержится ли она уже в списке дуг:
доб_дугу(Вид,Д) :-
верш (Вид,В,Дуги),
принадлежит (Д,Дуги),!,
nl, write ('уже существует !!'),nl.
доб_дугу(Вид,дуга(Д,Вид2)) :-
верш (Вид2,_,_),
retract (верш (Вид, В, Дуги)),
assertz(верш(Вид,В,[дуга(Д,Вид2) | Дуги])),
nl,write ('дуга добавлена'),nl.
Утверждение уничт_дугу позволяет уничтожить дугу Д, выходящую из вершины с идентификатором Вид:
уничт_дугу (Вид, Д) : -
retract (верш(Вид, В, Дуги)),
уничт_список(Дуги,Д,Дуги2),
assertz (верш (Вид, В, Дуги2)),
nl,write('Дyra уничтожена') ,nl.
Будем говорить, что вершина Вид1 ведет к вершине Вид2, если имеет место одна из следующих трех ситуаций: Вид2 есть Вид1, Вид2 находится в конце дуги, выходящей из Вид1, или же вершина, находящаяся в конце дуги, выходящей из Вид1, ведет к Вид2. Доказательство целевого утверждения ведет заканчивается успехом, если существует путь, ведущий от дуги (первого аргумента утверждения) к вершине (второму аргументу). В противном случае доказательство завершается неудачей. При успешном доказательстве утверждения ведет в качестве третьего аргумента возвращается искомый путь.
ведет ([дуга(Д,Вид) | T],Вид2,II) :-
вести (Вид, Вид2,П),!.
ведет([_| Т],Вид2,П) :- ведет (Т,Вид2,П).
вести(Вид,Вид,[Вид,Вид]) :- !.
вести(Вид1,Вид2,[Вид1,Вид2]) :-
верш (Вид1,В,Дуги),
принадлежит (дуга (Д,Вид2),Дуги),!.
вести (Вид1,Вид2,[Вид1 | П]) :-
верш (Вид1,В,Дуги),
ведет(Дуги,Вид2,П),
Для того чтобы пройти по дереву, начиная с вершины СВид, нужно вывести на экран вопрос, содержащийся в вершине. Если вершина не имеет исходящих дуг, работа заканчивается. В противном случае система читает ответ пользователя и использует предикат принадлежит для выборки следующей вершины.
обход(СВид) :-
верш (СВид,В,Дуги),
обраб_дуги(Дуги,В).
обраб_дуги([] ,В) :- !,
писать_вопрос(В).
обраб_дуги(Дуги,В) :-
ввести_ответ(В,Дуги,Отв),
принадлежит(дуга(Отв,Вид),Дуги),
обход (Вид).
Ответ пользователя на вопрос, содержащийся в вершине, вводится с помощью следующего утверждения:
ввести_ответ(В,Дуги,Отв) :-
repeat,
писать_вопрос(В),
геаdb(Отв),
принадлежит(дуга(Отв,_),Дуги),!.
Предикат ввести_ответ гарантирует совпадение ответа пользователя хотя бы с одним ответом, расположенным на дуге.
Последнее, что нам осталось сделать, - это осуществить импорт предиката уничт_список из модуля список:
;- import(список, [уничт_список]).
Помимо предиката уничт_список, модуль список содержит и другие целевые утверждения для обработки списков.
:- module (список).
:-visa([visa,secure], [присоединить,...,
уничт_список,...])
…
…
уничт_список([] ,Е,[]) :-!.
уничт_список([Е | 'I'] ,E,T2) ;- !,
уничт_список (Т,E,T2).
уничт_список([H | T),E,[H | T2]) :-,
уничт_список(Т,Е,Т2).
…
…
:- endmodule(список).
Пример диалога. В заключение приведем пример типичного диалога пользователя с разработанной системой. Мы построим дерево, изображенное на рис. 10.2.1. и обойдем его в поисках решения.
ОК, дерево Пролога
?- меню.
Хотите ли вы:
1) загрузить дерево
2) сохранить дерево
3) добавить вершину
4) убрать вершину
5) добавить дугу
6) убрать дугу
7) посмотреть дерево
8) совершить обход дерева
9) выйти из системы
Введите 1-9 ? 3
Идентификатор новой вершины ? IВМ_портативная
Введите вопрос (в конце напишите слово 'конец'):
> > Вы должны купить портативную ЭВМ фирмы IBM.
> > Она стоит 1632 фунта стерлингов,
> > использует процессор 8088, имеет 256К
> > оперативной памяти
> >
> > конец
Сколько дуг имеет вершина ? 0 Хотите ли вы:
1) загрузить дерево
2) сохранить дерево
3) добавить вершину
4) убрать вершину
5) добавить дугу
6) убрать дугу
7) посмотреть дерево
8) совершить обход дерева
9) выйти из системы
Введите 1 - 9 ? 3
Идентификатор новой вершины ? sharp_pc7000
Введите вопрос (В конце напишите слово 'конец'):
> > Вы должны купить портативную ЭВМ фирмы
> > sharp_pc7000
> > Она стоит 2577 фунтов стерлингов,
> > использует процессор 8088, имеет 320К
> > оперативной памяти
> >
> > конец
Сколько дуг имеет вершина ? 0
Хотите ли вы:
1) загрузить дерево
2) сохранить дерево
3) добавить вершину
4) убрать вершину
5) добавить дугу
6) убрать дугу
7) посмотреть дерево
8) совершить обход дерева
9) выйти из системы
Введите 1 – 9 ? 3
Идентификатор новой вершины ? цена
Введите вопрос (В конце напишите слово 'конец'):
> > Сколько денег вы можете затратить на
> > покупку:
> > а. 2000 фунтов стерлингов
> > б. 3000 фунтов стерлингов
> > ?
> > конец
Сколько дуг имеет вершина? 2
Дуга 1
Ответ ? а
К вершине IВМ_портативная
Дуга 2
Ответ ? 6
К вершине ? sharp_pc7000
Хотите ли вы:
1) загрузить дерево
2) сохранить дерево
3) добавить вершину
4) убрать вершину
5) добавить дугу
6) убрать дугу
7) посмотреть дерево
8) совершить обход дерева
9) выйти из системы
Введите 1 – 9 ? 3
Идентификатор новой вершины ? карманная
Введите вопрос (В конце напишите слово 'конец'):
> > Должна ли ЭВМ помещаться в вашем кармане ?
> > конец
Сколько дуг имеет вершина ? 1
Дуга 1
Ответ ? нет
К вершине ? цена
Хотите ли вы:
1)загрузить дерево
2) сохранить дерево
3) добавить вершину
4) убрать вершину
5) добавить дугу
6) убрать лугу
7) посмотреть дерево
8) совершить обход дерева
9) выйти из системы
Введите 1 – 9 ? 7
Идентификатор вершины ? карманная
Показ дерева
??
[карманная]
нет
[цена]
б
[sharp_pc7000]
a
[IВМ_портативная]
Хотите ли вы:
1) загрузить дерево
2) сохранить дерево
3) добавить вершину
4) убрать вершину
5)добавить дугу
6) убрать дугу
7) посмотреть дерево
8) совершить обход дерева
9) выйти из системы
Введите 1 - 9 ? 3
Идентификатор новой вершины ? IВМ_совместимая
Введите вопрос (В конце напишите слово 'конец'):
> > Должна ли ЭВМ быть IBM - совместимой ?
> > конец
Сколько дуг имеет вершина? 0
Хотите ли вы
1)загрузить дерево
2) сохранить дерево
3) добавить вершину
4) убрать вершину
5) добавить дугу
6) убрать дугу
7) посмотреть дерево
8) совершить обход дерева
9) выйти из системы
Введите 1 – 9 ? 3
Идентификатор новой вершины ? портативная
Введите вопрос (В конце напишите слово 'кон칇ц'):
> > Должна ли ЭВМ быть портативной ?
> > конец
Сколько дуг имеет вершина ? 2
Дуга 1
Ответ ? да
К вершине ? карманная
Дуга 2
Ответ ? нет
К вершине ? IВМ_совместимая
Хотите ли вы:
1) загрузить дерево
2) сохранить дерево
3) добавить вершину
4) убрать вершину
5) добавить дугу
6) убрать дугу
7) посмотреть дерево
8) совершить обход дерева
9) выйти из системы
Введите 1 - 9 ? 7
Идентификатор вершины ? портативная
Показ дерева
??
[портативная]
нет
[IВМ_совместимая]
да
[карманная]
нет
[цена]
б
[sharp_pc7000]
a
[IВМ_портативная]
Хотите ли вы:
1) загрузить дерево
2) сохранить дерево
3) добавить вершину
4) убрать вершину
5) добавить дугу
6) убрать дугу
7) посмотреть дерево
8) совершить обход дерева
9) выйти из системы
Введите 1 - 9 ? 8
Идентификатор вершины ? портативная
Должна ли ЭВМ быть портативной ? да
Должна ли ЭВМ помещаться в вашем кармане? Нет
Сколько денег вы можете затратить на покупку:
а. 2000 фунтов стерлингов
б. 3000 фунтов стерлингов
? а
Вы должны купить портативную ЭВМ фирмы IBM,
Она стоит 1632 фунта стерлингов, использует
процессор 8088, имеет 256К оперативной памяти.
Хотите ли вы:
1) загрузить дерево
2) сохранить дерево
3) добавить вершину
4) убрать вершину
5) добавить дугу
6) убрать дугу
7) посмотреть дерево
8) совершить обход дерева
9) выйти из системы
Введите 1-9 ? 9
До свидания
да
?- q /* выход из системы Пролог */