План - это всего лишь список последовательных инструкций для реальной или моделируемой на вычислительной машине руки. Он очень мало сообщает о том, как и почему даются эти инструкции. Если вопросы как и почему могут возникнуть, то для самой системы полезным будет иметь доступ к некоторой древовидной структуре, схожей с деревом отладки, показывающей путь ее движения от одной программы к другой. Поскольку система организована вокруг программ, каждая из которых призвана достигать идентифицируемую цель, то, обращаясь к этой древовидной структуре и выполняя некоторого рода интроспективный анализ, система легко может отвечать на многие вопросы, связанные с ее функционированием.
На рис. 12.6 показано, почему это так. Здесь мы имеем иное представление дерева целей. В каждом узле изображена ситуация, в которой указанная там программа была вызвана. Такой узел имеет ответвления к другим узлам, которые отвечают программам, вызванным в помощь исходной.
Рис. 12.6. Ответ на вопросы 'как', 'почему' и 'когда' требует прослеживания планирующей программы по мере того, как она строит дерево целей. В общем случае перемещение на один уровень вниз дает возможность отвечать на вопросы типа 'как', на один уровень вверх -? на вопросы типа 'почему', а перемещение на самый верх - на вопросы типа 'когда'
Система мира кубиков в определенной степени может осуществлять интроспективный анализ
На вопрос "Почему вы поместили А на стол?" правильный ответ получается, если найти (PUT-ON А <положение с z=0>) в этом дереве целей, посмотреть на узел, расположенный сверху от него, и ответить, что действие было совершено для того, чтобы избавиться от А. Тогда в ответ на вопрос "Почему вы это сделали?" необходимо произвести еще один шаг вверх по дереву и заметить, что нужно было освободить блок В. Повторение вопроса приведет в конечном итоге к ответу о том, что необходимо было поместить В на С, а в дальнейшем - и к окончательному ответу самого верхнего уровня: "Потому что вы мне приказали это сделать".
Вопросы типа как обрабатываются иначе. "Как вы поместили В на С?" вызывает ответ: "Я поместил его в (7 1 2)". Повторение вопроса вызывает перечисление целей, находящихся непосредственно под (PUT-AT В (7 1 2)), а именно: "Сначала я взял В; затем я перенес В, и наконец я отпустил В".
С вопросами типа когда также можно работать. Соответствующий прием состоит в прослеживании дерева от узла, относительно которого задан вопрос, к узлу наверху, который представляет собой первоначальную команду. Так, на вопрос "Когда вы взяли А?" можно дать ответ: "Тогда, когда я ставил В на С". Если вопрос касается самого верхнего узла, то, конечно, никакое прослеживание вверх невозможно, и нужно указать время, ссылаясь на следующую команду верхнего уровня или на команду, только что выполненную. На вопрос "Когда вы поместили В на С?" можно было бы дать и такой ответ: "После того, как я поместил А на В, но прежде, чем я взял D". Подведем итоги:
На вопросы почему ответы строятся путем перемещения на один шаг вверх по дереву целей и описания находящейся там цели, или можно ответить: "Потому что вы мне приказали это сделать".
На вопросы как ответы строятся путем перечисления целей, указанных на один шаг вниз по дереву целей, или можно ответить: "Просто сделал, и все".
На вопросы когда ответы строятся либо путем указания на цель верхнего уровня, либо ссылкой на соседние цели высшего уровня, зафиксированные в истории.
Таким образом, ясно, что дерево обращений к подпрограммам является ключевым элементом для ответа на вопросы как, почему и когда в отношении осуществленных действий. Как конструируется такое дерево? Одним из путей является внесение небольших дополнений в некоторые программы системы, работающей в мире кубиков. До сих пор все действие в ней концентрировалось на создании плана, и значения NIL и Т, возвращаемые функциями, более или менее игнорировались. Но эти величины можно использовать в работе по созданию доступного для системы дерева целей. Вместо обычных NIL и Т сделаем так, чтобы некоторые программы возвращали NIL при неуспехе и некоторую информацию о по дцели в случае успеха, а не просто Т.
Хранение в памяти обращений к функциям хорошо представляет историю работы системы
Выражаясь более точным языком, мысль состоит в том, чтобы для отражения отношений цели - под цели использовать иерархию вложений в списковой структуре. Тот факт, что функция F обращалась к функциям X, Y и Z, представляется списком, в котором F с ее аргументами находится в первой позиции, а описания действий - при X, Y и Z и ниже их, в следующих далее позициях. Ясно, что в описании действия, производимого при обращении, скажем, к X, будет использован список, в котором функция X и ее аргументы находятся в первой позиции, а остальные позиции заняты описаниями соответствующей деятельности, которая была вызвана самой X. Таким образом, эта схема представления рекурсивна.
Функция PUT-AT (ПОМЕСТИТЬ-В), например, делает по существу три вещи, используя три программы GRASP (ВЗЯТЬ), MOVE-OBJECT (ПЕРЕМЕСТИТЬ-ОБЪЕКТ) и UNGRASP (ОТПУСТИТЬ). Поэтому функция PUT-AT должна возвращать что-то наподобие следующего:
Понятно, что это достигается путем добавления переменных Gl, G2 и G3 к переменным функции PROG. Каждая из них полагается равной результату соответствующего обращения, и используется функция LIST для образования необходимой структуры:
Все эти результаты строятся обычно схожим образом, и поэтому они сами по себе будут также некоторыми списками. Таким образом, общий результат в сложных случаях будет представлять собой структуру с большой глубиной вложения, где каждый уровень вложения соответствует некоторому уровню в дереве целей. Вложение заканчивается на функциях, которые не характеризуются интересными обращениями к другим программам. Например, функция UNGRASP (ОТПУСТИТЬ) возвращает просто следующее:
Соответствующий программный код выглядит так:
Теперь функции PUT-AT (ПОМЕСТИТЬ-В) и UNGRASP (ОТПУСТИТЬ) выглядят следующим образом:
Ряд интересных проблем возникает в связи с GET-RID-OF (ИЗБАВИТЬСЯ) и MAKE-SPACE (ОСВОБОДИТЬ-МЕСТО), в которых имеются циклы, и в связи с функцией GRASP (ВЗЯТЬ), которая может обратиться к CLEAR-TOP (ОЧИСТИТЬ-ПОВЕРХ-НОСТЬ). После разрешения этих проблем пересмотренная система будет не только строить план и делать его значением функции PLAN, но также будет записывать историю смены целей как значение функции верхнего уровня. Идущая ниже списковая структура эквивалентна совокупности целей, приведенных ранее на рис. 12.6.