define - 演算子の特性を定義する
使い方
define(oper, rule1, rule2, ...)
definemore(oper, rule1, rule2, ...)
undefine(oper)
redefine(oper, rulelist)
パラメータ
oper - 定義される演算子の名前
rule1, rule2, ... - 1 つまたは複数の、性質を表すキーワード、あるいは、規則を定義する式
rulelist - リスト; 等式による規則からなるリスト、あるいは、性質のキーワード
|
説明
|
|
•
|
define コマンドは、規則により手続きを定義します。define コマンドを使用して手続きを定義するためには、手続き名と手続きが従うべき規則をpatmatch の構文を用いて指定します。各定義式の左辺は、定義された手続き名を含む必要があります。さらに、一般の構成の省略形として使用できるいくつかのプロパティ名があります。
|
•
|
define コマンドは、定義される手続きの名前を第1引数としてとります。値が返される際、渡される名前には指定した規則または特性に従う手続きが割り当てられます。define コマンド自身は、値 NULL を返します。
|
•
|
define の呼び出し内で指定される規則は、それらが現れた順序で適用されます。従って、一般的な規則よりも特別な規則の方が、規則の列の中で先に現れる必要があります。
|
•
|
define に第1引数として渡される名前は、割り当てられるべきではありません。従って、defineを使用して定義された手続きの定義を変更するためには、下記で述べるように、代わりに redefine コマンドを使用してください。
|
•
|
define を使用して定義される手続きは、definemore コマンドを使用して定義に規則と特性を加え、さらに 特殊化することができます。その構文は、define コマンドに対するものと同じですが、規則、あるいは、プロパティは、置き換えられるのではなく、すでに定義された手続きの定義に追加されます。
|
•
|
矛盾する規則があったり、終了しないプログラムになってしまう場合、コマンド define は、 必ずしも検出できない場合があります。
|
|
|
規則
|
|
•
|
規則は、patmatch の構文を使用して指定された等式による規則か、あるいは、プロパティに名前を与える予約語 linear, multilinear, orderless, flat, identity, zero, diff のいずれかである必要があります。これらの予約語 の意味は、以下の通りです。
|
•
|
linear プロパティを使うと、定義された手続きを第1引数に関して線形とすることができます。
|
•
|
multilinear プロパティを使うと、定義された手続きを multilinear 関数、すなわち、各引数について、独立に、線形とすることができます。
|
•
|
orderless プロパティを使うと、定義された手続きで、その引数の順序を変更しても一定とすることができます。 2つの引数を持つ手続きに対しては、可換な手続きに相当します。
|
•
|
flat プロパティにより、定義された手続きが結合的であるとすることができます。
|
•
|
identity プロパティは、 2 つの引数をもつ手続き (または 二項演算) に対する恒等要素に名前を与えるために使用されます。これは、 identity = EXPR の形の式を指定することにより使用されます。ここで、EXPR は、恒等要素として用いられるべき式です。
|
•
|
zero オプションは、定義された手続きの零点を指定するために使用されます。これは、zero = EXPR の形の式を指定することにより使用します。ここで、EXPR は、定義された手続きの零点である式です。
|
•
|
手続きを定義する規則は、定義された手続きの導関数の指定を含むことがあります。定義された手続きの名前が F である場合、その導関数は、 diff(F(x),x) = EXPR の形式で指定されなければなりません。ここで、EXPR は、Fの導関数に対する式 (xに依存します) です。
|
•
|
関数 F が define とともに生成された場合、その定義を undefine(F) を呼び出すことにより除くことができます (多くの場合、単に unassign Fで十分ですが、一般には、undefine を使用する必要があります。)
|
•
|
関数名は、redefine コマンドを使用することにより変更することができます。これは、再定義する必要のある関数の名前と定義のためのプロパティのリストのちょうど2つの引数をとります。これは、新しい定義において、つぎに続く引数として define に渡されます。
|
|
|
例
|
|
>
|
define( f, 'linear', f( 1 ) = tt );
f( 2 * x + 4 );
|
| (3.1) |
>
|
define( g,
g( ( a::nonunit(algebraic) )^n::nonunit(integer) ) = n * g( a ),
g( a::realcons ) = a );
g( x^2 );
|
| (3.2) |
| (3.3) |
| (3.4) |
交換可能 かつ 結合的な操作を定義します。
>
|
define( h, 'orderless', 'flat' );
h( a, b ) - h( b, a );
|
| (3.5) |
>
|
h( a, h( b, c ) ) - h( h( a, b ), c );
|
| (3.6) |
再帰的な手続きを定義するために define を使用することができます。
>
|
define( fac, fac( 0 ) = 1, fac( n::posint ) = n * fac( n -1 ) );
fac( 5 );
|
| (3.7) |
>
|
define( fib, fib( 0 ) = 1, fib( 1 ) = 1, fib( n::posint ) = fib( n - 1 ) + fib( n - 2 ) );
fib( 7 );
|
| (3.8) |
>
|
define( H, 'multilinear' );
H( 2 * x, x + 3 );
|
| (3.9) |
>
|
definemore( H, 'orderless', H( a::realcons, b::algebraic ) = a * H( b ) );
H( 2 * x, x + 3 );
|
| (3.10) |
次の例は 1 行だけで GCD をプログラミングしています。
>
|
define( GCD,
GCD( a::integer, 0 ) = a,
GCD( a::integer, b::integer ) = GCD( b, a mod b ) );
GCD( 6, 3 );
|
| (3.11) |
| (3.12) |
| (3.13) |
identity プロパティ は、モノイド (monoid) 演算を定義するために使用することができます。
>
|
define( '`&x`', 'flat', 'identity' = 1 );
a &x b &x c;
|
| (3.14) |
| (3.15) |
| (3.16) |
簡単な積分器は、つぎのように定義することができます。
>
|
define( INT,
'linear',
'conditional'( INT( a::algebraic, X::name ) = a * X, _type( a, freeof( X ) ) ),
INT( X::name, X::name ) = X^2/2 );
|
この定義を使うと、任意の変数に対して積分ができます。
| (3.17) |
| (3.18) |
積分器を改良するために definemore を使用します。
>
|
definemore( INT,
'conditional'( INT( 1 / (a::algebraic * X::name + b::algebraic), X::name )
= ln( a * X + b ),
_type( a, freeof( X ) ) &and _type( b, freeof( X ) ) ) );
INT( 1 / x, x );
|
| (3.19) |
>
|
INT( 1 / ( 2 * x + 3 ), x );
|
| (3.20) |
>
|
definemore( INT,
INT( (x::name)^n::nonunit(integer), x::name ) = 1 / (n + 1) * x^(n + 1) );
INT( 2 * x^2, x );
|
| (3.21) |
| (3.22) |
>
|
definemore( INT,
INT( sin( a::algebraic * x + b::algebraic ), x::name )
= -1/a * cos( a * x + b ),
_type( a::freeof( x ) ) & and _type( b, freeof( x ) ) );
|
on line 218, syntax error, invalid neutral operator:
_type( a::freeof( x ) ) & and _type( b, freeof( x ) ) );
^
| |
注意: このままでは、INTが理解できないパターンに出会うと、INT は未評価のままで返します。
>
|
INT( sin( x ) + cos( x ), x );
|
| (3.23) |
つぎの例では、P の導関数を指定して、手続きP を定義します。
>
|
define( P, diff( P( x ), x ) = 1 / P( x ) );
diff( P( x ), x );
|
| (3.24) |
>
|
diff( P( exp( z ) ), z );
|
| (3.25) |
>
|
diff( 1 / P( x^2 ), x );
|
| (3.26) |
linear プロパティを用いて定義された手続きに対して導関数を指定し、Maple で利用することができます。
>
|
redefine( f, [ linear, f( 1 ) = 1, diff( f( x ), x ) = a ] );
diff( f( x ),x );
|
| (3.27) |
| (3.28) |
| (3.29) |
>
|
int( exp( f( x ) ), x );
|
| (3.30) |
>
|
int( f( sin( x ) ), x );
|
| (3.31) |
>
|
limit( f( x ), x = 0 );
|
| (3.32) |
define コマンドを使用して定義された手続きの定義を完全に除くには、undefine を使用します。
>
|
undefine( f );
diff( f( x ), x );
|
| (3.33) |
>
|
limit( f( x ), x = 0 );
|
| (3.34) |
|
|