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