Go to the first, previous, next, last section, table of contents.


論理演算

以下のコマンドおよび代数関数は真/偽値を返します。 ここで 1 は「真」を表し、0 は「偽」を表します。 (書替え規則の条件部分や、Z [ Z ] 制御構文のように) 真理値が要求される局面では、 ゼロでない値はすべて「真」を意味するものとして受け入れられます。 (具体的には、dnonzero が 1 を返すものは「真」であり、 dnonzero が 0 を返すか判断できないものは「偽」と見なされます。 注意: Z [ Z ] は条件が真であることが確実な場合に "then"部分を実行しますが、 a = b のような必ずしも真と言えない条件では、 (たとえ真の可能性があろうとも) "else"部分が実行されます。 ? :&& のような、条件を引数として持つ代数関数は、 確かに真、確かに偽と言えない場合には評価されずに残ります 宣言 参照 。)

a = (calc-equal-to) コマンドや `eq(a,b)' 関数 (代数式中では `a = b' or `a == b' と書かれます)は、 ab が等しい(表現が等しいか数値が等しい)ならば真です。 (従って、整数 1 と浮動小数の 1.0 は等しいと見なされます。) ab の同値性が決定できない場合、 その比較はシンボル形式のまま残されます。 (注)コマンドとしての動作は、この演算はスタックから 2項を POP し、 1個の 1 または 0 を PUSH するか、 同値性が決定できない場合は式 `a = b' をPUSH します。

Calc の多くのコマンドは、`=' 式を 方程式 として認識します。 例えば a S (calc-solve-for) コマンドは、 方程式を変形して与えられた変数について解きます。 a M (calc-map-equation) は等式の両辺に任意の関数を作用させます。 例えば 2 a M * は、等式の両辺に 2 を掛けます。 (注)単に 2 * とするだけではそうならず、 `2 (a = b)' になってしまいます。 これは等式が真なら 2、偽なら 0 という意味です。

3個以上の引数をとる eq 関数 (例えば、C-u 3 a =`a = b = c')は、 全ての引数の同値性をテストします。 代数式表記における `=' 演算子の特異性は、 それが右結合でも左結合でもない点であって、 `a = b = c' は、`(a = b) = c'`a = (b = c)' と異なります (後の例におけるカッコ内の評価結果は 1 か 0 で、それと他の変数が比較されます)。

a # (calc-not-equal-to) コマンドや `neq(a,b)' 関数、`a != b' 式は、 ab が等しくない場合に真です。 これも 3つ以上の引数を取ることができ、 `a != b != c != d'a, b, c, d の 全てが異なるかどうかをテストします。

a < (calc-less-than) [`lt(a,b)' or `a < b' 式] は、 ab より小さいとき真です。 よく似た関数に、

a > (calc-greater-than) [`gt(a,b)' or `a > b' 式],

a [ (calc-less-equal) [`leq(a,b)' or `a <= b' 式],

a ] (calc-greater-equal) [`geq(a,b)' or `a >= b' 式]

があります。

lt のような不等式関数は 2引数しか取らないので、 式 `a <= b < c' は区間型式による同等な表現 `b in [a .. c)' に変換されます。 (下記 in の記述参照。) `<'`<=' の全4種の組合せ(区間両端の開閉に対応)が許されます。 また、`>'`>=' の全4種の組合せも許されます。 `a < b < c < d' のような 4引数構文や、 `a < b = c'のような混合は許されません。

a . (calc-remove-equal) [rmeq] コマンドは、 スタック先頭の等式や不等式の右辺を抽出します。 ベクトルの要素ごとにも作用します。 例えば、`[x = 2.34, y = z / 2]' がスタックにあれば、 a .`[2.34, z / 2]' を生成します。 特別なケースとして、右辺が変数で左辺が数値(`2.34 = x'のような)の場合、 Calc は右辺ではなく左辺を残します。 このコマンドは、割付け `x := 2.34' においても等式のときと同様に作用し、 常に右辺を取出します。また `=>' (evaluates-to) 演算子に対しては、 常に左辺を抽出します。

a & (calc-logical-and) [`land(a,b)' or `a && b'] 関数は、 引数の両方が真のとき関数値は真、つまり非ゼロ値になります。 この場合、結果は ab が勝手に選ばれます。 どちらかの値がゼロ値の場合、結果もゼロです。 それ以外の場合、式はシンボル形式のまま残されます。

a | (calc-logical-or) [`lor(a,b)' or `a || b'] 関数は、 引数のどちらかあるいは両方が真の場合、真(非ゼロ)になります。 結果はどちらか非ゼロ値のほうが選ばれ、 両者とも非ゼロの場合はどちらかが勝手に選ばれます。 ab も両方ゼロなら、結果もゼロです。

a ! (calc-logical-not) [`lnot(a)' or `! a'] 関数は、 a が偽(ゼロ値)のとき真で、a が真(非ゼロ)なら偽です。 a が数値でない場合はシンボル形式のまま残されます。

a : (calc-logical-if) [`if(a,b,c)' or `a ? b : c'] 関数は、 a が非ゼロなら b に等しく、 ゼロなら c に等しくなります。 a が数値でない場合、テストはシンボル形式のまま残され、 bc も評価されません。 代数式において、これは Calc の少数の例外関数のひとつで、 関数自体が評価されるときにその引数が自動評価されません。 これ以外には lambda, quote, condition があります。

ちょっと意外で注意すべき点は、 式 `a?3:4'`3:4' の部分が分数と解釈されてしまい、 3つの分離した引数と見られないのでうまく動きません。 `a ? 3 : 4'`a?(3):4' のようにタイプすると動きます。

特別なケースで、a をベクトルに評価したら、 bc の両方が評価されます。 結果は a と同じサイズのベクトルで、 その要素は a の各要素がゼロか非ゼロかに応じて、 bc の対応する要素から選ばれます。 bc はそれぞれ、 a と同サイズのベクトルでなければならないか、 あるいは非ベクトルです。 非ベクトルのときは a の全要素に対応します。 (訳注: if([1, 0, 1, 0], [a, b, c, d], e) は [a, e, c, e] になる)

a { (calc-in-set) [`in(a,b)'] 関数は、 数 ab で示される集合の要素なら真です。 b が区間型式の場合、a がその区間内の数であれば真です。 b がベクトルなら、a がそのベクトルの 要素のひとつに一致すれば真です。 (ベクトルの要素のどれかが区間であって、いずれかの区間に含まれれば真。) b が普通の数値の場合は、ab の値が等しいとき真です。 この種の集合操作コマンド群は、Set Operations using Vectors 参照 。

`typeof(a)' 関数は、a の型を示す整数か変数を生成します。 a が数値か、ベクトルか、変数であれば、結果は次のどれかになります。

 1   Integer                      整数
 2   Fraction                     分数
 3   Floating-point number        浮動小数
 4   HMS form                     時分秒
 5   Rectangular complex number   直交座標複素数
 6   Polar complex number         極座標複素数
 7   Error form                   誤差
 8   Interval form                区間
 9   Modulo form                  剰余
10   Date-only form               日付
11   Date/time form               日付/時刻
12   Infinity (inf, uinf, or nan) 無限大
100  Variable                     変数
101  Vector (but not a matrix)    (行列以外の)ベクトル
102  Matrix                       行列

これ以外には、a は式であって、 結果は最上位関数呼出しの名前を示す変数になります。 (訳注: 意味不明。Otherwise, a is a formula, and the result is a variable which represents the name of the top-level function call.)

`integer(a)' 関数は、a が整数なら真を返します。 `real(a)' 関数は、a が実数(整数, 分数, 浮動小数のどれか)なら真です。 `constant(a)' 関数は、typeofテストの結果が変数以外を示す整数を生成し、 しかもベクトルや誤差型式のような場合はその成分自体も (再帰的に) constant である場合に真を返します。 注意: 無限大とその仲間はこれらのテストを満たしません(真が帰りません)。 pie といった特殊定数もダメです。

同様に式を識別する類似の関数群については、宣言 参照 。 例えば、 `floor(x)' は確実に整数値を取りますが文字通りの整数定数ではないので、 `dint(floor(x))' は真となりますが、 `integer(floor(x))' はそうなりません。

`refers(a,b)' 関数は、変数(あるいはサブ数式)ba の中に 登場すれば真、そうでなければ偽です。 ここに挙げる他のテストとは違い、 この関数は引数がたとえシンボリック(未評価)なまま与えられても明確な答を返します。 refers が未評価のまま残される唯一のケースは、 a が(bではない)素の変数の場合だけです。

`negative(a)' 関数は、 a が実際に負の数である場合、-x の形式である場合、 負に見える項が絡んだ積や商である、等の理由で a が負に"見える"場合に真を返します。 これは書替え規則で最も便利です。 `negative(a)'どんな引数aでも 1 か 0 に評価してしまうので、 あらかじめ m O でデフォルト簡単化機能を止めておかないと (あるいは書替え条件のような非評価状況でないと)、式がすぐ消えてしまいます。

`variable(a)' 関数は、a が変数ならば真で、それ以外なら偽です。 a が関数呼出しならば、このテストはシンボリックなまま残されます。 piinf のような組込変数は他のテスト同様に変数と見なされます。

`nonvar(a)' 関数は、a が非変数なら真です。 引数が変数であれば、簡単化されずに残されるので、 現実にゼロ値を返すことはありません。 しかしながら、Calc の条件テストコマンド群は 確かに真でないものは"偽"と見なすので、 これで充分な場合が多いのです。

関数群 lin, linnt, islin, islinnt は、 式が"線形"かどうか調べます。 つまり定数 a, b および変数またはサブ数式 x を使って a + b x 形式に書けるか否かです。 関数 `islin(f,x)' は、式 fx について線形か調べ、 そうであれば 1 を返します。 例えば、`islin(x,x)', `islin(-x,x)', `islin(3,x)', `islin(x y / 3 - 2, x)' などは全て 1 を返します。 `lin(f,x)' 関数も似ていますが、 1 を返す替りにベクトル [a, b, x] を返します。 上の例では、答のベクトルはそれぞれ [0, 1, x], [0, -1, x], [3, 0, x], [-2, y/3, x] になります。 linislin も一般に、 式が例えば `lin(2 x^2, x)'`lin(sin(x), x)' など、 非線形であった場合は未評価の式を残します。 第2引数は式でもよく、`islin(2 + 3 sin(x), sin(x))' は真を返します。

linntislinnt 関数は類似のチェックを実施しますが、 係数 b がゼロでない"ちゃんとした"線形形式かどうかを調べます。 例えば、`lin(2,x)'[2, 0, x] を返し、 `lin(y,x)'[y, 0, x] を返しますが、 `linnt(2,x)'`linnt(y,x)' は未評価で残されます(言換えれば、 これらの式は x について"取るに足らない"と見なされたのです)。

4つの線型性テスト関数群は全て、第2引数を省略できます。 その場合、入力はどの非定数式について線形でも構いません。 ここで、a=0, b=1 のケースは些細とみなされ、 a, b が定数になる場合?は認知されます。 従って、 `lin(2 x y)'[0, 2, x y] を返し、 `lin(2 - x y)'[2, -1, x y] を返し、 `lin(x y)'[0, 1, x y] を返します。 linnt 関数は初めの2例を許しますが、3番目は些細として放置します。 また、第2引数が省略された場合には、 linlinnt のどちらも単なる定数を放置します。 `islin(2,x)' は真ですが、`islin(2)' は偽となります。

`istrue(a)' 関数は、a が非ゼロ数であるか、 非ゼロ値が確かな式である場合に 1 を返し、それ以外の場合に 0 を返します。 istrue の呼出しが使えるのは、 早まった evaluate がなされないように m O モードが使われている場合に限ります。 (注意: 式が真かどうか判断するのに宣言が使われます。 istrue は、dnonzero が 1 を返す場合に 1 を返し、 dnonzero が 0 を返すかシンボリックなまま残される場合には 0 を返します。


Go to the first, previous, next, last section, table of contents.     利用度数