Логическое программирование на языке Visual Prolog. Солдатова О.П - 20 стр.

UptoLike

20
На самом деле БД Пролога включает не только факты, но и правила.
Факты и правила представляют собой не множество, а список. Для получения
ответа БД просматривается по порядку, то есть в порядке следования фактов
и предикатов в тексте программы.
Цель достигнута, если в БД удалось найти факт или правило, который
(которое) удовлетворяет предикату цели, то есть превращает его в истинное
высказывание. В нашем примере первую подцель удовлетворяют факты
отец( иван, анна). и отец( иван, юлия). Вторую подцель удовлетворяет факт
мать( анна, петр). Следовательно, главная цель удовлетворена, переменная
X связывается с константой анна.
Третьим типом предложения является правило. Правило позволяет
вывести
один факт из других фактов. Иными словами, правилоэто
заключение, для которого известно, что оно истинно, если одно или
несколько других найденных заключений или фактов являются истинными.
Правилаэто предложения вида
H: - P
1
, P
2
,…, P
n
.
Символ «: -» читается как «если», предикат H называется заключением,
а последовательность предикатов P
1
, P
2
,…, P
n
называется посылками.
Приведенное правило является аналогом хорновского дизъюнкта H
¬
P
1
∨¬
P
2
,…,
∨¬
P
n
. Заключение истинно, если истинны все посылки. В посылках
переменные связаны квантором существования, а в заключении - квантором
всеобщности.
Пример 16.
Добавим в БД примера 15 правила, задающие отношение «дед»:
мать( мария, анна).
мать(мария, юлия).
мать( анна, петр).
отец( иван, анна).
отец( иван, юлия).
дед (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).