Главная arrow книги arrow Копия Глава 11. Основы планирования arrow Пример: мир блоков
Пример: мир блоков

К сожалению, в этом действии предикат Clear не сопровождается должным образом, если блок x или блок у находится на столе. Если х= Table, то результатом этого действия будет Clear {Table), но поверхность стола не должна становиться свободной (поскольку она и так всегда свободна), а если у= Table, то действие имеет предусловие Clear {Table), но вся поверхность стола не обязана быть свободной для того, чтобы на нее можно было поместить блок (поскольку на столе всегда и без того достаточно места). Для исправления такого положения необходимо предусмотреть два изменения. Во-первых, введем еще одно действие для перемещения блока b с блока x на стол:

Во-вторых, примем интерпретацию предиката Clear (b) как означающую, что "на b есть достаточно свободного места, чтобы поместился один блок". При этой интерпретации предикат Clear (Table) всегда будет истинным. Единственная проблема состоит в том, что ничто не будет препятствовать планировщику использовать действие Move(b,x, Table) вместо действия MoveToTable(b,x). Можно смириться с этой проблемой (она приводит к созданию пространства поиска с размерами больше необходимого, но не становится причиной получения неправильных ответов) или ввести в предусловие Move предикат Block и добавить в предусловие действия Move выражение Block(b) л Block(y).

Наконец, существует проблема фиктивных действий, таких как Move (В, С, С), которые должны представлять собой пустую операцию, но имеют противоречивые результаты. Обычно принято игнорировать подобные проблемы, поскольку они редко вызывают выработку неверных планов. Правильный подход состоит в добавлении предусловий в неравенство, как показано в листинге 11.3.

Листинг 11.3. Задача планирования в мире блоков: построение столбика из трех блоков. Одним из решений является последовательность действий [Move (В, Table, С), Move (A, Table, в) ]