Опубликован: 12.02.2014 | Доступ: свободный | Студентов: 818 / 236 | Длительность: 11:22:00
Специальности: Программист
Лекция 2:

Машина вывода Пролога

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >
Аннотация: Изучается устройство вычислений в языке Пролог. Дается представление о машине вывода Пролога. Рассматривается конструкция сложных термов и понятие отрицания в языке Пролог. Показывается, как использовать трассировку в PIE и отладчик системы Visual Prolog.

Данная глава посвящена устройству вычислений в Прологе. Дается представление о машине вывода Пролога. Рассматривается конструкция сложных термов и понятие отрицания в языке Пролог. Показывается, как использовать трассировку в PIE и отладчик системы Visual Prolog.

Основными механизмами машины вывода Пролога являются унификация и откат. При унификации термов и атомарных формул находится наибольший общий унификатор. Откат используется для поиска всех решений.

2.1. Унификация

Формулы A и B называются унифицируемыми, если существует такая подстановка \theta термов вместо переменных, что A\theta = B\theta. Подстановка ? называется при этом унификатором формул A и B.

Например, формулы p(x) и p(y) унифицирует любая из подстановок \{x = y\} и \{x = a, y = a\}.

Композицией подстановок \theta_1 и \theta_2 называется подстановка \theta = \theta_1 \theta_2, которая получается из подстановки \theta_1 применением к ее равенствам подстановки \theta_2, так что равенства x = t преобразуются в равенства x = t\theta_2, с последующим удалением равенств вида y = y, и добавлением равенств z = s из \theta_2 для переменных z, не встречающихся в левых частях равенств z = r в подстановке \theta_1.

Например, композицией подстановок \{x = y\} и \{y = a\} является подстановка \{x = a, y = a\}.

Унификатор \theta формул A и B называется наибольшим общим унификатором, если для любого другого унификатора \theta_1 этих формул найдется такая подстановка \theta_22, что \theta_1=\theta \theta_2.

Например, наибольшим общим унификатором формул p(x) и p(y) является подстановка \theta = \{x = y\}. Если, в частности, \theta_1 = \{x = a, y = a\}, то, взяв \theta_2 = \{y = a\}, получим: \theta \theta_2=\theta_1.

Построение наибольшего общего унификатора двух формул сводится к последовательному выявлению и устранению их различий.

Множество рассогласований формул A и B — это самая левая пара несовпадающих термов, стоящих в этих формулах на одинаковых позициях.

Например, множество рассогласований формул p(x, f(g(y, h(z)), b)) и p(x, f(g(y, a), c)) равно \{h(z), a\}.

Алгоритм поиска наибольшего общего унификатора \theta формул A и B заключается в следующем. На нулевой итерации полагается \theta_0=\varnothing, A_0 = A и B_0 = B. На итерации k, начиная с k = 0, выполняются следующие действия:

  1. если A_k = B_k, то алгоритм завершает свою работу, и наибольший общий унификатор полагается равным \theta_k, иначе находится множество рассогласований D_k формул A_k и B_k и выполняется переход к шагу 2;
  2. если D_k содержит переменную x и терм t, в который не входит переменная x, то строится подстановка \sigma_k=\{x=t\} и выполняется переход к шагу 3, иначе алгоритм завершает свою работу — формулы A и B не унифицируемы;
  3. вычисляются формулы A_{k + 1} = A_k\sigma_k и B_{k + 1} = B_k?_k и подстановка \theta_{k + 1} = \theta_k\sigma_k и выполняется переход к итерации k + 1.

Например, найдем наибольший общий унификатор формул p(x, x, f(g(a))) и p(y, b, f(z)) с переменными x, y и z и константами a и b. Множество рассогласований имеет вид: \{x, y\}. Применим к формулам подстановку \{x = y\} и получим формулы p(y, y, f(g(a))) и p(y, b, f(z)). Множество рассогласований этих формул равно \{y, b\}. Соответственно, применим к этой паре формул подстановку \{y = b\} и получим формулы p(b, b, f(g(a))) и p(b, b, f(z)). Множество рассогласований последних формул выглядит следующим образом: \{g(a), z\}. Применим к данным формулам подстановку \{z = g(a)\} и получим полностью совпадающие формулы, равные p(b, b, f(g(a))). Наибольший общий унификатор \theta равен композиции подстановок:

\theta = \{x = y\}\{y = b\}\{z = g(a)\} = \{x = b, y = b, z = g(a)\}.

2.2. Процедурная семантика логической программы

Процедурная семантика программы отвечает на вопрос, как устроены вычисления. Вычисления в классическом случае проводятся в соответствии с методом SLD-резолюции (Selected Linear Defined Resolution) [7, 9].

Пусть Q = ?- C_1, …, C_{i – 1}, C_i, C_{i + 1}, \dots, C_m — запрос к логической программе, B_0:- B_1, \dots, B_n — вариант D правила A_0:- A_1, \dots, A_n, такой что в нем и в запросе нет совпадающих переменных, и \theta — наибольший общий унификатор формул C_i и B_0.

SLD-резольвентой запроса Q и правила D с подстановкой \theta называется запрос Q = ?- (C_1, \dots, C_{i – 1}, B_1, \dots, B_n, C_{i + 1}, \dots, C_m)\theta.

Положим Q_0 = Q. Частичным SLD-резолютивным вычислением называется последовательность троек (D_i, \theta_i, Q_i), в которой Q_i является SLD-резольвентой запроса Q_{i – 1} и правила D_{i – 1} с подстановкой \theta_{i – 1}. Такое вычисление называется успешным, если на некотором шаге n получается пустой дизъюнкт: Q_n=\Box. Ответом на запрос, в случае успешного вычисления, является композиция подстановок \theta = \theta _1\theta _2\dots\theta _n, ограниченная переменными запроса Q.

Процедурным значением программы является множество простых замкнутых целей из эрбранова базиса, которые выводятся из программы с помощью SLD-резолютивного вывода. Вернемся к программе (см. п. 1.1):

млекопитающее("слон").
млекопитающее("зебра").

животное("страус").
животное("уж").
животное(X):- млекопитающее(X).

Рассмотрим цель Q_0 = ?- животное(слон). SLD-резольвентой этого запроса и правила D_0 вида животное(A):- млекопитающее(A) с подстановкой \theta_0= \{A = слон\} является запрос Q_1 = ?- млекопитающее(слон). SLD-резольвентной этого запроса и правила с пустым телом D_1 млекопитающее(слон) с пустой подстановкой является пустой запрос. Таким образом, цель животное(слон) выводится из программы. Легко проверить, что все цели из минимальной модели I_0 выводятся из программы, а остальные цели из эрбранова базиса не выводятся. Это верно и в общем случае: декларативное и процедурное значения классической логической программы совпадают.

Пространство вычислений в классическом Прологе представляется в виде дерева, вершинами которого являются SLD-резольвенты родителя и одного из правил, а ребра соответствуют унифицирующим постановкам. Корень дерева — это цель программы. Листьями являются пустые запросы, которые завершают успешные вычисления, и запросы, не имеющие SLD-резольвент, которые завершают тупиковые вычисления (рис. 2.1). Это дерево называется деревом SLD-резолютивных вычислений.

 Дерево SLD-резолютивных вычислений для запроса животное(A)

Рис. 2.1. Дерево SLD-резолютивных вычислений для запроса животное(A)

Вычисления в языке Пролог соответствуют обходу дерева в глубину. Правила программы упорядочиваются сверху вниз. Выделяется самая левая подцель запроса, затем на каждом шаге вычисления к нему применяется первое еще неиспользованное правило программы для данного предикатного символа, при этом в стеке запоминается возможное разветвление — следующее правило. Когда вычисление заходит в тупик или успешно завершается, происходит возврат в точку последнего разветвления, при этом результаты всех предыдущих подстановок отменяются. Вычисления заканчиваются, когда стек разветвлений становится пустым. Недостатком такой стратегии является существование возможности попасть на бесконечную ветвь дерева вычислений, с которой программа не может выбраться, теряется полнота вычислений. Полнотой обладает обход дерева в ширину, он обнаруживает все успешные вычисления произвольного запроса. Но обход в ширину требует слишком большого расхода памяти, поэтому стандартной стратегией вычислений в Прологе является поиск в глубину.

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >
Жаныл Айкын
Жаныл Айкын
Rustam Inatov
Rustam Inatov

Доброго времени суток, подскажите пожалуйста, visual prolog examples, pie, vip7.5 - это все, где я могу скачать? (в смысле) может быть на сайте есть какой-то архив? Увы я не нашел его.

Подскажите, пожалуйста.

С уважением, Рустам.