Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Языки логического программирования. Учебное пособие
.pdf
Шаг 1. Пытаемся применить первое правило (факт)
App (nil, X1, X1) <-.
При отождествлении деревьев факта и запроса (см. рис. 8.1) получается
недопустимая подстановка nil=a.b.nil. Поэтому отождествление
невозможно, и этот шаг закончился неудачно.
Рис. 8.1.
Шаг 2. Пытаемся применить второе правило
App (U1.X1, Y1, U1.Z1) <- App (X1, Y1, Z1).
Структура этого запроса представлена на рис. 8.2. Отождествление
запроса и левой части правила возможны только при следующей
интерпретации, показанной на рис. 8.2. Делая подстановку в запросе и
заменяя на тело правила, получаем запрос:
App (b.nil, b.nil, Z1) <-.
Языки логического программированияВ.С. Рублев
81

Рис. 8.2.
Шаг 3. Структура запроса определена деревом на рис. 8.3. Попытка
применить правило 1 не дает результата, так как .
Рис. 8.3.
Шаг 4. Пытаемся применить правило 2:
App (U2.X2, Y1, U2.Z2) <- App (X2, Y2, Z2).
Отождествление запроса и левой части правила возможны только при
интерпретации, показанной на рис. 8.3. Делая подстановку в запрос и
заменяя на правую часть правила, получаем запрос:
Языки логического программированияВ.С. Рублев
82

<- App (nil, b.nil, Z2).
Структура его дерева показана на рис. 8.4.
Рис. 8.4.
Шаг 5. Пытаемся применить правило 1:
App (nil, X3, X3)<-.
Отождествление этого запроса и левой части правила возможны только
при интерпретации, показанной на рис. 8.4. Делая подстановку и
заменяя на тело правила, получаем пустой запрос, что свидетельствует
о благополучном завершении интерпретаций. Подставляя значение Z2 в
выражение для Z1, а затем значение Z1 - в выражение для X, получим X
= a.Z1 = a.b.Z2 = a.b.b.nil, что и требовалось.
Прежде всего отметим сходство Пролога с языками НАМ и Рефал. При
вычислениях имеется выражение (запрос Пролога), которое мы
обрабатываем поиском подходящей подстановки (правила Пролога) за
счет интерпретации переменных и подстановки его правой части (тела
правила, где переменные интерпретированы) в выражение (замена).
Правило остановки вычислений при успехе также похоже - нет уже ни
одной подстановки (применения правила), так как результирующий
запрос оказывается пустым. В неуспешном случае вычислений
вычисления НАМ могут длиться бесконечно - но также, как мы увидим,
Языки логического программированияВ.С. Рублев
83

могут неограниченно продолжаться вычисления Пролога, если не
предусмотреть защиты от этого.
Обратим теперь внимание на то, что в тех случаях, когда запрос
содержит несколько атомов, порядок их вычисления может быть любой,
но от этого может зависеть скорость вычислений, так как результаты
вычислений одного атома используются уже при вычислении другого
атома. То же самое можно сказать о порядке применения правил в
процедуре. Производя вычисления неуспешно, мы возвращаемся к
предыдущему выбору, т. е. как бы обходим дерево вычислений в том или
ином направлении. Так как от этого может зависеть скорость
вычислений, то различные реализации Пролога имеют различную
стратегию, и мы далее это рассмотрим.
В описанной нами семантике вычислений Пролога формально не
описано, как же находится интерпретация переменных при
отождествлении. Может быть несколько интерпретаций, а в
рассматриваемых примерах - только по одной. Поэтому сначала точно
опишем так называемый чистый недетерминированный Пролог, а затем
перейдем уже к реализациям Пролога.
Упражнения
1. Проведите для упражнения 3.6.1 пошаговые вычисления.
2. Проведите для упражнения 3.6.2 пошаговые вычисления.
3. Проведите для упражнения 3.6.3 пошаговые вычисления.
4. Проведите для упражнения 3.6.4 пошаговые вычисления.
5. Измените правила базы знаний из упражнения 3.6.1 так, чтобы
можно было выполнить запрос, строящий цепочки включающих
друг друга кодов, начиная от заданного программного кода.
Языки логического программированияВ.С. Рублев
84

Язык Пролог: чистый недетерминированный Пролог и
процедурная семантика
Синтаксис программ и запросов: формальные определения.
Подстановки: определение подстановки и результата ее применения к
разным выражениям Пролога; частный случай и вариант; унификатор
выражений и наиболее общий унификатор и их примеры;
интерпретация программы и модель программы; основная модель
программы; ответ и правильный ответ; множество всех правильных
ответов. Процедурная семантика: отношение выводимости запросов;
пространство вычислений и его представление в виде дерева.
Адекватность процедурной семантики.
Чистый недетерминированный Пролог
Синтаксис программ и запросов
Программа есть множество правил вида:
B0 <- B1,...,Bm (m >= 0);
где B0, B1,...,Bm – атомы, B0 – левая часть правила ( заголовок ),
B1,...,Bm – правая часть правила ( тело правила ). Тело правила
может быть пустым ( факт ).
Атом имеет следующий вид:
P (t1,...,tn);
где P – предикатный символ, – термы.
Терм – это либо переменная, либо константа, либо составной терм
f(t1,...,tk) ; где f – функциональный символ, а –
термы.
Запрос имеет вид:
Языки логического программированияВ.С. Рублев
85

<- C1,...,Cr (r > 0);
где – атомы. Каждая программа фиксирует множество
употребленных в ней предикатных символов. Только они могут
использоваться в запросах к ней.
Введем обозначения:
T – множество термов программы ;
U – множество атомов программы ;
Th – множество термов без переменных (основных);
Uh – множество атомов без переменных.
Подстановки
Семантика Пролога определяется через подстановки. Подстановка - это
функция, действующая из множества X переменных в множество T
термов программы:
(при этом каждой переменной ставится в соответствие терм
).
как функция продолжается на множество всех интересующих нас
выражений:
Результат применения подстановки к выражению e называется
Языки логического программированияВ.С. Рублев
86

частным случаем e. Частный случай есть вариант, если e и
различаются только именами переменных.
Унификатором выражений A1 и A2 называется подстановка для
которой .
Наиболее общим унификатором (НОУ) называется унификатор что
для любого другого унификатора атом является частным
случаем (т. е. ).
Пример 1. Атомы P (f (X, a, g(b, Y)), b) и P (f
(b,a,Z), X) имеют следующий НОУ:
и результат подстановки P( f(b, a, g(b, Y)), b). Функция
является унификатором, но не НОУ (ее результат P( f(b, a, g(b,
a)), b) - частный случай результата подстановки
Пример 2. Атомы P (a, b) и P (b, X) не имеют НОУ (первые
термы у них - различные константы).
Перейдем теперь к интерпретациям. Подмножество
(атомов без переменных, т. е. фактов) называется интерпретацией
программы.
Интерпретация I называется моделью программы S, если для любого
правила и любой подстановки где
- атом без переменных, имеет место:
Языки логического программированияВ.С. Рублев
87

.
Пусть M(S) - множество всех моделей программы S. Нетрудно видеть,
что пересечение двух любых моделей программы S также является
моделью этой программы. Действительно, пересечение двух моделей (и
потому интерпретаций ) как множеств фактов без переменных также
представляет собой множество фактов без переменных, а потому
интерпретацию. Так как для исходных моделей подстановка превращает
некоторое правило в правило без переменных, то атом без переменных
в заголовке правила принадлежит обеим интерпретациям, а
следовательно, их пересечению, что и требуется для подтверждения
выполнения условия модели.
Наименьшая из всех моделей множества M(S) называется основной
моделью IS.
Рассмотрим запрос <- C1,..., Cr, и пусть X1,..., Xk - все
переменные запроса и для некоторой подстановки и интерпретации
I имеет место включение
(т. е. формула - истинна в I). Тогда кортеж термов
<t1,..., tk>, где , называется ответом на
запрос интерпретации I.
Ответ называется правильным ответом, если он является ответом
основной модели (и для любой другой, конечно).
Множество всех правильных ответов - это k -арное отношение на
множестве Th термов без переменных, т. е. на множестве всех объектов.
Если k=0, то при ответ Да, а иначе ответ
Нет (0-арное отношение).
Процедурная семантика
Языки логического программированияВ.С. Рублев
88

Прежде всего опишем шаг вычислений. Пусть запрос Q имеет вид
Q = <- C1 ..., Cj,..., C
r
и в нем выделен атом Cj и правило
l' = B0 <- B1,..., Bm (m >= 0),
которое является вариантом правила l программы (все переменные
отличны от переменных запроса Q ).
Если - НОУ для C_j и B0, то будем говорить, что запрос
выводим из Q (с помощью правила l и подстановки ). Получение Q
'
из Q - элементарный шаг вычислений в Прологе (он может закончиться
и неудачей). Производительность Пролог-машины измеряют
количеством таких шагов в секунду (единица LIPS - Logic Interference Per
Second).
Пространством вычислений называется множество возможных
запросов с заданным отношением выводимости. При вычислении
запроса Q мы образуем последовательность запросов:
так, что Q1=Q и Q
i+1
выводим из Qi (i=1, 2,...). Если из Qn не
выводим ни один запрос, то вычисления закончены (в некоторых
случаях процесс вычислений может идти неограниченно). При
окончании вычислений возможны 2 случая:
1. Qn - непустой запрос, тогда вычисление тупиковое (неудачное).
2. Qn - пустой запрос, тогда успешное вычисление.
В случае тупикового вычисления мы выбираем следующее подходящее
правило, а в случае успешного вычисления мы находим подстановку
Языки логического программированияВ.С. Рублев
89

,
где - подстановка, с помощью которой запрос Q
i+1
выводим из
запроса Qi.
Пространство вычислений запроса естественно представить деревом, в
котором вершины отвечают запросам, а дуги - выводимости. На рис. 9.1
приведено дерево вычислений для примера 2 из предыдущего раздела.
Рис. 9.1.
Адекватность процедурной семантики
Теперь нам надо показать, что в описанной процедурной семантике
Пролога мы получаем все необходимое и только это.
Пусть X1,..., Xk - все переменные запроса Q и - успешное
вычисление Q, а - соответствующая подстановка, полученная в
процессе этого вычисления. Тогда кортеж ответ, выдаваемый вычислением Справедливы следующие
Языки логического программированияВ.С. Рублев
90
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
