При сопоставлении плана Обработка-Чтение-While с программой, представленной на рис. 1, а, соответствие оказалось абсолютным. А раз никаких трудностей при сопоставлении не возникло, следовательно, реализация этого конкретною плана была сделана без ошибок. Однако часто случается, что ни один из планов, предлагаемых системой PROUST, не сопоставляется с программой. Когда это происходит, система должна искать ошибки, приводящие к несоответствию для одного из планов. В этом разделе мы обсудим несоответствия, обусловленные путаницей WHILE с IF, показанной на рис. 2, и объясним, как при этом найти ошибки.
В примере путаницы WHILE с IF обнаружение ошибки происходит в процессе достижения цели Допустимость-Входа. Один из планов, предлагаемых системой PROUST для достижения этой цели, называется Проверка-Правильности-Входа. Он включает: оператор WHILE, проверяющий, не выходит ли данное входное значение за определенный предел; сообщение об ошибке внутри цикла WHILE; подцель Вход, позволяющую повторно прочесть входное значение, если оно лежит вне указанного диапазона значений, и проверку, позволяющую убедиться, что выходное условие для основного цикла удовлетворяется.
Распечатка 2 дает пример безошибочной реализации этого плана.
План Проверка-Правильности-Входа приводится в соответствие с примером путаницы WHILE с IF (рис. 2,а) во всем, кроме одной детали, а именно: отсутствует проверка условия выхода из основного цикла вида IF Val <> 99999 THEN... . Там, где по плану ожидается появление оператора IF, стоит оператор WHILE. Таким образом, система PROUST сталкивается с различием в планах, т. е. различием между ожидаемым планом и реальным отрезком программы. Когда система обнаруживает различия в планах, рассматриваемый план не отбрасывается, а делается попытка найти ошибки, объясняющие эти различия. (Несоответствие плана программе используется в системе PROUST и для перехода к рассмотрению другого плана. Авторы предлагают, таким образом, сначала проверить, нет ли в программе студента просто ошибок, объясняющих непригодность рассматриваемого плана. Такое решение отнюдь не безобидно: теоретически непригодность плана в некоторых случаях можно объяснять ошибками студента при его реализации, тогда как в действительности студент мог следовать совсем другому плану. В этом случае вмешательство системы PROUST будет лишь сбивать студента с толку. Дело осложняется еще и тем, что планы носят эвристический характер и нет гарантии, что среди них не пропущен именно тот, который имеет в виду студент. Заметим, однако, что принятие решения такого рода при отсутствии полной надежности—одна из актуальных задач искусственного интеллекта).
В большинстве случаев подобное объяснение достигается путем применения правил ошибок. Каждое правило ошибки состоит из двух частей: проверочной, которая по различиям в планах позволяет установить, применимо ли данное правило, и результативной, которая дает объяснение этим различиям т. е. показывает результат применения правила.
В табл. 4 показано правило ошибки, которое позволяет объяснить различия в планах в случае путаницы WHILE с IF. Это правило записано с применением слотов и заполнителей, причем одна группа слотов составляет его проверочную часть, а вторая — результативную. Проверочная часть состоит здесь из слота Тип-Оператора и слота Характер-Ошибки.
Таблица 4. Правило ошибки для случая «путаницы WHILE с IF», вырабатываемое системой PROUST. Оно позволяет объяснить различие в планах между ошибочной частью программы (рис. 1) и правильной реализацией этой части (распечатка 1)
Слот Тип-Оператора указывает, что элементом плана, который не сопоставляется с программой, должен быть оператор IF. Слот Характер-Ошибки имеет значение (IF. WHILE), указывающее, что там, где должен стоять оператор IF, находится оператор WHILE. Оба этих проверочных условия выполняются в нашем примере путаницы WHILE с IF, поэтому запускается та часть правила, которая обеспечивает его действие. Она состоит из слота Ошибка, заполнителем которого является описание ошибки, связанной с обнаруженным различием в планах.
Ошибкой в данном случае является путаница WHILE с IF. Сообщая обнаруженные факты студенту, система PROUST придает каждому описанию ошибки вид текста на естественном (английском) языке, и, если необходимо, вырабатывает данные, демонстрирующие присутствие этой ошибки в его (студента) программе.