next up previous
Next: Zero Up: Open XM の設計と実装 Previous: オブジェクトの文字列表現

   
数, 多項式 の CMO 表現

@../SSkan/plugin/cmotag.h
#define     CMO_MONOMIAL32  19
#define     CMO_ZZ          20 
#define     CMO_QQ          21
#define     CMO_ZERO        22
#define     CMO_DMS_GENERIC  24
#define     CMO_DMS_OF_N_VARIABLES  25
#define     CMO_RING_BY_NAME   26
#define     CMO_DISTRIBUTED_POLYNOMIAL 31
#define     CMO_RATIONAL       34


#define     CMO_INDETERMINATE  60
#define     CMO_TREE           61
#define     CMO_LAMBDA         62    /* for function definition */

以下, グループ CMObject/Basic, CMObject/Tree および CMObject/DistributedPolynomial に属する CMObject の形式を説明する.

OpenXM/src/ox_toolkit にある bconv をもちいると CMO expression を binary format に変換できるので, これを参考にするといい.

Example:

bash$ ./bconv
> (CMO_ZZ,123123);
00 00 00 14 00 00 00 01 00 01 e0 f3

Group CMObject/Basic requires CMObject/Primitive.
ZZ, QQ, Zero, Rational, Indeterminate,$\in$ CMObject/Basic.

\begin{eqnarray*}\mbox{Zero} &:& ({\tt CMO\_ZERO}) \\
& & \mbox{ --- ユニバーサ...
... Cstring}\, {\rm v}) \\
& & \mbox{ --- 変数名 $v$\space . } \\
\end{eqnarray*}


Indeterminate は変数名をあらわす. v はバイト列であればなにを用いてもよいが, システム毎に変数名として用いられるバイト列は制限がある. 各システム xxx は任意の文字列を各システム固有の変数名へ1対1に変換できるように 実装しないといけない. (これを Dx#dx と変換するなどの escape sequence を用いて実現するのは, 無理があるようである. テーブルを作成する必要があるであろう.)

Group CMObject/Tree requires CMObject/Basic.
Tree, Lambda $\in$ CMObject/Basic.

\begin{eqnarray*}\mbox{Tree} &:& ({\tt CMO\_TREE}, {\sl Cstring}\, {\rm name},
...
...{ --- optional な引数が必要なときは, leaves の後へつづける.} \\
\end{eqnarray*}


数式を処理するシステムでは, Tree 構造が一般にもちいられる. たとえば, $\sin(x+e)$ は, (sin, (plus, x, e)) なる Tree であらわすのが一般的である. Tree の表現を スタックマシンのレベルでおこなうとすると, ox_BEGIN_BLOCK, ox_END_BLOCK で評価を抑制するのが 一つの方法である (cf. Postscript の { , } ). たとえば上の方法では x, e, plus, sin を begin block, end block でかこめばよろしい. われわれはスタックマシンの実装をなるべく簡単にするという立場をとりたい, また数学オブジェクトを OX スタックマシンと CMObject を混在して表現したく ない. したがって, Tree 構造は Open Math 風の表現をもちいた CMO を導入することにした. またこのほうが, われわれの想定するシステム xxx において, Open XM 対応が はるかに容易である. なお, Tree は, Open Math では, Symbol, Application のメカニズムに相当する.

Lambda は関数を定義するための関数である. Lisp の Lambda 表現と同じ.

例: sin(x+e) の表現.

(CMO_TREE, (CMO_STRING, "sin"), (CMO_STRING, "basic"),
    (CMO_LIST,[size=]1, 
        (CMO_TREE, (CMO_STRING, "plus"), (CMO_STRING, "basic"),
            (CMO_LIST,[size=]2, (CMO_INDETERMINATE,"x"),
                 (CMO_TREE,(CMO_STRING, "e"),  自然対数の底
                            (CMO_STRING, "basic"))
        ))
    )
)

Example:

sm1> [(plus) (Basic) [(123).. (345)..]] [(class) (tree)] dc ::
Class.tree [    $plus$ , $Basic$ , [    123 , 345 ]  ]

次に, 分散表現多項式に関係するグループを定義しよう.

Group CMObject/DistributedPolynomials requires CMObject/Primitive, CMObject/Basic.
Monomial, Monomial32, Coefficient, Dpolynomial, DringDefinition, Generic DMS ring, RingByName, DMS of N variables $\in$ CMObject/DistributedPolynomials.

\begin{eqnarray*}\mbox{Monomial} &:& \mbox{Monomial32}\, \vert\, \mbox{Zero} \\ ...
...ector,} \\
& & \mbox{ --- outord は出力するときの変数順序.} \\
\end{eqnarray*}


RingByName や DMS of N variables はなくても, DMS を定義できる. したがって, これらを実装してないシステムで DMS を扱うものが あってもかまわない.

以下, 以上の CMObject にたいする, xxx = asir, kan の振舞いを記述する.



 

Nobuki Takayama 平成12年1月25日