PROUST написана на языке Т, диалекте языка программирования Лисп (Неспециалисту может показаться неожиданным переход к другому языку программирования. Дело в том, что Паскаль—язык, предназначенный для вычислений и малопригодный для представления знаний и работы с ними. Поскольку система PROUST является системой, широко использующей знания, то применение языка Лисп, предназначенного прежде всего для манипулирования не числовой, а символьной информацией, здесь вполне оправдано).
В целом система содержит примерно 15 тыс. строк программы на Лиспе и работает на ЭВМ VAX-11/750. Совместно с фирмой «Корсвеар» (г. Сан-Диего, шт. Калифорния) был создан упрощенный вариант системы — Micro-PROUST. Система Micro-PROUST в состоянии распознать классы ошибок, обсуждаемые в настоящей статье; однако существует целый ряд более тонких ошибок, которые система PROUST обнаруживает, а система Micro-PROUST — нет.
Micro-PROUST для машины IBM PC
Micro-PROUST представляет собой подмножество системы PROUST. Наша система способна работать с ограниченным числом программ, составленных новичками, и в настоящее время она может работать лишь с теми примерами решений задачи вычисления среднего и задачи об осадках, которые поставляются вместе с системой.
Micro-PROUST работает па машине IBM PC, имеющей 512К байт памяти с использованием языка Лисп (Golden Common LISP), поставляемого корпорацией Gold Hill Compuicrs. Исходная программа и примеры могут быть полученьг непосредственно по сети BYTE. Файл под названием PRSTREAD.ME содержит указания относительно запуска системы micro-PROUST.
Aнализ программ системой PROUST основан на знании программируемой задачи. Студенты могут решать задачу многими способами, так что в их программах возможны самые разнообразные ошибки; однако дело в том, что все они пытаются решить одну и ту же задачу. Знание задачи открывает возможность в какой-то степени упорядочить разнообразие решений, даваемых новичками. Кроме того, такое знание даст важную информацию относительно намерений программиста.
Для описания задач программирования в системе PROUST был разработан специальный язык описания задач. Каждая задача описана на этом языке, и в системе PROUST создана библиотека таких описаний. Описание задачи при этом представляет собой перефразированную формулировку задачи на естественном (английском) языке, в которой задача предлагается студенту.
Чтобы понять студенческие программы, системе PROUST необходимо самой знать, как следует решать задачу. Решения для данной задачи программирования могут принимать самую разнообразную форму. Предположим, что допустимость входных данных в программе на языке Паскаль можно проверить только одним способом, а именно поместив цикл, содержащий оператор WHILE, в начало основного цикла программы, как показано на рис. 1,а и 2,а.
Если системе PROUST известно, что в какой-то программе необходимо проверять допустимость входных данных, то она будет ориентироваться на поиск такого рода цикла, а также теста на сигнальное значение, который должен идти за ним. Однако для оценки допустимости входных данных существуют несколько путей.
Так, распечатка 1 дает пример цикла, в котором проверка входных данных производится особым образом. Вместо одного цикла проверки здесь используются два. Один из них размещается на выходе из основного цикла программы, а другой предшествует основному циклу. При таком методе не требуется дополнительной проверки на сигнальное значение, поскольку, как только входная величина признана допустимой, управление переходит к выходу из основного цикла, где стоит оператор WHILE. Следовательно, не зная метода, которым пользуется программист для проверки допустимости входной величины, система PROUST не может решить, искать ли проверку на сигнальное значение внутри этого цикла. Отсутствие проверки на сигнальное значение на рис. 1,а является ошибкой, а в распечатке 1 — нет. Чтобы понять, как студент задумал свое решение и как реализовал его, системе PROUST необходимы знания о программировании. После того как намерения программиста поняты, можно воспользоваться знаниями о распространенных ошибках и разыскать их в написанной программе.
Система PROUST анализирует программы методом синтеза. При обследовании какой-либо программы система прежде всего отыскивает в своей библиотеке соответствующее описание задачи. Строятся гипотезы относительно методов, которые использовал программист для удовлетворения каждого из требований, перечисленных в описании задачи. Всякая такая гипотеза представляет собой возможную правильную реализацию соответствующего требования. Если одна из гипотез укладывается в программу студента, то в системе PROUST делается вывод, что реализация отвечает данному требованию. Если же гипотеза, предложенная системой, не укладывается в написанную студентом программу, то PROUST обращается к базе данных распространенных ошибок—с целью найти объяснение обнаруженного расхождения.