- •Глава 4 Вычислительная модель логических программ
- •4.1. Унификация
- •4.2. Абстрактный интерпретатор логических программ
- •Упражнения к разд. 4.2
- •4.3. Дополнительные сведения
- •Глава 5 Теория логических программ
- •5.1. Семантика
- •5.2. Корректность программы
- •5.3. Сложность
- •5.4. Деревья поиска
- •5.5. Отрицание в логическом программировании
- •5.6. Дополнительные сведения
- •Часть II Язык Пролог
- •Глава 6 Чистый Пролог
- •6.1. Вычислительная модель Пролога
- •Нет (больше) решений
- •Упражнения к разд. 6.1
- •6.2. Сравнение с традиционными языками программирования
- •6.3. Дополнительные сведения
- •Глава 7 Программирование на чистом Прологе
- •7.1. Порядок правил
- •7.3. Порядок целей
- •7.5. Рекурсивное программирование в чистом Прологе
- •7.6. Дополнительные сведения
5.2. Корректность программы
Как было показано в разд. 5.1, каждая программа имеет вполне определенное значение. Это значение само по себе не может быть корректным или некорректным
Однако значение программы может совпадать или не совпадать с тем, к чему стремился программист. Таким образом, обсуждение корректности требует рассмотрения подразумеваемого значения программы. Наши предыдущие рассмотрения корректности и полноты всегда соотносились с некоторым подразумеваемым значением.
Напомним определения гл. 1. Подразумеваемое значение программы Р - это некоторое множество основных целей. С помощью подразумеваемого значения мы выделяем те цели, для вычисления которых программа и была создана. Программа P - корректна относительно подразумеваемого значения М, если М(Р) содержится в М. Программа Р полна относительно подразумеваемого значения М, если М содержится в М(Р). Таким образом, программа корректна и полна относительно подразумеваемого значения, если эти два значения полностью совпадают.
Другим важным вопросом, относящимся к логическим программам, является вопрос об остановке программы. Назовем областью любое; множество целей (не обязательно основных), замкнутое относительно построения примеров. То есть для любой области D, если А входит в D и А' - пример А, то А’ тоже входит в D.
Областью остановки, программы Р называется такая область D, что каждое вычисление программы Р с каждой целью из D заканчивается.
Обычно полезные программы должны иметь область остановки, охватывающую подразумеваемое значение. Однако поскольку вычислительная модель логических программ не зависит от порядка, в котором редуцируются цели в резольвенте, то большинство интересных логических программ имеют бессодержательную область остановки. Эта ситуация улучшится при рассмотрении языка Пролог. Ограничения, налагаемые на вычислительную модель Пролога, позволяют создавать нетривиальные программы с требуемыми областями остановки.
Рассмотрим программу 3.1 определяющую натуральныe числа. Программа останавливается для любой цели, принадлежащей базису Эрбрана. Однако в области{natural_namber(X)} программа не останавливается Это связано с возможностью незавершающегося вычисления, показанного на рис. 5.1.
При анализе любой логической программы полезно найти области, в которых программа останавливается. Для рекурсивных программ это обычно сделать не просто. Нам нужно ввести описание рекурсивных типов данных, пригодное для исследования проблемы остановки.
Напомним, что тип в соответствии с определением гл. 3 -это множество термов. Тип называется полным, если данное множество замкнуто относителыю построения
natural-number (X) X=s(Xl)
natural-number(Xl) Xl=s(X2)
natural-number(X2) X2=s(X3)
Рис. 5.1. Незавершающееся вычисление.
примеров. Каждому полному типу Т мы сопоставим неполный тип IT, состоящий из термов, имеющих примеры, входящие в Т, и имеющих примеры, не входящие в Т
Продемонстрируем применение этих понятий на примере определения областей остановки рекурсивных программ гл. 3, использующих рекурсивные типы. Приведем примеры определений полного и неполного типов для натуральных чисел и списков. Константа 0 и любой терм вида s(0) являются (полным) натуральным числом. Неполным натуральным числом является или переменная X, или терм вида s(X). Программа 3.2, задающая отношение , останавливается в области, состоящей из целей, у которых первый или второй аргумент (или оба) являются полным натуральным числом.
Список является полным, если любой пример данного списка удовлетворяет программе 3.11. Список неполный, если имеются примеры, удовлетворяющие программе 3.11, и примеры, не удовлетворяющие этой программе. Список [а,b,c], например, является полным списком (доказывается на рис. 3.3), в то время как переменная Х - неполный список. Два менее тривиальных примера: [а,X,с] -полный список, хотя и не основной, a [a. B \ Xs]- неполный.
Областью остановки программы, задающей append, является множество целей, у которых первый или третий аргумент (или оба) являются полными списками. Анализ областей других программ, обрабатывающих списки, проводится в разд. 7.2 при обсуждении проблемы остановки программ на Прологе.
Упражнения к разд. 5.2
Опишите область, в которой останавливается программа 3.3, задающая отношение plus.
Опишите полные и неполные бинарные деревья.