[ << ] | [ < ] | [上] | [ > ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
[ << ] | [ < ] | [上] | [ > ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
quotetotex
, quotetotex_env
:: q を latex 形式で表現した文字列に変換する.
:: quotetotex の動作を制御するパラメータを変更する.
:: quotetotex の動作を制御するパラメータの現在値を戻す.
:: quotetotex の動作を制御するパラメータをデフォールト値に戻す.
文字列(quotetotex) または リストまたはオブジェクト(quotetotex_env)
quote
文字列
オブジェクト
[3] quotetotex(quote(1/(x+1))); \frac{ 1} { ( {x}+ 1)} [4] quotetotex(objtoquote(diff(x^x,x))); {x}^{ {x}- 1} {x}+ \log( {x}) {x}^{ {x}} [5] quotetotex_env("conv_rule",3); [6] quotetotex(objtoquote( (alpha2beta+x_i_j)^2)); {\alpha}_{2,\beta}^{ 2} + 2 {x}_{i,j} {\alpha}_{2,\beta}+ {x}_{i,j}^{ 2}
objtoquote
print_tex_form(contrib)
ChangeLog
[ << ] | [ < ] | [上] | [ > ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
objtoquote
:: オブジェクトと quote 型のデータに変換する.
quote
オブジェクト
objtoquote(ob)
は, ob を quote 型のデータに変換する.
[1150] quotetolist(quote(1+2)); [b_op,+,[internal,1],[internal,2]] [1151] quotetolist(objtoquote(1+x)); [b_op,+,[internal,x],[internal,1]]3
@ref{quotetotex} @ref{quotetolist}
ChangeLog
[ << ] | [ < ] | [上] | [ > ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
flatten_quote
:: quote の括弧をとりさる.
Quote
Quote
演算子を表す文字列.
quote_flatten()
は, q の中にあられる演算子 op
の子供ノードを平等にする.
つまり演算子 op に関する括弧づけがあった場合それをすべてとりさる.
たとえば (1+2)+(3+4) という表現を 1+2+3+4 に変換する.
[1288] flatten_quote(quote((1+2)+(3+4*(x+3))),"+"); quote(1+2+3+4*(x+3)) [1289] flatten_quote(quote( (x*y)*(p*3)-(x*y)*z),"*"); quote(x*y*p*3-x*y*z) [1290] quotetolist(quote(1+2+3)); [b_op,+,[b_op,+,[internal,1],[internal,2]],[internal,3]]
@ref{quotetolist}, @ref{print_tex_form}(contrib)
ChangeLog
[ << ] | [ < ] | [上] | [ > ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
quote_to_funargs
, funargs_to_quote
, remove_paren
, get_function_name
:: quote を funarg 形式(リスト) へ.
:: funarg 形式を quote へ.
:: funarg 形式の op を文字列へ.
:: 上の関数を用いて書かれた余分な括弧を取り去る simplifier (asir-contrib マニュアルへ: todo)
quote(funargs_to_quote, remove_paren) か リスト(quote_to_funargs)
quote
リスト
quote_to_funargs
は quote 型のデータ (内部的には FNODE) を
quote への復元可能な形でリストへ変換する.
quotetolist
は quote をリストへ変換するが, 一部の情報を捨てるため
もとの quote の復元はできない.
quote_to_funargs
の戻り値は [fid, op, arg1, arg2, ...]
なる形式をしている.
ここで op は node の名前であり,
関数 get_function_name
を用いて人間が読める形式
で取りだせる.
たとえば get_function_name(quote_to_funargs(quote(1+2))[1])
は "+" を戻す.
get_function_name
はそのうち変更されるだろう.
I_PAREN
を意味する.
数と意味の対応表は OpenXM/src/asir-contrib/packages/src/noro_simplify.rr
または OpenXM_contrib2/asir2000/parse/parse.h
を見よ.
以下の fid が 0, 1, 2, ... に対応づけられている.
I_BOP, I_COP, I_AND, I_OR, I_NOT, I_CE,
I_PRESELF, I_POSTSELF,
I_FUNC, I_FUNC_OPT, I_IFUNC, I_MAP, I_RECMAP, I_PFDERIV,
I_ANS, I_PVAR, I_ASSPVAR,
I_FORMULA, I_LIST, I_STR, I_NEWCOMP, I_CAR, I_CDR, I_CAST,
I_INDEX, I_EV, I_TIMER, I_GF2NGEN, I_GFPNGEN, I_GFSNGEN,
I_LOP, I_OPT, I_GETOPT, I_POINT, I_PAREN, I_MINUS,
I_NARYOP
次の例では (x+1)+(x+2) の括弧をはずして x+1+x+2 に変換している.
[0] ctrl("print_quote",1) $ [1] Q=quote((x+1)+(x+2)); [b_op,+,[u_op,(),[b_op,+,[internal,x],[internal,1]]], [u_op,(),[b_op,+,[internal,x],[internal,2]]]] [2] FA=quote_to_funargs(Q); [0,<...quoted...>, [u_op,(),[b_op,+,[internal,x],[internal,1]]], [u_op,(),[b_op,+,[internal,x],[internal,2]]]] [3] FA2=quote_to_funargs(FA[2])[1]; [b_op,+,[internal,x],[internal,1]] [4] FA3=quote_to_funargs(FA[3])[1]; [b_op,+,[internal,x],[internal,2]] [5] funargs_to_quote([FA[0],FA[1],FA2,FA3]); [b_op,+,[b_op,+,[internal,x],[internal,1]], [b_op,+,[internal,x],[internal,2]]]
次の例は OpenXM/asir-contrib 版の asir で実行.
[1287] load("noro_simplify.rr"); 1 [1293] noro_simplify.remove_paren(quote( f(1-(x)))); quote(f(1-x))
funargs_to_quote を用いて既存の quote の子供を置き換えて 新しい quote をつくり出せる.
[1184] R=quote_to_funargs(quote(a+(b+c))); [0,<...quoted...>,<...quoted...>,<...quoted...>] [1185] T=quote_to_funargs(quote(1+2)); [0,<...quoted...>,<...quoted...>,<...quoted...>] [1186] funargs_to_quote([0,R[1],R[2],T[2]]); quote(a+1)
@ref{quotetolist}
ChangeLog
funargs_to_quote
は変換する.
[ << ] | [ < ] | [上] | [ > ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
eval_quote
:: quote 型データ Q を asir のオブジェクトに変換する.
オブジェクト
quote型
objtoquote
ctrl("print_quote",2); A=quote((x-1)^2+(x-1)+3); 出力: ((((x)-(1))^(2))+((x)-(1)))+(3) eval_quote(A); 出力: x^2-x+3 print_input_form(A); /* asir-contrib */ 出力: quote((x-1)^2+(x-1)+3)
objtoquote
, @ref{quotetolist}, @ref{eval_string},
@ref{quote_to_funargs}, @ref{funargs_to_quote}
ChangeLog
[ << ] | [ < ] | [上] | [ > ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
nqt_match
:: Expr が Pattern にマッチ(適合)すると 1 を戻す. しないと 0 を戻す.
整数
quote型
quote型
整数
qt_normalize
を見よ.
ctrl("print_quote",2); A=quote((x-y)*(x+y)); nqt_match(A,quote(P*Q)); [P,Q] 出力: [x-y, x+y] nqt_match(A,quote(P*Q),1); マッチしない. nqt_match(A,quote(P*Q),2); マッチしない. qt_normalize(A,1); 出力: ((x)^(2))+((x)*(y))+((-1)*((y)^(2)))+((-1)*(y)*(x)) qt_normalize(A,2); 出力: ((x)*(x))+((x)*(y))+((-1)*(y)*(x))+((-1)*(y)*(y))
ChangeLog
[ << ] | [ < ] | [上] | [ > ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
nqt_match_rewrite
:: Expr を Rule に従い書き換える.
quote型
quote型
[Pattern,Action] かまたは [Pattern,Condition,Action]. これらの要素はすべて quote型.
整数
qt_normalize
を見よ.
ctrl("print_quote",2); nqt_match_rewrite(`x*y*z,[`X*Y,`X+Y],1); 出力: (x)+((y)*(z)) A=`x*x; nqt_match_rewrite(A,[`X*Y,`X+Y],1); 出力: x^2 (マッチしていない) nqt_match_rewrite(A,[`X*Y,`X+Y],2); 出力: 2*x 適合についてのモードの違いを理解するために次の例および fnode標準形(qt_normalize) を参照. quotetolist(qt_normalize(`x*x,0)); 出力: [b_op,^,[internal,x],[internal,2]] quotetolist(qt_normalize(`x*x,1)); 出力: [b_op,^,[internal,x],[internal,2]] quotetolist(qt_normalize(`x*x,2)); 出力: [n_op,*,[internal,x],[internal,x]]
ChangeLog
[ << ] | [ < ] | [上] | [ > ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
qt_normalize
:: Expr を fnode標準形に変換する. Modeにより標準形への展開アルゴリズムを指定できる.
quote型
quote型
整数
fnodeは quote型の実体である. fnode は木であり, 型 id および子供からなる. 型および子供を取り出す関数が funargs_to_quote である. また fnode をリストに変換する関数が quotetolist である.
fnode の標準形はパターンマッチング, 書き換えを容易におこなうために導入された. fnode の標準形を fn と書くとき, 標準形の BNF風表現での定義は以下のとおり.
fn = formula | functor(nf [,...]) | sum_of_monom fnode の標準形. functor は関数よびだしみたいなもの. sum_of_monom = monom [+ ...] モノミアルの和 monom = [formula *] nfpow [* ...] モノミアル nfpow = nf | nf^(nf) 冪乗部分の標準形 formula = Risa object
Mode の違いについては以下の例も参考に.
ctrl("print_quote",2); A=quote((x-y)*(x+y)); 出力: ((x)-(y))*((x)+(y)) B=qt_normalize(A,0); 出力: ((x)+((-1)*(y)))*((x)+(y)) Mode=0. 展開はされない. +, * は n_op (nary-op) へ. quotetolist(B); 出力: [n_op,*,[n_op,+,[internal,x],[n_op,*,[internal,-1],[internal,y]]],[n_op,+,[internal,x],[internal,y]]] B=qt_normalize(A,1); 出力: ((x)^(2))+((x)*(y))+((-1)*((y)^(2)))+((-1)*(y)*(x)) Mode=1. 展開する. +, * は n_op (nary-op) へ. 巾をまとめる. quotetolist(B); 出力: [n_op,+,[b_op,^,[internal,x],[internal,2]],[n_op,*,[internal,x],[internal,y]],[n_op,*,[internal,-1],[b_op,^,[internal,y],[internal,2]]],[n_op,*,[internal,-1],[internal,y],[internal,x]]] qt_normalize(A,2); 出力: ((x)*(x))+((x)*(y))+((-1)*(y)*(x))+((-1)*(y)*(y)) Mode=2. 展開する. +, * は n_op (nary-op) へ. 巾は使わない. quotetolist(B); 出力: [n_op,+,[b_op,^,[internal,x],[internal,2]],[n_op,*,[internal,x],[internal,y]],[n_op,*,[internal,-1],[b_op,^,[internal,y],[internal,2]]],[n_op,*,[internal,-1],[internal,y],[internal,x]]] qt_normalize(`x^2,2); 出力: (x)*(x) Mode=2. 巾は使わない. n-ary の * へ.
nqt_match
,
nqt_match_rewrite
,
@ref{quotetolist},
@ref{quote_to_funargs}
ChangeLog
[ << ] | [ < ] | [上] | [ > ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
qt_set_coef
:: 以下 ParamList に現れる多項式変数を変数とする有理関数体を係数とする 非可換多項式を扱う.
リスト
リスト
ctrl("print_quote",2); qt_set_coef([a]); B=qt_normalize(quote((a*x+a)^2),2); 出力: ((a^2)*(x)*(x))+((2*a^2)*(x))+(a^2) qt_normalize(B+B,2); 出力: ((2*a^2)*(x)*(x))+((4*a^2)*(x))+(2*a^2)
ChangeLog
[ << ] | [ < ] | [上] | [ > ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
qt_set_ord
:: VarList を変数順序とする.
リスト
リスト
ctrl("print_quote",2); qt_normalize(quote(x+y),2); 出力: (x)+(y) qt_set_ord([y,x]); 出力: [y,x,z,u,v,w,p,q,r,s,t,a,b,c,d,e,f,g, 以下省略 ] qt_normalize(quote(x+y),2); 出力: (y)+(x)
ChangeLog
[ << ] | [ < ] | [上] | [ > ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
qt_set_weight
:: 変数について weight ベクトルを設定する.
リスト
リスト
fnode f の weight w(f) は次の式で計算する.
f が葉の場合は原則 0. qt_weight_vector で weight が与えられている不定元に ついてはその値. f がnodeの場合は次の規則で再帰的にきめる. w(f+g) = max(w(f),w(g)) w(f g) = w(f) + w(g) w(f^n) = n w(f) 関数については? -----まだ書いてない.
dp_gr_main
も参照.
ctrl("print_quote",2); qt_set_weight([[x,-1],[y,-1]]); 結果: [[x,-1],[y,-1]] qt_normalize(quote( 1+(x+y)+(x+y)^2),1); 結果: (1)+(y)+(x)+((y)^(2))+((y)*(x))+((x)^(2))+((x)*(y))
ChangeLog
[ << ] | [ < ] | [上] | [ > ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
nqt_comp
:: Expr1 と Expr2 の順序を比較する.
整数
quote型
ctrl("print_quote",2); qt_set_ord([y,x]); qt_set_weight([[x,-1],[y,-1]]); [nqt_comp(`x,`y), nqt_comp(`y,`x), nqt_comp(`x,`x)]; 出力: [-1,1,0]
ChangeLog
[ << ] | [ < ] | [上] | [ > ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
qt_is_var
, qt_is_coef
:: Expr が不定元に対応する quote なら 1 を戻す.
:: Expr が係数の有理関数体に属するとき 1 を戻す.
整数
quote型
[qt_is_var(quote(x)), qt_is_var(quote(3/2))]; 出力: [1,0]
ChangeLog
[ << ] | [ < ] | [上] | [ > ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
qt_rewrite
:: Expr を規則集合 Rules を用いて書き換える.
quote型
quote型
リスト
整数
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]]
ChangeLog
[ << ] | [ < ] | [上] | [ > ] | [ >> ] |
この文書は3月 16, 2025にtexi2html 5.0を用いて生成されました。