[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27. 規則とパターン

27.1 規則とパターンについて  
27.2 規則とパターンに関する諸定義  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.1 規則とパターンについて

この節ではユーザ定義のパターン照合と簡易化の規則(TELLSIMP,TELLSIMPAFTER, DEFMATCH又はDEFRULEで設定したもの)について述べる。

尚、この設定によって、MAXIAM本体の簡易化に影響を与えたり、又、APPLY1やAPPLY2 を使う際に、この規則が表で適用される事がある。

TELLRATが影響を与える多項式の規則や可換及び非可換代数に関しては、AFFINEの章に 追加項目がある。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.2 規則とパターンに関する諸定義

関数: APPLY1 (exp, rule1, ..., rulen)
最初の規則をexpに失敗するまで繰り返し作用させ、今度は同じ規則をexp全ての部分式 に左から右へと失敗するまで繰り返し作用させる。変換したexpの結果はexp'で呼出す。 次に、第二の規則をexp'の先頭から同じ流儀で作用させて最後の規則が最後の部分式で 失敗すれば、この操作は終了する。

関数: APPLY2 (exp, rule1, ..., rulen)
最初の規則が与えられた部分式で失敗すると、第二の規則が適用させられる事で APPLY1と異なる。全ての与えられた部分式で失敗した時に限り、全ての規則の集合が 次の部分式に繰り返し適用させられる。もし、規則の一つが成功すれば、その同じ 部分式が最初の規則で再実行されMAXAPPLYDEPTH[10000]はAPPLY1とAPPLY2が実行さ れる最大の深さである。

 
(*訳者注: 

MAXIMAではLISPのS式の様な階層構造を持っており(リストの章を参照せよ)、
MAXAPPLYDEPTHはAPPLY1,APPLY2が適用させられる階層構造の深さと云える。
その為、それより深い個所にあるS式には影響が及ばない。とは云え、
デフォルト値が10000なので通常の利用では事実上全てと云えるだろう。

*)

関数: APPLYB1 (exp, rule1, ..., rulen)
APPLY1と似ているが、"下から上に"では無く"上から下に"動く。つまり、expで最小 の部分式、次に最小のもの等々、と進める。

MAXAPPLYHEIGHT[10000] - APPLYB1が停止する迄に達する最大の高さである。

変数: CURRENT_LET_RULE_PACKAGE
デフォルト値:[DEFAULT_LET_RULE_PACKAGE] - 以前利用された規則パッケージの名前が設定されている。利用者はLET命令で以前定義 されたどの様な規則パッケージの名前も、この変数に再設定して構わない。 ETパッケージに関連するどの様な関数でも、
 
CURRENT_LET_RULE_PACKAGE
が何時でも使える。

LETSIMP(Expr,rule_pkg_name);の様な呼出しが行われると、規則パッケージ rule_pkg_nameはLETSIMP命令のみの為に用いられる。つまり、 CURRENT_LFT_RULE_PACKAGEは変更されない。

変数: DEFAULT_LET_RULE_PACKAGE
- 規則パッケージの名前であり、利用者がLETやCURRENT_LET_RULE_PACKAGEの値を変更 する事で、明示的に指定しない時に使われる。

関数: DEFMATCH (progname, pattern, parm1, ..., parmn)
n+1個の引数を持ち、名前がprognemeで、ある特定のパターンに適合するかどうか式を 検査する関数を生成する。パターンはpattern変数と助変数を含む式である。 変数pattern(もし、提示されれば)が以前のMATCHDECLARE関数の中で暗示的に与えられ ていたとしても、parmiは明示的に引数としてDEFMATCHに与えられる。構成された関数 prognameの最初の引数は"pattern"に対して照合する式で、他のn個の引数は式中の実際 の値であり、"pattern"の中ではダミー変数として置かれる物である。DEFMATCH内の parmはFORTRANのSUBROUTINEでのダミー変数と似ている。

この関数が"呼出される"と実際の引数が代入される。
 
例えば:

(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)が定義される。

これはexpがA*var1+Bの形式であるかどうかを検証する。ここで、AとBはvar1を含まず、 Aは零で無いものである。DEFMATCHで構成された関数は(照合に成功すれば)、左辺が パターンの変数とparmで、右側が適合するパターン変数と助変数である式のリストを 返す。助変数では無いパターン変数は適合する式に設定される。もし、照合に失敗す れば関数はFALSEを返す。そんな訳で、LINEAR(3*Z+(Y+1)*Z+Y**2,Z)は [B=Y**2, A=Y+4, X=Z]を返す。

MATCHDECLAREでパターン変数として、又は、DEFMATCHでパターン変数として宣言しな かった如何なる変数も、(C4)でDEFMATCHに対して第三の引数が省略されていたとして も、LINEARはXの中のlinearにのみ適合し、他の如何なる変数に対しても、そうでない のと同様に、それ自身とは適合する助変数を含まないパターンやパターン変数は適合 すればTRUEを返す。より多くの例はEXAMPLE(DEFMATCH);を実行せよ。

関数: DEFRULE (rulename, pattern, replacement)
与えられたpatternに対し、replacementの規則の定義と名付けを行う。 rulenameと名付けられた規則が(後述のAPPLY関数の一つによって)式に適用されている と、そのpatternに適合する全ての部分式がreplacementによって置き換えられる。 patternによって値が割り当てられたreplacementの中の全ての変数はそうして簡易化 されたreplacementの中のそれらの値が割り当てられる。規則自体はpatternの照合と 置換えの一つの操作によって式を変換する関数として扱う事が可能である。その patternが失敗すると元の式が返される。

関数: DISPRULE (rulename1, rulename2, ...)
DEFRULE,TELLSIMP,TELLSIMPAFTERによって与えられたrulename1,rulename2や、 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) 
*)

関数: LET (prod, repl, predname, arg1, arg2, ..., argn)
LETSIMPに対し、prodがrep1で置き換えられる様に置き換えの規則を定義する。 prodは次の項の正、負の羃乗の積である:

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 として利用される。

変数: LETRAT
デフォルト値:[FALSE] - FALSEであれば、LETSIMPはexprの分子と分母を独立して簡易 化を行い、結果を返す。N!/Nを(N-1)!にする様な置換は失敗する。この様な置換を行う 為に、LETRATをTRUEに設定すべきである。すると、分子、分母、それらの商はその要求 の通りに簡易化される。

関数: LETRULES ()
現行の規則の組み合わせで規則を表示する。LETRULES(name)はnameと云う名前の規則 の組合せの規則を表示する。現在の規則の組み合わせは

 
CURRENT_LET_RULE_PACKAGE

の値であり、その規則の初期値は

 
DEFAULT_LET_RULE_PACKAGE
である。

関数: LETSIMP (exp)

expに対して変化が無くなるまで、以前関数LETで定義された代入規則の適用を連続し て行う。LETSIMP(expr,rule_pkg_name);で規則パッケージrule_pkg_nameがLETSIMP 命令のみに対して利用される事となる。つまり、CURRENT_LET_RULE_PACKAGEは変ら ない。

変数: LET_RULE_PACKAGES
デフォルト値:[DEFAULT_LET_RULE_PACKAGE] - LET_RULE_PACKAGEの値は全ての利用者 定義の規則パッケージに特殊なパッケージを加えたもののリストである。

 
DEFAULT_LET_RULE_PACKAGE
これは利用者によって明示的に設定されていない時に利用される規則パッケージの 名前である。

関数: MATCHDECLARE (patternvar, predicate, ...)
述語をパターン変数で結び付けて、述語がFALSEで無い式に対してのみ、その変数が 適合する様にする(適合は以下に記した関数の一つで達成される)。

 
例えば、

MATCHDECLARE(Q,FREEOF(X,%E))

が実行されるとQはXか%Eを含まない任意の式に適合する。もし、適合に成功すれば、 変数は適合した式に設定される。述語(この場合はFREEOF)は最後の引数無しで記述さ れており、引数はパターン変数を検査されるべきものに対して一つでなければなら ない。述語に対するpatternvarと引数はMATCHが実行された時間で評価される事に注意 せよ。奇数引数も全てが述語に関連するパターン変数のリストであっても良い。 パターンの照合については述語は関数を参照し、その関数はFALSEか非FALSE(任意の 非FALSE値はTRUEの様に動作する)のどちらかである。MATCHDECLARE(var,TRUE)はvarが 任意の式で適合する事を許容する。

関数: MATCHFIX
- MATCHFIX演算子は任意の数の引数を表記する為に用い、その引数はリストとして関数 に渡されるものである。引数は主演算子とその"マッチング"デリミタの間に現われる。

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]|

関数: REMLET (prod, name)
LET関数で定義された最も新しい代入規則prod-->replを削除する。nameが与えられる と、規則パッケージ名前からその規則が削除される。REMLET()とREMLET(ALL)はその 時点の規則パッケージから代入規則の全てを削除する。もし、規則パッケージの名前 が、例えば、RELMET(ALL,name)で与えられていれば、その規則パッケージ名のnameも 削除される。もし、代入が(最初に)同じ生成物を用いて変更されるものであれば REMLETが呼出される必要は無く、単にLET関数とその新しい代入と述語の名前を(綴で) 持った同じ生成物を用いる代入の再定義を行う。REMLET(生成物)が呼出されると元の 置換規則が復活する。

関数: REMRULE (function, rulename)
rulenameの規則をDEFRULE、DEFMATCH,TELLSIMPやTELLSIMPAFTERで設定されたfunction から削除する。rule-nameがALLであれば、全ての規則が削除される。

関数: TELLSIMP (pattern, replacement)
TELLSIMPAFTERに類似しているが、新しい情報を古いそれの前に置いて、組込みの簡易 化規則よりも前に適用される様にする。TELLSIMPは簡易化が作用する前に式を改変する 事が重要な時に利用される。例えば、簡易化が式について何かを"知って"いるが、 それが返すものが期待したもので無い場合である。

もし、簡易化が式の主演算子について何かを"知って"いるものの、十分な簡易化でな ければ、恐らくTELLSIMPAFTERを使う事を望むであろう。patternは和、積、単変数や 数値であってはらない。規則は名前のリストで名前は簡易化の規則を持ち、それらは DEFRULE,DEFMATCH,TELLSIMPやTELLSIMPAFTERで追加されるものである。 例題はEXAMPLE(TELLSIMP);を実行せよ。

関数: TELLSIMPAFTER (pattern, replacement)
patternに対してreplacementを定義する。このpatternはMACSYMAの簡易化が組込みの 簡易化の規則を適用した後に用いるものである。patternは単変数や数を除く任意の もので良い。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Hiroshi Yokota on September, 16 2002 using texi2html