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

### `quote_to_funargs`, `funargs_to_quote`, `remove_paren`

`quote_to_funargs(q)`
  :: quote を funarg 形式(リスト) へ.
`funargs_to_quote(f)`
  :: funarg 形式を quote へ.
`get_function_name(f)`
  :: funarg 形式の op を文字列へ.
`remove_paren(q)`
  :: 上の関数を用いて書かれた余分な括弧を取り去る simplifier (asir-contrib マニュアルへ: todo)

return
  quote(funargs_to_quote, remove_paren) か リスト(quote_to_funargs)
q
  quote
f
  リスト

- `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` はそのうち変更されるだろう.
- 下の例で quote_to_funargs(FA[2]); [34,[b_op,+,[internal,x],[internal,1]]] となる. 34 は `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)

`参照`
  @xref{quotetolist}

ChangeLog

- これらの関数は 2004-7-8 から開発のはじまっている quote の simplification 関連 の実験的関数である. 変更をうけたソースコードは多岐にわたるのでまだ書かない.
- 括弧を取り去る問題は OpenXM/fb が蓄えている公式を tex で綺麗に表示するのが動機の一つ.
- 2004-6-26 の計算代数セミナーにおいて, 中川さんが simplifier についていろいろ問題提起 をした (計算代数セミナービデオ参照).
- parse/quote.c の {\tt strcut fid_spec fid_spec_tab[] } の部分に書いてある形式に `funargs_to_quote` は変換する.

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