
- •Семинар №4. Использование структур: примеры
- •4. 1. Получение структурированной информации из базы данных
- •4. 2. Абстракция данных
- •4. 3. Моделирование недетерминированного автомата
- •4. 4. Планирование поездки
- •4. 5. Задача о восьми ферзях
- •4. 5. 2. Программа 2
- •4. 5. 3. Программа 3
- •4. 5. 4. Заключительные замечания
- •Упражнения
- •Допускается( s, [ ], _ ) :- конечное( s).
4. 5. 4. Заключительные замечания
Три решения задачи о восьми ферзях показывают, как к одной и той же задаче можно применять различные подходы. Мы варьировали также и представление данных. В одних случаях это представление было более экономным, в других - более наглядным и, до некоторой степени, избыточным. К недостаткам более экономного представления можно отнести то, что какая-то информация всякий раз, когда она требовалась, должна была перевычисляться.
В некоторых случаях основным шагом к решению было обобщение задачи. Как ни парадоксально, но при рассмотрении более общей задачи решение оказывалось проще сформулировать. Принцип такого обобщения - стандартный прием программирования, и его можно часто применять.
Из всех трех программ третья лучше всего показывает, как подходить к общей задаче построения структуры из заданного множества элементов при наличии ограничений.
Возникает естественный вопрос: " Какая из трех программ наиболее эффективна?" В этом отношение программа 2 значительно хуже двух других, а эти последние - одинаковы. Причина в том, что основанная на перестановках программа 2 строит все перестановки, тогда как две другие программы способны отбросить плохую перестановку не дожидаясь, пока она будет полностью построена. Программа 3 наиболее эффективна. Она избегает некоторых арифметических вычислений, результаты которых уже сразу заложены в избыточное представление доски, используемое этой программой.
Упражнения
4. 1. Напишите вопросы для поиска в базе данных о семьях.
(а) семей без детей;
(b) всех работающих детей;
(с) семей, где жена работает, а муж нет,
(d) всех детей, разница в возрасте родителей которых составляет не менее 15 лет.
4. 2. Определите отношение
близнецы( Ребенок1, Ребенок2)
для поиска всех близнецов в базе данных о семьях.
4. 3. Завершите определение отношения nребенок, определив отношение
n_элемент( N, Список, X)
которое выполняется, если Х является N-м элементом списка Список.
4. 4. Почему не могло возникнуть зацикливание модели исходного автомата на рис. 4.3, когда в его графе переходов не было "спонтанного цикла"?
4. 5. Зацикливание при вычислении допускается можно предотвратить, например, таким способом: подсчитывать число переходов, сделанных к настоящему моменту. При этом модель должна будет искать пути только некоторой ограниченной длины. Модифицируйте так отношение допускается. Указание: добавьте третий аргумент - максимально допустимое число переходов:
допускается( Состояние, Цепочка, Макс_переходов)
4. 6. При поиске решения программа, приведенная на рис. 4.7, проверяет различные значения Y-координат ферзей. В каком месте программы задается порядок перебора альтернативных вариантов? Как можно без труда модифицировать программу, чтобы этот порядок изменился? Поэкспериментируйте с разными порядками, имея в виду выяснить, как порядок перебора альтернатив влияет на эффективность программы.
4. 7. Пусть поля доски представлены парами своих координат в виде X/Y, где как X, так и Y принимают значения от 1 до 8.
(а) Определите отношение ходконя( Поле1, Поле2), соответствующее ходу коня на шахматной доске. Считайте, что Поле1 имеет всегда конкретизированные координаты, в то время, как координаты поля Поле2 могут и не быть конкретизированы. Например:
?- ходконя( 1/1, S).
S = 3/2; S = 2/3;
no (нет)
(b) Определите отношение путьконя( Путь), где Путь - список полей, представляющих соответствующую правилам игры последовательность ходов коня по пустой доске.
(с) Используя отношение путьконя, напишите вопрос для нахождения любого пути, состоящего из 4-х ходов, и начинающегося с поля 2/1, а заканчивающегося на противоположном крае доски (Y= 8). Этот путь должен еще проходить после второго хода через поле 5/4.
ОТВЕТЫ
4. 1
(a) ?- семья(членсемьи( _, Фамилия, _, _ ), _, [ ]).
(b) ?- ребенок( членсемьи( Имя, Фамилия, _, работает( _, _ ) )).
(c) семья(членсемьи( _, Фамилия, _, неработает), членсемьи( _, _, _, работает( _, _ ) ),_ ).
(d) ?- семья( Муж, Жена, Дети), датарождения( Муж, дата( _, _, Год1) ), датарождения( Жена, дата( _, _, Год2) ), ( Год1 - Год2 >= 15; Год2 - Год1 >= 15 ), принадлежит( Ребенок, Дети).
4. 2
близнецы( Ребенок1, Ребенок2) :-семья( _, _, Дети), удалить( Ребенок1, Дети, ДругиеДети), % Выделить первого ребенка принадлежит( Ребенок2, ДругиеДети), принадлежит( Ребенок1, Дата), принадлежит( Ребенок2, Дата).
4. 3
n_элемент( 1, [X | L], X). % X - первый элемент списка [X | L]
n_элемент( N, [Y | L], X) :- N1 is N - 1, n_элемент( N1, L, X). % X - n-й элемент [Y | L]
4. 4 Входная цепочка укорачивается на каждом неспонтанном цикле, а укорачиваться бесконечно она не может.
4. 5