Приведенные выше три решения задачи с восемью ферзями показывают, что к одной и той же проблеме часто можно подходить с разных сторон. Кроме того, в этих решениях использовались различные представления данных. Иногда такое представление было более экономичным, а иногда — более явным и частично избыточным. Недостатком более экономичного представления является то, что при его использовании всегда требуется вновь восстанавливать изъятую из него информацию, когда в ней возникает необходимость.
В некоторых случаях ключом к успешному решению задачи явилось ее обобщение. Как это ни парадоксально, но при рассмотрении более общей проблемы решение часто становится проще. Такой принцип обобщения является своего рода стандартным приемом, который может часто применяться ча практике.
Из этих трех программ третья является наиболее ярким примером того, как подойти к решению общей проблемы формирования структуры из заданного множества элементов с учетом ограничений.
Возникает резонный вопрос о том, какая из этих трех программ является наиболее эффективной. С этой точки зрения программа 2 обладает намного более низкими характеристиками по сравнению с двумя другими программами, которые примерно равнозначны друг другу. Причина этого состоит в том, что в программе 2, основанной на использовании перестановок, формируется полный набор перестановок, а две другие программы обладают способностью распознавать и отбрасывать небезопасные перестановки еще тогда, когда они сформированы лишь частично. В программе 3 исключены некоторые арифметические вычисления, поскольку необходимость в них, по сути, отсутствует благодаря избыточному представлению координат на доске, используемому в данной программе.
Упражнение
4.7. Предположим, что клетки шахматной доски представлены парами их координат в форме X/Y, где X и Y находятся з пределах 1-8.
а) Определите отношение iunp(Squarel, Square2), соответствующее ходу конем на шахматной доске. Предположим, что переменная Squarel всегда конкретизируется значениями координат некоторой клетки, a Square2 может оставаться не конкретизированной, например, следующим образом:
?- jump< 1/1, 5). S = 3/2; 5 = 2/3; но
Глава 4. Использование структур; примеры программ
б) Определите отношение knightpath(Path), где Path - список клеток,
который представляет один из допустимых путей прохождения коня по
пустой шахматной доске.
в) Используя отношение knightpath, запишите вопрос для поиска любого пу
ти движения коня, состоящего из четырех ходов от клетки 2/1 до противо
положного края доски (Y = 8), который проходит через клетку 5/4 после
второго хода.
Резюме
Примеры, приведенные в этой главе, демонстрируют некоторые перечисленные ниже важные особенности и характерные свойства программирования на языке Prolog.
• Любая база данных может быть естественным образом представлена как мно
жество фактов Prolog.
• Механизмы запроса и согласования системы Prolog могут разнообразными способами применяться для выборки структурированной информации из базы данных. Кроме того, могут быть легко определены вспомогательные процедуры для дальнейшего упрощения взаимодействия с определенной базой данных.
• Абстрагирование данных может рассматриваться как метод программирования, который позволяет упростить использование сложных структур данных и вносит свой вклад в обеспечение создания более понятных программ. В языке Prolog можно легко реализовать фундаментальные принципы абстрагирования данных.
• Такие абстрактные математические конструкции, как конечные автоматы,
часто можно непосредственно преобразовать в исполняемые определения
Prolog.
• Как показывает пример задачи с восемью ферзями, к решению одной и той же
проблемы можно подойти разными способами, определяя различные представ
ления этой проблемы. Введение избыточности в представление часто позволя
ет уменьшить объем вычислений. В этом проявляется один из компромиссов
между требованиями к пространству и времени.'
• Важным шагом в поиске решения часто становится обобщение проблемы. Как
это ни парадоксально, но при рассмотрении более общей проблемы формули
ровка решения может упроститься.
Часть I. Язык Prolog