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

## Asir で使用可能な型

Asir においては, 可読な形式で入力されたさまざまな対象は, パーザにより 中間言語に変換され, インタプリタにより Risa の計算エンジンを呼び出し ながら内部形式に変換される. 変換された対象は, 次のいずれかの型を持つ. 各番号は, 組み込み函数 `type()` により返される値に対応している. 各例は, Asir のプロンプトに対する入力が可能な形式のいくつかを 示す.

`0 0`
  実際には 0 を識別子にもつ対象は存在しない. 0 は, C における 0 ポインタに より表現されている. しかし, 便宜上 Asir の `type(0)` は 値 0 を返す.
`1 数`

      1 2/3  14.5  3+2*@i

  数は, さらにいくつかの型に分けられる. これについては下で述べる.
`2 多項式 (数でない)`

      x  afo  (2.3*x+y)^10

  多項式は, 全て展開され, その時点における変数順序に従って, 再帰的に 1 変数多項式として降冪の順に整理される. (See section 分散表現多項式.) この時, その多項式に現れる順序最大の変数を 主変数 と呼ぶ.
`3 有理式 (多項式でない)`

      (x+1)/(y^2-y-x)  x/x

  有理式は, 分母分子が約分可能でも, 明示的に `red()` が呼ばれない 限り約分は行われない. これは, 多項式の GCD 演算が極めて重い演算である ためで, 有理式の演算は注意が必要である.
`4 リスト`

      []  [1,2,[3,4],[x,y]]

  リストは読み出し専用である. `[]` は空リストを意味する. リストに対する 操作としては, `car()`, `cdr()`, `cons()` などによる操作の他に, 読み出し専用の配列とみなして, `[index]` を必要なだけつけることにより 要素の取り出しを行うことができる. 例えば

      [0] L = [[1,2,3],[4,[5,6]],7]$
      [1] L[1][1];
      [5,6]

  注意すべきことは, リスト, 配列 (行列, ベクトル) 共に, インデックスは 0 から始まることと, リストの要素の取り出しをインデックスで行うことは, 結局は先頭からポインタをたどることに相当するため, 配列に対する操作に 比較して大きなリストでは時間がかかる場合があるということである.
`5 ベクトル`

      newvect(3)  newvect(2,[a,1])

  ベクトルは, `newvect()` で明示的に生成する必要がある. 前者の例で は2 成分の 0 ベクトルが生成され, 後者では, 第 0 成分が `a`, 第 1 成分が `1` のベクトルが生成される. 初期化のための 第 2 引数は, 第 1 引数以下の長さのリストを受け付ける. リストの要素は左から用いられ, 足 りない分は 0 が補われる. 成分は `[index]` により取り出せる. 実際 には, 各成分に, ベクトル, 行列, リストを含む任意の型の対象を代入できる ので, 多次元配列をベクトルで表現することができる.

      [0] A3 = newvect(3);
      [ 0 0 0 ]
      [1] for (I=0;I<3;I++)A3[I] = newvect(3);
      [2] for (I=0;I<3;I++)for(J=0;J<3;J++)A3[I][J]=newvect(3);
      [3] A3;
      [ [ [ 0 0 0 ] [ 0 0 0 ] [ 0 0 0 ] ] [ [ 0 0 0 ] [ 0 0 0 ] [ 0 0 0 ] ]
      [ [ 0 0 0 ] [ 0 0 0 ] [ 0 0 0 ] ] ]
      [4] A3[0];
      [ [ 0 0 0 ] [ 0 0 0 ] [ 0 0 0 ] ]
      [5] A3[0][0];
      [ 0 0 0 ]

`6 行列`

      newmat(2,2)  newmat(2,3,[[x,y],[z]])

  行列の生成も `newmat()` により明示的に行われる. 初期化も, 引数 がリストのリストとなることを除いてはベクトルと同様で, リストの各要素 (これはまたリストである) は, 各行の初期化に使われ, 足りない部分には 0 が埋められる. 行列も, 各要素には任意の対象を代入できる. 行列の各 行は, ベクトルとして取り出すことができる.

      [0] M=newmat(2,3);
      [ 0 0 0 ]
      [ 0 0 0 ]
      [1] M[1];
      [ 0 0 0 ]
      [2] type(@@);
      5

`7 文字列`

      ""  "afo"

  文字列は, 主にファイル名などに用いられる. 文字列に対しては加算のみが 定義されていて, 結果は 2 つの文字列の結合である.

      [0] "afo"+"take";
      afotake

`8 構造体`

      newstruct(afo)

  Asir における構造体は, C における構造体を簡易化したものである. 固定長配列の各成分を名前でアクセスできるオブジェクトで, 構造体定義毎に名前をつける.
`9 分散表現多項式`

      2*<<0,1,2,3>>-3*<<1,2,3,4>>

  これは, ほとんどグレブナ基底専用の型で, 通常の計算でこの型が必要と なることはまずないが, グレブナ基底計算パッケージ自体がユーザ言語 で書かれているため, ユーザが操作できるよう独立した型として Asir で使用できるようにしてある. これについては See section グレブナ基底の計算.
`10 符号なしマシン 32bit 整数`
`11 エラーオブジェクト`
  以上二つは, Open XM において用いられる特殊オブジェクトである.
`12 GF(2) 上の行列`
  現在, 標数 2 の有限体における基底変換のためのオブジェクトとして用いられ る.
`13 MATHCAP オブジェクト`
  Open XM において, 実装されている機能を送受信するためのオブジェクトである.
`14 first order formula`
  quantifier elimination で用いられる一階述語論理式.
`15 matrix over GF(p)`
  小標数有限体上の行列.
`16 byte array`
  符号なし byte の配列
`-1 VOID オブジェクト`
  型識別子 -1 をもつオブジェクトは関数の戻り値などが無効であることを示す.

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