Определение отношений на основе правил
Рассматриваемый пример программ можно легко дополнить с применением многих интересных способов. Вначале введем информацию о мужском или женском поле людей, участвующих в отношении parent. Эту задачу можно решить, добавив следующие факты к программе:
female ( pam). male! torn].
male( bob). female { Иг). female ( pat) . female ( ann) -male( jim).
В этом случае введены отношения male и female. Эти отношения являются унарными (или одноместными). Бинарные отношения типа parent определяют связь между парами объектов. С другой стороны, унарные отношения могут использоваться для объявления простых свойств объектов, которые они могут иметь или не иметь. Первое из приведенных выше унарных предложений можно прочитать таким образом: Пэм - женщина. Вместо этого информацию, объявленную в двух унарных отношениях, можно передать с помощью одного бинарного отношения. В таком случае приведенная выше часть программы примет примерно такой вид:
sext pam, feminine). sex< torn, masculine). sex [ bob, masculine).
В качестве следующего дополнения к программе введем отношение offspring (отпрыск), обратное отношению parent. Отношение offspring можно определить таким же образом, как и parent, предоставив список обычных фактов об отношении offspring, и в качестве каждого факта указать такую пару людей, что один из них является сыном или дочерью другого, например: offspring; lie, torn).
Часть I, Язык Prolog
Но отношение of f spring можно определить гораздо более изящно, используя то, что оно является противоположным parent и что parent уже было определено. Этот альтернативный способ может быть основан на следующем логическом утверждении:
Для всех X v. Y,
Y является сыном или дочерью х, если
х является родителем Y.
Такая формулировка уже более близка к синтаксису языка Prolog. Соответствующее предложение Prolog, которое имеет тот же смысл, выглядит таким образом: offspring[Y, X) :- parent: X У» .
Это предложение можно также прочитать так: Для всех X и Y,
если X является родителем Y, то
Y является сыном или дочерью У. •
Предложения Prolog, такие как
offspring: Y, X) :- parent: X, fi .
называются правилами. Между фактами и правилами существует важное различие.
Такие факты, как
patent ( torn, Иг) .
представляют собой логические утверждения, которые всегда и безусловно являются
истинными. С другой стороны, правила представляют собой утверждения, которые
становятся истинными, если удовлетворяются некоторые условия. Поэтому принято
считать, что правила состоят из следующих частей:
• условие (правая часть правила);
• заключение (левая часть правила).
Часть, соответствующая заключению, называется также головой предложения, а часть, соответствующая условию, — телом предложения, как показано ниже. offspring; Y, X) :- parent! x, Y}.
*---------------------- V----------------------- *----------------- V----------------- J
голова тело
Если условие parent [ X, Y] является истинным, то его логическим следствием становится offspring ( У, X).
Применение правил в языке Prolog иллюстрируется в следующем примере. Зададим программе вопрос, является ли Лиз дочерью Тома: ?- offspring! liz, torn).
Поскольку в программе отсутствуют факты о дочерях и сыновьях, единственным способом поиска ответа на этот вопрос является использование правила с определением отношения offspring. Данное правило является общим в том смысле, что оно применимо к любым объектам X и Y; но его можно также применить и к таким конкретным объектам, как liz и torn. Чтобы применить правило к объектам liz и ton-.,. вместо Y необходимо подставить liz, а вместо X - torn. Это действие называется конкретизацией переменных (в данном случае — X и Y), которое выполняется следующим образом: X <■ torn и Y = liz
После конкретизации будет получен частный случай общего правила, который выглядит следующим образом: offspring! liz, torn) :- parent! torn, liz).
Часть с обозначением условия принимает вид parent; torn, liz)
После этого система Prolog пытается определить, является ли истинной часть с обозначением условия. Поэтому первоначальная цель: offspring: liz, tomi
Глава 1,Введение в Prolog
заменяется подцелью: patent f torn, liz)
Оказалось, что задача достижения этой (новой) цели является тривиальной, поскольку ее можно найти как факт в рассматриваемой программе. Это означает, что часть данного правила с обозначением заключения также является истинной, и Prolog в качестве ответа на вопрос выводит yes.
Теперь введем в рассматриваемый пример программы еще некоторую информацию о семейных отношениях. Определение отношения mother может быть основано на следующем логическом утверждении: