Previous: Functions and Variables for Facts, Up: Maximas Database   [Contents][Index]

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を返します。


Previous: Functions and Variables for Facts, Up: Maximas Database   [Contents][Index]