[Из песочницы] PG как эволюция Perl для математиков в WeBWorK
Дисклеймер: Представленная информация может быть полезна преподавателям, авторам курсов. Большинство информации является вольным переводом с англоязычной Wiki WeBWorK.
Для начала: Что такое WeBWorK?
WeBWorK — это написанная на Perl свободная система для предоставления индивидуальных домашних заданий через сеть. Система позволяет преподавателям создавать курсы из набора домашних работ, которые могут быть впоследствии решены студентами.
Студент может получит доступ к домашнему заданию с любого компьютера. Система предполагает ввод формул в любом тождественном виде, что снимает лишние заботы со студента. Благодаря тому, что информация о корректности решения поступает немедленно, у студента есть возможность перерешать задание.
Преподаватель также не ограничен в месте доступа. Для составления курса могут быть использованы как новые задачи, так и тысячи уже готовых задач нескольких университетов. Для пресечения списывания предусмотрена возможность задать индивидуальные особенности задания для каждого студента. Вся информация о студентах, курсах и статистика решения задач доступна преподавателю, что позволяет лучше оценить успеваемость студентов, как общую, так и индивидуальную.
Все задачи (проблемы) в WeBWorK считываются из текстовых файлов, которые написаны на языке, называемом PG (for Problem Generation).
Язык PG является коллекцией макросов (подпрограмм), написанных на Perl, который упрощает написание математических задач. Его разработка началась в 1995 году и язык все еще находится в стадии разработки.
На данный момент PG имеет три диалекта:
- Оригинальный PG;
- MathObjects;
- PGML.
Небольшую информацию о WeBWorK и PG я написал, попробуем разобрать сам язык PG.
Стандартный файл WeBWorK PG имеет пять разделов:
- Раздел пометки и описания, который описывает задачу для будущих пользователей и авторов;
- Раздел инициализации, который загружает требуемые макросы для задачи;
- Раздел, в котором устанавливаются переменные, нужные в данной задаче;
- Раздел текста, в котором записывается текст задачи, показываемый студенту;
- Раздел ответа.
Разберем простую задачу, написанную на PG.
# A simple sample problem that asks students to
# differentiate a trigonometric function.
# WeBWorK problem written by Gavin LaRose,
#
# ENDDESCRIPTION
## DBsubject('WeBWorK')
## DBchapter('Demos')
## DBsection('Problem')
## KEYWORDS('')
## TitleText1('')
## EditionText1('')
## AuthorText1('')
## Section1('')
## Problem1('')
## Author('Gavin LaRose')
## Institution('UMich')
Любая строка, начинающаяся с символа "#" является комментарием для преподавателей и других авторов задач. Описание нужно для того, чтобы другой автор задач или преподаватель мог узнать суть задачи не вникая в сам код.
Всю информацию о задании заполняют в пометки. Пометки начинаются с символов "##". Это нужно для того, чтобы задачу можно было легко проиндексировать.
Существуют он-лайн списки текущих имен глав и разделов, и аналогичный список ключевых слов.
Ключевые слова должны быть разделены запятыми и процитированы (например, KEYWORDS('calculus','derivatives')).
DOCUMENT();
loadMacros(
«PGstandard.pl»,
«MathObjects.pl»,
);
Первой командой в задаче обязательно должна быть команда DOCUMENT();
Заметьте, что каждая команда должна заканчиваться точкой с запятой.
Командой loadMacros мы загружаем нужные макросы.
Context(«Numeric»);
$a = random(2,9,1);
$trigFunc = Formula(«sin($a x)»);
$trigDeriv = $trigFunc->D();
Команда Context(«Numeric»); устанавливает «Контекст», устанавливающий как переменные интерпретируются.
Все контексты и контекстные пояснения даны на этой странице справки.
Основная часть раздела определяет переменные, которые мы используем в остальной части задачи.
Все скалярные переменные отмечаются символом "$": таким образом, $a — это переменная, которая имеет значение.
Так же мы определяем $trigFunc и $trigDeriv при помощи команд из MathObject.
TEXT(beginproblem());
Context()->texStrings;
BEGIN_TEXT
Find the derivative of the function \(f(x) = $trigFunc\).
$PAR
\(\frac{df}{dx} = \) \{ ans_rule(35) \}
END_TEXT
Context()->normalStrings;
Команда TEXT(beginproblem()); отображает заголовок задачи.
Команда Context()->texStrings; устанавливает, как будут отображаться формулы в тексте задачи.
Все между BEGIN_TEXT и END_TEXT будет показано студенту.
Математические уравнения разделяются на \( \) (для встроенных уравнений) или \[ \] (для отображаемых уравнений). Есть целый ряд переменных, которые устанавливают форматирование. Эта страница содержит список данных переменных.
А вот \{ \} выделяет часть кода, которая будет выполняться в тексте задачи. Здесь ans_rule(35) является функцией, которая вставляет поле ответа шириной 35 символов.
Context()->texStrings;
SOLUTION(EV3(<<'END_SOLUTION'));
$PAR SOLUTION $PAR
We find the derivative to this using the
chain rule. The inside function is \($a x\),
so that its derivative is \($a\), and the
outside function is \(\sin(x)\), which has
derivative \(\cos(x)\). Thus the solution is
\[ \frac{d}{dx} $trigFunc = $trigDeriv. \]
END_SOLUTION
Context()->normalStrings;
ENDDOCUMENT();
Ответ проверяется командой ANS( $trigDeriv->cmp() );. Эта команда сверяет правильный ответ и ответ введенный студентом. Затем мы объясняем решение студенту. Это решение будет отображаться, когда студент нажимает на кнопку «SOLUTION». Команда ENDDOCUMENT(); является последней командой в файле.
Единственной проблемой данной системы является то, что она не локализована для России и стран СНГ, и потому мало кто знает о ней и использует эту систему для преподавания и проверки знаний обучающихся.