2 * Functions and Variables for Evaluation::
5 @c -----------------------------------------------------------------------------
6 @node Functions and Variables for Evaluation, , Evaluation, Evaluation
7 @section Functions and Variables for Evaluation
8 @c -----------------------------------------------------------------------------
11 @c THIS ITEM IS VERY IMPORTANT !!
13 @c -----------------------------------------------------------------------------
20 シングルクォート演算子@code{'}は評価を抑制します。
22 シンボルにシングルクォートを用いると、シンボルが評価されません。
25 関数の引数は(抑制されない限り)評価されますが、関数コールは評価されません。結果は、関数コールの名詞形です。
27 括弧でくくられた式にシングルクォートを用いると、
28 式の中のすべてのシンボルと関数コールは評価されません。
29 @c DUNNO IF THESE EXAMPLES ARE STILL NEEDED -- COVERED BY ITEMS UNDER "Examples"
30 例えば、@code{'(f(x))}は、式@code{f(x)}を評価しないことを意味します。
31 @code{'f(x)}(@code{f(x)}ではなく@code{f}へ適用されたシングルクォート)は@code{[x]}に適用された@code{f}の名詞形を返します。
35 グローバルフラグ @mref{noundisp}が @code{true}の時、名詞はシングルクォート付きで表示されます。
36 このスイッチは関数定義を表示するときには、常に@code{true}です。
38 クォートクォート演算子 @mxref{quote-quote, ''}と @mref{nouns}も参照ください。
42 シンボルにシングルクォートを用いると、シンボルが評価されません。
62 関数コールにシングルクォートを用いると、関数の引数は評価されますが、関数コールが評価されません。
68 @c integrate (x^2, x, x0, x1);
69 @c 'integrate (x^2, x, x0, x1);
77 (%i3) integrate (x^2, x, x0, x1);
81 (%i4) 'integrate (x^2, x, x0, x1);
95 括弧でくくられた式にシングルクォートを用いると、式の中のすべてのシンボルと関数コールは評価されません。
111 (%i4) '(sqrt(aa) + bb);
120 @c sin (17 * %pi) + cos (17 * %pi);
121 @c '(sin (17 * %pi) + cos (17 * %pi));
124 (%i1) sin (17 * %pi) + cos (17 * %pi);
126 (%i2) '(sin (17 * %pi) + cos (17 * %pi));
130 Maximaは組み込み数学関数による浮動小数点演算を整理とみなします。
138 (%o1) .8414709848078965
140 (%o2) .8414709848078965
144 @category{Evaluation}
149 @c -----------------------------------------------------------------------------
155 クォートクォート演算子@code{'@w{}'}(シングルクォートマーク2つ)は、入力式の中の評価を部分修正します。
157 一般式@var{expr}にクォートクォートを用いると、入力式の中の@var{expr}に@var{expr}の値を代入します。
159 式の演算子にクォートクォートを用いると、(もし動詞でないなら)演算子は名詞から動詞に変わります。
161 クォートクォート演算子は入力パーサが適用します;
162 クォートクォート演算子はパースされた入力式の一部としては格納されません。
163 クォートクォート演算子は、パースされるといつもすぐに適用され、クォートできません。
164 このように、関数定義やラムダ式、シングルクォート@code{'}でクォートされた式の中のように通常評価が抑制される時も、
165 クォートクォートがあると評価を実行します。
167 @mref{batch}や@mref{load}はクォートクォートを認識します。
169 シングルクォート演算子 @mxref{quote, '}と @mref{nouns}も参照ください。
173 一般式@var{expr}にクォートクォートを用いると、入力式の中の@var{expr}に@var{expr}の値を代入します。
176 @c expand ((a + b)^3);
179 @c [aa : cc, bb : dd, cc : 17, dd : 29];
180 @c foo_1 (x) := aa - bb * x;
184 @c foo_2 (x) := ''aa - ''bb * x;
186 @c [x0 : x1, x1 : x2, x2 : x3];
192 (%i1) expand ((a + b)^3);
194 (%o1) b + 3 a b + 3 a b + a
197 (%o2) [expand((b + a) ), b + 3 a b + 3 a b + a ]
200 (%o3) [expand((b + a) ), b + 3 a b + 3 a b + a ]
201 (%i4) [aa : cc, bb : dd, cc : 17, dd : 29];
202 (%o4) [cc, dd, 17, 29]
203 (%i5) foo_1 (x) := aa - bb * x;
204 (%o5) foo_1(x) := aa - bb x
209 (%i8) ''(foo_1 (10));
211 (%i9) foo_2 (x) := ''aa - ''bb * x;
212 (%o9) foo_2(x) := cc - dd x
215 (%i11) [x0 : x1, x1 : x2, x2 : x3];
225 式の演算子にクォートクォートを用いると、(もし動詞でないなら)演算子は名詞から動詞に変わります。
228 @c declare (foo, noun);
229 @c foo (x) := x - 1729;
234 (%i1) declare (foo, noun);
236 (%i2) foo (x) := x - 1729;
237 (%o2) ''foo(x) := x - 1729
244 クォートクォート演算子は入力パーサが適用します;
245 クォートクォート演算子はパースされた入力式の一部としては格納されません。
248 @c [aa : bb, cc : dd, bb : 1234, dd : 5678];
250 @c display (_, op (_), args (_));
252 @c display (_, op (_), args (_));
255 (%i1) [aa : bb, cc : dd, bb : 1234, dd : 5678];
256 (%o1) [bb, dd, 1234, 5678]
259 (%i3) display (_, op (_), args (_));
264 args(cc + aa) = [cc, aa]
269 (%i5) display (_, op (_), args (_));
274 args(dd + bb) = [dd, bb]
279 関数定義やラムダ式、シングルクォート@code{'}でクォートされた式の中のように
281 クォートクォートがあると評価を実行します。
284 @c foo_1a (x) := ''(integrate (log (x), x));
285 @c foo_1b (x) := integrate (log (x), x);
286 @c dispfun (foo_1a, foo_1b);
287 @c integrate (log (x), x);
288 @c foo_2a (x) := ''%;
290 @c dispfun (foo_2a, foo_2b);
291 @c F : lambda ([u], diff (sin (u), u));
292 @c G : lambda ([u], ''(diff (sin (u), u)));
293 @c '(sum (a[k], k, 1, 3) + sum (b[k], k, 1, 3));
294 @c '(''(sum (a[k], k, 1, 3)) + ''(sum (b[k], k, 1, 3)));
297 (%i1) foo_1a (x) := ''(integrate (log (x), x));
298 (%o1) foo_1a(x) := x log(x) - x
299 (%i2) foo_1b (x) := integrate (log (x), x);
300 (%o2) foo_1b(x) := integrate(log(x), x)
301 (%i3) dispfun (foo_1a, foo_1b);
302 (%t3) foo_1a(x) := x log(x) - x
304 (%t4) foo_1b(x) := integrate(log(x), x)
307 (%i5) integrate (log (x), x);
309 (%i6) foo_2a (x) := ''%;
310 (%o6) foo_2a(x) := x log(x) - x
311 (%i7) foo_2b (x) := %;
313 (%i8) dispfun (foo_2a, foo_2b);
314 (%t8) foo_2a(x) := x log(x) - x
319 (%i10) F : lambda ([u], diff (sin (u), u));
320 (%o10) lambda([u], diff(sin(u), u))
321 (%i11) G : lambda ([u], ''(diff (sin (u), u)));
322 (%o11) lambda([u], cos(u))
323 (%i12) '(sum (a[k], k, 1, 3) + sum (b[k], k, 1, 3));
324 (%o12) sum(b , k, 1, 3) + sum(a , k, 1, 3)
326 (%i13) '(''(sum (a[k], k, 1, 3)) + ''(sum (b[k], k, 1, 3)));
327 (%o13) b + a + b + a + b + a
332 @category{Evaluation}
337 @c NEEDS WORK, ESPECIALLY EXAMPLES
338 @deffn {関数} alias (@var{new_name_1}, @var{old_name_1}, ..., @var{new_name_n}, @var{old_name_n})
339 (利用者もしくはシステム)関数や変数、配列等に対して別名を与えます。
343 @category{Declarations and inferences}
347 @c NEEDS CLARIFICATION
350 @c -----------------------------------------------------------------------------
352 @deffn {関数} ev (@var{expr}, @var{arg_1}, @dots{}, @var{arg_n})
354 引数@var{arg_1}, @dots{}, @var{arg_n}で指定された環境下で
356 引数は、スイッチ(ブーリアンフラグ)だったり、割り当てだったり、
358 @var{ev}は評価の結果(別の式)を返します。
360 評価は以下のようにステップを追って実行されます。
364 最初に、以下の任意のもしくはすべての引数をスキャンして環境を準備します。
368 @mref{simp}を引数に指定すると@var{expr}を整理します。@code{false}なら整理を抑制するスイッチ@code{simp}の設定に関わらずです。
370 @mref{noeval}を引数に指定すると@code{ev}の評価フェイズを抑制します。
371 (以下のステップ(4)を参照してください。)
372 これは、他のスイッチとの連携時や、@var{expr}を再評価せずに再整理をさせる時に役に立ちます。
374 @mref{nouns}を引数に指定すると@var{expr}の中の名詞形式
375 (典型的には、@code{'integrate}や@code{'diff}のような未評価関数)を評価します。
377 @mref{expand}を引数に指定すると展開します。
379 @code{expand (@var{m}, @var{n})}を引数に指定すると、
380 @mref{maxposex}と@mref{maxnegex}の値をそれぞれ@var{m}と@var{n}に設定して、展開します。
382 @mref{detout}を引数に指定すると、@var{expr}の中で計算されるどんな逆行列も、逆行列の外側に行列式を保つようにします。
384 @mref{diff}を引数に指定すると@var{expr}の中のすべての微分を実行します。
386 @code{derivlist (@var{x}, @var{y}, @var{z}, ...)}を引数に指定すると指定された変数に関する微分のみを実行します。
388 @code{risch}を引数に指定すると
389 @var{expr}の中の積分をRischアルゴリズムを使って評価します。
390 @mref{risch}を参照してください。
391 特殊なシンボル@mref{nouns}を使った時には標準の積分ルーチンが呼び出されます。
393 @mref{float}を引数に指定すると非整数有理数を浮動小数点に変換します。
395 @mref{numer}を引数に指定すると数値引数が指定された(指数関数を含む)いくつかの数学関数を浮動小数点に評価します。
396 また、@var{expr}の中の numerval宣言された変数は、宣言された値に置き換えられます。
397 また、@mref{float}スイッチをオンにします。
399 @mref{pred}を引数に指定すると述語(@code{true}もしくは@code{false}に評価される式)を評価します。
401 @mref{eval}を引数に指定すると@var{expr}の特別な後評価をします。(ステップ(5)を参照。)
402 @code{eval}は複数回起こるかもしれません。@code{eval}のそれぞれのインスタンスのために、式は再評価されます。
404 評価フラグ(@mref{evflag}を参照)として宣言されたアトム@code{A}を引数に指定すると、
405 @var{expr}の評価の最中、@code{A}が@code{true}にバインドされます。
407 @code{V: expression}(もしくは代わりに@code{V=expression})を引数に指定すると、
408 @var{expr}の評価の最中、@code{V}が@code{expression}の値にバインドされます。
409 もし@code{V}がMaximaオプションなら、@var{expr}の評価の最中、@code{V}の値に@code{expression}が使われることに注意してください。
410 もし@code{ev}の複数の引数がこのタイプの場合、並列してバインドされます。
411 もし@code{V}が非アトムの式なら、バインドではなく、代入が実行されます。
413 関数名 @code{F}が評価関数(@mref{evfun}参照)として宣言されている場合、
414 @code{F}を引数に指定すると @code{F}が @var{expr}に適用されます。
416 他のどんな関数名(例えば、@mref{sum})でも引数に指定すると、
417 @var{expr}の中にそれらの名前が現れた時それらが動詞であるかのように評価します。
419 加えて、exprの中で出現する関数(@code{F(x)}としましょう)を、
420 @var{expr}の今回の評価の目的のため、
421 @code{F(X) := expression}を@code{ev}の引数に与えて、局所的に定義することができます。
423 もし以上で言及しなかったアトム、添字付き変数、または、添字付き式が引数として与えられたら、
425 もしその結果が等式もしくは割り当てであったら、示されたバインドもしくは代入を実行します。
426 もしその結果がリストなら、リストのメンバが、 @code{ev}に与えられた追加の引数であるかのように扱います。
427 これにより、 @mref{solve}が返すような、与えられた等式のリスト
428 (例えば、 @code{[X=1,Y=A**2]})や
429 等式の名前のリスト(例えば、 @code{[%t1, %t2]}。ここで @code{%t1}, @code{%t2}は等式)が使えます。
432 @code{ev}の引数は、代入等式と評価関数以外はどんな順序で与えてもかまいません。
434 評価関数は、例えば、 @code{ev (@var{expr}, ratsimp, realpart)}は
435 @code{realpart (ratsimp (@var{expr}))}と扱われるように、合成されます。
437 @mref{simp}, @mref{numer}, @mref{float}スイッチは、ブロックの中でローカルにも、
438 またMaximaの中でグローバルにも設定でき、その場合,リセットされるまで効果を保ちます。
440 @code{numer}と@code{float}スイッチがともに@code{true}でない場合、
441 もし@var{expr}が標準有理式(CRE)なら、@code{ev}が返す式もまたCREです。
444 step (1)の最中に、引数の中のもしくは引数の値の、等式の左辺に現れる添字なしの変数のリストを作ります。
445 @var{expr}の中の変数(添字なし変数や配列関数に関連づけられていない添字付き変数)は、
446 先のリストに現れるものを除いて、グローバルな値に置き換えられます。
447 普通、 @var{expr}は、ただのラベルだったり
448 (以下の例の @code{%i2}のように) @code{%}だったりするので、
449 その場合,このステップは単にラベルされた式を取り出し、
450 @code{ev}はその式に対して機能することになります。
453 引数で指定されたどんな代入文もすぐ実行されます。
456 (引数で@mref{noeval}が指定されていない限り)結果の式は再評価され、
458 @var{expr}の中のどんな関数コールもその中の変数が評価された後実行されること、
459 @code{ev(F(x))}は @code{F(ev(x))}のように振る舞うことに注意してください。
462 引数の中の@mref{eval}のそれぞれのインスタンスのために、step (3)(4)を繰り返します。
468 @c sin(x) + cos(y) + (w+1)^2 + 'diff (sin(w), w);
469 @c ev (%, numer, expand, diff, x=2, y=1);
472 (%i1) sin(x) + cos(y) + (w+1)^2 + 'diff (sin(w), w);
474 (%o1) cos(y) + sin(x) + -- (sin(w)) + (w + 1)
476 (%i2) ev (%, numer, expand, diff, x=2, y=1);
478 (%o2) cos(w) + w + 2 w + cos(1) + 2.449599732693821
481 @code{ev}のために、代わりのトップレベルの文法が提供されています。
482 それによって、@code{ev()}なしに引数をタイプして入力するだけでよくなります。
486 @var{expr}, @var{arg_1}, ..., @var{arg_n}
489 これは、例えば、関数やブロックの中など、他の式の一部としては許されません。
491 以下の例では並列のバインドプロセスに注意してください。
494 (%i3) programmode: false;
496 (%i4) x+y, x: a+y, y: 2;
499 (%i6) -3*x + 2*y = -4$
500 (%i7) solve ([%o5, %o6]);
513 (%i9) x + 1/x > gamma (1/2);
515 (%o9) x + - > sqrt(%pi)
517 (%i10) %, numer, x=1/2;
518 (%o10) 2.5 > 1.772453850905516
524 @category{Evaluation}
528 @c -----------------------------------------------------------------------------
532 @code{ev (@var{expr})}のコールの引数として、
534 @var{expr}の追加の評価をもたらします。
540 @c [a:b,b:c,c:d,d:e];
547 (%i1) [a:b,b:c,c:d,d:e];
560 @category{Evaluation flags}
564 @c -----------------------------------------------------------------------------
566 @defvr {プロパティ} evflag
568 シンボル@code{x}が@code{evflag}プロパティを持つ時、
569 式@code{ev(@var{expr}, @var{x})}や対話プロンプトでの@code{@var{expr}, @var{x}}は、
570 @code{ev(@var{expr}, @var{x} = true)}と同値です。
571 すなわち、@var{expr}が評価される間、@var{x}は@code{true}にバインドされます。
573 式@code{declare(@var{x}, evflag)}は、変数@var{x}に@code{evflag}プロパティを与えます。
575 デフォルトで@code{evflag}プロパティを持つフラグは以下の通りです:
576 @c FOLLOWING LIST CONSTRUCTED FROM LIST UNDER (prog1 '(evflag properties) ...)
577 @c NEAR LINE 2649 OF mlisp.lisp AT PRESENT (2004/11).
580 algebraic cauchysum demoivre
581 dotscrules %emode %enumer
582 exponentialize exptisolate factorflag
583 float halfangles infeval
584 isolate_wrt_times keepfloat letrat
585 listarith logabs logarc
586 logexpand lognegint lognumer
587 m1pbranch numer_pbranch programmode
588 radexpand ratalgdenom ratfac
589 ratmx ratsimpexpons simp
590 simpproduct simpsum sumexpand
599 @c sin (1/2), float=true;
604 @c sum (1/k^2, k, 1, inf);
605 @c sum (1/k^2, k, 1, inf), simpsum;
606 @c declare (aa, evflag);
607 @c if aa = true then YES else NO;
608 @c if aa = true then YES else NO, aa;
615 (%i2) sin (1/2), float;
616 (%o2) 0.479425538604203
617 (%i3) sin (1/2), float=true;
618 (%o3) 0.479425538604203
627 (%i8) sum (1/k^2, k, 1, inf);
635 (%i9) sum (1/k^2, k, 1, inf), simpsum;
640 (%i10) declare (aa, evflag);
642 (%i11) if aa = true then YES else NO;
644 (%i12) if aa = true then YES else NO, aa;
649 @category{Evaluation flags}
650 @category{Simplification flags and variables}
654 @c -----------------------------------------------------------------------------
658 関数@var{F}が@code{evfun}プロパティを持つ時、
659 式@code{ev(@var{expr}, @var{F})}や(対話プロンプトでの)@code{@var{expr}, @var{F}}は、
660 @code{@var{F}(ev(@var{expr}))}と同値です。
662 もし2つ以上の@code{evfun}関数@var{F}, @var{G}などが指定されたなら、関数は指定された順に適用されます。
664 式@code{declare(@var{F}, evfun)}は、関数@var{F}に@code{evfun}プロパティを与えます。
666 デフォルトで@code{evfun}プロパティを持つ関数は以下の通りです:
667 @c FOLLOWING LIST CONSTRUCTED FROM LIST UNDER (prog1 '(evfun properties) ...)
668 @c NEAR LINE 2643 IN mlisp.lisp AT PRESENT (2004/11).
671 bfloat factor fullratsimp
672 logcontract polarform radcan
673 ratexpand ratsimp rectform
674 rootscontract trigexpand trigreduce
683 @c cos(4 * x) / sin(x)^4;
684 @c cos(4 * x) / sin(x)^4, trigexpand;
685 @c cos(4 * x) / sin(x)^4, trigexpand, ratexpand;
686 @c ratexpand (trigexpand (cos(4 * x) / sin(x)^4));
687 @c declare ([F, G], evfun);
688 @c (aa : bb, bb : cc, cc : dd);
700 (%i2) x^3 - 1, factor;
702 (%o2) (x - 1) (x + x + 1)
703 (%i3) factor (x^3 - 1);
705 (%o3) (x - 1) (x + x + 1)
706 (%i4) cos(4 * x) / sin(x)^4;
713 (%i5) cos(4 * x) / sin(x)^4, trigexpand;
715 sin (x) - 6 cos (x) sin (x) + cos (x)
716 (%o5) -------------------------------------
719 (%i6) cos(4 * x) / sin(x)^4, trigexpand, ratexpand;
722 (%o6) - --------- + ------- + 1
725 (%i7) ratexpand (trigexpand (cos(4 * x) / sin(x)^4));
728 (%o7) - --------- + ------- + 1
731 (%i8) declare ([F, G], evfun);
733 (%i9) (aa : bb, bb : cc, cc : dd);
745 (%i15) G (F (ev (aa)));
750 @category{Evaluation flags}
756 @c -----------------------------------------------------------------------------
758 @defvr {オプション変数} infeval
760 「無限評価」モードにします。@code{ev}は、値が変わらなくなるまで式を繰り返し評価します。
761 このモードで変数(@code{X}とします)が評価されることを避けるには、単に@code{X='X}を@code{ev}の引数として含めます。
762 @code{ev (X, X=X+1, infeval)}のような式は、もちろん、無限ループを引き起こします。
765 @category{Evaluation flags}
769 @c NEEDS CLARIFICATION, EXAMPLES
770 @c NEED TO MENTION THIS IS AN evflag
772 @c -----------------------------------------------------------------------------
774 @defvr {特殊シンボル} noeval
776 @code{noeval}は、@mref{ev}の評価フェイズを抑制します。
778 式を再評価することなしに再整理するのに役に立ちます。
781 @category{Evaluation flags}
785 @c NEEDS CLARIFICATION, EXAMPLES
787 @c -----------------------------------------------------------------------------
789 @defvr {特殊シンボル} nouns
791 @code{nouns}は@mref{evflag}の1つです。
792 @mref{ev}コマンドのオプションとして使われる時、
793 @code{nouns}は、式の中に現れる「名詞」形すべてを「動詞」に@mref{ev}します。すなわち、それらを評価します。
794 @mref{noun}, @mref{nounify}, @code{verb}, @mref{verbify}も参照してください。
797 @category{Evaluation flags}
798 @category{Nouns and verbs}
802 @c -----------------------------------------------------------------------------
806 @code{ev (@var{expr})}のコールでの引数として、
808 述語論理(@code{true}または@code{false}に評価される式)を評価するようにします。
825 @category{Evaluation flags}