/* $OpenXM: OpenXM/src/asir-contrib/testing/tr.rr,v 1.4 2005/04/06 09:26:28 takayama Exp $ */ /* $Id: tr.rr,v 1.7 2005/04/03 11:05:46 taka Exp $ */ /* OpenXM版の Risa/Asir で実行のこと. OpenXM 版の関数を用いるため. */ /* $Id: tr.rr,v 1.7 2005/04/03 11:05:46 taka Exp $ このファイルは quotetolist でリストに変換したデータに対して パターンマッチおよびそれを応用した変形を行う. tr.oxt の仕様とことなり quotetolist で変換したものを扱う. テストプログラムのため効率は無視. (append の多用, 無駄な2重呼び出し, など)) */ extern Debug$ Debug=0$ def dprint(X) { if (Debug) print(X); } def dprint0(X) { if (Debug) print(X,0); } /* quotetolist の逆関数. ただし文字列で */ def listtoquote_str(L) { return quote_input_form_quote_list(L); } def qt_node(F) { if (type(F) == 17) F=quotetolist(F); return [rtostr(F[0]),rtostr(F[1])]; } /* Number of child */ def qt_nchild(F) { if (type(F) == 17) F=quotetolist(F); return length(F)-2; } def qt_child(F,K) { if (type(F) == 17) F=quotetolist(F); return F[K+2]; } /* リスト F が リスト P に(先頭からの比較で)マッチしたら 1. そうでないから 0. 幅優先探索. Todo: P に任意関数を含む仕組みはまだ実装してない. */ def tr_match0(F,P) { dprint0("tr_match0: F="); dprint(F); dprint0("tr_match0: P="); dprint(P); if (type(F) != type(P)) return 0; if (type(F) != 4) { if (F == P) return 1; else return 0; } Node = qt_node(F); Node2 = qt_node(P); /* pn に何の制約もなければ 2 を戻す. */ if (Node2 == ["function","pn"]) return tr_check_pn(F,P); if (Node != Node2) return 0; N = qt_nchild(F); if (N != qt_nchild(P)) return 0; for (I=0; I action 関数の中で再帰的に呼べば深さ優先となる. Todo: 書き換えがおこったかのフラグ. */ def tr_rp(F,P,Q) { dprint0("tr_rp, F="); dprint(F); dprint0("tr_rp, P="); dprint(P); dprint0("tr_rp, Q="); dprint(Q); if (tr_match0(F,P)) { BindTable = tr_make_binding(F,P); dprint0("BindTable="); dprint(BindTable); return tr_apply_function0(Q,BindTable); } if (type(F) != 4) return F; Node = qt_node(F); N = qt_nchild(F); Ans = Node; for (I=0; I nn(f(nn(x),nn(y))) qt_map_arg(nn,quote(1/4+f(x))) --> テストは test4(). */ def qt_map_arg(F,Q) { F = rtostr(F); if (type(Q) == 17) Q=quotetolist(Q); if (rtostr(Q[0]) == "internal") { T = listtoquote_str(Q); return eval_str( "quote("+F+"("+T+"))" ); } /* node の子供を F で評価する. */ N = qt_nchild(Q); L = []; for (I=0; I