Главная / Искусственный интеллект / Учитель Лиспа / Принципы работы учителя Лиспа

Принципы работы учителя Лиспа

В основу конструкции учителя Лиспа положена простая идея: студент должен работать над поставленными задачами в «дружественной» атмосфере, так, словно ему помогает опытный наставник — структурный редактор. Когда студент допускает ошибку в планировании или программировании или просит о помощи, машинный учитель должен обеспечить его необходимой информацией, которая помогла бы студенту вернуться на правильный путь решения. Кроме того, мы хотели, чтобы сама атмосфера обучения лучше отражала концептуальную структуру задач программирования, чем это достигается при работе с обычными машинными редакторами.

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

Для представления правил, которыми руководствуются программисты при решении задач, воспользовались системой GRAPES (Аббревиатура от Goal-Restricted Production System — система продукций, ориентированная на цели). Каждое такое правило — это порождающее правило (или продукция), содержащее часть с ЕСЛИ, где перечисляется множество условий, при которых данное правило применимо, и часть с ТО. Ниже приведены описания двух (из нескольких сотен порождающих правил, известных машинному учителю) правил:

ЕСЛИ

целью является объединение списков СПИСОК1 и СПИСОК2 в единый список

ТО

воспользуйся функцией APPEND и установи в качестве подцелей необходимость задать СПИСОК 1 и СПИСОК2

ЕСЛИ

целью является проверка того, что рекурсивный вызов некоторой функции прекратится и этот рекурсивный вызов осуществляется в контексте функции MAP

ТО

в качестве подцели убедись, что список, являющийся аргументом функции MAP, всегда обращается в NIL после некоторого числа рекурсивных вызовов

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

Идеальная модель—это те знания, которые мы хотели бы передать студенту. Вместе с тем преподаватель должен также хорошо представлять, чтб студенту уже известно, а чтб — нет, и какой подход тот использует при решении каждой конкретной задачи. Машинный учитель следит за каждым вводимым символом по мере того, как студент составляет программу, и пытается понять, какое верное или ошибочное порождающее правило могло бы привести к наблюдаемым действиям студента. Если найденное правило относится к числу верных, то учитель, не вмешиваясь, ожидает дальнейших шагов студента. Если же действия студента оказываются ошибочными, учитель прерывает его работу подсказкой. Таким образом, пока студент движется по пути, ведущему к верному решению, машинный учитель «остается в тени».

Учитель Лиспа полностью обеспечивает все необходимое руководство студентом. Убедившись, что при программировании задачи студент сталкивается с затруднением, учитель переводит его из «режима программирования» в «режим планирования», при котором на конкретном примере учитель шаг за шагом прорабатывает требуемый алгоритм. После того как построение алгоритма завершено, студент может вернуться к программированию, теперь, вероятно, уже лучше представляя себе, что нужно сделать, чтобы его программа работала так, как нужно.

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

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

Главным элементом интерфейса, осуществляющего общение машинного учителя со студентом, является структурный экранный редактор, через который студент вводит свою программу в машину. Этот редактор автоматически уравнивает число скобок и указывает позиции для размещения аргументов каждой функции. Например, для задания определения функции в Лиспе следует пользоваться функцией defun, за которой идет имя задаваемой функции, список параметров и собственно функция. Сначала студент набирает на клавиатуре терминала левую скобку и слово defun. Как только студент печатает пробел после этого слова, машинный учитель показывает на экране дисплея

(defun <ИМЯ> <ПАРАМЕТРЫ> <ПРОЦЕСС>)

Символы в угловых скобках соответствуют аргументам, которые необходимо указать программисту. Учитель помещает курсор под <ИМЯ> и высвечивает (т. е. эта часть строки выглядит более яркой) эту надпись на экране, указывая тем самым, что теперь следует задать имя функции.

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

Редактор также облегчает контакт между учителем и студентом. В проведенных исследованиях различных организаций интерфейса было установлено, что в обычном вопросоответном режиме» свойственном большинству программ, предназначенных для обучения, ученик при решении сложных задач часто теряет нить рассуждения, переставая понимать, о какой части рассматриваемой задачи толкует ему учитель. В системе обучения Лиспу студент вносит информацию непосредственно в программу, заменяя содержимое позиций, отведенных для аргументов; поэтому ему всегда совершенно ясно, над какой частью программы ведется работа. Кроме того, используемые символы помогают в передаче студенту концептуальной структуры задачи программирования. Например, когда студент набирает итеративную конструкцию prog, машинный учитель выдает такой шаблон для итерации:

(prog   <ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ>
<НАЧАЛЬНЫЕ ЗНАЧЕНИЯ>
<ТЕЛО>
<ПОВТОР>
)

Этот шаблон помогает разбить задачу на части, выделяя в ней список локальных переменных, список начальных значений этих переменных, тело программы (т. е. повторяющиеся действия) и возвращение к началу цикла. Во многих случаях отдельный символ представляется в виде совокупности нескольких символов, отражающих различные детали, например <ТЕЛО> задается двумя частями <УСЛОВИЕ ЗАВЕРШЕНИЯ> и <ПЕРЕМЕННАЯ ЧАСТЬ>.

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