Турбо-Пролог отыскивает голову правила для отношения sestra и конкретизирует переменные X и Y (X=ana, Y=vera).
Само правило принимает следующий частный вид:
sestra(ana, vera):-female(ana),
roditel(Z, ana), roditel(Z, vera), ana<>vera.
Далее Турбо-Пролог пытается удовлетворить условиям правой части правила, для чего последовательно решаются подзадачи, входящие в список условий.
Первой подзадачей является подзадача:
female(ana).
Поскольку такой факт в разделе clauses программы имеется, то данная подзадача считается решенной и Турбо-Пролог переходит к решению второй подзадачи:
roditel(Z, ana).
В результате унификации с соответствующим фактом из раздела программы clauses переменная Z конкретизируется и получает значение sasha(Z=sasha). Турбо-Пролог переходит к решению третьей подзадачи с конкретным значением Z:
roditel(sasha, vera).
Такой факт, в программе, имеется и поэтому Турбо-Пролог переходит к последней, четвёртой, подзадаче: ana<> vera.
Это условие также выполняется и, таким образом, выполняются все условия правой части правила.
Следовательно, выполняется и левая часть правила. Поэтому на поставленный вопрос система ответит утвердительно (YES).
Зададим теперь программе вопрос “Кто является сестрой sasha?”:
Goal:sestra(Kto, sasha)
В результате унификации данного вопроса с головой соответствующего правила получим его следующий частный вид:
sestra(Kto, sasha):-female(Kto), roditel(Z, Kto),
roditel(Z, sasha), Kto<>sasha.
Далее Тубо-Пролог решает подзадачи, определяемые правой частью правила, первой из которых является следующая подзадача:
female(Kto).
Турбо-Пролог просматривает факты с предикатом female и связывает свободную переменную Kto со значением ola. Поскольку, в данном случае, возможно более чем одно решение, Турбо-Пролог помещает маркер возврата у факта female(kata), следующего за фактом female(ola).
Следующей подзадачей, с уже конкретизированной переменной Kto, является подзадача:
roditel(Z, ola).
Поскольку в программе нет фактов roditel со вторым аргументом ola, Турбо-Пролог не может решить эту подзадачу.
Происходит возврат к установленному ранее маркеру возврата и освобождение связанной переменной Kto. Далее Турбо-Пролог устанавливает новое значение для переменной Kto=kata, а маркер возврата помещается у следующего факта с данным предикатом. И вновь решается вторая подзадача с другим значением переменной Kto: roditel(Z, kata).
Данная подзадача унифицируется с фактом roditel(vita, kata) и, т.о., переменная Z получает значение vita. Далее решается третья подзадача: roditel(vita, sasha).
Такой факт в разделе clauses программы имеется, и, т.о., подзадача решена. Далее решается четвёртая подзадача:
kata<>sasha.
Неравенство выполняется, и система на поставленный вопрос определяет первый ответ:
Kto=kata
Турбо-Пролог возвращается к маркеру возврата для поиска других вариантов решений. Однако другие варианты решений отсутствуют и, соответственно, дополнительных ответов на поставленный вопрос не появляется. Система даёт ответ:
Kto=kata
1 Solution
Вопросно-ответные системы представляют собой программы- консультанты в той или иной предметной области. Ниже приводится программа, реализующая вопросно-ответную систему, ориентированную на вычисление различных родственных отношений. Эти отношения в явном виде не задаются на множестве объектов (имён), представленных на приводимой ниже схеме родственных отношений (см. рис.3). Они вычисляются на основе заданного явном виде отношения “родитель” (т.н. базового отношения) и/или других вычисляемых отношений.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.