
- •Управление перебором
- •5. 1. Ограничение перебора
- •5. 1. 1. Эксперимент 1
- •5. 1. 2. Эксперимент 2
- •5. 2. Примеры, использующие отсечение
- •5. 2. 1. Вычисление максимума
- •5. 2. 2. Процедура проверки принадлежности списку, дающая единственное решение
- •5. 2. 3. Добавление элемента к списку, если он в нем отсутствует (добавление без дублирования)
- •5. 2. 4. Задача классификации объектов
- •5. 3. Отрицание как неуспех
- •5. 4. Трудности с отсечением и отрицанием
- •Упражнения
Упражнения
5. 1. Пусть есть программа:
р( 1). р( 2) :- !. р( 3).
Напишите все ответы пролог-системы на следующие вопросы:
(a) ?- р( X). (b) ?- р( X), p(Y). (c) ?- р( X), !, p(Y).
5. 2. Следующие отношения распределяют числа на три класса - положительные, нуль и отрицательные:
класс( Число, положительные) :- Число > 0. класс( 0, нуль). класс( Число, отрицательные) :- Число < 0.
Сделайте эту процедуру более эффективной при помощи отсечений.
5. 3. Определите процедуру
разбить( Числа, Положительные, Отрицательные)
которая разбивает список чисел на два списка: список, содержащий положительные числа (и нуль), и список отрицательных чисел. Например,
разбить( [3, -1, 0, 5, -2], [3, 0, 5], [-1, -2] )
Предложите две версии: одну с отсечением, другую - без.
5. 4. Даны два списка Кандидаты и Исключенные, напишите последовательность целей (используя принадлежит и not), которая, при помощи перебора, найдет все элементы списка Кандидаты, не входящие в список Исключенные.
5.5. Определите отношение, выполняющее вычитание множеств:
разность( Множ1, Множ2, Разность)
где все три множества представлены в виде списков. Например,
разность( [a, b, c, d], [b, d, e, f], [a, c] )
5. 6. Определите предикат
унифицируемые( Спис1, Терм, Спис2)
где Спис2 - список всех элементов Спис1, которые сопоставимы с Терм'ом, но не конкретизируются таким сопоставлением. Например:
?- унифицируемые( [X, b, t( Y)], t( a), Спис).
Спис = [ X, t( Y)]
Заметьте, что и Х и Y должны остаться неконкретизированными, хотя сопоставление с t( a) вызывает их конкретизацию. Указание: используйте not ( Терм1 = Терм2). Если цель Терм1 = Терм2 будет успешна, то not( Терм1 = Tepм2) потерпит неудачу и получившаяся конкретизация будет отменена!