[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6. Expressions


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.1 Introduction to Expressions

変数名として使えないたくさんの予約語があります。 これらを使うと不可解な構文法エラーの原因となります。

 
integrate            next           from                 diff
in                   at             limit                sum
for                  and            elseif               then
else                 do             or                   if
unless               product        while                thru
step

Maximaのほとんどのものは式です。 括弧で囲みコンマで区切ることで、式の列が構成できます。 これは C言語のコンマ式に似ています。

 
(%i1) x: 3$
(%i2) (x: x+1, x: x^2);
(%o2)                          16
(%i3) (if (x > 17) then 2 else 4);
(%o3)                           4
(%i4) (if (x > 17) then x: 2 else y: 4, y+x);
(%o4)                          20

Maximaではループでさえ式です。ループが返す値はあまり役に立たないdoneですけれども。

 
(%i1) y: (x: 1, for i from 1 thru 10 do (x: x*i))$
(%i2) y;
(%o2)                         done

ということなので、本当にしたいことはたぶん、コンマ式に 実際に値を返す3番目の項を含めることです。

 
(%i3) y: (x: 1, for i from 1 thru 10 do (x: x*i), x)$
(%i4) y;
(%o4)                        3628800


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2 Nouns and Verbs

Maximaは「名詞(Noun)」演算子と「動詞(Verb)」演算子を区別します。 動詞は実行される演算子です。 名詞は式の中で実行されずシンボルとして現れる演算子です。 デフォルトでは関数名は動詞です。 関数名をクォートするか、nounify関数を適用することで、 動詞を名詞に変えることができます。 verbify関数を適用することで名詞を動詞に変えることができます。 評価フラグnounsevを式の中の名詞を評価するようにします。

動詞形は、対応するLispシンボル上では先頭のドル記号$で区別されます。 対照的に、 名詞形は、対応するLispシンボル上では先頭のパーセント記号%で区別されます。 'integrateや(diffが返す)'derivativeのように いくつかの名詞は特別な表示プロパティを持ちますが、ほとんどは特別な表示を持ちません。 デフォルトでは、表示の際、関数の名詞形も動詞形も同じです。 グローバルフラグnoundispを立てると、 Maximaは先頭にクォートマーク'をつけて名詞形を表示します。

noun, nouns, nounify, やverbifyも参照してください。

例:

 
(%i1) foo (x) := x^2;
                                     2
(%o1)                     foo(x) := x
(%i2) foo (42);
(%o2)                         1764
(%i3) 'foo (42);
(%o3)                        foo(42)
(%i4) 'foo (42), nouns;
(%o4)                         1764
(%i5) declare (bar, noun);
(%o5)                         done
(%i6) bar (x) := x/17;
                                    x
(%o6)                     bar(x) := --
                                    17
(%i7) bar (52);
(%o7)                        bar(52)
(%i8) bar (52), nouns;
(%o8)                        bar(52)
(%i9) integrate (1/x, x, 1, 42);
(%o9)                        log(42)
(%i10) 'integrate (1/x, x, 1, 42);
                             42
                            /
                            [   1
(%o10)                      I   - dx
                            ]   x
                            /
                             1
(%i11) ev (%, nouns);
(%o11)                       log(42)

Categories:  Evaluation · Nouns and verbs


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.3 Identifiers

Maximaの識別子は、アルファベット文字と 0から9までの数詞と バックスラッシュ\文字に続く任意の特別文字で構成されます。

もしバックスラッシュが先行するなら、数詞は識別子の最初の文字となることができます。 2番目や後の文字の数詞はバックスラッシュが先行する必要はありません。

文字は declare関数によってアルファベットと宣言することができます。 もし宣言されたら、識別子の中でバックスラッシュで先行する必要はありません。 アルファベット文字は、AからZまで, aから zまで, %,と_が初期設定です。

Maximaは大文字小文字を区別します。 識別子foo, FOO, とFooは別の物です。 この点に関してLisp and Maximaを参照してください。

Maximaの識別子はドル記号$で始まるLispのシンボルです。 Maximaの中で現れる時、他の任意のLispシンボルはクエスチョンマーク?で始まります。 この点に関してLisp and Maximaを参照してください。

例:

 
(%i1) %an_ordinary_identifier42;
(%o1)               %an_ordinary_identifier42
(%i2) embedded\ spaces\ in\ an\ identifier;
(%o2)           embedded spaces in an identifier
(%i3) symbolp (%);
(%o3)                         true
(%i4) [foo+bar, foo\+bar];
(%o4)                 [foo + bar, foo+bar]
(%i5) [1729, \1729];
(%o5)                     [1729, 1729]
(%i6) [symbolp (foo\+bar), symbolp (\1729)];
(%o6)                     [true, true]
(%i7) [is (foo\+bar = foo+bar), is (\1729 = 1729)];
(%o7)                    [false, false]
(%i8) baz\~quux;
(%o8)                       baz~quux
(%i9) declare ("~", alphabetic);
(%o9)                         done
(%i10) baz~quux;
(%o10)                      baz~quux
(%i11) [is (foo = FOO), is (FOO = Foo), is (Foo = foo)];
(%o11)                [false, false, false]
(%i12) :lisp (defvar *my-lisp-variable* '$foo)
*MY-LISP-VARIABLE*
(%i12) ?\*my\-lisp\-variable\*;
(%o12)                         foo

Categories:  Syntax


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.4 Inequality

Maximaは不等式演算子<, <=, >=, >, #, notequalを持ちます。 条件式の記述に関しては、ifを参照してください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.5 Functions and Variables for Expressions

関数: alias (new_name_1, old_name_1, …, new_name_n, old_name_n)

(利用者もしくはシステム)関数や変数、配列等に対して別名を与えます。 任意の偶数個の引数を取ります。

システム変数: aliases

デフォルト値: []

aliasesは、 (alias, ordergreat, orderless関数で設定されるか、 declareでアトムをnounに宣言することで設定される) ユーザー定義のエーリアスを持つ アトムのリストです。

キーワード: allbut

partコマンド(すなわち、part,inpart,substpart, substinpart,dpart, lpart)と共に動作します。例えば、

 
(%i1) expr : e + d + c + b + a;
(%o1)                   e + d + c + b + a
(%i2) part (expr, [2, 5]);
(%o2)                         d + a

一方、

 
(%i1) expr : e + d + c + b + a;
(%o1)                   e + d + c + b + a
(%i2) part (expr, allbut (2, 5));
(%o2)                       e + c + b

killallbutを認識します。

 
(%i1) [aa : 11, bb : 22, cc : 33, dd : 44, ee : 55];
(%o1)                 [11, 22, 33, 44, 55]
(%i2) kill (allbut (cc, dd));
(%o0)                         done
(%i1) [aa, bb, cc, dd];
(%o1)                   [aa, bb, 33, 44]

kill(allbut(a_1, a_2, ...))は、 シンボルa_1, a_2, …をキルしないよう除外して kill(all)を実行します。

関数: args (expr)

exprの引数のリストを返します。 ここで exprはアトム以外のいかなる種類の式を取り得ます。 トップレベル演算子の引数だけが抽出されます; exprの部分式は、要素としてか引数のリストの要素の部分式として現れます。

リストの中の項目の順序はグローバルフラグinflagに依存するかもしれません。

args (expr)substpart ("[", expr, 0)と同値です。 substpartapply, funmake, opも参照してください。

行列を入れ子のリストに変換する方法:

 
(%i1) M:matrix([1,2],[3,4]);
                            [ 1  2 ]
(%o1)                       [      ]
                            [ 3  4 ]
(%i2) args(M);
(%o2)                   [[1, 2], [3, 4]]

maximaは n項の和を内部的に n個の引数の加算コマンドとして扱うので、 args()は和の項のリストを抽出できます:

 
(%i1) a+b+c;
(%o1)                       c + b + a
(%i2) args(%);
(%o2)                       [c, b, a]

Categories:  Expressions

関数: atom (expr)

もし exprがアトム(すなわち、数や名前や文字)なら true、そうでなければ falseを返します。 例えば、 atom(5)trueですが、 (a[1]xはバインドされていないと仮定して) atom(a[1])atom(sin(x))falseです。

Categories:  Expressions · Predicate functions

関数: box  
    box (expr)  
    box (expr, a)

枠で囲んだexprを返します。 返り値は、演算子としてboxを持ち引数としてexprを持つ式です。 display2dtrueの時、ディスプレイ上に枠が描かれます。

box (expr, a)は シンボルaでラベルされた枠でexprを囲みます。 もし枠の幅より長ければ、ラベルは切りつめられます。

boxは引数を評価します。 しかしながら、枠に入れられた式は中身に評価されないので、 枠に入れられた式は計算から効果的に除外されます。

boxcharは、box, dpart, lpart関数において 枠を描くのに使われる文字です。

例:

 
(%i1) box (a^2 + b^2);
                            """""""""
                            " 2    2"
(%o1)                       "b  + a "
                            """""""""
(%i2) a : 1234;
(%o2)                         1234
(%i3) b : c - d;
(%o3)                         c - d
(%i4) box (a^2 + b^2);
                      """"""""""""""""""""
                      "       2          "
(%o4)                 "(c - d)  + 1522756"
                      """"""""""""""""""""
(%i5) box (a^2 + b^2, term_1);
                      term_1""""""""""""""
                      "       2          "
(%o5)                 "(c - d)  + 1522756"
                      """"""""""""""""""""
(%i6) 1729 - box (1729);
                                 """"""
(%o6)                     1729 - "1729"
                                 """"""
(%i7) boxchar: "-";
(%o7)                           -
(%i8) box (sin(x) + cos(y));
                        -----------------
(%o8)                   -cos(y) + sin(x)-
                        -----------------

Categories:  Expressions

オプション変数: boxchar

デフォルト値: "

boxcharbox, dpart, lpart関数において 枠を描くのに使われる文字です。

式の中の枠すべては boxcharの現在値で描かれます; 描画文字は枠式に保存されていません。

Categories:  Expressions

関数: collapse (expr)

共通の(すなわち等しい)部分式すべてを共用する(すなわち、同じセルを使用する)ことで、 exprを縮約しスペースを節約します。 (collapseoptimizeコマンドによって使われるサブルーチンです。) 例えば,collapseをコールすることは saveファイルに積んだ後役に立つかもしれません。 collapse ([expr_1, ..., expr_n])を使うことでいくつかの式を 一緒に縮約できます。 同様に collapse (listarray ('A))を実行することで配列 Aの要素を縮約できます。

Categories:  Expressions

関数: disolate (expr, x_1, …, x_n)

ユーザーに複数の変数を同時に隔離できるようにすることを除いて、 isolate (expr, x)に似ています。 例えば、もし多重積分の中で変数を変えようとしていて それが2つ以上の積分変数を含んだ変数変換なら、これは役立つかもしれません。 この関数は `simplification/disol.mac'から自動ロードされます。 demo("disol")$でデモが入手可能です。

Categories:  Expressions

関数: dispform  
    dispform (expr)  
    dispform (expr, all)

exprの外部表現を返します。

dispform(expr)は主(トップレベル)演算子に関して外部表現を返します。 dispform(expr, all)exprの中の演算子すべてに関して 外部表現を返します。

part, inpart, inflagも参照してください。

例:

- xの内部表現は「-1掛けるx」ですが、 外部表現は「マイナスx」です。

 
(%i1) - x;
(%o1)                          - x
(%i2) ?format (true, "~S~%", %);
((MTIMES SIMP) -1 $X)
(%o2)                         false
(%i3) dispform (- x);
(%o3)                          - x
(%i4) ?format (true, "~S~%", %);
((MMINUS SIMP) $X)
(%o4)                         false

sqrt(x)の内部表現は「xの1/2乗」ですが、 外部表現は「xの平方根」です。

 
(%i1) sqrt (x);
(%o1)                        sqrt(x)
(%i2) ?format (true, "~S~%", %);
((MEXPT SIMP) $X ((RAT SIMP) 1 2))
(%o2)                         false
(%i3) dispform (sqrt (x));
(%o3)                        sqrt(x)
(%i4) ?format (true, "~S~%", %);
((%SQRT SIMP) $X)
(%o4)                         false

オプション引数allの使用。

 
(%i1) expr : sin (sqrt (x));
(%o1)                     sin(sqrt(x))
(%i2) freeof (sqrt, expr);
(%o2)                         true
(%i3) freeof (sqrt, dispform (expr));
(%o3)                         true
(%i4) freeof (sqrt, dispform (expr, all));
(%o4)                         false

Categories:  Expressions

関数: dpart (expr, n_1, …, n_k)

partと同じ部分式を選択しますが、 その部分式を値として返すだけの代わりに 枠の中に表示されて選択された部分式を持つ式全体を返します。 枠は実際に式の一部です。

 
(%i1) dpart (x+y/z^2, 1, 2, 1);
                             y
(%o1)                       ---- + x
                               2
                            """
                            "z"
                            """

Categories:  Expressions

オプション変数: exptisolate

デフォルト値: false

exptisolatetrueの時、 isolate (expr, var)varを含む(%eのような)アトムの指数を検査します。

Categories:  Expressions

オプション変数: exptsubst

デフォルト値: false

exptsubsttrueの時、 %e^(a x)の中の%e^xyを代入するような代入を許します。

 
(%i1) %e^(a*x);
                                a x
(%o1)                         %e
(%i2) exptsubst;
(%o2)                         false
(%i3) subst(y, %e^x, %e^(a*x));
                                a x
(%o3)                         %e
(%i4) exptsubst: not exptsubst;
(%o4)                         true
(%i5) subst(y, %e^x, %e^(a*x));
                                a
(%o5)                          y

関数: freeof (x_1, …, x_n, expr)

もしx_1と等しいexprの部分式がないか、 x_1exprの中でダミー変数としてのみ現れるか、 x_1exprの中で任意の演算子の名詞形でも動詞形でもないなら、 freeof (x_1, expr)trueを返します。 そうでなければ falseを返します。

freeof (x_1, ..., x_n, expr)は、 freeof (x_1, expr)かつ、 ...かつfreeof (x_n, expr)と同値です。

引数x_1, …, x_n は、 関数や変数の名前、添字付き名前、(ダブルクォートでくくられた)演算子、もしくは一般式 を取り得ます。 freeofは引数を評価します。

freeofは(整理と評価の後)式そのままで expr上でのみ機能し、 ある同値の表現が違った結果を与えるかどうかを決定しようとはしません。 特に、整理は、同値ですがexprの原型とは違った要素を含む異なる式を生成するかもしれません。

もし式の外部にバインドを持たなければ、変数は式の中のダミー変数です。 freeofによって認識されたダミー変数は、 和や積のインデックス、limitの中の極限変数、 integrateの定積分形の中の積分変数、 laplaceの中のオリジナル変数、 at式の中の形式変数、 lambda式の中の引数です。

integrateの不定積分形は積分変数から自由ではありません

例:

引数は、関数、変数、添字付き名前、演算子、式の名前です。 freeof (a, b, expr)freeof (a, expr) and freeof (b, expr)と同値です。

 
(%i1) expr: z^3 * cos (a[1]) * b^(c+d);
                                 d + c  3
(%o1)                   cos(a ) b      z
                             1
(%i2) freeof (z, expr);
(%o2)                         false
(%i3) freeof (cos, expr);
(%o3)                         false
(%i4) freeof (a[1], expr);
(%o4)                         false
(%i5) freeof (cos (a[1]), expr);
(%o5)                         false
(%i6) freeof (b^(c+d), expr);
(%o6)                         false
(%i7) freeof ("^", expr);
(%o7)                         false
(%i8) freeof (w, sin, a[2], sin (a[2]), b*(c+d), expr);
(%o8)                         true

freeofは引数を評価します。

 
(%i1) expr: (a+b)^5$
(%i2) c: a$
(%i3) freeof (c, expr);
(%o3)                         false

freeofは同値の式を考慮しません。 整理は、同値ですが異なる式を生成します。

 
(%i1) expr: (a+b)^5$
(%i2) expand (expr);
          5        4       2  3       3  2      4      5
(%o2)    b  + 5 a b  + 10 a  b  + 10 a  b  + 5 a  b + a
(%i3) freeof (a+b, %);
(%o3)                         true
(%i4) freeof (a+b, expr);
(%o4)                         false
(%i5) exp (x);
                                 x
(%o5)                          %e
(%i6) freeof (exp, exp (x));
(%o6)                         true

和や定積分はダミー変数から自由です。 不定積分は積分変数から自由ではありません。

 
(%i1) freeof (i, 'sum (f(i), i, 0, n));
(%o1)                         true
(%i2) freeof (x, 'integrate (x^2, x, 0, 1));
(%o2)                         true
(%i3) freeof (x, 'integrate (x^2, x));
(%o3)                         false

Categories:  Expressions

オプション変数: inflag

デフォルト値: false

inflagtrueの時、 部分抽出のための関数は exprの内部形式を検査します。

整理器は式を再順序付けすることに注意してください。 例えば、 もしinflagtrueなら first (x + y)xを返し、 もし inflagfalseなら yを返します。 (first (y + x)は同じ結果を与えます。)

また、inflagtrueに設定し partsubstpartをコールすることは、 inpartsubstinpartをコールすることと同じです。

inflagの設定に影響される関数は以下の通りです: part, substpart, first, rest, last, length, for ... in構成子, map, fullmap, maplist, reveal, pickapart

Categories:  Expressions

関数: inpart (expr, n_1, ..., n_k)

partに似ていますが、表示形式ではなく内部表現上で機能し、 フォーマットが実行されないのでより速いかもしれません。 (内部形式での変数の順序はしばしば表示形式でのそれと異なるので) 和や積の中の部分式の順序や、 (以下の演算子は式から取り除かれるので)単項マイナス、引き算、割り算を扱う際の部分式の順序 に関して注意が必要です。 part (x+y, 0)inpart (x+y, 0)+を返しますが、 演算子を参照するため、"で囲まれたものになります。 例えば、... if inpart (%o9,0) = "+" then ....

例:

 
(%i1) x + y + w*z;
(%o1)                      w z + y + x
(%i2) inpart (%, 3, 2);
(%o2)                           z
(%i3) part (%th (2), 1, 2);
(%o3)                           z
(%i4) 'limit (f(x)^g(x+1), x, 0, minus);
                                  g(x + 1)
(%o4)                 limit   f(x)
                      x -> 0-
(%i5) inpart (%, 1, 2);
(%o5)                       g(x + 1)

Categories:  Expressions

関数: isolate (expr, x)

xを含まない部分式を (%t1, %t2, ...のようなアトムシンボルの)中間式ラベルで置き換えた exprを返します。部分式は和の形を取ります。 興味のある変数を含まない部分式の不必要な展開を避けるのにしばしば役立ちます。 中間ラベルは部分式にバインドされるので、 それらが現れる式を評価すると、部分式をすべて代入し元に戻すことができます。

もしexptisolate (デフォルト値: false)がtrueなら、 isolatexを含むか、(%eのような)アトムの指数を検査します。

もしisolate_wrt_timestrueなら、 isolateは積に関しても隔離します。 isolate_wrt_timesを参照してください。

サンプルを見るには example (isolate)を実行してください。

Categories:  Expressions

オプション変数: isolate_wrt_times

デフォルト値: false

isolate_wrt_timestrueの時, isolateは積に関しても隔離します。 例えば、スイッチの両方の設定を比較すると、

 
(%i1) isolate_wrt_times: true$
(%i2) isolate (expand ((a+b+c)^2), c);

(%t2)                          2 a


(%t3)                          2 b

                          2            2
(%t4)                    b  + 2 a b + a

                     2
(%o4)               c  + %t3 c + %t2 c + %t4
(%i4) isolate_wrt_times: false$
(%i5) isolate (expand ((a+b+c)^2), c);
                     2
(%o5)               c  + 2 b c + 2 a c + %t4

Categories:  Expressions

オプション変数: listconstvars

デフォルト値: false

listconstvarstrueの時、 listofvarsが返すリストは %e, %pi, %iのような定数変数や exprの中に現れる定数として宣言された任意の変数を含みます。 変数はdeclareを介してconstant型として宣言されて、 constantpconstantとして宣言されたすべての変数に対して trueを返します。 デフォルトでは listofvarsの戻り値から定数変数を省略します。

Categories:  Expressions

オプション変数: listdummyvars

デフォルト値: true

listdummyvarsfalseの時、 式の中の「ダミー変数」は listofvarsが返すリストの中に含まれません。 (「ダミー変数」の意味はfreeofで与えられているものです。 「ダミー変数」は和や積のインデックスや、極限変数、定積分変数のように数学的なものです。)

例:

 
(%i1) listdummyvars: true$
(%i2) listofvars ('sum(f(i), i, 0, n));
(%o2)                        [i, n]
(%i3) listdummyvars: false$
(%i4) listofvars ('sum(f(i), i, 0, n));
(%o4)                          [n]

Categories:  Expressions

関数: listofvars (expr)

exprの中の変数のリストを返します。

listconstvarstrueの時、 もし %e, %pi, %iや 定数と宣言された任意の変数が exprの中で現れたなら、 listofvarsはそれらを戻り値のリストの中に含みます。 デフォルトはこれらを省略します。

変数のリストのなかの「ダミー変数」を除外したり含めたりするには、オプション変数 listdummyvarsも参照してください。

 
(%i1) listofvars (f (x[1]+y) / g^(2+a));
(%o1)                     [g, a, x , y]
                                  1

Categories:  Expressions

関数: lfreeof (list, expr)

listのそれぞれのメンバーmに関して、 freeof (m, expr)をコールします。 もしfreeofのコールのいずれかがfalseを返すなら、 falseを返し、そうでなければ trueを返します。

例:

 
(%i1) lfreeof ([ a, x], x^2+b);
(%o1)                         false
(%i2) lfreeof ([ b, x], x^2+b);
(%o2)                         false
(%i3) lfreeof ([ a, y], x^2+b);
(%o3)                         true

Categories:  Expressions

関数: lpart (label, expr, n_1, …, n_k)

dpartに似ていますが、ラベルされた枠を使います。 ラベルされた枠は dpartによって生成されたものに似ていますが、 トップラインの中での名前を持ちます。

Categories:  Expressions

プロパティ: mainvar

変数を mainvarに宣言することができます。 アトムに関する順序付けスケールは本質的に以下の通りです: 数 < 定数 (例えば、%e, %pi) < スカラー < 他の変数 < mainvars。 例えば、 expand ((X+Y)^4)(declare (x, mainvar), expand ((x+y)^4))と比較してください。 (注意: 上記の特長を使うことを決めたら注意が必要です。 例えば、もし、 mainvarであるxを含む式を mainvarでないxを含む式から引くなら、 もし打ち消しが起こるようにするには 例えばev (expr, simp)のような再整理が必要かもしれません。 また、mainvarであるxを含む式を保存するなら、 xもまた保存すべきです。)

宣言: noun

noundeclareコマンドのオプションの1つです。 関数を「名詞」に宣言するのに使います。 「名詞」は自動的には評価されないことを意味します。

例:

 
(%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

Categories:  Nouns and verbs

オプション変数: noundisp

デフォルト値: false

noundisptrueの時、 名詞が単一クォートで表示されます。 このスイッチは、関数定義を表示する時には常にtrueです。

関数: nounify (f)

関数名fの名詞形を返します。 もし動詞関数の名前を名詞のように参照したいならこれが必要になります。 もしある引数に関して関数が評価されないなら、 いくつかの動詞関数は名詞形を返すことに注意してください。 これは、クォートに関数コールが続く時返される形式でもあります。

verbifyも参照してください。

Categories:  Nouns and verbs

関数: nterms (expr)

式が完全に展開されて項の打ち消しや結合が起こらないという仮定の下、 exprが持つ項の数を返します。 sin (expr), sqrt (expr), exp (expr), などのような式は、 exprが(もしそれが和なら) どんなにたくさんの項を持とうと1項と数えます。

Categories:  Expressions

関数: op (expr)

exprの主演算子を返します。 op (expr)part (expr, 0)と同値です。

もし主演算子が組み込みもしくはユーザー定義の前置、二項もしくはn項中置、後置、マッチフィックス、無項いずれかの演算子なら、 opは文字列を返します。 そうでなければ、 もしexprが添字付き関数式なら、 opは添字付き関数を返します; この場合、戻り値はアトムではありません。 それ意外の場合、 exprは配列関数もしくは通常の関数式であり、 opはシンボルを返します。

opはグローバルフラグ inflagの値を見ています。

opは引数を評価します。

argsも参照してください。

例:

 
(%i1) stringdisp: true$
(%i2) op (a * b * c);
(%o2)                          "*"
(%i3) op (a * b + c);
(%o3)                          "+"
(%i4) op ('sin (a + b));
(%o4)                          sin
(%i5) op (a!);
(%o5)                          "!"
(%i6) op (-a);
(%o6)                          "-"
(%i7) op ([a, b, c]);
(%o7)                          "["
(%i8) op ('(if a > b then c else d));
(%o8)                         "if"
(%i9) op ('foo (a));
(%o9)                          foo
(%i10) prefix (foo);
(%o10)                        "foo"
(%i11) op (foo a);
(%o11)                        "foo"
(%i12) op (F [x, y] (a, b, c));
(%o12)                        F
                               x, y
(%i13) op (G [u, v, w]);
(%o13)                          G

Categories:  Expressions · Operators

関数: operatorp  
    operatorp (expr, op)  
    operatorp (expr, [op_1, …, op_n])

もしopexprの演算子に等しければ、 operatorp (expr, op)trueを返します。

もしある要素op_1, ..., op_nexprに等しければ、 operatorp (expr, [op_1, …, op_n])trueを返します。

Categories:  Operators · Predicate functions

オプション変数: opsubst

デフォルト値: true

opsubstfalseの時、 substは式の中の演算子に代入を試みません。 例えば、 (opsubst: false, subst (x^2, r, r+r[0]))はうまくいきます。

 
(%i1) r+r[0];
(%o1)                        r + r
                                  0
(%i2) opsubst;
(%o2)                         true
(%i3) subst (x^2, r, r+r[0]);
                            2     2
(%o3)                      x  + (x )
                                    0
(%i4) opsubst: not opsubst;
(%o4)                         false
(%i5) subst (x^2, r, r+r[0]);
                              2
(%o5)                        x  + r
                                   0

Categories:  Expressions

関数: optimize (expr)

exprと同じ値と副作用を生成する式を返しますが、 共通の部分式の再計算を避けることによってより効率的に行います。 optimizeは、共通の部分式すべてが共用されるように引数を縮約する副作用も持ちます。 例を見るには、example (optimize)を実行してください。

Categories:  Expressions

オプション変数: optimprefix

デフォルト値: %

optimprefixoptimizeコマンドによって生成されたシンボルのために 使われる前置です。

Categories:  Expressions

関数: ordergreat (v_1, …, v_n)
関数: orderless (v_1, …, v_n)

ordergreatは、 v_1v_2に続き、v_2は、…, v_nに続き、 そしてv_nは 引数として言及されなかった他の任意のシンボルに続くというように、 Maximaの式の標準の順序付けを変えます。

orderlessは、 v_1v_2に先行し、v_2は、…, v_nに先行し、 そしてv_nは 引数として言及されなかった他の任意のシンボルに先行するというように、 Maximaの式の標準の順序付けを変えます。

ordergreatorderlessによって確立される順序は、 unorderによって解消されます。 ordergreatorderlessは、 unorderがコールされるまで、 それぞれ一度だけコールすることができます; ordergreatorderlessの最後のコールだけが効果を持ちます。

ordergreatpも参照してください。

Categories:  Expressions

関数: ordergreatp (expr_1, expr_2)
関数: orderlessp (expr_1, expr_2)

もしMaximaの式の標準の順序付けの中で、expr_1expr_2に続くなら、 ordergreatpは、trueを返し、 そうでなければ、falseを返します。

もしMaximaの式の標準の順序付けの中で、expr_1expr_2に先行するなら、 orderlesspは、trueを返し、 そうでなければ、falseを返します。

Maximaのアトムや式のすべては ordergreatporderlesspの下で比較可能です。これらの述語論理が推移的でないような式の孤立した例はあるけれども; それはバグです。

アトム(シンボル、数リテラル、文字列)の標準の順序付けは以下の通りです。

(整数と浮動小数点)は以下に先行 (多倍長浮動小数点)は以下に先行 (宣言された定数)は以下に先行 (文字列)は以下に先行 (宣言されたスカラー)は以下に先行 (orderlessの最初の引数)は以下に先行 …は以下に先行 (orderlessの最後の引数) は以下に先行 (他のシンボル) は以下に先行 (ordergreatの最後の引数)は以下に先行 …は以下に先行 (ordergreatの最初の引数)は以下に先行 (宣言されたメイン変数)

アトムでない式に関して、標準の順序付けはアトムの順序付けから演繹されます。 組み込みの+ * ^演算子に関しては、 順序付けは簡単にはまとめられません。 他の組み込み演算子と他の半数や演算子、式すべてに関しては、 (最初の引数から始めて)それらの引数によって順序付けされ、 それから演算子や関数の名前によって順序付けされます。 添字付き式の場合、 添字付きのシンボルは演算子と、添字は引数と考えられます。

式の標準の順序付けは、関数ordergreatorderlessと、 mainvar, constant, scalar宣言によって変更されます。

sortも参照してください。

例:

通常のシンボルや定数の順序付け。 %piは数値に従って順序付けされないことに注意してください。

 
(%i1) stringdisp : true;
(%o1)                         true
(%i2) sort ([%pi, 3b0, 3.0, x, X, "foo", 3, a, 4, "bar", 4.0, 4b0]);
(%o2) [3, 3.0, 4, 4.0, 3.0b0, 4.0b0, %pi, "bar", "foo", X, a, x]

ordergreatorderless関数の効果。

 
(%i1) sort ([M, H, K, T, E, W, G, A, P, J, S]);
(%o1)           [A, E, G, H, J, K, M, P, S, T, W]
(%i2) ordergreat (S, J);
(%o2)                         done
(%i3) orderless (M, H);
(%o3)                         done
(%i4) sort ([M, H, K, T, E, W, G, A, P, J, S]);
(%o4)           [M, H, A, E, G, K, P, T, W, J, S]

mainvar, constant, scalar宣言の効果

 
(%i1) sort ([aa, foo, bar, bb, baz, quux, cc, dd, A1, B1, C1]);
(%o1)   [A1, B1, C1, aa, bar, baz, bb, cc, dd, foo, quux]
(%i2) declare (aa, mainvar);
(%o2)                         done
(%i3) declare ([baz, quux], constant);
(%o3)                         done
(%i4) declare ([A1, B1], scalar);
(%o4)                         done
(%i5) sort ([aa, foo, bar, bb, baz, quux, cc, dd, A1, B1, C1]);
(%o5)   [baz, quux, A1, B1, C1, bar, bb, cc, dd, foo, aa]

アトムでない式の順序付け

 
(%i1) sort ([1, 2, n, f(1), f(2), f(2, 1), g(1), g(1, 2), g(n),
       f(n, 1)]);
(%o1) [1, 2, f(1), g(1), g(1, 2), f(2), f(2, 1), n, g(n),
                                                         f(n, 1)]
(%i2) sort ([foo(1), X[1], X[k], foo(k), 1, k]);
(%o2)            [1, X , foo(1), k, X , foo(k)]
                      1              k

Categories:  Expressions · Predicate functions

関数: part (expr, n_1, …, n_k)

exprの表示形式のパーツを返します。 exprの最初のパーツn_1、それから、パーツn_2などなど、 結果は、exprのパーツn_1のパーツn_2の, ...パーツn_kです。 もし添字が指定されないなら、exprを返します。

partはリストの要素や行列の行を得るのに使うことができます。

もしpart関数の最後の引数がインデックスのリストなら、 それぞれがリストのインデックスに対応するいくつかの部分式が抽出されます。 従って、part (x + y + z, [1, 3])z+xです。

part関数を使ったとき、 pieceは選択された最後の式を保持します。 それは関数の実行中にセットされ、以下で示すように関数自身の中で参照されることもあります。

もし partswitchtrueに設定されているなら、 式の選択されたパーツが存在しないとき endが返されます。 そうでなければ、エラーメッセージが出力されます。

inpart, substpart, substinpart, dpart, lpartも参照してください。

例:

 
(%i1) part(z+2*y+a,2);
(%o1)                          2 y
(%i2) part(z+2*y+a,[1,3]);
(%o2)                         z + a
(%i3) part(z+2*y+a,2,1);
(%o3)                           2

example (part)でさらに例を見ることができます。

Categories:  Expressions

関数: partition (expr, x)

2つの式のリストを返します。 それらは、 (式が積か和かリストに応じて) 一番目の要素は xを含まないexprの因子、exprの項、リストで、 二番目の要素は xを含む因子、項、リストです。

例:

 
(%i1) partition (2*a*x*f(x), x);
(%o1)                     [2 a, x f(x)]
(%i2) partition (a+b, x);
(%o2)                      [b + a, 0]
(%i3) partition ([a, b, f(a), c], a);
(%o3)                  [[b, c], [a, f(a)]]

Categories:  Expressions

オプション変数: partswitch

デフォルト値: false

partswitchtrueの場合、 式の選択された部分が存在しない時 endが返されます。 そうでない時はエラーメッセージが出力されます。

Categories:  Expressions

関数: pickapart (expr, n)

exprの 深さ nの部分式に中間式ラベルを割り当てます。 より大きなもしくは小さな深さでの部分式はラベルに割り当てられません。 pickapartは元の式exprと同値の中間式の項による式を返します。

part, dpart, lpart, inpart, revealも参照してください。

例:

 
(%i1) expr: (a+b)/2 + sin (x^2)/3 - log (1 + sqrt(x+1));
                                          2
                                     sin(x )   b + a
(%o1)       - log(sqrt(x + 1) + 1) + ------- + -----
                                        3        2
(%i2) pickapart (expr, 0);
                                          2
                                     sin(x )   b + a
(%t2)       - log(sqrt(x + 1) + 1) + ------- + -----
                                        3        2
(%o2)                          %t2
(%i3) pickapart (expr, 1);

(%t3)                - log(sqrt(x + 1) + 1)


                                  2
                             sin(x )
(%t4)                        -------
                                3


                              b + a
(%t5)                         -----
                                2

(%o5)                    %t5 + %t4 + %t3
(%i5) pickapart (expr, 2);

(%t6)                 log(sqrt(x + 1) + 1)


                                  2
(%t7)                        sin(x )


(%t8)                         b + a

                         %t8   %t7
(%o8)                    --- + --- - %t6
                          2     3
(%i8) pickapart (expr, 3);

(%t9)                    sqrt(x + 1) + 1


                                2
(%t10)                         x

                  b + a              sin(%t10)
(%o10)            ----- - log(%t9) + ---------
                    2                    3
(%i10) pickapart (expr, 4);

(%t11)                     sqrt(x + 1)
                      2
                 sin(x )   b + a
(%o11)           ------- + ----- - log(%t11 + 1)
                    3        2
(%i11) pickapart (expr, 5);

(%t12)                        x + 1

                   2
              sin(x )   b + a
(%o12)        ------- + ----- - log(sqrt(%t12) + 1)
                 3        2
(%i12) pickapart (expr, 6);
                  2
             sin(x )   b + a
(%o12)       ------- + ----- - log(sqrt(x + 1) + 1)
                3        2

Categories:  Expressions

システム変数: piece

part関数を使った時m、選択された最後の式を返します。 関数の実行中に設定され、関数そのものの中で参照されることもあります。

Categories:  Expressions

関数: psubst  
    psubst (list, expr)  
    psubst (a, b, expr)

psubst(a, b, expr)substに似ています。 substを参照してください。

substとは違って、 もし最初の引数listが等式のリストなら 関数psubstは平行代入します。

並列代入するには sublisも参照してください。

例:

最初の例は psubstを使った平行代入を示します。 二番目の例は 関数substでの結果を示します。それは逐次代入します。

 
(%i1) psubst ([a^2=b, b=a], sin(a^2) + sin(b));
(%o1)                    sin(b) + sin(a)
(%i2) subst ([a^2=b, b=a], sin(a^2) + sin(b));
(%o2)                       2 sin(a)

Categories:  Expressions

関数: rembox  
    rembox (expr, unlabelled)  
    rembox (expr, label)  
    rembox (expr)

exprから枠を取り除きます。

rembox (expr, unlabelled)exprからラベルされていない枠すべてを取り除きます。

rembox (expr, label)labelを運ぶ枠のみを取り除きます。

rembox (expr)は、ラベルされているか否か問わず 枠すべてを取り除きます。

枠は box, dpart, lpart関数によって描画されます。

例:

 
(%i1) expr: (a*d - b*c)/h^2 + sin(%pi*x);
                                  a d - b c
(%o1)                sin(%pi x) + ---------
                                      2
                                     h
(%i2) dpart (dpart (expr, 1, 1), 2, 2);
dpart: fell off the end.
 -- an error. To debug this try: debugmode(true);
(%i3) expr2: lpart (BAR, lpart (FOO, %, 1), 2);
                                  BAR""""""""
                   FOO"""""""""   "a d - b c"
(%o3)              "sin(%pi x)" + "---------"
                   """"""""""""   "    2    "
                                  "   h     "
                                  """""""""""
(%i4) rembox (expr2, unlabelled);
                                  BAR""""""""
                   FOO"""""""""   "a d - b c"
(%o4)              "sin(%pi x)" + "---------"
                   """"""""""""   "    2    "
                                  "   h     "
                                  """""""""""
(%i5) rembox (expr2, FOO);
                                 BAR""""""""
                                 "a d - b c"
(%o5)               sin(%pi x) + "---------"
                                 "    2    "
                                 "   h     "
                                 """""""""""
(%i6) rembox (expr2, BAR);
                    FOO"""""""""   a d - b c
(%o6)               "sin(%pi x)" + ---------
                    """"""""""""       2
                                      h
(%i7) rembox (expr2);
                                  a d - b c
(%o7)                sin(%pi x) + ---------
                                      2
                                     h

Categories:  Expressions

関数: reveal (expr, depth)

指定された整数depthexprの部分を記述的な要約で置き換えます。

depthexprの最大深さ以上の時、 reveal (expr, depth)exprをそのまま返します。

revealは引数を評価します。 revealは要約された式を返します。

例:

 
(%i1) e: expand ((a - b)^2)/expand ((exp(a) + exp(b))^2);
                          2            2
                         b  - 2 a b + a
(%o1)               -------------------------
                        b + a     2 b     2 a
                    2 %e      + %e    + %e
(%i2) reveal (e, 1);
(%o2)                       Quotient
(%i3) reveal (e, 2);
                             Sum(3)
(%o3)                        ------
                             Sum(3)
(%i4) reveal (e, 3);
                     Expt + Negterm + Expt
(%o4)               ------------------------
                    Product(2) + Expt + Expt
(%i5) reveal (e, 4);
                       2                 2
                      b  - Product(3) + a
(%o5)         ------------------------------------
                         Product(2)     Product(2)
              2 Expt + %e           + %e
(%i6) reveal (e, 5);
                         2            2
                        b  - 2 a b + a
(%o6)              --------------------------
                       Sum(2)     2 b     2 a
                   2 %e       + %e    + %e
(%i7) reveal (e, 6);
                          2            2
                         b  - 2 a b + a
(%o7)               -------------------------
                        b + a     2 b     2 a
                    2 %e      + %e    + %e

Categories:  Expressions · Display functions

関数: sublis (list, expr)

式に対して多重平行代入を行います。 listは等式のリストです。 等式の左辺はアトムでなければいけません。

変数 sublis_apply_lambdasublisの後の式整理を制御します。

平行代入を行うには psubstも参照してください。

例:

 
(%i1) sublis ([a=b, b=a], sin(a) + cos(b));
(%o1)                    sin(b) + cos(a)

Categories:  Expressions

オプション変数: sublis_apply_lambda

デフォルト値: true

lambdaの代入が sublisを使った後の式整理の中で適用されるか 、もしくは代入が適用されるようにユーザーが evを実行しなければいけないかを決めます。 trueは式整理の中で適用されることを意味します。

Categories:  Expressions

オプション変数: subnumsimp

デフォルト値: false

もしtrueなら、シンボルfが与えられた時だけ、 関数substpsubstは添字付き変数f[x]に数を代入できます。

substも参照してください。

 
(%i1) subst(100,g,g[x]+2);

subst: cannot substitute 100 for operator g in expression g
                                                           x
 -- an error. To debug this try: debugmode(true);

(%i2) subst(100,g,g[x]+2),subnumsimp:true;
(%o2)                          102

Categories:  Expressions

関数: subst (a, b, c)

cの中の baを代入します。 bはアトムもしくは cの完全な部分式でなければなりません。 例えば、 x+y+z2*(x+y+z)の完全な部分式である一方、 x+yは完全な部分式ではありません。 bが前記の性質を持たない時は、 substpartratsubstが使える時があります(下記参照)。 代わりに、もしbe/f形式なら subst (a*f, e, c)が使えますし、 もしbe^(1/f)形式なら subst (a^f, e, c)が使えます。 substコマンドは x^-yの中の x^yも認識するので、 subst (a, sqrt(x), 1/sqrt(x))1/aを出力します。 abはダブルクォート "で囲まれた式の演算子でも 関数名でも問題ありません。 導関数形式の独立変数に代入したいなら at関数(下記参照)を使うべきです。

substsubstituteの別名です。

コマンドsubst (eq_1, expr)subst ([eq_1, ..., eq_k], expr)も許されている形式です。 eq_iは行う代入を指示する等式です。 それぞれの等式において、右辺が式 exprの中の左辺に代入されます。 等式は exprに左から右へ逐次に代入されます。 平行代入するには関数sublispsubstを参照してください。

exptsubsttrueなら、 %e^(a*x)の中の%e^xyに置き換えられるような代入が許されます。

opsubstfalseの時 substは式の演算子への代入を行いません。 例えば、(opsubst: false, subst (X^2, r, r+r[9]))は意図通り動作します。

例:

 
(%i1) subst (a, x+y, x + (x+y)^2 + y);
                                    2
(%o1)                      y + x + a
(%i2) subst (-%i, %i, a + b*%i);
(%o2)                       a - %i b

代入は等式のリストに関して逐次になされます。 これを並列代入と比較してください。

 
(%i1) subst([a=b, b=c], a+b);
(%o1)                          2 c
(%i2) sublis([a=b, b=c], a+b);
(%o2)                         c + b

+- のような単一文字演算子を substで置き換えるには、引用符で括らなければいけません。 しかし、 a+b-cは内部的に a+b+(-1*c)と表現されている可能性があることに注意してください。

 
(%i3) subst(["+"="-"],a+b-c);
(%o3)                                 c-b+a

もっと例を見るには example (subst)を実行してください。

Categories:  Expressions

関数: substinpart (x, expr, n_1, ..., n_k)

substpartと同様ですが、 substinpartexprの内部表現上で働きます。

例:

 
(%i1) x . 'diff (f(x), x, 2);
                              2
                             d
(%o1)                   x . (--- (f(x)))
                               2
                             dx
(%i2) substinpart (d^2, %, 2);
                                  2
(%o2)                        x . d
(%i3) substinpart (f1, f[1](x + 1), 0);
(%o3)                       f1(x + 1)

もしpart関数の最後の引数がインデックスのリストなら、 複数の部分式が選ばれます。それぞれはリストのインデックスに対応します。 例えば、

 
(%i1) part (x + y + z, [1, 3]);
(%o1)                         z + x

part関数を使った時、 pieceは最後の式の値を保持します。 関数の実行の間に設定され、以下で示すように関数自身の中で参照されることもあります。 もしpartswitchtrueに設定されたら、 式の選択された部分が存在しない時にはendが返されます。 そうでなければ、エラーメッセージが出力されます。

 
(%i1) expr: 27*y^3 + 54*x*y^2 + 36*x^2*y + y + 8*x^3 + x + 1;
              3         2       2            3
(%o1)     27 y  + 54 x y  + 36 x  y + y + 8 x  + x + 1
(%i2) part (expr, 2, [1, 3]);
                                  2
(%o2)                         54 y
(%i3) sqrt (piece/54);
(%o3)                        abs(y)
(%i4) substpart (factor (piece), expr, [1, 2, 3, 5]);
                               3
(%o4)               (3 y + 2 x)  + y + x + 1
(%i5) expr: 1/x + y/x - 1/z;
                             1    y   1
(%o5)                     (- -) + - + -
                             z    x   x
(%i6) substpart (xthru (piece), expr, [2, 3]);
                            y + 1   1
(%o6)                       ----- - -
                              x     z

また、 オプション inflagtrueに設定し partsubstpartをコールすることは、 inpartsubstinpartをコールすることと同じです。

Categories:  Expressions

関数: substpart (x, expr, n_1, …, n_k)

残りの引数をpartに食わせた結果の部分式に xを代入します。 exprの新しい値を返します。 xexprの演算子に代入される演算子でも問題ありません。 いくつかの場合、 xはダブルクォート "で囲まれる必要があります。 (例えば、substpart ("+", a*b, 0)b + aを返します。)

例:

 
(%i1) 1/(x^2 + 2);
                               1
(%o1)                        ------
                              2
                             x  + 2
(%i2) substpart (3/2, %, 2, 1, 2);
                               1
(%o2)                       --------
                             3/2
                            x    + 2
(%i3) a*x + f(b, y);
(%o3)                     a x + f(b, y)
(%i4) substpart ("+", %, 1, 0);
(%o4)                    x + f(b, y) + a

また、オプション inflagtrueに設定し partsubstpartをコールすることは、 inpartsubstinpartをコールすることと同じになります。

Categories:  Expressions

関数: symbolp (expr)

もし exprがシンボルなら true、そうでないなら falseを返します。 事実上、 symbolp(x)は述語論理 atom(x) and not numberp(x)と同値です。

Identifiersも参照してください。

Categories:  Predicate functions

関数: unorder ()

順序付けコマンドordergreatorderlessの最後の使用で生成されたエーリアシングを使用不可にします。 ordergreatorderlessは、 unorderを呼び出さずに、一回以上使えないかもしれません。 unorderは、 ordergreatorderlessで導入されたエーリアスに 元のシンボルを式に再代入しません。 それ故に、unorderの実行後、以前の式にエーリアスが現れます。

ordergreatorderlessも参照してください。

例s:

ordergreat(a)はシンボルaのエーリアスを導入します。 それ故に、 %o2%o4の違いは消えません。 unorderはシンボルaを再代入しないし、 出力%o7にエーリアスが現れます。

 
(%i1) unorder();
(%o1)                          []
(%i2) b*x + a^2;
                                   2
(%o2)                       b x + a
(%i3) ordergreat (a);
(%o3)                         done
(%i4) b*x + a^2;
 %th(1) - %th(3);
                             2
(%o4)                       a  + b x
(%i5) unorder();
                              2    2
(%o5)                        a  - a
(%i6) %th(2);
(%o6)                          [a]

Categories:  Expressions

関数: verbify (f)

関数名fの動詞形を返します。 verb, noun, nounifyも参照してください。

例:

 
(%i1) verbify ('foo);
(%o1)                          foo
(%i2) :lisp $%
$FOO
(%i2) nounify (foo);
(%o2)                          foo
(%i3) :lisp $%
%FOO

Categories:  Nouns and verbs


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by 市川雄二 on June, 21 2016 using texi2html 1.76.