Go to the first, previous, next, last section, table of contents.

### `qt_normalize`

`qt_normalize(Expr[,Mode])`
  :: Expr を fnode標準形に変換する. Modeにより標準形への展開アルゴリズムを指定できる.

return
  quote型
Expr
  quote型
Mode
  整数

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

- Expr を fnode標準形に変換する. Modeにより標準形への展開アルゴリズムを指定できる.
- 展開は再帰的である.
- 入力が fnode に変換された初期状態では + や * は子供が2人の binary operator (b_op) であるが, qt_normalize を作用させることにより, + や * は任意人数の 子供を持てる n-ary operator に変換される.
- n-ary operator を基礎とした fnode標準形を用いることにより, パターンマッチ用のパターンの数を減らせることが経験的にわかっている.
- Mode=0. 展開しない. これが既定の動作.
- Mode=1. 展開する. ただし x*x 等を x^2 等に変換
- Mode=2. 展開する. ただし x*x 等を x^2 等に変換しない.

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 の * へ.

`参照`
  section `nqt_match`, section `nqt_match_rewrite`, @xref{quotetolist}, section `quote_to_funargs`, `funargs_to_quote`, `remove_paren`

ChangeLog

Go to the first, previous, next, last section, table of contents.