Команда define задает свойства
оператора или функции.
Команду define можно применять тремя
различными способами.
Способ 1
Можно определить оператор, как
принадлежащий некоторому абстрактному
алгебраическому пространству aa командой define
( aa (оператор)) ( в настоящее время программа
позволяет определять пространство aa как
линейное ( aa = Linear ) или как группу ( aa = Groop
).
Например введем оператор H как линейный
> define(h,linear,h(1)=1);
Если мы воздействуем этим оператором на
некоторую функцию, скажем многочлен 2*x+3*x^2, то
получим
> h(2*x+3*x^2);
То есть мы видим, что выражения,
содержащие этот оператор упрощаются. Это не
случайный факт, при задании оператора командой define
автоматически создаются входы для таких команд,
как simplify , eval , expand , diff , series , и testeq
так, чтобы осуществить необходимые свойства
оператора.
Если абстрактное алгебраическое поле -
группа, то команда define записывается
следующим образом
define (Group(Имя оператора, Единица,
Оператор обращения)), где
Имя оператора - Имя бинарного оператора,
определяемого на группе
Единица - Символ единицы (единичного элемента)
группы
Оператор обращения - унарный оператор, который
вычисляет обратный элемент для любого элемента
группы. При такой записи команда define задает
оператор над группой, тем самым задавая правила
вычислений, преобразований и упрощений этого
оператора.
Свойства группы:
Замкнутость
Ассоциативность
Единичный оператор действует как слева так и
справа.
Оператор обращения - унарный оператор.
Приведем пример
define(E,algebraic,E(1)=0);
> z &+ E;
> &- (&- a);
> a &+ (&- a);
Способ 2
Можно определить оператор заданием
некоторых свойств. В этом случае команду define
нужно применять в следующей записи
define (оператор, свойство1, свойство2,
...), где свойство.i - наименование свойства
оператора
Операторы могут использоваться в
инфиксной нотации (&-имена):
a &+ b; a &* b &* c; &A x
или в функциональной нотации (любое имя):
Op(a,b); Op(a); Op(a,b,c)
В настоящее время Maple позволяет
задавать следующие свойства:
unary ; - свойство унарности оператора.
binary ; свойство бинарности.
associative ; свойство ассоциативности:
f(x,f(y,z)) = f(f(x,y),z) = f(x,y,z).
commutative или symmetric ; свойство
коммутативности (симметричности): f(x,y) = f(y,x).
antisymmetric ; свойство
антисимметричности: f(x,y) = -f(y,x).
inverse =g; Определяет обратный (для
унарного) оператор к оператору g.
identity =x; Выражение x, примененное к
оператору f как слева так и справа дает единичный
оператор
zero =x; определяет x как нулевой
элемент оператора f, так что если любой аргумент f
есть x tто результат также x.
Приведем пример
define(`&A`, associative, commutative,
identity=0, zero=y);
> x &A (t &A z) &A (0
&A x);t &A z;0 &A x;x &A (t &A z);
>define(f, commutative, associative,
inverse=g);
Warning: new definition for f
> f( g(x), x,y);
> f( g(x),f(x));
> f( g(x), z, f(x,y), y );
Способ 3
Можно задать конкретные правила
выполнения оператора при помощи уравнений. В
этом случае команда define записывается
следующим образом
define (F, forall ( переменные , F( аргумент1
)= результат1 , F( аргумент2 )= результат2
, ...)
где
переменные - имя или имя с
присвоенным типом, или список имен
F - имя определяемого при помощи команды defined
оператора
аргументы.i - аргументы, с которыми данный
оператор будет использоваться
результаты.i - программированные результаты
применения F(аргументы.i)
Выражение forall () - необходимый
аргумент команды define , который обеспечивает
назначение свойств оператору..
Соотношение F( аргументы.i
)=результаты.i вынуждает оператор выдавать результаты.i
каждый раз, когда он получает аргументы.i .
Заданные в команде переменные используются
как сравниваемые аргументы, которые могут иметь
любое значение. Замена затем будет выполнена для
всех таких значений.
Имена переменных должны появляться
строго один раз в аргументы.i. Параметр переменные
может быть именем или списком имен, в этом случае
эти имена могут сравниваться с любым выражением.
Если имена приведены в форме тип(имя) , где тип
является одним из имеющих силу типов и имя -
некоторое имя, то имя будет сравниваться
только в случае, если оно имеет указанный тип.
Приведем примеры.
> restart;define(F,forall([n,x],F(x^n)=n*F(x)),F(sin(x))=exp(x+b));
> F(sin(x)^3.5)+F(1/sin(x));
|