| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
19.1 NARY 19.2 NOFIX 19.3 演算子 19.4 POSTFIX 19.5 PREFIX 19.6 演算子に関する諸定義
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
(*訳者注: 7の場合 (C1) 7!!; (D1) 105 (C2) 1*3*5*7; (D2) 105 *) |
但し、FをSUM(X[I],I,下限,上限)の形式の式に対して作用させる場合、上述の(1),(2) の簡易化は実行されない。
例えば; EXPRがE+D+C+B+Aの時、PART(EXPR,[2,5]);を実行すればD+Aが返される。 |
更に、
PART(EXPR,ALLBUT(2,5))を実行するとE+C+Bが返される。 |
これはKILL命令と一緒に使う事も可能である。
KILL(ALLBUT(name1,...,namek)) |
注意:nameiはU,F,FOOやGの様な関数名でFUNCTIONSを実行して得られるリストでは 無い。
(* 訳者注: (C1) entier(10.1); (D1) 10 (C2) entier(-10.1); (D2) - 11 (C3) fix(10.1); (D3) 10 (C4) fix(-10.1); (D4) - 11 この様に、絶対値で越えない数を返すのでは無い事に注意せよ。 *) |
(C1) IS(X**2 >= 2*X-1); (D1) TRUE (C2) ASSUME(A>1); (D2) DONE (C3) IS(LOG(LOG(A+1)+1)>0 AND A^2+1>2*A); (D3) TRUE |
(* 訳者注: (C9) FIX(10); (D9) 10 (C10) FIX(-10); (D10) - 10 (C11) FIX(-10.5); (D11) - 11 (C12) FIX(10.5); (D12) 10 (C13) ENTIER(10); (D13) 10 (C14) ENTIER(-10); (D14) - 10 (C15) ENTIER(-10.5); (D15) - 11 (C16) ENTIER(10.5); (D16) 10 (C17) この様に、Xを越えない整数が返されているが、負の場合には絶対値に対してでは無く、 通常の大小関係で返される事に注意せよ。 |
(C1) A+B*C$ (C2) FULLMAP(G,%); (D2) G(B) G(C) + G(A) (C3) MAP(G,D1); (D3) G(B C) + G(A) |
(* 訳者注:
尚、利用者が定義した演算子の場合、主演算子とは認めていない。
(C17) NARY("MIKE");
(D17) "MIKE"
(C18) A+B*C MIKE D$
(C19) FULLMAP(G,%);
(D19) G(B) G(C) MIKE G(D) + G(A)
(C20) MAP(G,D18);
(D20) G(B C MIKE D) + G(A)
(C21) x MIKE y := ABS(1-x*y);
(D21) x MIKE y := ABS(1 - x y)
(C22) 0.1 MIKE 0.4;
(D22) 0.96
(C23) FULLMAP(G,D18);
(D23) G(B) G(C) MIKE G(D) + G(A)
(C24)
この例の様にMIKEをNARY命令で単純に中置演算子と宣言してもFULLMAPで置換されない。
又、(C21)で関数として定義していてもFULLMAPでは置換されていない。
|
(C1) FULLMAPL("+",[3,[4,5]],[[A,1],[0,-1.5]]);
(D1) [[A + 3, 4], [4, 3.5]]
(* 訳者注:
FULLMAPLは制限付きのFULLMAPであるが、FULLMAP自体がMAXIAのデータの階層構造を利用
している。これはリストの章で述べている様に、MAXIMAのデータは先頭にそのデータの
形式や命令表現を示す演算子等があり、それを単純に取り換える事を行っている。
*)
|
(* 訳者注:
(C1) isqrt(-3);
(D1) 1
(C2) isqrt(-4);
(D2) 2
(C3) isqrt(10);
(D3) 3
となっており、
MYISQRT(x) := BLOCK(LOCAL(a),
a : FIX(BFLOAT(SQRT(ABS(x)))),
RETURN(a));
で表現される関数と同じ動作をする。
|
(* 訳者注:
MODULUSに3を設定して、剰余の計算を行う。尚、MODULUSのデフォルト値はFALSEで、
MODULUSに値を設定せずにMOD(x+3)の様にMODULUSを設定せずに実行するとエラーが
出るので注意せよ。
(C1) MODULUS:3;
(D1) 3
(C2) mod(x^2+3);
2
(D2) x
(C3) mod((x+1)^3);
3
(D3) x + 1
(C4) mod((x+1)^2,2);
2
(D4) x + 1
(C5) MODULUS;
(D5) 3
尚、(C4)で剰余環をZ2としたが、MODULUSの値はこの操作によって書換えられないので
安心して使って良い。
*)
|
Multicsの場合、-2^(35)と2^(35)の範囲となる。この範囲はMACSYMAの土台となるLISP のFIXNUMの範囲でもある。
(* 訳者注: 少なくとも、GCLとCLISP上のMAXIMA 5.4,5.5及び5.6では引数無しでは使えない。 (C26) RANDOM; (D26) RANDOM (C27) RANDOM(10); (D27) 1 (C28) RANDOM(10.2); (D28) 0.853747594277 *) |
(* 訳者注:
(C1) SQRTDISPFLAG;
(D1) TRUE
(C2) sqrt(x);
(D2) SQRT(x)
(C3) SQRTDISPFLAG:FALSE;
(D3) FALSE
(C4) sqrt(x);
1/2
(D4) x
この様にsqrt(x)の表記が代る事に注意。
*)
|
構文例:
SUBLIS([A=B,B=A],SIN(A)+COS(B));
=> SIN(B) + COS(A)
(* 訳者注:
上のSUBLISでは、リスト[A=B,B=A]でSIN(A)+COS(B)の中に現われるAをBに、BをAに相互
に入れ換えている事に注意。
*)
|
(* 訳者注: SUBLIST([1,2,3,4],EVENP)の例では、リスト[1,2,3,4]からEVENPに適合する偶数の リスト[2,4]を返している。ここで、EVENP(X)はXが偶数ならばTRUE、それ以外は FALSEを返す関数である。 *) |
このSUBST命令はX^-YでX^Yを認識するので、SUBST(A,SQRT(X),1/SQRT(X))は1/Aとなる。 aとbはまた"で括られた式の演算子や関数名でも良い。微分形式での独立変数に代入を 行う場合、AT関数(以下を見よ)を利用すべきである。
注意: SUBSTはSUBSTITUTEの別名である。SUBST(eq1,exp)やSUBST([eq1,...,eqk],exp) は他の可能な代入形式である。各eqiは指定した代入が実行されるべき等式である。 各々の等式でその右側が式expの左側に代入される。
EXPTSUBST[FALSE] TRUEであれば%E**(A*X)の%E**XをYで置き換える操作が可能になる。
OPSUBST[TRUE]はFALSEであれば、SUBSTは式に含まれる演算子に対して代入を行わない。 つまり、(OPSUBST:FALSE, SUBST(X^2,R,R+R[0]));を実行すると、R+R[0]の左側のRに は代入されるが、R[0]のRには代入されない。
(C1) SUBST(A,X+Y,X+(X+Y)**2+Y);
2
(D1) Y + X + A
(C2) SUBST(-%I,%I,A+B*%I);
(D2) A - %I B
|
(注:C2の方法は共役複素数を求める一つの方法である)。より多くの例は EXAMPLE(SUBST);を実行した結果を参照。
(C1) X.'DIFF(F(X),X,2);
2
d
(D1) X . (--- F(X))
2
dX
(C2) SUBSTINPART(D**2,%,2);
2
(D2) X . D
(C3) SUBSTINPART(F1,F[1](X+1),0);
(D3) F1(X + 1)
追加情報
PART関数の最後の引数が添字のリストであれば、幾つかの部分式が取り出され、各々
はそのリストの添字に関連するものである。それ故、PART(X+Y+Z,[1,3])はZ+Xとなる。
PIECEはPART関数を用いた時に選ばれた最後の式の値を保つ。その関数の実行中に設定
され、それ故に、その関数でそれ自体を以下に見る様に参照しても良い。
PARTSWITCH[FALSE]がTRUEに設定されていれば、存在しない式の成分を選択した場合、
ENDが返され、それ以外ではエラーメッセジが与えられる。
(C1) 27*Y**3+54*X*Y**2+36*X**2*Y+Y+8*X**3+X+1;
3 2 2 3
(D1) 27 Y + 54 X Y + 36 X Y + Y + 8 X + X + 1
(C2) PART(D1,2,[1,3]);
2
(D2) 54 Y
(C3) SQRT(PIECE/54);
(D3) Y
(C4) SUBSTPART(FACTOR(PIECE),D1,[1,2,3,5]);
3
(D4) (3 Y + 2 X) + Y + X + 1
(C5) 1/X+Y/X-1/Z;
1 Y 1
(D5) - - + - + -
Z X X
(C6) SUBSTPART(XTHRU(PIECE),%,[2,3]);
Y + 1 1
(D6) ----- - -
X Z
|
(C1) 1/(X**2+2);
1
(D1) ------
2
X + 2
(C2) SUBSTPART(3/2,%,2,1,2);
1
(D2) --------
3/2
X + 2
(C3) A*X+F(B,Y);
(D3) A X + F(B, Y)
(C4) SUBSTPART("+",%,1,0);
(D4) X + F(B, Y) + A
(* 訳者注:
(C2)の代入では1/(X**2+2)の内部形式を利用し、その内部の2,1,2で指定される要素を
入れ換えている。内部形式はLISPのS式による表現(/ 1 (+ (** x 2) 2 )に似たもので
ある(実際は演算子が例えば、"+"が(mplus)と原子のリストになっている程度で本質的
な構造は同じ)。実例での2,1,2の意味はこの内部形式の階層構造に関連する。
先頭の2が内部形式のリストの2番目の元を意味するが、内部形式で先頭が演算子となる
ので実際は1を加えたものが対応する。従って、3番目の成分(+ (** x 2) 2)となる。
次の1は同様に(** x 2)、2で、このリストの2番目の引数2が対応し、それを3/2に変更
する為、最終的に1/(x**(3/2)+2)となる。ここで0が演算子となるので、0を指定すれば
一番上の"+"が対応する。
(C15) a:1/(X**2+2);
1
(D15) ------
2
X + 2
(C16) SUBSTPART("*",a,0);
2
(D16) X + 2
(C17) SUBSTPART("*",a,2,0);
1
(D17) ----
2
2 X
又、この階層を利用すれば、成分の入れ替えも可能である。
(C22) SUBSTPART("SIN(X)+COS(Y)+2",a,2,1);
1
(D22) -------------------
SIN(X)+COS(Y)+2 + 2
この例では、X^2をSIN(X)+COS(Y)で置き換えている。
|
詳細はDESCRIBE(ORDERGREAT);とDESCRIBE(ORDERLESS);の実行に加え、 EXAMPLE(UNORDER);を実行せよ。
(C1) ((X+2)**20-2*Y)/(X+Y)**20+(X+Y)**-19-X/(X+Y)**20;
20
1 X (X + 2) - 2 Y
(D1) --------- - --------- + ---------------
19 20 20
(Y + X) (Y + X) (Y + X)
(C2) XTHRU(%);
20
(X + 2) - Y
(D2) -------------
20
(Y + X)
|
| [ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |