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

–константа унифицируется с идентичной константой;

–переменная (в том числе анонимная) может унифицироваться с константой или структурой, в результате чего переменная принимает значение этой константы или структуры и становится связанной переменной, т.е. конкретизируется;

–переменная (в том числе анонимная) может унифицироваться с другой переменной, и в этом случае говорят, что переменные сцепливаются (являются сцепленными). При этом если одна из сцепленных переменных принимает какоелибо конкретное значение, то такое же значение принимает и другая переменная.

Зададим теперь нашей программе более сложные вопросы и посмотрим, как осуществляется поиск решений. Пусть нас, например, интересует вопрос “Кто является родителем родителя kola? ”. В программе нет отношения “родитель родителя” и поэтому необходимо использовать составной вопрос:

Goal: roditel(Y, kola), roditel(X,Y)

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

При решении данной составной задачи она разбивается на две подзадачи, и Турбо-Пролог ищет решение каждой подзадачи последовательно (слева направо).

Окончательным результатом решения задачи является конъюнкция решений подзадач.

Первой подзадачей в нашем примере является задача:

roditel(Y, kola).

В процессе её унификации свободная переменная Y получит значение vera(Y=vera),т.е. конкретизируется и становится, за счет этого, связанной переменной. Теперь решается вторая подзадача, в которой значение Y уже определено:

roditel(X, vera).

Турбо-Пролог вновь просматривает все факты раздела clauses, начиная с первого предложения сверху вниз, и устанавливает значение X равное sasha(X=sasha). В результате система ответит:

Y=vera, X=sasha

1 Solution

Аналогично можно задать вопрос "Кто внуки vita?":

Goal: roditel(vita, X), roditel(X, Y)

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

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

X=sasha, Y=ana

X=sasha, Y=vera

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

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

rebenok (person, person)

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