| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
27.1 規則とパターンについて 27.2 規則とパターンに関する諸定義
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この節ではユーザ定義のパターン照合と簡易化の規則(TELLSIMP,TELLSIMPAFTER, DEFMATCH又はDEFRULEで設定したもの)について述べる。
尚、この設定によって、MAXIAM本体の簡易化に影響を与えたり、又、APPLY1やAPPLY2 を使う際に、この規則が表で適用される事がある。
TELLRATが影響を与える多項式の規則や可換及び非可換代数に関しては、AFFINEの章に 追加項目がある。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
(*訳者注: MAXIMAではLISPのS式の様な階層構造を持っており(リストの章を参照せよ)、 MAXAPPLYDEPTHはAPPLY1,APPLY2が適用させられる階層構造の深さと云える。 その為、それより深い個所にあるS式には影響が及ばない。とは云え、 デフォルト値が10000なので通常の利用では事実上全てと云えるだろう。 *) |
MAXAPPLYHEIGHT[10000] - APPLYB1が停止する迄に達する最大の高さである。
CURRENT_LET_RULE_PACKAGE |
LETSIMP(Expr,rule_pkg_name);の様な呼出しが行われると、規則パッケージ rule_pkg_nameはLETSIMP命令のみの為に用いられる。つまり、 CURRENT_LFT_RULE_PACKAGEは変更されない。
この関数が"呼出される"と実際の引数が代入される。
例えば:
(C1) NONZEROANDFREEOF(X,E):= IF E#0 AND FREEOF(X,E)
THEN TRUE ELSE FALSE$
(IS(E#0 AND FREEOF(X,E))と同値な関数の定義である)
(C2) MATCHDECLARE(A,NONZEROANDFREEOF(X),B,FREEOF(X))$
(C3) DEFMATCH(LINEAR,A*X+B,X)$
これで関数LINEAR(exp,var1)が定義される。
|
MATCHDECLAREでパターン変数として、又は、DEFMATCHでパターン変数として宣言しな かった如何なる変数も、(C4)でDEFMATCHに対して第三の引数が省略されていたとして も、LINEARはXの中のlinearにのみ適合し、他の如何なる変数に対しても、そうでない のと同様に、それ自身とは適合する助変数を含まないパターンやパターン変数は適合 すればTRUEを返す。より多くの例はEXAMPLE(DEFMATCH);を実行せよ。
例えば、SINを修正した第一の規則はSINRULE1と呼ばれる。DISPRULE(ALL);は全ての 規則を表示する。
(* 訳者注:
デフォルトの規則
(C16) disprule(all);
SIN(A)
(E16) TRIGRULE0 : TAN(A) -> ------
COS(A)
SIN(A)
(E17) TRIGRULE1 : TAN(A) -> ------
COS(A)
1
(E18) TRIGRULE2 : SEC(A) -> ------
COS(A)
1
(E19) TRIGRULE3 : CSC(A) -> ------
SIN(A)
COS(A)
(E20) TRIGRULE4 : COT(A) -> ------
SIN(A)
SINH(A)
(E21) HTRIGRULE1 : TANH(A) -> -------
COSH(A)
1
(E22) HTRIGRULE2 : SECH(A) -> -------
COSH(A)
1
(E23) HTRIGRULE3 : CSCH(A) -> -------
SINH(A)
COSH(A)
(E24) HTRIGRULE4 : COTH(A) -> -------
SINH(A)
(E25) LINEAR : A X + B -> [X]
B
/
[
(E26) CHECKLIMITS : I F dX -> []
]
/
A
(D26) DONE
(C26)
*)
|
LETRAT[FALSE]がFALSEであれば、LETSIMPはexprの分子と分母を独立して簡易化した 結果を返す。N!/Nを(N-1)!にする様な置き換えは失敗する。この様な状況を扱う為 にLETRATはTRUEに設定されているべきである。そうすると、分子、分母とそれらの商 はその次数で簡易化される。
これらの置き換え関数は一度に幾つかの規則の組み合わせを用いて動かす事が出来る。 各々の規則の組み合わせは任意数のLETで操作された任意の数の規則を含む事が可能で あり、利用者によって提供された名前で参照される。
規則パッケージnameへの規則の追加は、LET([prod,rep1,pred,arg1,...],name)を実行 する。規則パッケージname内の規則を適用する為にLETSIMP(expr,name)を実行せよ。 関数LETSIMP(expr,name1,name2,...)はLETSIMP(%,name2)等が後に続く LETSIMP(expr,name1)を実行する事と同値である。
CURRENT_LET_PRLE_PACKAGEは規則パッケージの名前で現在利用されているものである。 利用者はこの変数をLET命令を通じて以前定義した任意の規則パッケージの名前に対し て設定しても良い。
LETパッケージを含む任意の関数がパッケージ名無しで呼び出される時は何時でも CURRENT_LET_RULE_PACKAGEの値が利用される。
もし、LETSIMP(expr,rule_pkg_name);が実行される様な呼び出しであれば、規則 パッケージrule_pkg_nameはLETSIMP命令のみの為に用いられる。つまり、 CURRENT_LET_RULE_PACKAGEは変らない。
DEFAULT_LET_RULE_PACKAGEがあり、これは他の名前が一切、任意の関数に対して供給 されていない時に仮定されたものである
LETが規則の組み合わせのnameを含んでいる時は何時でもCURRENT_LET_RULE_PACKAGE として利用される。
CURRENT_LET_RULE_PACKAGE |
の値であり、その規則の初期値は
DEFAULT_LET_RULE_PACKAGE |
expに対して変化が無くなるまで、以前関数LETで定義された代入規則の適用を連続し て行う。LETSIMP(expr,rule_pkg_name);で規則パッケージrule_pkg_nameがLETSIMP 命令のみに対して利用される事となる。つまり、CURRENT_LET_RULE_PACKAGEは変ら ない。
DEFAULT_LET_RULE_PACKAGE |
例えば、 MATCHDECLARE(Q,FREEOF(X,%E)) |
MATCHFIX("x",...)関数は構文式関数で、XがMATCHFIX演算子である事を宣言するもの である。初期のbinding powerは180で内側のARGSは任意で良い。
(C1) matchfix("|","|");
(D1) "|"
(C2) |a|+b;
(D2) b + (|a|)
(C3) |(a,b)|;
(D3) |b|
(C4) |[a,b]|;
(D4) |[a, b]|
(C9) |x|:=IF NUMBERP(x) THEN ABS(x)
ELSE (IF LISTP(x) AND APPLY("and",MAP(NUMBERP,x))
THEN SUM(x[i]^2,i,1,LENGTH(x))^0.5 ELSE BUILDQ([u:x],|u|))$
(C10) |[1,2,3]|;
(D10) 3.741657386773941
(C18) |-7|;
(D18) 7
(C19) |[a,b]|;
(D19) |[a, b]|
|
もし、簡易化が式の主演算子について何かを"知って"いるものの、十分な簡易化でな ければ、恐らくTELLSIMPAFTERを使う事を望むであろう。patternは和、積、単変数や 数値であってはらない。規則は名前のリストで名前は簡易化の規則を持ち、それらは DEFRULE,DEFMATCH,TELLSIMPやTELLSIMPAFTERで追加されるものである。 例題はEXAMPLE(TELLSIMP);を実行せよ。
| [ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |