Логическое программирование. Элементы и конструкции языка Турбо-Пролог. Средства отладки Турбо-Пролога, страница 10

Правило состоит из двух частей, разделенных знаком “:-”. Правая часть правила, называемая телом правила содержит условие, логическим следствием  которого является выражение, располагающееся в левой части правила. Левую часть правила называют головой правила. Если условие roditel(X, Y) выполнено, то выполняется и утверждение rebenok(Y, X).

Ниже представлена программа-2, являющаяся расширением программы-1   за       счет введения    предиката и        правила, выражающего отношение “ребёнок”:

/* Программа 2 */ domains    person = symbol predicates    roditel(person, person)    rebenok(person, person) clauses    roditel(ola,sasha).    roditel(vita,sasha).    roditel(vita,kata).    roditel(sasha,ana).    roditel(sasha,vera).    roditel(vera,kola).

                 rebenok(Y, X) :- roditel(X, Y).

Проанализируем теперь, как работает введённое правило.

Зададим программе вопрос “Является ли kata ребёнком vita? ”:

                 Goal: rebenok(kata, vita)

Поскольку в программе нет фактов с предикатом rebenok, Турбо-Пролг обращается к соответствующему правилу. В результате унификации вопроса с головой правила, переменные Y и X будут конкретизированы, т.е. примут значения kata(Y=kata) и  vita(X=vita). В силу этого само правило принимает следующий частный вид:

rebenok (kata, vita):- roditel(vita,kata).

Далее Турбо-Пролог будет решать задачу, определяемую правой частью правила (т.е. определять выполнение условий, определяемых в теле правила):

roditel(vita, kata).

Просматривая факты раздела clauses программы, ТурбоПролог устанавливает наличие факта roditel(vita, kata) и на поставленный исходный вопрос отвечает YES.

Зададим теперь нашей программе следующий вопрос “Ктo дети vita?”:

Goal:rebenok(Kto, vita)

В данном случае, после унификации вопроса с головой правила, оно примет следующий частный вид: rebenok (Kto, vita):-roditel(vita, Kto).

Далее Турбо-Пролог решает задачу определяемую, правой частью правила:

roditel(vita, Kto).

Сопоставление данного вопроса (задачи) с фактами из раздела clauses программы дает два ответа:

Kto=sasha

Kto=kata

2 Solutions

Аналогично можно спросить “Чей ребенок sasha?”:

Goal:rebenok(sasha, X)

После унификации соответствующее правило принимает следующий частный вид:

rebenok(sasha, X):-roditel(X, sasha).

Решая задачу из правой части правила, Турбо-Пролог выдаст два ответа:

X=ola

X=vita

2 Solutions

Введём теперь в рассмотрение новые предикаты, определяющие пол людей:

male(person) – мужчина; female(person) – женщина.

Эти предикаты являются унарными и используются для выражения свойств объектов.

Определим теперь отношение “сестра” предикатом и правилом:

sestra(person, person) sestra(X, Y):-female(X), roditel(Z, X), roditel(Z, Y), X<>Y.

Приведенное правило необходимо понимать так: “Х является сестрой Y, если X – женщина, если у X и Y общий родитель Z и если X не равен Y”. Таким образом, правило в своей правой части содержит конъюнкцию условий, которые должны выполняться, чтобы выполнялась левая часть правила.

Дополним программу-2 новыми предикатами и правилом, рассмотренными выше:

/* Программа 3 */ domains    person = symbol predicates    roditel(person, person)    rebenok(person, person)      male(person)

female(person) sestra(person, person)

clauses      roditel(ola,sasha).    roditel(vita,sasha).    roditel(vita,kata).    roditel(sasha,ana).    roditel(sasha,vera).    roditel(vera,kola).    male(sasha).    male(vita).    male(kola).       female(ola).    female(kata).    female(ana).    female(vera).    rebenok(Y, X) :- roditel(X, Y).

sestra(X, Y):-female(X),       roditel(Z, X),       roditel(Z, Y),       X<>Y.

Зададим данной программе вопрос “Является ли ana сестрой vera?”:

Goal:sestra(ana, vera)