Правила. Помимо фактов база данным может содержать факты
Помимо фактов база данным может содержать факты. Правило отличается от факта тем, что связывается наличие отношения между объектами с выполнением некоторого условия, представленного целью или конъюнкцией целей. Другое отличие состоит в том, что правило обычно выражает не частные случаи, а общие закономерности. Приведем пример:
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.
Более подробно
Термы
Программа на Прологе — это набор термов. Термы:
· константы:
o атомы;
o числа;
· переменные;
· структуры (составные термы).
Атомы можно записывать как:
· последовательность букв и цифр, начиная с буквы в нижнем регистре, например…;
· последовательность символов + - * / \ ~ < > : . ? @ # $ &, например…;
· последовательность произвольных символов, заключенных в одинарные кавычки. Отметим, что '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))