Еще две
очень полезные функции, помогающие
программировать правила вычислений
match - сравнение с шаблоном и typematch
- сравнение типов.
Функция match вызывается следующей
командой match (выражение = шаблон, v, 's'), где
выражение - сравниваемое выражение
шаблон - шаблон, с которым сравнивается выражение
v - имя главной переменной
's' - имя возвращаемого аргумента
Функция match возвращает true
если она может подтвердить соответствие шаблону
и false в противном случае. Если сравнение
удачно, то величине s присваивается система
равенств, подстановка которых в шаблон приведет
к сравниваемому выражению.
Главная переменная - именно та
переменная, относительно которой происходит
сравнение с шаблоном.
Сравнение является математическим
сравнением, иначе говоря выражения вычисляются,
если возможно, чтобы удовлетворить шаблону, в
отличие от функции typematch , которая сравнивает
форму объектов. Приведем пример
> match(exp(x)/x^(2) =
A*exp(x)^P*x^Q, x, 's');
> s;
Заметим, что функция match может быть
очень полезна также, когда из сложного выражения
необходимо выделить члены, соответствующие
некоторому шаблону.
Функция typematch осуществляет
сравнение выражений по типу переменных. Она
вызывается одной из следующих команд
typematch ( выражение , t) или typematch
( выражение , t, 's'), где
выражение - любое выражение
t - выражение, содержащее переменные с указанием
их типов ` ::` - оператором
s - (необязательная опция) - имя
Команда typematch является логической
функцией. Она возвращает true , если вводимое ` выражение
` удовлетворяет типу t. Обычно тип t содержит
выражения вида v_i :: t_i где v_i переменная, t_i - ее
тип..
В команде typematch (e,t,'s'), если сравнение
успешно, список уравнений вида v_i = r_i
присваивается параметру s.
Заметим, что аргументы оператора связи
`::` шаблона вычисляются. Таким образом, если
переменной x может быть присвоено некоторое
значение - например, в предыдущей команде
сравнения - то, чтобы не было ошибки, ее
необходимо заключать в кавычки. То есть записать
команду в виде
typematch( e,'x'::name=range).
Приведем примеры
> typematch( y^3,
b::name^(n::integer), 's' );
> s;
> typematch( [a,b,c,d,e], list(
v::name ), 's' );
> s;
>
Команда typematch может быть
использована также для вычленения элементов из
сложного выражения по шаблону типов элементов.
|