| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
6.1 式について 6.2 割当て 6.3 複素数 6.4 不等号 6.5 構文 6.6 式に関する諸定義
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
変数名として利用してはならない予約語が幾つか存在する。それらを用いると意味不明 な構文エラーの原因となる。以下にその予約語を示す。
INTEGRATE NEXT FROM DIFF IN AT LIMIT SUM FOR AND ELSEIF THEN ELSE DO OR IF UNLESS PRODUCT WHILE THRU STEP |
MAXIMAでは殆どのものが式(expression)である。式の列はコンマで各式に分離され、 それらの回りに括弧を置いたもので作られる。これはCのcomma expressionに 似ている。
(C29) x:3$ (C30) joe:(x:x+1,x:x*x); (D30) 16 (C31) joe:(if (x >17) then 2 else 4); (D31) 4 (C32) joe:(if (x >17) then x:2 else joe:4,joe+x); (D32) 20 |
MAXIMAのループでさえも式だが、それの返す値は便利とは言えないDONEである。
(C33) joe:(x:1,for i from 1 thru 10 do (x:x*i)); (D33) DONE |
ともあれ、本当に必要なものは実際に値を返すコンマ式の第三の項に含まれる。
(C34) joe:(x:1,for i from 1 thru 10 do (x:x*i),x); (D34) 3628800 |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
小さい(less than): < 大きい(greater than): > 以上(greater than or equal to): >= 以下(less than or equal to): <= |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
MACSYMAの構文は殆どの通常のアプリケーションにとって適切でありさえすれば利用者 側で新しい演算子の定義やその再定義の消去が可能である。拡張の仕組はより直接的 で、以下の例で明白になるだろう。
(C1) PREFIX("DDX")$
(C2) DDX Y$
((C2)は"DDX"(Y)を意味する)
(C3) INFIX("<-")$
(C4) A<-DDX Y$
((C4)は"<-"(A,"DDX"(Y))を意味する)
|
SPECIALを除いた各々の演算子の型に関連する生成関数がある。この生成関数は 指定された語彙項目に関連する構文解析属性を与える。だから、上の例の "PREFIX("DDX")"で、"DDX"は丁度"-"や"NOT"の様な前置(prefix)演算子になる。 勿論、ある拡張関数はmatchfix演算子向けに照合キーワードの様な追加情報を必要 とする。加えて、羃乗の割当と語の一部は、定義された全てのキーワードに対して 指定されていなければならない。これは拡張関数に追加引数を引渡す事で実行される。 利用者がこれらの追加の助変数を指定しなかった場合、MACSYMAはデフォルト値を指定 する。
羃乗の割当と語の一部(鈎括弧で閉じられている)を伴う6個の拡張関数は以下に纏め られる。
PREFIX(operator, rbp[180], rpos[ANY], pos[ANY]) POSTFIX(operator, lbp[180], lpos[ANY], pos[ANY]) INFIX(operator, lbp[180], rbp[180], lpos[ANY], rpos[ANY],pos[ANY]) NARY(operator, bp[180], argpos[ANY], pos[ANY]) NOFIX(operator, pos[ANY]) MATCHFIX(operator, match, argpos[ANY], pos[ANY]) |
PREFIX("DDX",180,ANY,ANY)$
PREFIX("DDX",180)$
PREFIX("DDX")$
|
(C20) PREFIX("DDX",180,ANY,ANY)$
(C21) DDXYZ;
(D21) DDX YZ
(C26) "ddx"(u):=u+4;
(D26) DDX u := u + 4
(C27) ddx 8;
(D27) 12
|
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
BOX(expr,label) |
BOXCHAR["] - この関数や、DPARTやLPART関数で箱を描く時に用いる文字。
(*訳者注:要するに、こんな代物。
(C1) box(" This is a pen. ");
""""""""""""""""""
(D1) " This is a pen. "
""""""""""""""""""
*)
|
(* 訳者注:これもこんな代物。
(C30) box(" This is a pen. ","MAXIMA");
"MAXIMA"""""""""""
(D30) " This is a pen. "
""""""""""""""""""
(C31) boxchar:X;
(D31) X
(C32) box(" This is a pen. ","MAXIMA");
"MAXIMA"XXXXXXXXXX
(D32) X This is a pen. X
XXXXXXXXXXXXXXXXXX
*)
|
(* 訳者注: CONTRACTは対称式パッケージ(Symmetries)にあるが、本体側には含まれていないら しい。対称式パッケージのCONTRACTは二引数で、式とその変数リストを必要とする。 *) |
初期のevfunsは
FACTOR, TRIGEXPAND,TRIGREDUCE, BFLOAT, RATSIMP, RATEXPANDとRADCAN |
FLOAT, PRED, SIMP, NUMER, DETOUT, EXPONENTIALIZE, DEMOIVRE, KEEPFLOAT, LISTARITH, TRIGEXPAND, SIMPSUM, ALGEBRAIC, RATALGDENOM, FACTORFLAG, %EMODE, LOGARC, LOGNUMER, RADEXPAND, RATSIMPEXPONS, RATMX, RATFAC, INFEVAL, %ENUMER, PROGRAMMODE, LOGNEGINT, LOGABS, LETRAT, HALFANGLES, EXPTISOLATE, ISOLATE_WRT_TIMES, SUMEXPAND, CAUCHYSUM, NUMER_PBRANCH, M1PBRANCH, DOTSCRULESとLOGEXPAND |
DECLARE([var1, var2, ...], BINDTEST)は、任意のvariが計算で不定値の時は何時でも MACSYMAがエラーメッセージを出力する。MACSYMAが現在認識して用いているものは、 以下のオブジェクトの機能である:
EVEN, ODD, INTEGER, RATIONAL, IRRATIONAL, REAL, IMAGINARYとCOMPLEX |
INCREASING, DECREASING, ODDFUN (奇関数), EVENFUN (偶関数), COMMUTATIVE (又はSYMMETRIC), ANTISYMMETRIC, LASSOCIATIVEと RASSOCIATIVE |
DECLARE(F,INCREASING)は全ての面で次と同値である。
ASSUME(KIND(F,INCREASING)) |
aiとfiはオブジェクトや機能のリストであっても良い。
次の命令、
FEATUREP(object,feature) |
例えば、EXP:SIN(SQRT(X))であれば、 FREEOF(SQRT,EXP)とFREEOF(SQRT,DISPFORM(EXP))はTRUEとなるが、 FREEOF(SQRT,DISPFORM(EXP,ALL))はFALSEとなる。
例えば、 DISTRIB((A+B)*(C+D)) -> A C + A D + B C + B D MULTTHRU ((A+B)*(C+D)) -> (A + B) C + (A + B) D DISTRIB (1/((A+B)*(C+D))) -> 1/ ((A+B) *(C+D)) EXPAND(1/((A+B)*(C+D)),1,0) -> 1/(A C + A D + B C + B D) |
(* 訳者注:
式の層とは内部表現での括弧()の配置に対応する。最上層とはLISP等の
(演算子,式1,式2,...)の事で、各式が原子でなければ、これと同様の構造が入り、
全体的に入れ子の構造(マトリョーシカの様な感じ)となっている。例えば、
x^2+2*x+y*(sin(1/y+2)+1)をLISPのS式で表記するなら、
(+ (^ x 2) (* 2 x) (* y (+ (sin (+ (/ 1 y) 2)) 1)))
となるが、この括弧の階層を図示すれば次の様になるだろう。
(+ )
(^ x 2) (* 2 x) (* y )
(+ 1)
(sin )
(+ 2)
(/ 1 y)
ここでEXPANDは各入れ子全てを展開して可能な限り階層を浅くするものと言えるが、
DISTRIBは最上層の演算子の分配に留まると言える。尚、Mathematicaでは、リスト
の階層表示や、Maximaの名詞型に対する式の階層を指定した展開処理や演算子の
入れ換えさえも可能である。
*)
|
(C1) DPART(X+Y/Z**2,1,2,1);
Y
(D1) ---- + X
2
*****
* Z *
*****
|
(*訳者注:
こんな使い方も出来る;
(C1) infix("tama");
(D1) "TAMA"
(C2) x tama y:=sin(x*y);
(D2) x TAMA y := SIN(x y)
(C3) plot3d(x tama y,[x,-2,2],[y,-2,2]);
(D3) 0
この例では、tamaをinfixとして宣言し、それから関数tamaを定義している。定義した
後は普通に使える。但し、infixである事を忘れると次の例の様な現象で驚く;
(C4) %pi tama 1/2;
(D4) 0
(C5) %pi tama (1/2);
(D5) 1
(C4)では、(%pi tama 1)/2 <=> sin(%pi*1)/2が計算されているので0となる。
(C5)では、(%pi tama (1/2))<=>sin(%pi*(1/2))を計算する為、望む値が得られている。
*)
|
(C1) X+Y+W*Z;
(D1) W Z + Y + X
(C2) INPART(D1,3,2);
(D2) Z
(C3) PART(D1,1,2);
(D3) Z
(C4) 'LIMIT(F(X)**G(X+1),X,0,MINUS);
G(X + 1)
(D4) LIMIT F(X)
X ->0-
(C5) INPART(%,1,2);
(D5) G(X + 1)
|
(*訳者注:
(C1) ISOLATE_WRT_TIMES;
(D1) FALSE
(C2) ISOLATE(EXPAND((A+B+C)^2),C);
2 2
(E2) B + 2 A B + A
2
(D2) E2 + C + 2 B C + 2 A C
(C3) ISOLATE_WRT_TIMES:FALSE;
(D3) FALSE
(C4) ISOLATE(EXPAND((A+B+C)^2),C);
2
(D4) E2 + C + 2 B C + 2 A C
*)
|
例題はEXAMPLE(ISOLATE);を実行せよ。
(* 訳者注:
(C29) EXPAND((A+B+C)^2);
2 2 2
(D29) C + 2 B C + 2 A C + B + 2 A B + A
(C30) ISOLATE_WRT_TIMES;
(D30) FALSE
(C31) ISOLATE(EXPAND((A+B+C)^2),C);
2 2
(E31) B + 2 A B + A
2
(D31) E31 + C + 2 B C + 2 A C
(C32) ISOLATE_WRT_TIMES:TRUE;
(D32) TRUE
(C33) ISOLATE(EXPAND((A+B+C)^2),C);
(E33) 2 A
(E34) 2 B
2
(D34) C E34 + C E33 + E31 + C
(C34)
*)
|
例:LISTOFVARS('SUM(F(I),I,0,N));はLISTDUMMYVARSがTRUEなら[I,N]、FALSEなら [N]である。
(C1) LISTOFVARS(F(X[1]+Y)/G**(2+A)); (D1) [X[1], Y, A, G] |
LOPOW((X+Y)**2+(X+Y)**A,X+Y) ==> MIN(A,2) |
(C1) X/(X-Y)**2-1/(X-Y)-F(X)/(X-Y)**3;
1 X F(X)
(D1) - ----- + -------- - --------
X - Y 2 3
(X - Y) (X - Y)
(C2) MULTTHRU((X-Y)**3,%);
2
(D2) - (X - Y) + X (X - Y) - F(X)
(C3) RATEXPAND(D2);
2
(D3) - Y + X Y - F(X)
(C4) ((A+B)**10*S**2+2*A*B*S+(A*B)**2)/(A*B*S**2);
10 2 2 2
(B + A ) S + 2 A B S + A B
(D4) --------------------------------
2
A B S
(C5) MULTTHRU(%);
10
2 A B (B + A)
(D5) - + --- + -------
S 2 A B
S
(上の式で(B+A)**10が展開されていない事に注意せよ。)
(C6) MULTTHRU(A.(B+C.(D+E)+F));
(D6) A . F + A . (C . (E + D)) + A . B
(EXPANDの似た例題と比較せよ)
|
数値定数<宣言された定数<宣言されたスカラー<ORDERLESSの最初の引数<... <ORDERLESSの最後の引数<Aで始まる変数<... <Zで始まる変数<ORDERGREATの最後の引数<... <ORDERGREATの最初の引数<宣言されたMAINVAR |
注:幾つかの話題に関してはEXAMPLE(ORDERLESS);を実行せよ。他の順序に関しては DESCRIBE(MAINVAR);を見よ。
(C1) PARTITION(2*A*X*F(X),X); (D1) [ 2 A , X F(X) ] (C2) PARTITION(A+B,X); (D2) [ A + B , 0 ] (C3) PARTITION([A,B,F(A),C],A); (D3) [[B,C],[A,F(A)]] |
(C1) EXP:(A+B)/2+SIN(X^2)/3-LOG(1+SQRT(X+1));
2
SIN(X ) B + A
(D1) - LOG(SQRT(X + 1) + 1) + ------- + -----
3 2
(C2) PICKAPART(%,1);
(E2) - LOG(SQRT(X + 1) + 1)
2
SIN(X )
(E3) -------
3
B + A
(E4) -----
2
(D4) E4 + E3 + E2
|
(C1) PRODUCT(X+I*(I+1)/2,I,1,4); (D1) (X + 1) (X + 3) (X + 6) (X + 10) |
@itemized @bullet
(* 訳者注:
SIMPSUMスイッチはデフォルトでFALSEである。以下に、SIMPSUMスイッチをFALSEの
ままの場合とTRUEにした場合の違いを示す:
(C18) SIMPSUM;
(D18) FALSE
(C19) SUM(x^n,n,0,m);
m
====
\n
(D19) >x
/
====
n = 0
(C20) SIMPSUM:TRUE;
(D20) TRUE
(C21) SUM(x^n,n,0,m);
m + 1
x - 1
(D21) ----------
x - 1
(C22) SUM(x^n,n,0,inf);
Is ABS(x) - 1 positive, negative, or zero?
negative;
1
(D22) -----
1 - x
(C23)
(C24) SUM(x^n,n,0,inf);
Is ABS(x) - 1 positive, negative, or zero?
zero;
(D24) UNDEFINED
(C25) SUM(x^n,n,0,inf);
Is ABS(x) - 1 positive, negative, or zero?
positive;
(D25) INF
この様にSIMPSUM:FALSEではSUM(x^n,n,0,m)の簡易化は実行されないが、SIMPSUM:TRUE
で簡易化が実行される。又、SUM(x^n,n,0,inf)とすると、xの絶対値から1を引いた
ものが正か負か零であるかを利用者が指定する事で簡易化が行える。
*)
|
| [ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |