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

Турбо-Пролог отыскивает голову правила для отношения 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

5. Вопросно - ответные системы

Вопросно-ответные системы представляют собой программы- консультанты в той или иной предметной области. Ниже приводится программа, реализующая вопросно-ответную систему, ориентированную на вычисление различных родственных отношений. Эти отношения в явном виде не задаются на множестве объектов (имён), представленных на приводимой ниже схеме родственных отношений (см. рис.3). Они вычисляются на  основе заданного явном виде отношения “родитель”     (т.н.   базового       отношения)         и/или          других вычисляемых отношений.