- •Глава 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. Дополнительные сведения
Упражнения к разд. 4.2
1.Постройте протоколы решения цели sort([3,1,2]Xs)?при сортировке перестановкой (3.20),сортировке вставкой (3.21)и быстрой сортировке.
2.Постройте протокол решения цели derivative(3*sin(x) – 4*cos(x, D))при использовании программы 3.29для отношения derivative.
3.Потренируйтесь в разработке протоколов для своих программ.
4.3. Дополнительные сведения
Унификация играет центральную роль при автоматическом поиске вывода иипользовании логического вывода в искусственном интеллекте. Впервые унификация описана основополагающей работе Робинсона (Robinson, 1965). Алгоритм унификации был объектом исследования во многих работах, например: (Martelli, Montanari, 1982), (Paterson Wegman • 1978) и (Dwork et al, 1984). Типичное учебное изложение приводится в книгах (Bundy, 1983) (Nilsson, 1980).
Доказательство произвольности выбора редуцируемой цели в резолюции можно наити в работах (Apt, van Emden, 1982) или (Lloyd, 1984).
В работе (Plaisted, 1984) предложен метод, позволяющий заменить проверку на вхождение на стадии выполнения программ на анализ программы в процессе компиляции.
Были предприняты попытки избавиться в унификации от избыточных проверок на вхождения в практических реализациях Пролога. Так, в работе (Colmerauer, 1982b) излагается теоретическая модель подобной унификации, допускающая вычисления с бесконечными термами.
Новое использование унификации без проверки на вхождения приведено в работе (Eggert, Chow, 1983);при этом возникают изящные структуры, подобно рисункам Эшера уводящие в бесконечность.
Глава 5 Теория логических программ
Теория логических программ непрерывно развивается. В этой главе будут затронуты пять тем: семантика, корректность, сложность, деревья поиска и отрицание. Результаты приводятся без доказательств.
5.1. Семантика
Семантика сопоставляет значение с программой. Обсуждение семантики позволит нам более формально описывать отношение, вычисляемое программой. В первой главе значение программы неформально определялось как множество основных примеров, выводимых из Р путем конечного числа применения обобщенного правила modus ponens. В данном разделе используется более формальный подход.
Операционная семантика позволяет процедурно описывать значение программы, Операционное значение логической программы Р - это множество основных целей, являющихся примерами вопросов, которые программа Р решает с помощью абстрактного интерпретатора, приведенного на рис. 4.2. Это альтернативное определение ранее данному определению, определяющему значение в терминах логической выводимости.
Декларативная семантика логических программ основана на стандартной теоретико-модельной семантике логики первого порядка. Для ее описания потребуется некоторая новая терминология.
Пусть P - логическая программа. Универсуум Эрбрана программы P, обозначаемыйU(P) – это множество всех основных термов, которые могут быгь построены из констант и функциональных символов, входящих в Р. Пусть, например, Р - программа 3.1, определяющая натуральные числа:
natura_number(0).
natural_number (s(X)) natural number (X).
В программе имеется один символ константы - 0 и один унарный функциональный символ – s.Универсум Эрбрана U(Р) данной программы есть {0.s (0),(s(s0)),...}. В общем случае универсуум Эрбрана бесконечен, если в программу входит хотя бы один функциональный символ. Если в программу не входят символы констант, то выбирается произвольным образом одна константа.
Базис Эрбрана, обозначаемый В(Р), есть множество всех основных целей,которые можно построить с помощью предикатов программы Р и термов универсуума Эрбрана. Если универсуум Эрбрана бесконечен, то бесконечен и базис Эрбрана. В нашем примере программа содержит один предикат – natural_numher. Базис Эрбрана - {nalural_number (0), natural_numher (s (0)),...}.
Интерпретация логической программы - это некоторое подмножество базиса Эрбрана. Интерпретация сопоставляет истинность и ложность элементам базиса Эрбрана. Цель, принадлежащая базису Эрбрана, является истинной относительно данной интерпретации, если цель входит в данную интерпретацию, в противном случае цель является ложной.
Интерпретация I является моделью логической программы, если каждый основной пример А В,...,B правила программы удовлетворяет следующему свойству: если В,...,B принадлежат I, то и А принадлежит I. Интуитивно ясно, что моделями являются интерпретации, согласованные с декларативным пониманием предложений программы.
В нашем примере цель natural_number(0) должна входить в каждую модель; кроме того, если natural_number(X) принадлежит модели, то и natural_numher(s(Х)) принадлежит модели. Таким образом, любая модель программы 3.1 содержит весь базис Эрбрана.
Легко заметить, что пересечение двух моделей логической программы Р также является моделью. Это свойство позволяет определить пересечение всех моделей. Модель, полученная пересечением всех моделей, называется минимальной моделью и обозначается М(Р). Минимальная модель и есть декларативное значение программы.
Декларативное значение программы для natural_number, т.е. ее минимальная модель, совпадает с полным базисом Эрбрана - {natural_number (0),natural_number,(s (0)), natural_number (s (s (0))),...}.
Рассмотрим декларативное значение программы 3.15, определяющей отношение append:
append([X \ Xs], Ys,[_X \ Zs}}- append(Xs, Ys,Zs).
append( [ ],Ys,Ys).
Универсуум Эрбрана-[ ], [[ ]], [[ ], [ ]], иными словами, все списки, которые можно построить, используя константу [ ]. Базис Эрбрана - все комбинации списков с предикатом append. Декларативное значение - все основные примеры цели append([ ],Xs,Xs\ т.е. append{[ ],[ ],[ ]), append([ ],[[ ]],[[ ]]),..., а кроме того, такие цели, как append([[ ]],[ ],[[ ]]), логически следующие ввиду применения (применений) правила. В данном случае значение будет лишь подмножеством базиса Эрбрана. Цель append([ ],[ ],[[ ]]), например, не принадлежит значению программы, хотя и принадлежит базису Эрбрана.
Денотационная семантика устанавливает значения программам, основываясь на объединении программы с функцией, определенной в области вычисления программы. Значение программы определяется как наименьшая неподвижная точка функции, если такая точка существует. Областью вычислений логических программ являются интерпретации.
Для заданной логической программы Р имеется естественная функция Т. отображающая интерпретации в интерпретации и определенная следующим образом:
T(I) = {А \ А принадлежит В(Р), А В, В,...,В
п0.-основной пример предложения в Р, В, В,...,В, принадлежат I}.
Данное отображение монотонно, так как если интерпретация I содержится в интерпретации J, то Т(1) содержится в Т(J).
Это отображение позволяет описать модели иным способом. Интерпретация I является моделью в том и только в том случае, если Т (I ) содержится в /
Данное отношение является не только монотонным, но и непрерывным (понятие непрерывности здесь не определяется). Эти два свойства гарантируют, что для каждой логической программы Р отображение Tимеет наименьшую неподвижнуюточку, которая и является значением, определяемым денотационной семантикой программыР.
К счастью, все различные определения семантики в действительности описывают один и тот же объект. Показано, что операционная, денотационная и декларативная семантики совпадают. Это позволяет нам определить - значение логической программы как минимальную модель программы.