Next: , Previous:   [Contents][Index]

11 Maximas Database


11.1 Introduction to Maximas Database


11.2 Functions and Variables for Properties

関数: declare (a_1, p_1, a_2, p_2, …)

アトムやアトムのリストa_iに、プロパティやプロパティのリストp_iを割り当てます。 a_ip_iがリストの時、 アトムのそれぞれは、プロパティすべてを得ます。

declareは引数をクォートします。 declareはいつもdoneを返します。

それぞれの宣言フラグに関する記述で注意しているように、 いくつかのフラグに関して、 もしobjectfeatureを持つよう宣言されているなら、 featurep(object, feature)は、 trueを返します。 しかしながら、featurepはいくつかのフラグを認識しません; これはバグです。

featuresも参照してください。

declareは以下のプロパティを認識します:

evfun

evのフラグ引数としてa_iが現れた時 a_iで名付けられた関数を適用するように evに伝えます。 evfunを参照してください。

evflag

evのフラグ引数としてa_iが現れた時 evの実行中a_itrueにバインドされるように evに伝えます。 evflagを参照してください。

bindtest

a_iがバインドされていない状態に評価された時、 Maximaにエラーをトリガーするように伝えます。

noun

a_iを名詞としてパースするようにMaximaに伝えます。 この効果は、a_iのインスタンスを'a_inounify(a_i) で置き換えることです。どちらに置き換えるかは文脈に依存します。

constant

a_iをシンボル定数と考えるようにMaximaに伝えます。

scalar

a_iをスカラー変数と考えるようにMaximaに伝えます。

nonscalar

a_iを非スカラー変数と考えるようにMaximaに伝えます。 普通の使い方は、変数をシンボルベクトルや行列として宣言することです。

nonarray

Maximaにa_iを配列でないものと考えるように伝えます。 この宣言は添字付き変数名の多重評価を抑制します。

mainvar

a_iを「主変数」と考えるようにMaximaに伝えます。 ordergreatpで決定されるように、 Maximaの式の標準順序では、主変数は他のすべての定数や変数に続きます。

alphabetic

(文字列の)a_iの中の文字すべてをアルファベット文字として認識するように Maximaに伝えます。

feature

a_iをfeature名として認識するようにMaximaに伝えます。 他のアトムは、a_iプロパティを持つように定義されます。

rassociative, lassociative

a_iを右結合、もしくは左結合関数として認識するようにMaximaに伝えます。

nary

a_iをn項関数として認識するようにMaximaに伝えます。

nary宣言は、nary関数をコールするのとは同じではありません。 declare(foo, nary)だけの効果は、Maxima整理器を ネストされた式を平坦にするように指示することです。 例えば、foo(x, foo(y, z))foo(x, y, z)に整理します。

symmetric, antisymmetric, commutative

a_iを対称もしくは反対称関数として認識するようにMaximaに伝えます。 commutativesymmetricと同じです。

oddfun, evenfun

a_iを偶関数もしくは奇関数として認識するようにMaximaに伝えます。

outative

a_i式を最初の引数から定数因子を引き出すことで整理するようにMaximaに伝えます。

a_iが1つ引数を持つ時、 もしリテラル定数や宣言定数なら、因子は定数とみなされます。

a_iが2つ以上の引数を持つ時、 もし2番目の引数がシンボルであり、因子が2番目の引数の制約を受けなければ、 因子は定数とみなされます。

multiplicative

代入a_i(x * y * z * ...) --> a_i(x) * a_i(y) * a_i(z) * .... によって、a_i式を整理するようにMaximaに伝えます。 代入は、1番目の引数のみで実行されます。

additive

代入a_i(x + y + z + ...) --> a_i(x) + a_i(y) + a_i(z) + .... によって、a_i式を整理するようにMaximaに伝えます。 代入は、1番目の引数のみで実行されます。

linear

a_ioutativeかつadditiveに宣言することと同値です。

integer, noninteger

a_iを整数もしくは非整数変数として認識するようにMaximaに伝えます。

even, odd

a_iを偶数変数もしくは奇数変数として認識するようにMaximaに伝えます。

rational, irrational

a_iを有理変数もしくは非有理実変数として認識するようにMaximaに伝えます。

real, imaginary, complex

a_iを実変数もしくは純虚数変数もしくは複素変数として認識するようにMaximaに伝えます。

increasing, decreasing

a_iを単調増加関数もしくは単調減少関数として認識するようにMaximaに伝えます。

posfun

a_iを正関数として認識するようにMaximaに伝えます。

integervalued

a_iを整数値を返す関数として認識するようにMaximaに伝えます。

例:

evfunevflag宣言。

(%i1) declare (expand, evfun);
(%o1)                         done
(%i2) (a + b)^3;
                                   3
(%o2)                       (b + a)
(%i3) (a + b)^3, expand;
                     3        2      2      3
(%o3)               b  + 3 a b  + 3 a  b + a
(%i4) declare (demoivre, evflag);
(%o4)                         done
(%i5) exp (a + b*%i);
                             %i b + a
(%o5)                      %e
(%i6) exp (a + b*%i), demoivre;
                      a
(%o6)               %e  (%i sin(b) + cos(b))

bindtest宣言。

(%i1) aa + bb;
(%o1)                        bb + aa
(%i2) declare (aa, bindtest);
(%o2)                         done
(%i3) aa + bb;
aa unbound variable
 -- an error.  Quitting.  To debug this try debugmode(true);
(%i4) aa : 1234;
(%o4)                         1234
(%i5) aa + bb;
(%o5)                       bb + 1234

noun宣言。

(%i1) factor (12345678);
                             2
(%o1)                     2 3  47 14593
(%i2) declare (factor, noun);
(%o2)                         done
(%i3) factor (12345678);
(%o3)                   factor(12345678)
(%i4) ''%, nouns;
                             2
(%o4)                     2 3  47 14593

constant, scalar, nonscalar, mainvar宣言。

alphabetic宣言。

(%i1) xx\~yy\`\@ : 1729;
(%o1)                         1729
(%i2) declare ("~`@", alphabetic);
(%o2)                         done
(%i3) xx~yy`@ + @yy`xx + `xx@@yy~;
(%o3)               `xx@@yy~ + @yy`xx + 1729
(%i4) listofvars (%);
(%o4)                  [@yy`xx, `xx@@yy~]

feature宣言。

(%i1) declare (FOO, feature);
(%o1)                         done
(%i2) declare (x, FOO);
(%o2)                         done
(%i3) featurep (x, FOO);
(%o3)                         true

rassociative, lassociative宣言。

nary宣言。

(%i1) H (H (a, b), H (c, H (d, e)));
(%o1)               H(H(a, b), H(c, H(d, e)))
(%i2) declare (H, nary);
(%o2)                         done
(%i3) H (H (a, b), H (c, H (d, e)));
(%o3)                   H(a, b, c, d, e)

symmetric, antisymmetric宣言。

(%i1) S (b, a);
(%o1)                        S(b, a)
(%i2) declare (S, symmetric);
(%o2)                         done
(%i3) S (b, a);
(%o3)                        S(a, b)
(%i4) S (a, c, e, d, b);
(%o4)                   S(a, b, c, d, e)
(%i5) T (b, a);
(%o5)                        T(b, a)
(%i6) declare (T, antisymmetric);
(%o6)                         done
(%i7) T (b, a);
(%o7)                       - T(a, b)
(%i8) T (a, c, e, d, b);
(%o8)                   T(a, b, c, d, e)

oddfun, evenfun宣言。

(%i1) o (- u) + o (u);
(%o1)                     o(u) + o(- u)
(%i2) declare (o, oddfun);
(%o2)                         done
(%i3) o (- u) + o (u);
(%o3)                           0
(%i4) e (- u) - e (u);
(%o4)                     e(- u) - e(u)
(%i5) declare (e, evenfun);
(%o5)                         done
(%i6) e (- u) - e (u);
(%o6)                           0

outative宣言。

(%i1) F1 (100 * x);
(%o1)                       F1(100 x)
(%i2) declare (F1, outative);
(%o2)                         done
(%i3) F1 (100 * x);
(%o3)                       100 F1(x)
(%i4) declare (zz, constant);
(%o4)                         done
(%i5) F1 (zz * y);
(%o5)                       zz F1(y)

multiplicative宣言。

(%i1) F2 (a * b * c);
(%o1)                       F2(a b c)
(%i2) declare (F2, multiplicative);
(%o2)                         done
(%i3) F2 (a * b * c);
(%o3)                   F2(a) F2(b) F2(c)

additive宣言。

(%i1) F3 (a + b + c);
(%o1)                     F3(c + b + a)
(%i2) declare (F3, additive);
(%o2)                         done
(%i3) F3 (a + b + c);
(%o3)                 F3(c) + F3(b) + F3(a)

linear宣言。

(%i1) 'sum (F(k) + G(k), k, 1, inf);
                       inf
                       ====
                       \
(%o1)                   >    (G(k) + F(k))
                       /
                       ====
                       k = 1
(%i2) declare (nounify (sum), linear);
(%o2)                         done
(%i3) 'sum (F(k) + G(k), k, 1, inf);
                     inf          inf
                     ====         ====
                     \            \
(%o3)                 >    G(k) +  >    F(k)
                     /            /
                     ====         ====
                     k = 1        k = 1
宣言: features

Maximaは、関数や変数のある数学的プロパティを認識します。 それらは「フィーチャー」と呼ばれます。

declare (x, foo)は、 プロパティfooを関数もしくは変数xに与えます。

declare (foo, feature)は、 新しいフィーチャーfooを宣言します。 例えば、 declare ([red, green, blue], feature)は、 3つの新しいフィーチャーred, green, blueを宣言します。

もしxfooプロパティを持つなら、 述語論理featurep (x, foo)は、trueを返し、 そうでなければ、falseを返します。

インフォリストfeaturesは既知のフィーチャーのリストです。 それらは、

   integer        noninteger      even
   odd            rational        irrational
   real           imaginary       complex
   analytic       increasing      decreasing
   oddfun         evenfun         posfun
   commutative    lassociative    rassociative
   symmetric      antisymmetric

プラス、任意のユーザー定義フィーチャーです。

featuresは、数学的フィーチャーのリストです。 非数学的で、システム依存のフィーチャーのリストもあります。 statusを参照してください。

関数: get (a, i)

iが示すアトム aのユーザープロパティを検索し、 もしaがプロパティ iを持たないなら、 falseを返します。

getは、引数を評価します。

(%i1) put (%e, 'transcendental, 'type);
(%o1)                    transcendental
(%i2) put (%pi, 'transcendental, 'type)$
(%i3) put (%i, 'algebraic, 'type)$
(%i4) typeof (expr) := block ([q],
        if numberp (expr)
        then return ('algebraic),
        if not atom (expr)
        then return (maplist ('typeof, expr)),
        q: get (expr, 'type),
        if q=false
        then errcatch (error(expr,"is not numeric.")) else q)$
(%i5) typeof (2*%e + x*%pi);
x is not numeric.
(%o5)  [[transcendental, []], [algebraic, transcendental]]
(%i6) typeof (2*%e + %pi);
(%o6)     [transcendental, [algebraic, transcendental]]

プロパティ: nonarray

コマンドdeclare(a, nonarray)はMaximaに aが配列でないものと考えるように伝えます。 もしaが添字付き変数なら、この宣言は多重評価を抑制します。

例:

(%i1) a:'b$ b:'c$ c:'d$


(%i4) a[x];
(%o4)                          d
                                x
(%i5) declare(a, nonarray);
(%o5)                         done
(%i6) a[x];
(%o6)                          a
                                x
宣言: posfun

declare (f, posfun)は、 fを正の関数と宣言します。 is (f(x) > 0)trueを出力します。

関数: printprops (a, i)
関数: printprops ([a_1, ..., a_n], i)
関数: printprops (all, i)

アトムaに関連付けられた指標iの属性を表示します。 aは、アトムのリストもしくはアトムallもありえます。 その場合,与えられたプロパティを持つすべてのアトムに適用します。 例えば、 printprops ([f, g], atvalue)printpropsは、表示できないプロパティ、 すなわちatvalue, atomgrad, gradef, matchdeclareのためのものです。


11.3 Functions and Variables for Facts

関数: activate (context_1, …, context_n)

文脈context_1, …, context_nをアクティベートします。 これらの文脈に関する事実は、演繹し情報を検索するために利用可能となります。 これらの文脈に関する事実は、facts ()によってリストされません。

変数activecontextsは、 activate関数を使ってアクティブになった文脈のリストです。

システム変数: activecontexts

デフォルト値: []

変数activecontextsは、 アクティブである文脈と対照的に、 activate関数を使ってアクティブになった文脈のリストです。 ゆえに、それらは現在の文脈の部分文脈です。

システム変数: askexp

asksignがコールされた時、 askexpは、asksignがテストしている式です。

以前は、control-AでMaximaブレイクに入ることによって、 ユーザーがaskexpを検査することができました。

関数: askinteger (expr, integer)
関数: askinteger (expr)
関数: askinteger (expr, even)
関数: askinteger (expr, odd)

askinteger (expr, integer)は、 assumeデータベースから、exprが整数かどうかを決定しようとします。 そうでなく、もし決定できなければ、askintegerはユーザーに入力を促し、 可能ならばデータベースに情報をインストールしようとします。 askinteger (expr)は、 askinteger (expr, integer)と同値です。

同様に、 askinteger (expr, even)askinteger (expr, odd)は、 それぞれ、exprが偶数か奇数か、決定しようとします。

関数: asksign (expr)

最初に、指定された式が正か負かゼロか決定しようとします。 できなければ、演繹を完了するのに必要な質問をユーザーに尋ねます。 ユーザーの答えは、現在の計算の演繹のため、データベースに記録されます。 asksignの戻り値は、pos, negもしくはzeroのいずれか1つです。

関数: assume (pred_1, …, pred_n)

述語論理pred_1, …, pred_nを現在の文脈に追加します。 もし述語論理が現在の文脈と矛盾していたり、冗長だったりしたなら、文脈に追加されません。 文脈はassumeがコールされる毎に述語論理を累積していきます。

assumeは、文脈に追加された述語論理を要素に持つリストか、 適用されたアトムredundantもしくはinconsistentを返します。

述語論理pred_1, …, pred_nは 関係演算子< <= equal notequal >= >を持つ式のみ許されます。 述語論理はリテラル等号=やリテラル不等号#の式は使えません。 integerpのような述語関数も使えません。

形式pred_1 and ...and pred_nの合成された述語論理が認識されます。 しかし、pred_1 or ... or pred_nは認識されません。 もしpred_kが関係述語論理なら、not pred_kは認識されます。 形式not (pred_1 and pred_2)の式や not (pred_1 or pred_2)は認識されません。

Maximaの推論メカニズムはそれほど強くありません; isによって決定されない多くの明らかな結果があります。 これは既知の弱みです。

assumeは複素数を伴う述語論理を扱いません。 もし述語論理が複素数を含むなら、assumeinconsistentredundantを返します。

assumeは引数を評価します。

isfacts, forget, context, declareも参照してください。

例:

(%i1) assume (xx > 0, yy < -1, zz >= 0);
(%o1)              [xx > 0, yy < - 1, zz >= 0]
(%i2) assume (aa < bb and bb < cc);
(%o2)                  [bb > aa, cc > bb]
(%i3) facts ();
(%o3)     [xx > 0, - 1 > yy, zz >= 0, bb > aa, cc > bb]
(%i4) is (xx > yy);
(%o4)                         true
(%i5) is (yy < -yy);
(%o5)                         true
(%i6) is (sinh (bb - aa) > 0);
(%o6)                         true
(%i7) forget (bb > aa);
(%o7)                       [bb > aa]
(%i8) prederror : false;
(%o8)                         false
(%i9) is (sinh (bb - aa) > 0);
(%o9)                        unknown
(%i10) is (bb^2 < cc^2);
(%o10)                       unknown
オプション変数: assumescalar

デフォルト値: true

assumescalarは、 nonscalarp (expr)falseであるような式exprが、 ある変換に関してスカラーのように振る舞うと仮定されるかどうかを決めるのを助けます。

Let exprがリストや行列以外の任意の式を表してるとし、 [1, 2, 3]が任意のリストや行列を表しているとすると、 もしassumescalartrue、 もしくはscalarp (expr)true、 もしくはconstantp (expr)trueなら、 expr . [1, 2, 3]は、[expr, 2 expr, 3 expr]をもたらします。

もしassumescalartrueなら、 そんな式は可換演算子に関してだけスカラーのように振る舞いますが、 非可換乗算.に関してはそうは振る舞いません。

assumescalarfalseの時 そんな式は、非スカラーのように振る舞います。

assumescalarallの時、 そんな式は、上でリストされた演算子すべてに関してスカラーのように振る舞います。

オプション変数: assume_pos

デフォルト値: false

assume_postrueで、 パラメータxの符号が現在の文脈や他の考慮から決定できない時、 signasksign (x)は、trueを返します。 これは、integrateや他の計算から起こるような、 自動生成されるasksign問い合わせを事前に防ぐことができます。

デフォルトでは、パラメータはsymbolp (x)もしくは subvarp (x)のようなxです。 パラメータとして考えられる式のクラスは、 変数assume_pos_predを介して、ある程度変えることができます。

signasksignは、 式の中のオペランドの符号から式の符号を演繹しようとします。 例えば、もしabがともに正なら、 a + bも正です。

しかしながら、asksign問い合わせすべてを迂回する方法はありません。 特に、asksign引数が、差x - yもしくは 対数log(x)の時、 たとえassume_postrueで、assume_pos_predが 引数すべてにtrueを返す関数であっても、 asksignは、いつもユーザーからの入力を要請します。

オプション変数: assume_pos_pred

デフォルト値: false

assume_pos_predが関数名や、引数xのラムダ式に割り当てられている時、 その関数は、 xが、assume_posのためのパラメータと考えられるかどうかを決定するために コールされます。 assume_posfalseの時、 assume_pos_predは、無視されます。

assume_pos_pred関数は、引数xsignasksignによってコールされます。 ここで、xはアトム、添字付き変数、関数コール式のいずれかです。 もしassume_pos_pred関数がtrueを返すなら、 xは、assume_posのためのパラメータと考えられます。

デフォルトでは、パラメータは、symbolp (x)もしくはsubvarp (x)のようなxです。

assumeassume_posも参照してください。

例:

(%i1) assume_pos: true$
(%i2) assume_pos_pred: symbolp$
(%i3) sign (a);
(%o3)                          pos
(%i4) sign (a[1]);
(%o4)                          pnz
(%i5) assume_pos_pred: lambda ([x], display (x), true)$
(%i6) asksign (a);
                              x = a

(%o6)                          pos
(%i7) asksign (a[1]);
                             x = a
                                  1

(%o7)                          pos
(%i8) asksign (foo (a));
                           x = foo(a)

(%o8)                          pos
(%i9) asksign (foo (a) + bar (b));
                           x = foo(a)

                           x = bar(b)

(%o9)                          pos
(%i10) asksign (log (a));
                              x = a

Is  a - 1  positive, negative, or zero?

p;
(%o10)                         pos
(%i11) asksign (a - b);
                              x = a

                              x = b

                              x = a

                              x = b

Is  b - a  positive, negative, or zero?

p;
(%o11)                         neg
オプション変数: context

デフォルト値: initial

contextは、assumeforgetによって保守される事実の集まりの名前です。

assumeは、contextと名付けられた集まりに事実を追加する一方、 forgetは、事実を取り除きます。

contextを名前fooにバインドすることは、 現在の文脈をfooに変えます。 もし指定された文脈fooがまだ存在しないなら、 newcontextのコールによって自動的に生成されます。 指定された文脈は自動的にアクティベートされます。

文脈メカニズムの一般的な記述に関しては、contextsを参照してください。

オプション変数: contexts

デフォルト値: [initial, global]

contextsは、 現在アクティブな文脈を含んでいる、現在存在する文脈のリストです。

文脈メカニズムは、ユーザーが 文脈と呼ばれる事実の集まりにバインドし、名付けることを可能にします。 一旦これがなされると、ユーザーは、 文脈を単にアクティベートしたりデアクティベートすることで、 たくさんの数の事実をMaximaに仮定させたり忘れさせたりできます。

任意のシンボルのアトムは、文脈となりえ、 その文脈の中に含まれた事実は、 forgetをコールすることで1つ1つ破壊されるまで、 あるいは、それらが属する文脈を破壊するためにkillをコールすることで、全体として破壊されるまで、記憶装置に保持されます。

文脈は階層的に存在します。 その根はいつも文脈globalであり、 文脈globalは、いくつかの関数が必要とするMaximaについての情報を含みます。 アクティブな文脈の部分文脈である任意の文脈の中の事実すべてそうであるように、 与えられた文脈の中では、 その文脈の中の事実すべては、「アクティブ」(それらが演繹や探索に使われるという意味) です。

新鮮なMaximaが起動された時、 ユーザーは、initialと呼ばれる文脈の中にいます。 それは、部分文脈としてglobalを持ちます。

facts, newcontext, supcontext, killcontext, activate, deactivate, assume, forgetも参照してください。

関数: deactivate (context_1, …, context_n)

特定の文脈context_1, …, context_nをデアクティベートします。

関数: facts (item)
関数: facts ()

もしitemが文脈の名前なら、 facts (item)は指定された文脈のfactsのリストを返します。

もしitemが文脈の名前でなければ、 facts (item)は現在の文脈の中で、 itemについて知っているfactsのリストを返します。 異なる文脈中のアクティブなfactsはリストされません。

facts ()(すなわち引数なし)は現在の文脈をリストします。

関数: forget (pred_1, …, pred_n)
関数: forget (L)

assumeで規定された述語論理を取り除きます。 述語論理は以前に規定されたものと同値の(必ずしも同一である必要なない)式です。

forget (L)Lは述語論理のリスト)は、 リスト上のそれぞれの項目を忘れます。

関数: is (expr)

assumeデータベースの中の事実から述語論理exprが確かか否かを決定 しようとします。

もし述語論理が確かにtrueもしくはfalseなら、 isは、それぞれtrueもしくはfalseを返します。 そうでなければ、戻り値は、グローバルフラグprederrorに依存します。 prederrortrueの時、 isはエラーメッセージを出力します。 そうでなければ、isunknownを出力します。

ev(expr, pred) (対話プロンプトでは、expr, predと書けます) は、is(expr)と同値です。

assume, facts, maybeも参照してください。

例:

isは述語論理の評価を引き起こします。

(%i1) %pi > %e;
(%o1)                       %pi > %e
(%i2) is (%pi > %e);
(%o2)                         true

isは、assumeデータベースから述語論理を演繹しようとします。

(%i1) assume (a > b);
(%o1)                        [a > b]
(%i2) assume (b > c);
(%o2)                        [b > c]
(%i3) is (a < b);
(%o3)                         false
(%i4) is (a > c);
(%o4)                         true
(%i5) is (equal (a, c));
(%o5)                         false

もしisassumeデータベースから述語論理を証明もしくは否定できなかったら、 グローバルフラグprederrorisの振る舞いを決めます。

(%i1) assume (a > b);
(%o1)                        [a > b]
(%i2) prederror: true$
(%i3) is (a > 0);
Maxima was unable to evaluate the predicate:
a > 0
 -- an error.  Quitting.  To debug this try debugmode(true);
(%i4) prederror: false$
(%i5) is (a > 0);
(%o5)                        unknown
関数: killcontext (context_1, …, context_n)

文脈context_1, …, context_nを消します。

もし文脈の1つが現在の文脈なら、 新しい文脈は、 消されなかった現在の文脈の最初の利用可能な部分文脈になるでしょう。 もし最初の利用可能な消されなかった文脈がglobalなら、 initialが代わりに使われます。 もしinitial文脈が消されたら、 新しい、空のinitial文脈が生成されます。

killcontextは、現在アクティブな文脈を消すことを拒否します。 なぜなら、それは現在の文脈の部分文脈、もしくは 関数activateの使用によってアクティブになっているから。

killcontextは、引数を評価します。 killcontextは、doneを返します。

関数: maybe (expr)

述語論理exprassumeデータベースの事実から正しいかどうかを 決定しようとします。

もし述語論理が確かにtrueもしくはfalseなら、 maybeは、それぞれtrueもしくはfalseを返します。 そうでなければ、maybeunknownを返します。

maybeは、prederror: falseでのisと関数的に同値です。 しかし、prederrorに値を実際に割り当てることなく結果が計算されます。

assume, facts, isも参照してください。

例:

(%i1) maybe (x > 0);
(%o1)                        unknown
(%i2) assume (x > 1);
(%o2)                        [x > 1]
(%i3) maybe (x > 0);
(%o3)                         true
関数: newcontext (name)

nameと呼ばれる新しい、空の文脈を生成します。 nameは、唯一の部分文脈としてglobalを持ちます。 新しく生成された文脈は現在アクティブな文脈になります。

newcontextは、引数を評価します。 newcontextは、nameを返します。

関数: sign (expr)

現在のデータベースの事実に基づいてexprの符号を決定しようとします。 以下の答えの1つを返します; pos (positive), neg (negative), zero, pz (正もしくはゼロ), nz (負もしくはゼロ), pn (正もしくは負), or pnz (正、負もしくはゼロ、すなわちなにもわからない).

関数: supcontext (name, context)
関数: supcontext (name)

nameと呼ばれる新しい文脈を生成します。 nameは、部分文脈としてcontextを持ちます。 contextは存在しなければいけません。

もしcontextが指定されないなら、 現在の文脈が仮定されます。


11.4 Functions and Variables for Predicates

関数: charfun (p)

述語論理pfalseに評価される時、0を返します; 述語論理ptrueに評価される時、1を返します。 述語論理がtruefalseでもない何かに評価される時(unknown), 名詞形を返します。

例:

(%i1) charfun (x < 1);
(%o1)                    charfun(x < 1)
(%i2) subst (x = -1, %);
(%o2)                           1
(%i3) e : charfun ('"and" (-1 < x, x < 1))$
(%i4) [subst (x = -1, e), subst (x = 0, e), subst (x = 1, e)];
(%o4)                       [0, 1, 0]
関数: compare (x, y)

is (x op y)trueに評価されるような比較演算子op (<,<=,>,>=,=,#)を返します; xy%iに依存して、x # yの時、 notcomparableを返します; 該当する演算子がなかったり、Maximaが演算子を決定できなかった時には unknownを返します。

例:

(%i1) compare (1, 2);
(%o1)                           <
(%i2) compare (1, x);
(%o2)                        unknown
(%i3) compare (%i, %i);
(%o3)                           =
(%i4) compare (%i, %i + 1);
(%o4)                     notcomparable
(%i5) compare (1/x, 0);
(%o5)                           #
(%i6) compare (x, abs(x));
(%o6)                          <=

関数compareは引数の実領域が空でないか決定しようとはしません; 従って、

(%i1) compare (acos (x^2 + 1), acos (x^2 + 1) + 1);
(%o1)                           <

acos (x^2 + 1)の実領域は空です。

特殊演算子: constant

declare (a, constant)は、aを定数に宣言します。 declareを参照してください。

関数: constantp (expr)

もしexprが定数式なら、trueを返します。 そうでなければ、falseを返します。

もし引数が、(/R/をつけて表示される有理数を含む)数や %pi, %e, %iにようなシンボル定数、 定数にバインドされた変数、declareで宣言された定数、 引数が定数の関数のいずれかなら、 式は定数式と考えられます。

constantpは引数を評価します。

例:

(%i1) constantp (7 * sin(2));
(%o1)                                true
(%i2) constantp (rat (17/29));
(%o2)                                true
(%i3) constantp (%pi * sin(%e));
(%o3)                                true
(%i4) constantp (exp (x));
(%o4)                                false
(%i5) declare (x, constant);
(%o5)                                done
(%i6) constantp (exp (x));
(%o6)                                true
(%i7) constantp (foo (x) + bar (%e) + baz (2));
(%o7)                                false
(%i8) 
関数: equal (a, b)

同値、すなわち、同じ値であることを表します。

equalはそれ自身で評価も整理もされません。 関数isは、equalをブーリアン値に評価しようとします。 is(equal(a, b)は、 もしabが、ratisimp(a - b)を評価することで決定されるように、 変数の可能な値すべてで等しいときだけtrueを返します; もしratsimpが0を返したら、2つの式は同値と考えれます。 2つの式は構文法的に等しくなくても(すなわち同一でなくても)同値でありえます。

isequaltrueもしくはfalseへの換算に失敗した時、 結果は、グローバルフラグprederrorに依ります。 prederrortrueの時、isはエラーメッセージを出力します。 そうでなければ、isunknownを返します。

isに加えて、 いくつかの他の演算子、if, and, or, notequalnotequaltrueもしくはfalseに評価します。

equalの否定がnotequalです。

例:

equalはそれ自身で評価も整理もされません。

(%i1) equal (x^2 - 1, (x + 1) * (x - 1));
                        2
(%o1)            equal(x  - 1, (x - 1) (x + 1))
(%i2) equal (x, x + 1);
(%o2)                    equal(x, x + 1)
(%i3) equal (x, y);
(%o3)                      equal(x, y)

関数isは、equalをブーリアン値に評価しようとします。 is(equal(a, b)は、 ratisimp(a - b)が0を返すときtrueを返します。 2つの式は構文法的に等しくなくても(すなわち同一でなくても)同値でありえます。

(%i1) ratsimp (x^2 - 1 - (x + 1) * (x - 1));
(%o1)                           0
(%i2) is (equal (x^2 - 1, (x + 1) * (x - 1)));
(%o2)                         true
(%i3) is (x^2 - 1 = (x + 1) * (x - 1));
(%o3)                         false
(%i4) ratsimp (x - (x + 1));
(%o4)                          - 1
(%i5) is (equal (x, x + 1));
(%o5)                         false
(%i6) is (x = x + 1);
(%o6)                         false
(%i7) ratsimp (x - y);
(%o7)                         x - y
(%i8) is (equal (x, y));
(%o8)                        unknown
(%i9) is (x = y);
(%o9)                         false

isが、equaltrueもしくはfalseへの換算に失敗したとき、 結果は、グローバルフラグprederrorに依ります。

(%i1) [aa : x^2 + 2*x + 1, bb : x^2 - 2*x - 1];
                    2             2
(%o1)             [x  + 2 x + 1, x  - 2 x - 1]
(%i2) ratsimp (aa - bb);
(%o2)                        4 x + 2
(%i3) prederror : true;
(%o3)                         true
(%i4) is (equal (aa, bb));
Maxima was unable to evaluate the predicate:
       2             2
equal(x  + 2 x + 1, x  - 2 x - 1)
 -- an error.  Quitting.  To debug this try debugmode(true);
(%i5) prederror : false;
(%o5)                         false
(%i6) is (equal (aa, bb));
(%o6)                        unknown

いくつかの演算子がequalnotequaltrueもしくはfalseに評価します。

(%i1) if equal (y, y - 1) then FOO else BAR;
(%o1)                          BAR
(%i2) eq_1 : equal (x, x + 1);
(%o2)                    equal(x, x + 1)
(%i3) eq_2 : equal (y^2 + 2*y + 1, (y + 1)^2);
                         2                   2
(%o3)             equal(y  + 2 y + 1, (y + 1) )
(%i4) [eq_1 and eq_2, eq_1 or eq_2, not eq_1];
(%o4)                  [false, true, true]

not exprは、exprの評価を伴うので、 not equal(a, b)は、is(notequal(a, b))と同値です。

(%i1) [notequal (2*z, 2*z - 1), not equal (2*z, 2*z - 1)];
(%o1)            [notequal(2 z, 2 z - 1), true]
(%i2) is (notequal (2*z, 2*z - 1));
(%o2)                         true
関数: notequal (a, b)

equal(a, b)の否定を表します。

例:

(%i1) equal (a, b);
(%o1)                      equal(a, b)
(%i2) maybe (equal (a, b));
(%o2)                        unknown
(%i3) notequal (a, b);
(%o3)                    notequal(a, b)
(%i4) not equal (a, b);
(%o4)                    notequal(a, b)
(%i5) maybe (notequal (a, b));
(%o5)                        unknown
(%i6) assume (a > b);
(%o6)                        [a > b]
(%i7) equal (a, b);
(%o7)                      equal(a, b)
(%i8) maybe (equal (a, b));
(%o8)                         false
(%i9) notequal (a, b);
(%o9)                    notequal(a, b)
(%i10) maybe (notequal (a, b));
(%o10)                        true
関数: unknown (expr)]

exprがMaximaの整理器が認識しない演算子や関数を含む時だけ、 trueを返します。

関数: zeroequiv (expr, v)

変数vの式exprがゼロと同値かどうかテストし、 true, false, もしくはdontknowを返します。

zeroequivは以下の制限を持ちます:

  1. Maximaが微分や評価する方法を知らない関数を使わない。
  2. もし式が実線上で極を持つなら、 結果としてエラーになります。(しかしこれは起こりにくいことです。)
  3. もし式が1階微分方程式の解ではない関数(例えばベッセル関数)を含むなら、 正しくない結果になるかもしれません。
  4. アルゴリズムは、注意深く選ばれた部分式に関してランダムに選ばれた点での評価を使います。 アルゴリズムはエラーの可能性を細小にしようとしますが、これはいつも危険な仕事です。

例えば、zeroequiv (sin(2 * x) - 2 * sin(x) * cos(x), x)trueを返し、 zeroequiv (%e^x + x, x)falseを返します。 一方、 zeroequiv (log(a * b) - log(a) - log(b), a)は、 余分なパラメータbがあるので、dontknowを返します。


Next: , Previous:   [Contents][Index]