До инициализации переменная свободна, после присвоения ей значения она становится связанной. Переменная остается связанной только то время, которое необходимо для получения решения по запросу, затем Пролог освобождает ее и ищет другое решение.
Переменные в Прологе предназначены для установления соответствия между термами предикатов, действующих в пределах одной фразы (предложения), а не местом памяти для хранения данных. Переменная начинается с прописной буквы или знаков подчеркивания.
В Прологе программист свободен в выборе имен констант, переменных, функций и предикатов. Исключения составляют резервированные имена и числовые константы. Переменные от констант отличаются первой буквой имени: у констант она строчная, у переменных – заглавная буква или символ подчеркивания.
Область действия имени представляет собой часть программы, где это имя имеет один и тот же смысл:
· для переменной областью действия является предложение (факт, правило или цель), содержащее данную переменную;
· для остальных имен (констант, функций или предикатов) – вся программа.
Специальным знаком «_» обозначается анонимная переменная, которая используется тогда, когда конкретное значение переменной не существенно для данного предложения. Анонимные переменные не отличаются от обычных при поиске соответствий, но не принимают значений и не появляются в ответах. Различные вхождения знака подчеркивания означают различные анонимные переменные.
Отношения между объектами в Прологе называются фактами. Факт соответствует фразе Хорна, состоящей из одного положительного литерала.
Факт – это простейшая разновидность предложения Пролога.
Любой факт имеет соответствующее значение истинности и определяет отношение между термами.
Факт является простым предикатом, который записывается в виде функционального терма, состоящего из имени отношения и объектов, заключенных в круглые скобки, например:
мать( мария, анна).
отец( иван, анна).
Точка, стоящая после предиката, указывает на то, что рассматриваемое выражение является фактом.
Вторым типом предложений Пролога является вопрос или цель. Цель – это средство формулировки задачи, которую должна решать программа. Простой вопрос (цель) синтаксически является разновидностью факта, например:
Цель: мать (мария, юлия).
В данном случае программе задан вопрос, является ли мария матерью юлии. Если необходимо задать вопрос, кто является матерью юлии, то цель будет иметь следующий вид:
Цель: мать( X, юлия).
Сложные цели представляют собой конъюнкцию простых целей и имеют следующий вид:
Цель: Q1, Q2,…,Qn, где запятая обозначает операцию конъюнкции, а Q1, Q2,…,Qn – подцели главной цели.
Конъюнкция в Прологе истинна только при истинности всех компонент, однако, в отличие от логики, в Прологе учитывается порядок оценки истинности компонент (слева направо).
Пример 18.
Пусть задана семейная БД при помощи перечисления родительских отношений в виде списка фактов:
мать( мария, анна).
мать(мария, юлия).
мать( анна, петр).
отец( иван, анна).
отец( иван, юлия).
Тогда вопрос, является ли иван дедом петра, можно задать в виде следующей цели:
Цель: отец( иван, X), мать(X, петр).
На самом деле БД Пролога включает не только факты, но и правила. Факты и правила представляют собой не множество, а список. Для получения ответа БД просматривается по порядку, то есть в порядке следования фактов и предикатов в тексте программы.
Цель достигнута, если в БД удалось найти факт или правило, который (которое) удовлетворяет предикату цели, то есть превращает его в истинное высказывание. В нашем примере первую подцель удовлетворяют факты отец( иван, анна). и отец( иван, юлия). Вторую подцель удовлетворяет факт мать( анна, петр). Следовательно, главная цель удовлетворена, переменная X связывается с константой анна.
Третьим типом предложения является правило. Правило позволяет вывести один факт из других фактов. Иными словами, правило – это заключение, для которого известно, что оно истинно, если одно или несколько других найденных заключений или фактов являются истинными.
Правила – это предложения вида
H: - P1, P2,…, Pn.
Символ «: -» читается как «если», предикат H называется заключением, а последовательность предикатов P1, P2,…, Pn называется посылками. Приведенное правило является аналогом хорновского дизъюнкта ШP1ЪШ P2,…,ЪШPn ЪH. Заключение истинно, если истинны все посылки. В посылках переменные связаны квантором существования, а в заключении - квантором всеобщности.
Пример 19.
Добавим в БД примера 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).
Рекурсивное определение предиката обязательно должно содержать нерекурсивную часть, иначе оно будет логически некорректным и программа зациклится. Чтобы избежать зацикливания, следует также позаботиться о порядке выполнения предложений, поэтому практически полезно, а порой и необходимо придерживаться принципа: «сначала нерекурсивные выражения».
Программа на Прологе - это конечное множество предложений.