qt_rewrite
import("noro_rewrite.rr")
しておくこと.
(noro_rewrite.rr が OpenXM/lib/asir-contrib に存在しない場合
ソースの OpenXM/src/asir-contrib/testing/noro/new_rewrite.rr をコピー)
nqt_match_rewrite
ではトップレベルのみに規則が適用される.
nqt_match()
の
Pattern と同じ書き方.
つまり [パターン, 書き換え結果] または
[パターン, 条件, 書き換え結果].
qt_normalize
の Mode と同様.
パターンマッチ, 書き換えは Mode で qt_normalize()
されてから遂行される.
注意: 数学的には X*Y=Y*X が可換性を与える規則だが, これをそのまま規則として 与えると書き換えが停止しない. 次の例では, 上の例のように順序比較し, たとえば, 順序が大きくなる場合のみに書き換えるべきである.
import("noro_rewrite.rr"); R=[[`X*Y,`nqt_comp(Y*X,X*Y)>0, `Y*X]]; qt_rewrite(`(x-y)^2,R,2); 出力: quote(x*x+-2*x*y+y*y)
外積代数の計算 (asir-contrib をロードした状態).
import("noro_rewrite.rr"); Rext0=[quote(X*Y),quote(qt_is_var(X) && qt_is_var(Y) && nqt_comp(Y,X)>0), quote(-Y*X)]; Rext1=[quote(X^N),quote(eval_quote(N)>=2),quote(0)]; Rext2=[quote(X*X),quote(0)]; Rext=[Rext0,Rext1,Rext2]; qt_rewrite(quote( (x+2*y)*(x+4*y) ), Rext,1); 出力: 2*x*y qt_set_coef([a,b,c,d]); qt_rewrite(quote((a*x+b*y)*(c*x+d*y)), Rext,1); 出力: (d*a-c*b)*x*y
微分の計算 (asir-contrib をロードした状態).
import("noro_rewrite.rr"); qt_set_coef([a,b]); Rd1=[`d(X+Y), `d(X)+d(Y)]; Rd2=[`d(X*Y),`d(X)*Y+X*d(Y)]; Rd3=[`d(N), `qt_is_coef(N), `0]; Rd4=[`d(x),`1]; Rd=[Rd1,Rd2,Rd3,Rd4]; B=qt_rewrite( `d( (a*x+b)^3),Rd,2); 出力: quote(3*a^3*x*x+6*b*a^2*x+3*b^2*a) fctr(eval_quote(B)); 出力: [[3,1],[a,1],[a*x+b,2]]
nqt_match
,
section nqt_match_rewrite
,
section qt_normalize
ChangeLog
Go to the first, previous, next, last section, table of contents.