- •Первое знакомство Объекты и отношения
- •Запросы
- •Переменные
- •Конъюнкция
- •Правила
- •Более подробно Термы
- •Операторы
- •Эквивалентность и унификация
- •Арифметика
- •Выполнение целей (повторение)
- •Структуры и деревья
- •Обработка списков
- •Отсечение
- •Разное Ввод-вывод
- •Управление порядком вычислений
- •Динамическое создание и анализ структур
- •Пролог как база данных
- •Работа с файлами
Правила
Помимо фактов база данным может содержать факты. Правило отличается от факта тем, что связывается наличие отношения между объектами с выполнением некоторого условия, представленного целью или конъюнкцией целей. Другое отличие состоит в том, что правило обычно выражает не частные случаи, а общие закономерности. Приведем пример:
likes(bill, X) :- prefers(X, wine).
Здесь условие состоит из единственной цели prefers(X, wine). Данное правило соответствует предложению "Bill likes anybody, provided (if) she prefers a wine". В отличие фактов likes, данное правило охватывает не одну пару объектов, а (потенциально) множество таких пар (в данном случае две пары).
Выполним следующие запросы:
?- likes(bill, jane).
true.
?- likes(X, jane).
X = bill ; false.
Если при попытке удовлетворить цель Пролог встречает не факт, а правило, то Пролог запоминает текущее положение в базе данных и переходит удовлетворению целей этого правила так, как если бы они были запросом. Если исходная цель содержала переменные, то эти переменные будут связаны в ходе удовлетворения целей, перечисленных в правиле. Связывание переменных, указанных в запросе, с переменными, указанными правиле происходит по порядку, а не по имени (…).
В базе данных Пролога один и тот же предикат может определяться как фактами, так и правила, причем правил, как и факторов, может быть несколько. Строго говоря, разделение на факты и правила искусственное (и преследует учебные цели); с точки зрения Пролога факт — это правило с пустым (т. е. всегда выполняющимся) условием. Вместе факты и правила часто называются предложениями.
Добавим в базу данных следующие правила.
likes(kate, X) :- likes(jane, X), likes(mary, X).
is_happy(X) :- likes(X, Y), likes(Y, X).
Рассмотрим выполнение следующих запросов
?- likes(X, john).
X = jane ; X = alice ; X = mary ; X = kate.
?- is_happy(X).
X = john ; X = mary ; false.
?- is_happy(X), prefers(X, Y).
X = mary, Y = wine ; false.
Более подробно Термы
Программа на Прологе — это набор термов. Термы:
-
константы:
-
атомы;
-
числа;
-
-
переменные;
-
структуры (составные термы).
Атомы можно записывать как:
-
последовательность букв и цифр, начиная с буквы в нижнем регистре, например…;
-
последовательность символов + - * / \ ~ < > : . ? @ # $ &, например…;
-
последовательность произвольных символов, заключенных в одинарные кавычки. Отметим, что 'mary' — это то же самое, что mary, а '--->' — то же самое, что --->.
Числа могут иметь знак, десятичную точку и экспоненту, например….
Переменные записываются как последовательность букв и цифр, начиная с буквы в верхнем регистре.
Структура состоит из функтора и компонентов (сначала функтор, потом компоненты в круглых скобках через запятую). Функтор — атом, а каждый из компонентов — произвольный терм (в т. ч. структура). Примеры:
likes(john, mary)
beliefs(alice, likes(john, mary))
knows(jane, beliefs(alice, likes(john, mary)))
birth_date(john, date(1980, 6, 15))
+(1, 2)
*(+(1, 2), +(3, 4))
Операторы
Оператор — особая форма записи функтора. Пример: 1 + 2 то же, что и +(1, 2), а (1 + 2) * 3 то же, что и *(+(1, 2), 3).
Оператор характеризуется положением, ассоциативностью и приоритетом. По положению и ассоциативности выделяются следующие типы:
-
префиксные операторы (операнд один, оператор перед операндом):
-
fy — запись o o a допустима и эквивалентна o(o(a)); пример: – (замена знака);
-
fx — запись o o a недопустима.
-
-
инфиксные операторы (операндов два, оператор между операндами):
-
yfx — запись a o b o c допустима и эквивалентна o(o(a, b), c); примеры: +, – (вычитание), и т. д.;
-
xfy — запись a o b o c допустима и эквивалентна o(a, o(b, c)); пример: ** (возведение в степень).
-
xfx — запись a o b o c недопустима; примеры: <, > и т. д.
-
-
постфиксные операторы (операнд один, оператор после операнда):
-
yf — запись a o o допустима и эквивалентна o(o(a)).
-
xf — запись a o o недопустима.
-
Приоритет — это целое число. Операторы с меньшим приоритетом «выполняются» раньше, чем операторы с большим приоритетом.