Рассмотрим следующее предложение:
р :- р.
В нем говорится: «р истинно, если р истинно». С точки зрения декларативного смысла это совершенно корректно, однако в процедурном смысле оно бесполезно. Более того, для пролог - системы такое предложение может породить серьезную проблему. Рассмотрим вопрос:
?- р.
При использовании вышеприведенного предложения цель р будет заменена на ту же самую цель р; она в свою очередь будет заменена снова на р и т.д. В этом случае система войдет в бесконечный цикл, не замечая, что никакого продвижения в вычислениях не происходит.
Данный пример демонстрирует простой способ ввести пролог-систему в бесконечный цикл. Однако подобное зацикливание могло встретиться и в некоторых наших предыдущих программах, если бы мы изменили порядок предложений, или же порядок целей в них. Будет полезно рассмотреть несколько примеров.
В программе об обезьяне и банане предложения, касающиеся отношения ход, были упорядочены следующим образом: схватить, залезть, подвинуть, перейти (возможно, для полноты следует добавить еще «слезть»). В этих предложениях говорится, что можно схватить, можно залезть и т.д. В соответствии с процедурной семантикой Пролога порядок предложений указывает на то, что обезьяна предпочитает схватывание залезанию, залезание - передвиганию и т.д. Такой порядок предпочтений на самом деле помогает обезьяне решить задачу. Но что могло случиться, если бы этот порядок был другим? Предположим, что предложение с «перейти» оказалось бы первым. Процесс вычисления нашей исходной цели из предыдущего раздела
?- можетзавладеть(состояние(удвери, наполу, уокна, неимеет)).
протекал бы на этот раз так. Первые четыре списка целей (с соответствующим образом переименованными переменными) остались бы такими же, как и раньше:
(1) можетзавладеть(состояние(удвери, наполу, уокна, неимеет)).
Применение второго предложения из можетзавладеть («может2») породило бы
(2) ход(состояние(удвери,наполу, окна,неимеет),М',S2'),можетзавладеть( S2')
С помощью хода перейти( уокна, Р2') получилось бы
(3) можетзавладеть(состояние(Р2', наполу, уокна, неимеет) )
Повторное использование предложения «может2» превратило бы список целей в
(4)ход(состояние(Р2',наполу,уокна,неимеет),М",S2"),можетзавладеть(S2")
С этого момента начались бы отличия. Первым предложением, голова которого сопоставима с первой целью из этого списка, было бы теперь «перейти» (а не «залезть», как раньше).
ЧИТАТЬ ДАЛЕЕ