Построение функции rightp

Обучение Лиспу

Распечатка 1 содержит диалог из урока 4, ориентирующего студента на разбиение задачи на совокупность подзадач. Хотя в этом диалоге больше ошибок, чем в среднем допускает студент, тем не менее он может служить хорошей иллюстрацией того, как учитель реагирует на ошибки студента и его просьбы о помощи. Студент спокойно вводит информацию до тех пор, пока не напечатает cond. В этот момент учитель говорит ему, что в условной структуре необходимости нет. После строки 1 в распечатке 1 на экране дисплея появляется следующая информация:


Да, вы можете воспользоваться функцией COND в этом случае, но есть гораздо более простой способ проверки тою, что сумма квадратов двух первых сторон лежит в пределах 2%-ного отклонения от квадрата третьей стороны. Поскольку нам потребуется лишь один тест, вы можете использовать здесь предикат.

ПРОГРАММА ДЛЯ rightp

(defun rightp (сторона) сторона3 сторона3)
    (cond)
    )

ЦЕЛИ

Определить функцию rightp. (rightp 3 4 5,01)=t.
... Проверяет, является ли треугольник прямоугольным ...


Далее студент печатает (lessp (difference (см. строку 2) и получает подсказку, благодаря чему правильно размещает функцию вычисления абсолютной величины abs перед разностью в строке 3. Заметим, что учитель выдает меню, когда не знает, как дальше поступит студент. Например, поскольку аргументы для разности в функции rightp могут быть взяты в любом порядке, ему нужно знать, какой из них будет напечатан следующим. Это выясняется через меню в строке 3.

После строки 4 учитель дает студенту информацию о том, когда полезно запрограммировать отдельную вспомогательную функцию. Он задает студенту вопросы после строки 5, чтобы убедиться, что их мнения относительно того, что должно вычисляться с помощью такой функции, совпадают. Это пример режима планирования в действиях учителя. Студент неправильно представляет себе, чтб должна делать такая вспомогательная функция, т. е. допускает ошибку, которая корректируется учителем. После строки 7 студент обнаруживает, что его программа цели не достигает. Но поскольку эта программа не приводится в соответствие ни с одним из ошибочных правил в идеальной модели, от машинного учителя поступает минимальная информация — он указывает, что программа непонятна и просит студента пояснить, что же он пытается запрограммировать. Такой подсказки для студента недостаточно, и последний просит пояснения, нажимая на терминале специальную клавишу. Тогда машинный учитель помогает студенту определить другую вспомогательную функцию, а именно percentage (процент).

Окончательный вид функция rightp приобретает в строке К. В строке 9 студент определяет вспомогательную функцию sumsq, не допустив при этом ошибок, и переходит к определению функции percentage в строке 10. Он спотыкается на том, что не знает, что делать после того, как напечатано тело функции,— и просит учителя дать пояснения.

Машинный учитель помогает студенту улучшить алгоритм, после чего тот определяет функцию percentage, допустив при этом одну ошибку в строке 12.

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