Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1414-Лекции.doc
Скачиваний:
29
Добавлен:
25.12.2018
Размер:
419.84 Кб
Скачать

7 Лекция №6. Унификация и поиск с возвратом: программа с фактами и правилом

Время: 2 часа (90 мин.)

7.1 Ключевые (основные) вопросы (моменты)

- обработка фактов и правил.

7.2 Текст лекции

Введем теперь в программу-1 новый предикат, выражающий отношение “ребёнок”:

rebenok (person, person)

Однако в разделе clauses не будем перечислять все факты, соответствующие этому отношению. Используем то обстоятельство, что отношение “ребёнок” обратно отношению “родитель”, которое уже определено в программе предикатом roditel. Тогда соответствующее утверждение для отношения “ребёнок” можно определить на Турбо-Прологе, как правило:

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]