Программирование на языке Пролог для искусственного интеллекта | страница 38



>% Разрешенные ходы

>ход( состояние( середина, на ящике, середина, неимеет),

> схватить,           % Схватить банан

> состояние( середина, наящике, середина, имеет)).


>ход( состояние( P, наполу, P, H),

> залезть,            % Залезть на ящик

> состояние( P, наящике, P, H) ).


>ход( состояние( P1, наполу, P1, H),

> подвинуть( P1, Р2), % Подвинуть ящик с P1 на Р2

> состояние( Р2, наполу, Р2, H) ).


>ход( состояние( P1, наполу, В, H),

> перейти( P1, Р2),   % Перейти с P1 на Р2

> состояние( Р2, наполу, В, H) ).


>% можетзавладеть(Состояние): обезьяна может завладеть

>% бананом, находясь в состоянии Состояние

>можетзавладеть( состояние( -, -, -, имеет) ).


>% может 1:  обезьяна уже его имеет

>можетзавладеть( Состояние1) :-

> % может 2:  Сделать что-нибудь, чтобы завладеть им

> ход( Состояние1, Ход, Состояние2),

> % сделать что-нибудь

> можетзавладеть( Состояние2).

> % теперь может завладеть

Рис. 2.14.  Программа для задачи об обезьяне и банане.


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

Рис. 2.15.  Поиск банана обезьяной. Перебор начинается в верхнем узле и распространяется вниз, как показано. Альтернативные ходы перебираются слева направо. Возврат произошел только один раз.

2.6. Порядок предложений и целей 

2.6.1. Опасность бесконечного цикла

Рассмотрим следующее предложение:

>p :- p.

В нем говорится: "p истинно, если p истинно". С точки зрения декларативного смысла это совершенно корректно, однако в процедурном смысле оно бесполезно. Более того, для пролог-системы такое предложение может породить серьезную проблему. Рассмотрим вопрос:

>?-  p.

При использовании вышеприведенного предложения цель p будет заменена на ту же самую цель p; она в свою очередь будет заменена снова на p и т.д. В этом случае система войдет в бесконечный цикл, не замечая, что никакого продвижения в вычислениях не происходит.