Переменные в Прологе инициализируются при сопоствлении с константами в фактах и правилах.

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

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

В Прологе программист свободен в выборе имен констант, переменных, функций и предикатов. Исключения составляют резервированные имена и числовые константы. Переменные от констант отличаются первой буквой имени: у констант она строчная, у переменных – заглавная буква или символ подчеркивания.

Область действия имени представляет собой часть программы, где это имя имеет один и тот же смысл:

· для переменной областью действия является предложение (факт, правило или цель), содержащее данную переменную;

· для остальных имен (констант, функций или предикатов) – вся программа.

Специальным знаком «_» обозначается анонимная переменная, которая используется тогда, когда конкретное значение переменной не существенно для данного предложения. Анонимные переменные не отличаются от обычных при поиске соответствий, но не принимают значений и не появляются в ответах. Различные вхождения знака подчеркивания означают различные анонимные переменные.

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

Факт – это простейшая разновидность предложения Пролога.

Любой факт имеет соответствующее значение истинности и определяет отношение между термами.

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

мать( мария, анна).

отец( иван, анна).

Точка, стоящая после предиката, указывает на то, что рассматриваемое выражение является фактом.

Вторым типом предложений Пролога является вопрос или цель. Цель – это средство формулировки задачи, которую должна решать программа. Простой вопрос (цель) синтаксически является разновидностью факта, например:

Цель: мать (мария, юлия).

В данном случае программе задан вопрос, является ли мария матерью юлии. Если необходимо задать вопрос, кто является матерью юлии, то цель будет иметь следующий вид:

Цель: мать( X, юлия).

Сложные цели представляют собой конъюнкцию простых целей и имеют следующий вид:

Цель: Q1, Q2,…,Qn, где запятая обозначает операцию конъюнкции, а Q1, Q2,…,Qn – подцели главной цели.

Конъюнкция в Прологе истинна только при истинности всех компонент, однако, в отличие от логики, в Прологе учитывается порядок оценки истинности компонент (слева направо).

Пример 1.

Пусть задана семейная БД при помощи перечисления родительских отношений в виде списка фактов:

мать( мария, анна).

мать(мария, юлия).

мать( анна, петр).

отец( иван, анна).

отец( иван, юлия).

Тогда вопрос, является ли иван дедом петра, можно задать в виде следующей цели:

Цель: отец( иван, X), мать(X, петр).

На самом деле БД Пролога включает не только факты, но и правила. Факты и правила представляют собой не множество, а список. Для получения ответа БД просматривается по порядку, то есть в порядке следования фактов и предикатов в тексте программы.

Цель достигнута, если в БД удалось найти факт или правило, который (которое) удовлетворяет предикату цели, то есть превращает его в истинное высказывание. В нашем примере первую подцель удовлетворяют факты отец( иван, анна). и отец( иван, юлия). Вторую подцель удовлетворяет факт мать( анна, петр). Следовательно, главная цель удовлетворена, переменная X связывается с константой анна.

Третьим типом предложения является правило. Правило позволяет вывести один факт из других фактов. Иными словами, правило – это заключение, для которого известно, что оно истинно, если одно или несколько других найденных заключений или фактов являются истинными.

Правила – это предложения вида

H: - P1, P2,…, Pn.

Символ «: -» читается как «если», предикат H называется заключением, а последовательность предикатов P1, P2,…, Pn называется посылками. Приведенное правило является аналогом хорновского дизъюнкта ШP1ЪШ P2,…,ЪШPn ЪH. Заключение истинно, если истинны все посылки. В посылках переменные связаны квантором существования, а в заключении - квантором всеобщности.

Пример 2.

Добавим в БД примера 18 правила, задающие отношение «дед»:

мать( мария, анна).

мать(мария, юлия).

мать( анна, петр).

отец( иван, анна).

отец( иван, юлия).

дед (X, Y): - отец(X, Z), мать(Z, Y).

дед (X, Y): - отец(X, Z), отец(Z, Y).

Тогда вопрос, является ли иван дедом петра, можно задать в виде следующей цели:

Цель: дед( иван, петр).

Правила - самые общие предложения Пролога, факт является частным случаем правила без правой части, а цель – правило без левой части.

Все предложения для одного предиката связаны между собой отношением «или».

Очень часто правила в Прологе являются рекурсивными. Например, для нашей семейной БД предикат «предок» определяется рекурсивно:

предок(x, y): - мать(x, y).

предок(x, y): - отец(x, y).

предок(x, y): - мать(x, z), предок(z, y).

предок(x, y): - отец (x, z), предок(z, y).

Рекурсивное определение предиката обязательно должно содержать нерекурсивную часть, иначе оно будет логически некорректным и программа зациклится. Чтобы избежать зацикливания, следует также позаботиться о порядке выполнения предложений, поэтому практически полезно, а порой и необходимо придерживаться принципа: «сначала нерекурсивные выражения».

Программа на Прологе - это конечное множество предложений.

Наши рекомендации