Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы программирования на языке Пролог. Учебное пособие
.pdf
совпадает с термом), ,x/a,y/b (потому что заменяемая переменная из
подстановки совпадает с заменяемой переменной из подстановки
). Получим ответ: .
Подстановка называется более общей, чем подстановка если
существует такая подстановка что .
Подстановка называется унификатором простых выражений A и B,
если . Про A и B в такой ситуации говорят, что они
унифицируемы. Унификация используется в Прологе для композиции и
декомпозиции структур данных.
Пример. A=p(f(x),z) и B=p(y,a) унифицируемы. Можно взять в
качестве их унификатора подстановку {y/f(x),z/a} или
подстановку {y/f(a),x/a,z/a}.
Вообще говоря, две формулы могут иметь бесконечно много
унификаторов. Унификатор называют наиболее общим (или
простейшим ) унификатором простых выражений A и B, если он
является более общей подстановкой, чем все другие унификаторы
простых выражений A и B.
Пример. В рассмотренном выше примере наиболее общим
унификатором является подстановка {y/f(x),z/a}.
Пусть S — конечное множество простых выражений. Определим
множество d(S) разногласий (рассогласований). Зафиксируем самую
левую позицию, на которой не во всех выражениях из S стоит один и
тот же символ. Занесем в d(S) подвыражения выражений из S,
начинающиеся с этой позиции.
Пример. Пусть S=
{p(f(x),h(y),a),p(f(x),z,a),p(f(x),h(y),b)}.
Множество рассогласований для S d(S)={h(y),z}.
Алгоритм унификации
Дадим алгоритм поиска наиболее общего унификатора для конечного
Основы программирования на языке ПрологШрайнер П.А.
21

множества простых выражений S. В том случае, если это множество не
унифицируемо, алгоритм должен обнаруживать эту ситуацию.
Шаг 1. Полагаем k=0, .
Шаг 2. Если — одноэлементное множество, останавливаем
алгоритм, — наиболее общий унификатор для S. В противном
случае строим множество рассогласований и переходим к
третьему шагу.
Шаг 3. Если в существуют переменная x и терм t такие, что x
не входит в t, то полагаем что . Увеличиваем на
единицу k, переходим ко второму шагу. Иначе останавливаем алгоритм,
множество S не унифицируемо.
Обратите внимание, что алгоритм унификации заканчивает свою
работу за конечное число шагов для любого конечного множества
простых выражений, потому что на каждом проходе мы уменьшаем
количество переменных. Так как множество простых выражений было
конечным, то и множество различных переменных в нем конечно, и,
значит, через число шагов, не превышающее количества различных
переменных, алгоритм завершится.
Утверждение о том, что для любого унифицируемого конечного
множества простых выражений S алгоритм унификации закончит свою
работу и выдаст наиболее общий унификатор для S, называется
теоремой унификации.
Теперь можно перейти к рассмотрению метода резолюций.
В чем вообще заключается задача? Мы хотим построить алгоритм,
который позволял бы нам автоматически давать ответ на вопрос, может
ли быть выведено некоторое заключение из множества имеющихся
посылок. Известно, что в общем случае даже для логики первого
порядка такой алгоритм невозможен. Как правило, формальные
системы, для которых можно построить подобный разрешающий
алгоритм, обладают небольшой выразительной силой. К ним,
например, относится логика высказываний и логика одноместных
Основы программирования на языке ПрологШрайнер П.А.
22

предикатов.
Однако Робинсон решил, что правила вывода, используемые
компьютером при автоматическом выводе, не обязательно должны
совпадать с правилами вывода, используемыми при "человеческом"
выводе. В частности, он предложил вместо правила вывода "modus
ponens", которое утверждает, что из A и A -> B выводится B,
использовать его обобщение, правило резолюции, которое сложнее
понимается человеком, но эффективно реализуется на компьютере.
Давайте попробуем разобраться с этим правилом.
Правило резолюции для логики высказываний можно сформулировать
следующим образом.
Если для двух дизъюнктов существует атомарная формула, которая в
один дизъюнкт входит положительно, а в другой отрицательно, то,
вычеркнув соответственно из одного дизъюнкта положительное
вхождение атомной формулы, а из другого — отрицательное, и
объединив эти дизъюнкты, мы получим дизъюнкт, называемый
резольвентой. Исходные дизъюнкты в таком случае называются
родительскими или резольвируемыми, а вычеркнутые формулы —
контрарными литералами. Другими словами, резольвента — это
дизъюнкт, полученный из объединения родительских дизъюнктов
вычеркиванием контрарных литералов.
Графически это правило можно изобразить так:
Здесь и — родительские дизъюнкты, P и —
контрарные литералы, — резольвента.
Если родительские дизъюнкты состояли только из контрарных
литералов, то резольвентой будет пустой дизъюнкт.
Пример. Правило вывода "modus ponens" получается из правила
резолюции, если взять в качестве родительских дизъюнктов C1=A,
. Контрарными литералами в применении
этого правила будут A и , резольвентой — формула B.
Основы программирования на языке ПрологШрайнер П.А.
23

Сформулируем правило резолюции для логики первого порядка.
Пусть имеется два дизъюнкта C1 и C2, у которых нет общих
переменных, L1 — литерал, входящий в дизъюнкт C1, L2 — литерал,
входящий в дизъюнкт C2. Если литералы имеют наибольший общий
унификатор то дизъюнкт называется
резольвентой дизъюнктов C1 и C2. Литералы L1 и L2 называются
контрарными литералами. То же правило записывается в графическом
виде как
Здесь P1 и P2 — контрарные литералы, — резольвента,
полученная из дизъюнкта применением унификатора
и — родительские дизъюнкты, а — наибольший
общий унификатор P1 и P2.
Метод резолюций является обобщением метода "доказательства от
противного". Вместо того чтобы пытаться вывести некоторую формулугипотезу из имеющегося непротиворечивого множества аксиом, мы
добавляем отрицание нашей формулы к множеству аксиом и пытаемся
вывести из него противоречие. Если нам удается это сделать, мы
приходим к выводу (пользуясь законом исключенного третьего), что
исходная формула была выводима из множества аксиом. Опишем более
подробно.
Добавим отрицание исходной формулы к множеству посылок,
преобразуем каждую из этих формул во множество дизъюнктов,
объединим получившиеся множества дизъюнктов и попытаемся
вывести из этого множества дизъюнктов противоречие (пустой
дизъюнкт ). Для этого будем выбирать из нашего множества
дизъюнкты, содержащие унифицируемые контрарные литералы,
вычислять их резольвенту по правилу резолюции, добавлять ее к
исследуемому множеству дизъюнктов. Этот процесс будем продолжать
до тех пор, пока не выведем пустой дизъюнкт.
Возможны, вообще говоря, три случая:
Основы программирования на языке ПрологШрайнер П.А.
24

1. Этот процесс никогда не завершается.
2. Среди текущего множества дизъюнктов не окажется таких, к
которым можно применить правило резолюции. Это означает, что
множество дизъюнктов выполнимо, и, значит, исходная формула
не выводима.
3. На очередном шаге получена пустая резольвента. Это означает,
что множество дизъюнктов невыполнимо и, следовательно,
начальная формула выводима.
Имеет место теорема, утверждающая, что описанный выше процесс
обязательно завершится за конечное число шагов, если множество
дизъюнктов было невыполнимым.
С другой стороны, мы опираемся на результат, что формула выводима из
некоторого множества формул тогда и только тогда, когда описанное
множество дизъюнктов невыполнимо. А также на то, что множество
дизъюнктов невыполнимо тогда и только тогда, когда из него
применением правила резолюции можно вывести пустой дизъюнкт.
В сущности, метод резолюций несовершенен и приводит к
"комбинаторному взрыву". Однако некоторые его разновидности (или
стратегии) довольно эффективны. Одной из самых удачных стратегий
является линейная или SLD-резолюция для хорновских дизъюнктов
(Linear resolution with Selection function for Definition clauses), то есть
дизъюнктов, содержащих не более одного положительного литерала. Их
называют предложениями или клозами.
Если дизъюнкт состоит только из одного положительного литерала, он
называется фактом. Дизъюнкт, состоящий только из отрицательных
литералов, называется вопросом (или целью или запросом ). Если
дизъюнкт содержит и позитивный, и негативные литералы, он
называется правилом. Правило вывода выглядит примерно следующим
образом . Это эквивалентно формуле
, которая на Прологе записывается в виде
B:–A1,A2,...,An.
Логической программой называется конечное непустое множество
хорновских дизъюнктов (фактов и правил).
Основы программирования на языке ПрологШрайнер П.А.
25

При выполнении программы к множеству фактов и правил добавляется
отрицание вопроса, после чего используется линейная резолюция. Ее
специфика в том, что правило резолюции применяется не к
произвольным дизъюнктам из программы. Берется самый левый
литерал цели (подцель) и первый унифицируемый с ним дизъюнкт. К
ним применяется правило резолюции. Полученная резольвента
добавляется в программу в качестве нового вопроса. И так до тех пор,
пока не будет получен пустой дизъюнкт, что будет означать успех, или
до тех пор, пока очередную подцель будет невозможно унифицировать
ни с одним дизъюнктом программы, что будет означать неудачу.
В последнем случае включается так называемый бэктрекинг —
механизм возврата, который осуществляет откат программы к той точке,
в которой выбирался унифицирующийся с последней подцелью
дизъюнкт. Для этого точка, где выбирался один из возможных
унифицируемых с подцелью дизъюнктов, запоминается в специальном
стеке, для последующего возврата к ней и выбора альтернативы в
случае неудачи. При откате все переменные, которые были означены в
результате унификации после этой точки, опять становятся свободными.
В итоге выполнение программы может завершиться неудачей, если одну
из подцелей не удалось унифицировать ни с одним дизъюнктом
программы, и может завершиться успешно, если был выведен пустой
дизъюнкт, а может и просто зациклиться.
Основы программирования на языке ПрологШрайнер П.А.
26

Основные понятия Пролога
Предложения: факты и правила. Цели внутренние и внешние.
Отношения (предикаты). Переменные свободные и связанные.
Анонимная переменная. Отсечение. "Зеленые" и "красные" отсечения.
Семантические модели Пролога: декларативная и процедурная.
Данная лекция посвящена базовым понятиям языка Пролог. В этой и
следующей лекциях, мы будем изучать основы написания программ на
Прологе.
Начнем с того, что познакомимся с так называемой нормальной формой
Бэкуса-Наура (БНФ), разработанной в 1960 Джоном Бэкусом и Питером
Науром и используемой для формального описания синтаксиса языков
программирования. Впервые БНФ была применена Питером Науром
при записи синтаксиса языка Алгол-60.
При описании синтаксиса конструкций используются следующие
обозначения:
Символ ::= читается как "по определению" ("это", "есть"). Слева от
разделителя располагается объясняемое понятие, справа - конструкция,
разъясняющая его. Например,
<Имя> ::= <Идентификатор>
В угловые скобки заключается часть выражения, которая используется
для обозначения синтаксической конструкции языка, в частности
объясняемое понятие. В приведенном выше примере это <Имя> и
<Идентификатор>.
Символ | означает в нотации БНФ "или", он применяется для
разделения различных альтернативных растолкований определяемого
понятия.
Пример. Десятичную цифру можно определить следующим образом:
<цифра> ::= 0|1|2|3|4|5|6|7|8|9
Часть синтаксической конструкции, заключенная в квадратные скобки,
Основы программирования на языке ПрологШрайнер П.А.
27

является необязательной (может присутствовать или отсутствовать);
Пример. Запись
<Целое число> ::= [-]<Положительное целое число>
означает, что целое число можно определить через положительное
целое число, перед которым может стоять знак минус.
Символ * обозначает, что часть синтаксической конструкции может
повторяться произвольное число раз (ноль и более). Заметим, что
иногда вместо символа * используют фигурные скобки ( {, } ).
Пример. Определить положительное целое число в нотации БНФ
можно следующим образом:
<Положительное целое число> ::= <цифра>[<цифра>]*.
То есть положительное целое число состоит из одной или нескольких
цифр.
Программа на языке Пролог, ее иногда называют базой знаний, состоит
из предложений (или утверждений ), каждое предложение
заканчивается точкой.
Предложения бывают двух видов: факты, правила.
Предложение имеет вид
A: B1,... , Bn.
A называется заголовком или головой предложения, а B1,..., Bn -
телом.
В принципе об этом уже говорилось в предыдущей лекции. Но там мы
рассматривали эти понятия в основном с теоретической точки зрения,
заходя со стороны математической логики, а сейчас наш подход будет
больше практическим, со стороны программирования.
Факт констатирует, что между объектами выполнено некоторое
Основы программирования на языке ПрологШрайнер П.А.
28

отношение. Он состоит только из заголовка. Можно считать, что факт это предложение, у которого тело пустое.
Например, известный нам факт, что Наташа является мамой Даши,
может быть записан в виде:
мама(Наташа, Даша).
Факт представляет собой безусловно истинное утверждение.
Напомню, что в математической логике, с которой мы познакомились в
предыдущей лекции, отношения принято называть предикатами.
Если воспользоваться нормальной формой Бэкуса-Науэра, то предикат
можно определить следующим образом:
<Предикат>::=<Имя> | <Имя>(<аргумент>[,<аргумент>]*),
т.е. предикат состоит либо только из имени, либо из имени и
следующей за ним последовательности аргументов, заключенной в
скобки.
Аргументом или параметром предиката может быть константа,
переменная или составной объект. Число аргументов предиката
называется его арностью или местностью. Про переменные мы
поговорим чуть-чуть позже, а подробное рассмотрение констант
отложим до пятой лекции. Пока отметим, что константа получает свое
значение в разделе описания констант, а переменная означивается в
процессе работы программы.
В Турбо Прологе имя предиката должно состоять из
последовательности латинских букв, цифр, знаков подчеркивания и
начинаться с буквы или знака подчеркивания. В других версиях Пролога
имя предиката может содержать символы не только из английского
алфавита, но и из национального, например, из русского.
Соответственно, приведенный выше пример факта можно записать в
Турбо Прологе, например, так:
mother("Наташа", "Даша").
Основы программирования на языке ПрологШрайнер П.А.
29

Некоторые предикаты уже известны системе, они называются
стандартными или встроенными.
В Турбо Прологе предложения с одним и тем же предикатом в заголовке
должны идти одно за другим. Такая совокупность предложений
называется процедурой.
В приведенном выше примере про то, что Наташа является мамой
Даши, мама - это имя двухаргументного предиката, у которого
строковая константа "Наташа" является первым аргументом, а
строковая константа "Даша" - вторым.
Правило - это предложение, истинность которого зависит от
истинности одного или нескольких предложений. Обычно правило
содержит несколько хвостовых целей, которые должны быть
истинными для того, чтобы правило было истинным.
В нотации БНФ правило будет иметь вид:
<Правило>::=<предикат>:-<предикат>[,<предикат>]*.
Пример. Известно, что бабушка человека - это мама его мамы или мама
его папы.
Соответствующие правила будут иметь вид:
бабушка(X,Y): мама(X,Z),мама(Z,Y).
бабушка(X,Y): мама(X,Z),папа(Z,Y).
Символ " :- " означает "если", и вместо него можно писать if.
Символ " ," - это логическая связка "и" или конъюнкция, вместо него
можно писать and.
Первое правило сообщает, что X является бабушкой Y, если существует
такой Z, что X является мамой Z, а Z - мамой Y. Второе правило
сообщает, что X является бабушкой Y, если существует такой Z, что X
является мамой Z, а Z - папой Y.
Основы программирования на языке ПрологШрайнер П.А.
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
