Правило состоит из двух частей, разделенных знаком “:-”. Правая часть правила, называемая телом правила содержит условие, логическим следствием которого является выражение, располагающееся в левой части правила. Левую часть правила называют головой правила. Если условие 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)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.