===================================================================
RCS file: /home/cvs/OpenXM/src/asir-contrib/testing/tr-ja.oxt,v
retrieving revision 1.4
retrieving revision 1.9
diff -u -p -r1.4 -r1.9
--- OpenXM/src/asir-contrib/testing/tr-ja.oxt 2005/04/03 11:05:21 1.4
+++ OpenXM/src/asir-contrib/testing/tr-ja.oxt 2005/05/11 06:40:10 1.9
@@ -1,225 +1,567 @@
-/*&generate-prologue
-*/
-$Id: tr-ja.oxt,v 1.4 2005/04/03 11:05:21 takayama Exp $
-$OpenXM: OpenXM/src/asir-contrib/testing/tr-ja.oxt,v 1.3 2005/04/02 05:56:57 takayama Exp $
+$Id: tr-ja.oxt,v 1.9 2005/05/11 06:40:10 takayama Exp $
+$OpenXM: OpenXM/src/asir-contrib/testing/tr-ja.oxt,v 1.8 2005/05/04 05:47:03 takayama Exp $
注意: testing/tr.rr では quote を quotetolist で list に変換して扱うため,
下の仕様とはことなり, list 型でデータを戻す場合も多い.
ユーザ言語で書いている関係上 pn(x) を pn("x") としている.
他にも同様な関数があり.
-gentexi
t.texi
-t.texi に
-\input texinfo
-@def@pi{PI}
-を加えてから ptex t.texi で 大体見れるが,
+このファイルから texi ファイルを作成するには以下のように入力して下さい.
+oxgentexi は OpenXM/src/util の下にあります.
-cat pre.texi >t.texi
-${OpenXM_HOME}/asir-contrib/packages/doc/gentexi tr.oxt >>t.texi
-echo "@bye" >>t.texi
-ptex t.texi
-とすればもっとマニュアルっぽいものができる.
+nkf -e tr.oxt | oxgentexi --noSorting --title 'Term rewriting functions for Risa/Asir' --author 'Nobuki Takayama' >t.texi
-@c --------------------------------------------------------------------
-@section quote に対する基本関数
+begin: AAA01|
-begin: qt_node(Q)
+現在のサンプル実装には bug が沢山でかつ,
+サンプル実装は効率も悪い.
+ご注意!
+
+@c ---------------------------------------------------------
+@section 変数パターンと関数パターン
+
+
+変数パターン
+@itemize @bullet
+@item pn(x), 任意のものにマッチ. マッチしたものを x に bind.
+@item pn(x,qt.is_integer(x)), x が @code{qt.is_integer(x)} をみたせばマッチ.
+
+@item Todo; 関数にマッチする fn は多分いらない. qt.is_function(x) で OK.
+@end itemize
+
+パターンは quote で与える.
+予約語 tr.and, tr.or, tr.not はパターンのマッチに関して論理演算をおこなう.
+たとえば
+quote(tr.and(pn(x,qt.is_integer(x)),pn(x,qt.is_non_negative(x)))
+は x が 整数で - が先頭についていない場合マッチする.
+
+end:
+
+begin: AAA011|
+
+@c ---------------------------------------------------------
+@section 実装のための補助関数
+
+@itemize @bullet
+@item @code{quotetolist}, @code{listtoquote}, @code{listtoquote_str} ;
+ quote と list の間の変換.
+@item @code{quote_to_funargs}, @code{funargs_to_quote}, @code{get_function_name} ;
+ quote と funarg 形式の変換. 実験的関数のマニュアルを参照.
+@item @code{quotetoobj}, @code{eval_quote} ;
+ quote と object の間の変換.
+@item @code{quote_input_form}, @code{ctrl("print_quote",1)} ;
+ quote と文字列の間の変換.
+@item @code{quote_flatten} ;
+ 左結合的に作り変える. 実験的関数のマニュアルを参照.
+@end itemize
+
+end:
+
+begin: AAA02|
+
+@section quote に対する基本関数 (module qt の関数)
+
+end:
+
+
+begin: qt.node(Q)
quote データ {Q} の node を取り出す.
- example: qt_node(quote(1+2*3))
+ example: qt.node(quote(1+2*3))
+ ["b_op","+"] (現在の実装ではこれが戻る)
end:
-begin: qt_nchild(Q)
+begin: qt.nchild(Q)
quote データ {Q} の 子供の数を戻す.
- example: qt_nchild(quote(1+2*3)) 2 を戻す.
+ example: qt.nchild(quote(1+2*3)) 2 を戻す.
end:
-begin: qt_child(Q,K)
+begin: qt.child(Q,K)
quote データ {Q} の {K} 番目の子供を戻す.
- example: qt_child(quote(1+2*3),1) quote(2*3) を戻す.
- example: qt_child(quote(1+2*3),0) quote(1) を戻す.
+ example: qt.child(quote(1+2*3),1) quote(2*3) を戻す.
+ example: qt.child(quote(1+2*3),0) quote(1) を戻す.
end:
+begin: hoge|
@c --------------------------------------------------------------------
-@subsection quote に対する述語
+@section quote に対する述語
+end:
-begin: qt_is_integer(Q)
+begin: qt.is_integer(Q)
quote データ {Q} が整数なら 1
- example: qt_is_integer(quote(0))
+ example: qt.is_integer(quote(0))
end:
-begin: qt_depend(Q,x)
+begin: qt.is_dependent(Q,x)
quote データ {Q} が不定元 {x} を含むと 1, 含まないと 0.
- example: qt_depend(quote(1+1/x),x)
+ example: qt.is_dependent(quote(1+1/x),x)
end:
-begin: qt_is_function(Q)
+begin: qt.is_function(Q)
quote データ {Q} が関数のとき 1, そうでないとき 0.
- example: qt_is_function(f(x,y));
+ example: qt.is_function(f(x,y));
end:
+begin: qt.is_minus(Q)
+ quote データ {Q} が形式的に -1 より始まるとき 1.
+ example: qt.is_minus(quote(-1/x));
+ ref: qt.add_paren, qt.add_paren0
+end:
+
+begin: qt.is_rational(Q)
+ quote データ {Q} が形式的に有理数の時 1.
+ example: qt.is_rational(quote(1/2));
+ example:
+ [1321] qt.is_rational(quote(1/2+4));
+ 1
+ ref: qt.cancel_number
+end:
+
+begin: hoge2|
@c --------------------------------------------------------------------
-@subsection quote に対するコンストラクタ
+@section quote に対するコンストラクタ
+end:
-begin: qt_zero()
+begin: qt.zero()
quote 0 を戻す.
end:
-begin: qt_id(Qobj)
+begin: qt.id(Qobj)
quote object {Qobj} をそのまま戻す.
end:
-begin: qt_replace(Qobj,[[x,Valuex],[y,Valuey],...])
+begin: qt.replace(Qobj,[[x,Valuex],[y,Valuey],...])
quote object {Qobj} の中の x を Valuex, y を Valuey, ... に置き換えた
quote object を戻す.
- example: qt_replace(quote(sin(x*@pi)), [[x,quote( (2*t+3) )]])
+ description:
+ 課題; x, y は大文字も許すか? @var{Qobj} も元々含まれている大文字を評価して置き換える
+ 関数も必要か?
+
+ example: qt.replace(quote(sin(x*@pi)), [[x,quote( (2*t+3) )]])
end:
- qt_replace は asir-contrib の base_replace と似た機能.
+ qt.replace は asir-contrib の base_replace と似た機能.
quote の内部に大文字ではじまる変数(評価する)が書けないため.
-begin: qt_parenthesis(Qobj)
+begin: qt.parenthesis(Qobj)
quote object {Qobj} の中の括弧が足りないときには補い, 多いときには取り去った
quote object を作る.
+, *, /, ^, - 等について asir の文法での演算子の強さを仮定する.
+ description:
+ 参考;
+ @itemize
+ @item まだ実装してない.
+ @item noro_simplify.rr の @code{noro_simplify.remove_paren()}
+ がすでに実現づみ?
+ (加える方はだめみたい)
+ @code{flatten()} や @code{quote_to_funargs()} を利用してる模様.
+ @item 実験的関数マニュアルの @code{quote_flatten} も参照 (この関数ない).
+ @end itemize
+
end:
-begin: qt_eval(Qobj,type)
+begin: qt.eval(Qobj,type)
Qobj を asir の他の object に変換.
+ description:
+ @code{eval_quote()} がすでに実現づみ.
+ 実装してない.
+
end:
-begin: qt_(Obj)
+begin: qt.qt(Obj)
asir の Obj を quote 型に変換.
+ description:
+ @code{objtoquote()} がすでに実現づみ. 実装してない.
+
end:
+begin: qt.cancel_number(Q)
+ Quote {Q} の中で有理数があれば通分する.
+ example:
+ [1320] qt.cancel_number(quote(2/4));
+ quote(1/2)
+ changelog:
+ @itemize @bullet
+ @item 2005.05.04, the initial version. Taylor 展開の係数の簡約のために作製.
+ @end itemize
+ ref: qt.is_rational
+end:
+begin: qt.add_paren(Q)
+ +- があれば ( ) を加える. まだ bug いり.
+ description: Taylor 展開を計算するために作った.
+end:
+
+begin: qt.add_paren0(Q)
+ 無条件に {Q} を ({Q}) にする.
+end:
+
+begin: qt.map_arg(F,Q)
+ 関数 F を quote データ {Q} の すべてのノードに再帰的に
+ apply した quote データを戻す.
+ example: qt.map_arg(nn,quote(sin(@pi)+2/3))
+ nn(nn(sin(nn(@pi)))+nn(nn(2)/nn(3)))
+end:
+
+begin: qt.sin_int(Q)
+ {Q} が整数なら quote(0) を戻す.
+ {Q} が整数でないなら quote(sin(Q*@@pi)) を戻す.
+description:
+ @itemize @bullet
+ @item 書き換え規則の右辺用の関数.
+ @item tr.simp_sin (sinを含む式の簡単化のサンプル実装)や
+ 例のプログラムで利用されている.
+ @end itemize
+changelog:
+ @itemize @bullet
+ @item 2005.04.02 の初期版から存在する関数なので仕様が古い. list を戻す.
+ @item 2005.05.08 quote を戻すように書き換えた. 名前もよくないかも, しかし
+ とりあえずこのまま.
+ @end itemize
+ref: tr.simp_sin
+end:
+
+begin: qt.sin_int2(Q)
+ref: qt.sin_int
+end:
+
+begin: qt0021|
@c --------------------------------------------------------------------
-@section tr (term rewriting) のトップレベルの関数
+@section qt, quote を別のものに変換する.
+end:
-begin: tr_match0(Qobj,P)
+begin: qt.input_form(Q)
+ {Q} を文字列に変換する.
+ {Q} がリスト, ベクトル, 行列の場合にはその要素を文字列に変換する.
+changelog:
+ @itemize @bullet
+ @item 2005.05.08, the initial version.
+ qt.hc_etov の結果表示に. quote_input_form は Q がリストの場合不便.
+ @end itemize
+ref: quote_input_form,
+ qt.hc_etov
+end:
+
+
+begin: qt003|
+@c --------------------------------------------------------------------
+@section qt, quote で分散多項式, 冪級数を実現するための補助関数.
+end:
+
+begin: qt.gtlex(f,g)
+{f} は {g} より quote tree の lex order で大きい.
+description:
+ quote tree の lex order は次のように決める.
+ @itemize @bullet
+ @item Todo; まだ実装してない.
+@c 4/15 夜. 実装は明日講義の準備の終了後か?
+ @item 不定元は不定元の順序.
+ @item 不定元より +, - , *, /, ^ 等の node は大きい.
+ たとえば x < power(x,2) (power(x,2) は x^2 の意味)
+ @item あとは再帰的. times(x,y) < power(x,y) だが,
+ times(x,y) と times(p,q) は x と p の比較, これできまらないなら,
+ y, q の比較.
+ @end itemize
+
+end:
+
+begin: qt.dtoq(F,V)
+分散表現多項式 {F} を quote に変換する.
+{V} は変数リスト.
+description:
+ @itemize @bullet
+ @item 変数リストが空のときは x_1, x_2, ... を用いる.
+ @end itemize
+example:
+ F=dp_ptod((x-y-z)^3,[x,y]);
+ qt.dtoq(F,[]);
+ quote(x_1^3+(-3)*x_1^2*x_2+3*x_1*x_2^2+(-1)*x_2^3+(-3*z)*x_1^2
+ +6*z*x_1*x_2+(-3*z)*x_2^2+3*z^2*x_1+(-3*z^2)*x_2+(-z^3))
+changelog:
+ @itemize @bullet
+ @item 2005/4/21, the initial version.
+ @end itemize
+ref: qt.qtod
+end:
+
+begin: qt.qtod(F,V)
+quote {F} を 分散表現多項式に変換する.
+{V} は変数リスト.
+description:
+ @itemize @bullet
+ @item 変数リストが空のときは x_1, x_2, ... を用いる.
+ @item まだ実装してない.
+ @end itemize
+ref: qt.qtod
+end:
+
+
+begin: qt.vars(Q)
+ {Q} に現れる変数を戻す.
+ description: @code{vars(Obj)} の qt 版.
+ example:
+ [2306] qt.vars(objtoquote((x-y-1)^4/z+y^q));
+ [x,y,z,q]
+end:
+
+begin: qt.etov_pair(Q)
+ {Q} に p^q の形の元を探して [p,q] をリストにして戻す.
+ description:
+ @itemize @bullet
+ @item この関数は木構造の中の p^q の形の元をすべて探索する.
+ @end itemize
+ example:
+[2410] ctrl("print_quote",1);
+1
+[2411] qt.etov_pair(quote(3*x^4*y^(-3)));
+[[[internal,y],[u_op,(),[u_op,-,[internal,3]]]],[[internal,x],[internal,4]]]
+ changelog:
+ @itemize @bullet
+ @item 2005.05.04, dp_etov に似た関数を qt で作るための準備.
+ @end itemize
+ ref: qt.vars
+end:
+
+begin: qt.hm(Q)
+ {Q} の頭項を戻す.
+ example:
+ [1314] Q=qt.dtoq(-4/3*<<1,4,5>>,[x,y,z]);
+ quote((-4/3)*x*y^4*z^5)
+ [1315] qt.hm(Q);
+ quote((-4/3))
+ [1316] qt.hop(Q);
+ *
+ [1317] QQ=qt.rest(Q);
+ quote(x*y^4*z^5)
+ [1318] qt.hm(QQ);
+ quote(x)
+ [1319] qt.rest(QQ);
+ quote(y^4*z^5)
+ [1320] qt.hm(qt.rest(QQ));
+ quote(y^4)
+ ref: qt.rest, qt.hop
+end:
+
+begin: qt.rest(Q)
+ {Q}が a+b+c+... の時 b+c+...を戻す. dp_rest のまね.
+ description:
+ @itemize @bullet
+ @item I_BOP の時に第2引数を flatten_quote してから戻す.
+ @end itemize
+ example:
+ [1667] load("taka_series.rr")$
+ [1668] Q=tkseries.expand1(cos(x),x,0,5);
+ quote(1+(-1/2)*x^2+1/24*x^4+oO(x, 6))
+ [1769] qt.hm(qt.rest(Q));
+ quote((-1/2)*x^2)
+ [1770] QQ=qt.rest(Q);
+ quote((-1/2)*x^2+1/24*x^4+oO(x, 6))
+ changelog:
+ @itemize @bullet
+ @item 2005.05.04, tkseries.expand の結果に対して,
+ 毎回 flatten_quote をやらないと左結合的にならないのは何故か?
+ BUG 安定的に動作するかどうか不安.
+ @item 2005.05.04, いよいよ 係数と exponet ベクトルの取り出しを書く準備が完了.
+ @item 2005.05.05, Q=a*b なら qt.rest(Q) = b となるように変更.
+ 係数の取り出し, exponent ベクトルの取り出しにはこれが便利.
+ @end itemize
+ ref: qt.hm, qt.hop, qt.dtoq, dp_hm, dp_rest
+end:
+
+begin: qt.hop(Q)
+ {Q} の頭節が binary operator (I_BOP) の時 binary operator の名前を戻す.
+ changelog:
+ @itemize @bullet
+ @item 2005.05.05, 始めての版.
+ @end itemize
+end:
+
+begin: hc_etov(Q,V)
+ quote {Q} を変数リスト {V} のモノミアルとみて, hc (leading coefficient)
+ と exponet ベクトルを quote 型で戻す.
+ description:
+ Q = hc*p1*p2* ... なる形を仮定. これ以外の形では動作保証なし.
+ example:
+ [1967] R=qt.hc_etov(quote(-3/2*x*z^3),[x,y,z]);
+ [<...quoted...>,[ <...quoted...> 0 <...quoted...> ]]
+ [1968] qt.input_form(R);
+ [quote(1*(-1)*3/2),[ quote(1) 0 quote(3) ]]
+ changelog:
+ @itemize @bullet
+ @item 2005.05.05,
+ qt.hc_etov(quote(-3/2*x*z^3),[x,y,z]); でテストするもまだ動作へん.
+ @item if (A[0] == I_MINUS) の部分をつけて解決. 05 夜.
+ まだ bug が残るかもしれず.
+ @item Todo; qtodl (distributed poly in quote を list 形式で).
+ @item Todo; quote の distributed poly の比較.
+ @item Todo; 多変数のテイラー展開. テイラー展開の積.
+ @item Todo; Asir ドリルの 10 行 Buchberger アルゴリズムの実装をここで
+ 定義した quote 関数で書く.
+ @end itemize
+end:
+
+
+begin: tr|
+
+@c --------------------------------------------------------------------
+@section tr (term rewriting) のトップレベルの関数 (module tr の関数)
+
+end:
+
+begin: tr.match0(Qobj,P)
quote データ {Qobj} が パターン {P} に適合すれば 1 を戻し, そうでなければ 0
を戻す.
- example: tr_match0(quote(1+2*3),quote(pn(x)+pn(y)))
+ example: tr.match0(quote(1+2*3),quote(pn(x)+pn(y)))
x に quote(1), y に quote(2*3)
- tr_match0(quote(1+2*3),quote(pn(x)+pn(y,qt_is_integer,y)))
- qt_is_integer(2*3) は 0 なので y にはマッチしない.
+ tr.match0(quote(1+2*3),quote(pn(x)+pn(y,qt.is_integer(y))));
+ qt.is_integer(quote(2*3)) は 0 なので y にはマッチしない.
+ example:
+ [2991] tr.match0(quote(1),quote(pn(c,qt.is_dependent(c,x))));
+ 0
+ [2992] tr.match0(quote(x^3+1),quote(pn(c,qt.is_dependent(c,x))));
+ 1
end:
begin: pn(X)
pn(x) は任意の quote object にマッチし, 名前 x をつける.
+ quote の中で使う特別な関数記号.
+ pn は variable PatterN (変数パターン)の略.
description:
- tr_match0(quote(1+2*3),quote(pn(x)+pn(y))) は 1 を戻すが,
- tr_match0(quote(1+2*3),quote(pn(x)+pn(y,tr_is_integer,x))) は 0 をもどす.
- 2*3 は integer から作られた fnode ではあるが integer ではないので qt_is_integer
+ tr.match0(quote(1+2*3),quote(pn(x)+pn(y))) は 1 を戻すが,
+ tr.match0(quote(1+2*3),quote(pn(x)+pn(y,tr.is_integer(y)))) は 0 をもどす.
+ 2*3 は integer から作られた fnode ではあるが integer ではないので qt.is_integer
が 0 を戻すため.
end:
-
-begin: tr_match0_act(Qobj,P,Act)
- quote データ {Qobj} が パターン {P} に適合すれば {Act} を呼び出しその値を戻す.
- パターン {P} にマッチしないときは 0.
- example: tr_match0_act(quote(1+2*3),quote(pn(x)+pn(y)),[myadd,x,y])
-end:
-begin: tr_or_match0_act(Qobj,Rules)
-end:
-
-begin: tr_apply_rule1(Qobj,P,Act)
+begin: tr.apply_rule1(Qobj,P,Act)
quote データ {Qobj} の木を幅優先探索し,
パターン {P} に適合するものがあるときは {Act} を呼び出しその値を戻す.
つまり top node が {P} に適合するか調べ, 適合しない場合はその子供に
- tr_apply_rule1 を適用する (ここが tr_match_act とは異なる).
+ tr.apply_rule1 を適用する (ここが tr.match_act とは異なる).
マッチしない場合は Qobj をそのまま戻す (これが再帰的に適用される).
description:
- ここで sin_int(X) は X が integer の時は quote(0) を戻し,
- そうでないときは quote(sin(X*@pi)) を戻す.
- 深さ優先で書き換えをするには 関数 sin_int の中でまた tr_apply_rule1 を呼び出せば
- よい.
+ ここで qt.sin_int(X) は X が integer の時は quote(0) を戻し,
+ そうでないときは quote(sin(X*@@pi)) を戻す.
+ 深さ優先で書き換えをするには 関数 qt.sin_int の中でまた
+ tr.apply_rule1 を呼び出せばよい.
- example: tr_apply_rule1(quote(1+sin(2*@pi)),quote(sin(pn(x)*@pi)),[sin_int,x])
+ example:
+ [2215] tr.apply_rule1(quote(1+sin(2*@pi)),quote(sin(pn(x)*@pi)),
+ ["qt.sin_int",x]);
+
+ quote(1+0)
end:
-begin: tr_apply_or_rules(Qobj,Rules)
+begin: tr.apply_or_rules(Qobj,Rules)
+ quote データ {Qobj} の木を幅優先探索し,
+ ルール {Rules} に適合するものがあるときはルールに記述された action を
+ 呼び出す. {Rules} には複数のルールを書くことが一つでも適用可能なルールが
+ あれば再帰的に呼び出される.
+
end:
-@subsection 内部関数
+begin: hoge4|
+@section tr 内部関数
+end:
-begin: tr_apply_function0(Qobj,BindingTable)
+begin: tr.apply_function0(Qobj,BindingTable)
end:
-begin: tr_rp(Qobj,P,A)
+begin: tr.rp(Qobj,P,A)
end:
-begin: tr_make_binding(Qobj,P)
+begin: tr.make_binding(Qobj,P)
end:
-@c ---------------------------------------------------------
-@section 変数パターンと関数パターン
+begin: hoge41|
+@section tr 簡単化関数のサンプル実装
-begin: remark_on_pn()
-変数パターン
-example:
-pn(x) 任意のものにマッチ. マッチしたものを x に bind.
-pn(x,qt_is_integer(x))
+@itemize @bullet
+@item 2005.05.08 簡単化関数は注意深く実装しないと, 無限ループにおちいったり,
+簡単化のやりのこしがでたりする.
+とりあえずまとめておくが, これらの実装はまだまだである.
+@end itemize
-Todo; fn は多分いらない. qt_is_function(x) で OK.
-fn(f) 任意の関数にマッチ. マッチした関数名を f に bind.
-fn(f,pn(x),pn(y)) 任意の関数にマッチ. マッチした関数名を f に bind.
- f の引数を x, y に bind
end:
-@c ---------------------------------------------------------
-@section パターン
+begin: tr.simp_zero(Q)
+ 式 {Q} の中から 0 や 1 をけす. たとえば 1*x は x へ. 0*1 は 0 へ.
+ x+0 は 0 へ.
+changelog:
+ @itemize @bullet
+ @item 2005.04 のおわりに initial version? tkseries.expand1 用.
+ @end itemize
+end:
-begin: remark_pattern()
-パターンは quote で与える.
-予約語 tr_and, tr_or, tr_not はパターンのマッチに関して論理演算をおこなう.
-たとえば
-quote(tr_and(pn(x,qt_is_integer),pn(x,qt_is_non_negative(x))))
-は x が 整数で - が先頭についていない場合マッチする.
+begin: tr.simp_unary(Q)
+ "-"を消すようにする. たとえば +-x は -x へ. -(-x) は x へ.
+changelog:
+ @itemize @bullet
+ @item 2005.04 のおわりに initial version? tkseries.expand1 用.
+ @end itemize
end:
-@c ---------------------------------------------------------
-@section 例題 sin(整数*@pi) を 0 に.
+begin: tr.simp_sin(Q)
+ 式 {Q} の中の sin(整数 @@pi) を 0 にする.
+example:
+ [2217] tr.simp_sin(quote(sin(2*@pi)+sin(@pi/2)));
+ quote(sin(@pi()/2))
+changelog:
+ @itemize @bullet
+ @item 2005.04 のおわりに initial version? tkseries.expand1 用.
+ @item 2005.05.08 tr.simp_sin(quote(sin(2*sin((1/2)*@@pi)))); は無限ループ bug.
+ まだ直してない.
+ @end itemize
+end:
-begin: example_sin_int();
-例題 sin(整数*@pi) を 0 に.
+begin: zzz00|
+
+@section 例題
+
+end:
+
+begin: zzz01|
+例題 sin(整数*@@pi) を 0 に.
example:
/* 準備 */
extern P,A;
P=quote(sin(pn(x)*@pi)); /* パターン */
- A=[sin_int,x] /* action, action 関数 */
+ A=["sin_int",x]; /* action, action 関数 */
def sin_int(X) {
- X = tr_apply_rule1(X,P,A); /* 子供に [P,A] を再帰的に適用 */
- if (qt_is_integer(X)) return qt_zero();
- else qt_replace(sin(y*@pi),[[y,X]]); /* sin(x*@pi) をそのまま戻す.*/
+ X = tr.apply_rule1(X,P,A); /* 子供に [P,A] を再帰的に適用 */
+ if (qt.is_integer(X)) return qt.zero();
+ else qt.replace(quote(sin(y*@pi)),[[y,X]]);
+ /* sin(x*@pi) をそのまま戻す.*/
}
/* 計算 */
Qobj=quote(1+sin(sin(2*@pi)*@pi)*sin((1/2)*@pi));
- tr_apply_rule1(Qobj,P,A);
+ tr.apply_rule1(Qobj,P,A);
+example_description:
+ ファイルにセーブして実行のこと. @code{Debug=1;} とすると変形の様子がわかる.
end:
@c ------------------------------------------------------
@section 例題 Mathematica の N[ ] 相当の関数をユーザが書けるように.
-begin: example_Mathematica_N()
+begin: zzz02|
例題 Mathematica の N[ ] 相当の関数をユーザが書けるように.
example:
nn(sin(cos(@pi)+sqrt(2)))
--> nn(sin(nn(cos(nn(@pi)))+nn(sqrt(nn(2)))))
Prog; test1-tr.rr の test4().
- qt_map_arg 関数を用いる.
+ qt.map_arg 関数を用いる.
def test4() {
- Rule=[quote(nn(pn(f))),[qt_map_arg,nn,f]];
+ Rule=[quote(nn(pn(f))),["qt.map_arg",nn,f]];
/* nn で囲まれたものがあれば, nn をその内部に再帰的に apply する */
R0 = quote(nn(sin(1/2)*cos(1/3)));
print(print_input_form(R0));
- R=tr_apply_rule1(R0,Rule[0],Rule[1]);
+ R=tr.apply_rule1(R0,Rule[0],Rule[1]);
return R;
}
@@ -228,38 +570,48 @@ end:
@c ---------------------------------------------------------
@section 例題 不定積分
-begin: example_indefinite_integral()
+begin: zzz03|
例題 不定積分
example:
/* integral(f+g) => integral(f)+integral(g) */
S1=[quote(integral(pn(f)+pn(g))),
[int_linear1,f,g]];
def int_linear1(X,Y) {
- return qt_replace(quote(integral(f)+integral(g)),[[f,X],[g,Y]]);
+ return qt.replace(quote(integral(f)+integral(g)),[[f,X],[g,Y]]);
}
/* integral(c*f) => c*integral(f) */
- def qt_independent(F,X) { return !qt_dependent(F,X); }
- S2=[quote(integral(pn(c,qt_independent(c,x))*f)),
+ def is_independent(F,X) { return !qt.is_dependent(F,X); }
+ S2=[quote(integral(pn(c,is_independent(c,x))*f)),
[int_linear2,c,f]];
def int_linear2(X,Y) {
- return qt_replace(quote(c*integral(f)),[[c,X],[f,Y]]);
+ return qt.replace(quote(c*integral(f)),[[c,X],[f,Y]]);
}
- apply_or_rules(quote(integral(a*x^2+x+2/x)),[S1,S2]);
+ tr.apply_or_rules(quote(integral(a*x^2+x+2/x)),[S1,S2]);
これをこれ以上書き換えが起きないまで繰り返す.
このルールの場合答えは
a*integral(x^2)+integral(x)+integral(2/x);
quote(integral(x^pn(n))) --> x^(n+1)/(n+1) or log(x) を書く.
+example:
+ tr.match0(quote(c*x),quote(pn(c,is_independent(c,x))*f));
+example_description:
+ 2005.05.08, Todo; Bug. この例が正しく動いてくれない.
+
end:
@c ---------------------------------------------------------
@section 例題 簡単な構文解析
-begin: example_parsing()
+begin: zzz04|sortKey: zzz04
+description:
+--------------------- 5/8 ここまで修正. ----------------------
+
例題 簡単な構文解析
+
example:
+ todo; この例はまだチェックしてない.
式(expression) は 式+式 | 式*式 | (式) | 整数
extern R1,R2,R3,R4,S1,S2,S3,S4;
@@ -267,7 +619,7 @@ example:
R1=[quote(pn(x,is_expression(x))+pn(y,is_expression(y))), 1];
R2=[quote(pn(x,is_expression(x))*pn(y,is_expression(y))), 1];
R3=[quote((pn(x,is_expression(x)))), 1];
- R4=[quote(pn(x,qt_is_integer(x))), 1];
+ R4=[quote(pn(x,qt.is_integer(x))), 1];
def is_expression(Qobj) {
R = [R1,R2,R3,R4];
A = apply_or_match0(Qobj,R);
@@ -277,8 +629,8 @@ example:
/* 計算用. R1,R2,R3,R4 と左は共通. */
S1=[quote(pn(x,is_expression(x))+pn(y,is_expression(y))), [myadd,x,y]];
S2=[quote(pn(x,is_expression(x))*pn(y,is_expression(y))), [mymul,x,y]];
- S3=[quote((pn(x,is_expression(x)))), [qt_id,x]];
- S4=[quote(pn(x,qt_is_integer(x))), [qt_id,x]];
+ S3=[quote((pn(x,is_expression(x)))), ["qt.id",x]];
+ S4=[quote(pn(x,qt.is_integer(x))), ["qt.id",x]];
def eval_expression(Qobj) {
S = [S1,S2,S3,S4];
@@ -286,30 +638,117 @@ example:
}
def myadd(X,Y) {
- return qt_(qt_eval(X,1)+qt_eval(Y,1));
+ return qt.qt(qt.eval(X,1)+qt.eval(Y,1));
}
def mymul(X,Y) {
- return qt_(qt_eval(X,1)*qt_eval(Y,1));
+ return qt.qt(qt.eval(X,1)*qt.eval(Y,1));
}
/* 計算 */
- tr_eval_expression(quote(1+2*(3+15)));
+ tr.eval_expression(quote(1+2*(3+15)));
end:
-@c ---------------------------------------------------------
-@section 例題 非可換環の簡単な構文解析
+begin: misc|
+@section 考え方についての概説
+ トップレベルの関数達. (stylesheet の考えに似てる.)
-@section Todo;
+ iterator の一種.
+ yacc に似てる.
+
+@section デバッガー
+
+ 選択すべきルールが沢山あるときは, 警告する機能.
+
+ 無限ループの|検出.
+
+end:
+
+begin: hoge001|
+@section Talor 展開 (taka_series.rr の解説)
+
+end:
+
+begin: tkseries.expand1(Q,X,A,N)
+{Q} を 変数 {X} に関して, {X}={A} の近傍で {N} 次まで
+Taylor 展開する.
+
+description:
+@itemize @bullet
+@item qt パッケージと tr パッケージの例題として書いている.
+@item Bug だらけです.
+@item Todo; 多変数の Taylor 展開.
+@end itemize
+
+example:
+[1258] load("tr.rr");
+1
+[1359] load("taka_series.rr");
+1
+[1373] tkseries.expand1(cos(x),x,0,6);
+quote(1+(-1/2)*x^2+1/24*x^4+(-1/720)*x^6+oO(x, 7))
+example_description:
+ cos の値の計算に tr.simp_sin を用いている.
+ Bug; この関数は不完全なので, 係数の計算はうまく行かない場合も多い.
+
+example:
+[1374] tkseries.expand1(quote(f(x)),x,0,3);
+quote(f(0)+calc_diff(f(0), 0)/1*x^1
+ +calc_diff(calc_diff(f(0), 0), 0)/2*x^2
+ +calc_diff(calc_diff(calc_diff(f(0), 0), 0), 0)/6*x^3+oO(x, 4))
+example_description:
+ Todo; f の微分に 0を代入したものは f(0), f_1(0), f_2(0), ...
+ (それぞれ f(0), f'(0), f''(0), ... の意味)
+ とした方がいいだろう.
+
+changelog:
+@itemize @bullet
+@item 2005.04 はじめての版.
+@end itemize
+
+end:
+
+begin: hoge002|
+
+@section 記号微分 (taka_qtdiff.rr の解説)
+
+まだ実装してない.
+
+end:
+
+begin: exp|
+
+@c ------------------------------------------------
+@section 実験的関数
+
+end:
+
+
+begin: todo|
+
+@section Todo
+
+@subsection ユーザ定義の中置演算子
+
+ tfb の書き方を導入.
+
+@subsection 数学よりの例題
+
+数学的におもしろい例題をなるべく沢山用意する.
+これらの例題に対して tr が試作品を作るのに有効であるということをいう.
+
+ 例; gcd 計算の多項式 reduction を tr で実現.
+
例; 冪級数の計算を quote で実現.
sort や expand は組み込みで.
例; Mathematica の Expand[], Toghether[] 相当のもの.
例; D の掛け算を パターンマッチで実現.
+ holonomic 関数を係数とする微分作用素環での計算.
例; (x^(1/n))^n --> x 等.
@@ -318,41 +757,95 @@ end:
例; QE, 論理式.
-@section 考え方についての概説
+ 例; 外積代数.
- トップレベルの関数達. (stylesheet の考えに似てる.)
- iterator の一種.
+ 例; 岩波, 応用数学, 神保のソリトンの本にあるような fermion 等の例.
-@c ------------------------------------------------
-@section 実験的関数
-begin: qt_map_arg(F,Q)
- 関数 F を quote データ {Q} の すべてのノードに再帰的に
- apply した quote データを戻す.
- example: qt_map_arg(nn,quote(sin(@pi)+2/3))
- nn(nn(sin(nn(@pi)))+nn(nn(2)/nn(3)))
+ 例;
+ Bergman, George M.
+ The diamond lemma for ring theory.
+ Advances in Math. 29 (1978), no. 2, 178--218.
+ にあるような非可換代数の例.
+
end:
+begin: new-functions|
+
@section まだスケッチのみの関数仕様
- qt_ltor, qt_rtol : 木の構造の変換; 例 (x*y)*z --> x*(y*z)
+ qt.ltor, qt.rtol ; 木の構造の変換; 例 (x*y)*z --> x*(y*z)
- idxtov(x,i) x_i を生成. x_i の index (idx) 属性 を i に.
- base_name 属性を x に.
- idxtov(x,[i,j]) x_i_j を生成. x_i_i の index (idx) 属性 を [i,j] に.
- vtoidx(x_i) は i を戻す. 属性の検索なので高速. idx 属性が無い場合は i を設定.
+end:
- idxtov 関数は 関数名にも使えるようにする --> 微分環対応.
+begin: idx|
- qt_function(名前, 引数) --> quote(名前(引数)) を生成.
+@subsection Index つき変数
+
+end:
+
+begin: idxtov(X,I)
+ idxtov({X},{I}) は変数 {X}_{I} を戻す.
+ {I} はスカラーかリスト.
+ example:
+ idxtov(x,i) は x_i を戻す.
+ description:
+ idxtov(x,[i,j]) は x_i_j を生成. x_i_i の index (idx) 属性 を [i,j] に.
+
+ @code{util_v()} とほぼ同じ.
+
+ x_i の index (idx) 属性 を i に.
+ base_name 属性を x に.
+ 不定元の属性を利用することにより高速に index をとりだせて index つき変数の
+ 代りができる.
+
+end:
+
+begin: vtoidx(X)
+ vtoidx(x_i) は [x,i] を戻す.
+description:
+ @code{util_index()} とほぼ同様.
+
+ 属性の検索なので高速. idx 属性が無い場合は i を設定.
+
+ idxtov 関数は 関数名にも使えるようにする? --> 微分環対応.
+
+ qt.function(名前, 引数) --> quote(名前(引数)) を生成.
index 付き関数は微分環の取扱に必要.
+end:
+begin: powerSeries|
+
+@subsection 冪級数, dp の pretty print.
+
巾級数の取扱, dp の pretty print のため.
- qt_qttodp(Qobj | vlist, order?) quote から dp を作る.
- exponent が数でないと作れず.
- qt_dptoqt(Qobj | vlist) dp から quote を作る. vlist は属性で対応?
+ qt.qttodp(Qobj | vlist, order?) quote から dp を作る.
+ exponent が数でないと作れず.
- qt_expand, qt_sort, qt_ht, qt_rest, qt_mtov も基礎関数として欲しい.
+ qt.expand, qt.sort, qt.ht, qt.rest, qt.mtov も基礎関数として欲しい.
-/*&generate-epilogue
-*/
+end:
+
+begin: monomialSimplifier00|
+
+@section モノミアルを標準形へ (builtinで? Monomial の simplifier)
+
+changelog;
+@quotation
+Monomial simplifier を通してから,
+パターンマッチをしないと場合わけが多すぎる.
+これは必須だろう.
+@end quotation
+
+Example;
+@example
+ x^1 --> x
+ (x*y)*(z*t) --> x*y*z*t
+ x*2*y*4 --> 8*x*y (指定した変数以外は可換とする)
+ x*x^3 --> x^4
+ x*(-y)*z --> -x*y*z
+ ((x)) --> x これは noro_simplify.rr noro_simplify.remove_paren() が対応
+@end example
+
+end:
+