• 検索結果がありません。

文脈の概要

ドキュメント内 , (ページ 152-157)

第 9 章 多項式について

14.1 文脈の概要

Maximaには文脈(context)があります.この文脈とは要するに,問題を考える上での様々な仮定

や事実の積重ねです.式の計算や簡易化ではこの文脈を利用する事で実行して行きます.例えば,非 常に簡単な例ですが, 4の平方根は2になりますが,x2はどうでしょうか?xは正か負か,ひょっと すると複素数かもしれません.この様に

x2を考えるだけでも,xに関して様々な情報が必要にな ります.先ず,実数であれば|x|となりますね. 更に,x0であれば答えはxになります.

この処理では,

xは実数である

x≤0である

と言ったxに対する仮定を用いています. 文脈とはこの様な問題を考える上での情報の蓄積の事 です.

Maximaには複数の文脈を持たせる事が可能です.更に,文脈には階層構造もあります.この場合,

文脈globalがその最上位になります.この文脈を上手く利用しながら問題を解いて行きます.これ

らの文脈を有効や無効にする事がactivateとdeactivateで各々行えます.

どの様な文脈がMaximaに存在するかはcontexts;と入力すれば,利用可能な文脈のリストが 表示されます.尚,Maximaを立ち上げた時点では,initialとglobalの二種類の文脈があります.

新しい文脈の生成はnewcontext(文脈名);で行います.又,既存の文脈の親文脈を生成する場 合はsupcontextで, supcontext(新規生成する親文脈,既存の文脈);とします. 文脈の削除は killcontextで行いますが,現在利用中の文脈,或いはその文脈が有効(activate)であれば削除出 来ません.

ここで,Maximaに仮定を教える函数はassumeです.教えた仮定を忘れさせるのがforgetで,あ る事項に関して,どの様な仮定をMaximaに教えたかを調べたければ,factsを用います.

146 第14章 文脈 では,以下に文脈の使い方の実例を示しましょう.

(%i1) contexts;

(%o1) [initial, global]

(%i2) context;

(%o2) initial

(%i3) newcontext(mike);

(%o3) mike

(%i4) supcontext(neko,mike);

(%o4) neko

(%i5) context;

(%o5) neko

この例では,最初に立ち上げた時点でMaximaが持っている文脈をcontextsで表示し,それか らcontextで最初に用いている文脈がinitialである事を示しています.次にnewcontextを使っ て新しい文脈mikeを生成しています.それからmikeの親文脈となるnekoをsupcontextを使っ て生成しています.このsupcontextは子としては既存の文脈を指定しなければなりません.

次に,assumleを用いて式を簡易化する例と文脈の切り替えの効果を見ましょう.

(%i6) assume(y>0);

(%o6) [y > 0]

(%i7) assume(x>0,z<0);

(%o7) [x > 0, z < 0]

(%i8) facts();

(%o8) [y > 0, x > 0, 0 > z]

(%i9) sqrt(x^2);

(%o9) x

(%i10) context:initial;

(%o10) initial

(%i11) sqrt(x^2);

(%o11) abs(x)

(%i12) facts();

(%o12) []

(%i13) activate(neko);

(%o13) done

(%i14) context;

(%o14) initial

(%i15) sqrt(x^2);

(%o15) x

(%i16) facts();

(%o16) []

(%i17) deactivate(neko);

(%o17) done

(%i18) sqrt(x^2);

(%o18) abs(x)

(%i19) killcontext(neko);

(%o19) done

(%i20) contexts;

(%o20) [mike, initial, global]

先程の文脈の定義に続いて,文脈nekoでassumを使って変数x,y,zに対して仮定を設定します.

利用している文脈で設定した仮定全体はfacts();で表示が出来ます.文脈nekoでabs(x^2)を実 行するとx>0よりxが返されます.ここで文脈の切り替えは変数contextに文脈を代入する事で行 います.ここでは文脈をnekoからinitalに変更します.ここで,sqrt(x^2)を実行するとabs(x)が 返されます.何故なら,facts();から,initialには何も仮定が無い事が分ります.ここで,文脈neko の仮定を文脈initialで利用したければ,actvate(neko);を実行します.その結果,sqrt(x^2)の結 果がxになります.但し,initialの内容には変化がありません. 不要になった文脈はdeactivateす

148 第14章 文脈 るか,killcontextで削除してしまいます.

他に,featuresがあります.これは組込の特性リストです. 述語がfeaturesのリストに含まれる 特性を持たせたければ,declareを用います.例えばbirthdayを整数として宣言して,birthdayに 整数としての特性を持たせたければ,declare(birthday,integer);とします.逆に述語pが特性 qを持つかどうかを調べる場合にはfeaturep(p,q);で調べます. 尚,declareによる影響は,assume とは違い大域的ですが,featurepではdeclareを用いた文脈上でしか使えません.

(%i1) newcontext("mike");

(%o1) mike

(%i2) supcontext("neko");

(%o2) neko

(%i3) context:mike;

(%o3) mike

(%i4) declare(bb,lassociative);

(%o4) done

(%i5) featurep(bb,lassociative);

(%o5) true

(%i6) facts();

(%o6) [kind(bb, lassociative)]

(%i7) bb(bb(a,b),bb(c,d));

(%o7) bb(bb(bb(a, b), c), d)

(%i8) context:initial;

(%o8) initial

(%i8) bb(bb(a,b),bb(c,d));

(%o9) bb(bb(bb(a, b), c), d)

(%i10) aa(aa(a,b),aa(c,d));

(%o10) aa(aa(a, b), aa(c, d))

(%i11) facts();

(%o11) []

(%i12) featurep(bb,lassociative);

(%o12) false

(%i13) killcontext("mike");

(%o13) done

(%i14) contexts;

(%o14) [neko, initial, global]

(%i15) bb(bb(a,b),bb(c,d));

(%o15) bb(bb(bb(a, b), c), d)

150 第14章 文脈

ドキュメント内 , (ページ 152-157)