Next: Functions and Variables for Sets, Previous: Sets, Up: Sets [Contents][Index]
Maximaは、 陽な列挙によって定義された有限集合のために、 積集合や和集合のような、集合関数を提供します。 Maximaは、リストと集合を別のオブジェクトとして扱います。 この特長は、 リストまたは集合であるメンバーがリストであったり集合であったりする集合を扱うことを可能にします。
有限集合のための関数に加えて、 Maximaは、 組み合わせ論に関係したいくつかの関数を提供します; これらは、第一種と第二種スターリング数、ベル数、第一種と第二種の多項係数、 非負整数の分割、と2,3の他の関数です。 Maximaは、クロネッカーのデルタ関数も定義します。
メンバーa_1, ..., a_nの集合を構成するには、
set(a_1, ..., a_n)または{a_1, ..., a_n}を書いてください;
空集合を構成するには、
set()または{}を書いてください。
入力では、
set(...)と{ ... }は同値です。
集合は、いつも中括弧で表示されます。
もしメンバーが一度以上リストされているなら、 整理は、冗長なメンバーを消去します。
(%i1) set();
(%o1)                          {}
(%i2) set(a, b, a);
(%o2)                        {a, b}
(%i3) set(a, set(b));
(%o3)                       {a, {b}}
(%i4) set(a, [b]);
(%o4)                       {a, [b]}
(%i5) {};
(%o5)                          {}
(%i6) {a, b, a};
(%o6)                        {a, b}
(%i7) {a, {b}};
(%o7)                       {a, {b}}
(%i8) {a, [b]};
(%o8)                       {a, [b]}
2つの要素志望xとyは、
is(x = y)がtrueをもたらす
(すなわち、集合構成の目的で同じと見なされる)
時だけ
冗長です。
is(x = y)がfalseをもたらす一方、
is(equal(x, y))は、trueをもたらす可能性があることに
注意してください;
その場合、要素xとyは異なったものと見なされます。
(%i1) x: a/c + b/c;
                              b   a
(%o1)                         - + -
                              c   c
(%i2) y: a/c + b/c;
                              b   a
(%o2)                         - + -
                              c   c
(%i3) z: (a + b)/c;
                              b + a
(%o3)                         -----
                                c
(%i4) is (x = y);
(%o4)                         true
(%i5) is (y = z);
(%o5)                         false
(%i6) is (equal (y, z));
(%o6)                         true
(%i7) y - z;
                           b + a   b   a
(%o7)                    - ----- + - + -
                             c     c   c
(%i8) ratsimp (%);
(%o8)                           0
(%i9) {x, y, z};
                          b + a  b   a
(%o9)                    {-----, - + -}
                            c    c   c
リストの要素から集合を構成するには、setifyを使ってください。
(%i1) setify ([b, a]);
(%o1)                        {a, b}
もしis(x = y)がtrueに評価されるなら、
集合の元xとyは等しいです。
従って、rat(x)とxは集合の元として等しいです;
結果として、
(%i1) {x, rat(x)};
(%o1)                          {x}
さらに、
is((x - 1)*(x + 1) = x^2 - 1)はfalseに評価されるので、
(x - 1)*(x + 1)とx^2 - 1は集合の異なる元です;
従って、
(%i1) {(x - 1)*(x + 1), x^2 - 1};
                                       2
(%o1)               {(x - 1) (x + 1), x  - 1}
この集合を1元集合に縮小するには、
ratを集合の元それぞれに適用してください:
(%i1) {(x - 1)*(x + 1), x^2 - 1};
                                       2
(%o1)               {(x - 1) (x + 1), x  - 1}
(%i2) map (rat, %);
                              2
(%o2)/R/                    {x  - 1}
他の集合から冗長性を取り除くために、
他の整理関数を使う必要があるかもしれません。
以下は、trigsimpを使った例です:
(%i1) {1, cos(x)^2 + sin(x)^2};
                            2         2
(%o1)                {1, sin (x) + cos (x)}
(%i2) map (trigsimp, %);
(%o2)                          {1}
元が、冗長でなく、並べ換えられている時
集合は整理されてます。
集合関数の現在のバージョンは、
集合を順に並べるためにMaxima関数orderlesspを使います;
しかしながら、
集合関数の将来のバージョンは、違う並び替え関数を使うかもしれません。
代入のような、集合に関するいくつかの演算は、 再整理を自動的に強制します; 例えば、
(%i1) s: {a, b, c}$
(%i2) subst (c=a, s);
(%o2)                        {a, b}
(%i3) subst ([a=x, b=x, c=x], s);
(%o3)                          {x}
(%i4) map (lambda ([x], x^2), set (-1, 0, 1));
(%o4)                        {0, 1}
Maximaは、リストと集合を異なるオブジェクトとして扱います;
unionやintersectionのような関数は、
もし引数のいずれかがしゅうごうでないなら、文句を言います。
もしリストに集合関数を適用する必要があるなら、
集合に変換するために、
setify関数を使ってください。
例えば、
(%i1) union ([1, 2], {a, b});
Function union expects a set, instead found [1,2]
 -- an error.  Quitting.  To debug this try debugmode(true);
(%i2) union (setify ([1, 2]), {a, b});
(%o2)                     {1, 2, a, b}
集合sの集合要素のうち述語論理fを満たすすべての要素を抽出するためには、
use subset(s, f)を使ってください。
(述語論理はブーリアン値関数です。)
例えば、
与えられた集合の中で、変数zに依存しない等式を見つけるには、
以下を使ってください。
(%i1) subset ({x + y + z, x - y + 4, x + y - 5},
                                    lambda ([e], freeof (z, e)));
(%o1)               {- y + x + 4, y + x - 5}
節Functions and Variables for Setsは、 Maximaの集合関数の完全なリストを持ちます。
集合の元上を反復する2つの方法があります。
1つの方法はmapの使用です;
例えば:
(%i1) map (f, {a, b, c});
(%o1)                  {f(a), f(b), f(c)}
他の方法は、
for x in s doを使うことです。
(%i1) s: {a, b, c};
(%o1)                       {a, b, c}
(%i2) for si in s do print (concat (si, 1));
a1 
b1 
c1 
(%o2)                         done
Maxima関数firstとrestは、
集合に対して正しく機能します。
集合に適用されると、
firstは、最初に表示される集合の要素を返します;
それは、実装依存かもしれません。
もしsが集合なら
rest(s)は、disjoin(first(s), s)と同値です。
現在、
集合に対して正しく機能する他のMaxima関数があります。
集合関数の将来のバージョンでは、
firstとrestは、違うように機能するかもしれませんし、そうでないかもしれません。
集合関数は、
集合の元を並び換えるために、
Maxima関数orderlesspを使い、
集合の元の同一性をテストするために(Lispレベルの)関数likeを使います。
これらの関数の両方は、
もし標準有理式(CRE)形式の式を含むリストや行列が元の集合を使おうとするなら、現れる既知のバグを持ちます。
例は以下の通りです。
(%i1) {[x], [rat (x)]};
Maxima encountered a Lisp error:
  The value #:X1440 is not of type LIST.
Automatically continuing.
To reenable the Lisp debugger set *debugger-hook* to nil.
この式は、Maximaがエラーで停止する原因となります。 (エラーメッセージはMaximaが使うLispのバージョンに依ります。) もう1つの例は、以下の通りです。
(%i1) setify ([[rat(a)], [rat(b)]]); Maxima encountered a Lisp error: The value #:A1440 is not of type LIST. Automatically continuing. To reenable the Lisp debugger set *debugger-hook* to nil.
これらのバグは、
orderlesspとlikeの中にあるバグに原因します;
それらは、集合関数の中のバグが原因ではありません。
例証するには、以下の式を試してください。
(%i1) orderlessp ([rat(a)], [rat(b)]); Maxima encountered a Lisp error: The value #:B1441 is not of type LIST. Automatically continuing. To reenable the Lisp debugger set *debugger-hook* to nil. (%i2) is ([rat(a)] = [rat(a)]); (%o2) false
これらのバグが直されるまで、 CRE形式の式を含むリストや行を元に持つ集合を構成しないでください; しかしながら、CRE形式の元を持つ集合は、問題ないはずです:
(%i1) {x, rat (x)};
(%o1)                          {x}
Maximaのorderlesspは、
集合関数で問題の原因となる可能性がある
もう1つのバグを持ちます。
それは、すなわち、順序付け述語論理orderlesspが推移的でないことです。
これを示す最も簡単な既知の例は、以下の通りです。
(%i1) q: x^2$ (%i2) r: (x + 1)^2$ (%i3) s: x*(x + 2)$ (%i4) orderlessp (q, r); (%o4) true (%i5) orderlessp (r, s); (%o5) true (%i6) orderlessp (q, s); (%o6) false
このバグは、一般的にMaximaの関数はもちろん、集合関数すべてにおいて、
問題の原因となる可能性があります。
確実ではありませんが、
もし集合の元すべてがCRE形式であるか、ratsimpを使って整理されていれば、
このバグはたぶん避けられます。
Maximaのorderlessとordergreatメカニズムは、
集合関数と互換性がありません。
もし、orderlessかordergreatのいずれかを使う必要があるなら、
いかなる集合を構成する前に、これらの関数をコールしてください。
そして、unorderをコールしないでください。
もし集合関数のバグかもしれないと思う何かを見つけたら、
どうかMaximaのバグデータベースに報告してください。
bug_reportを参照してください。
マサチューセッツ州ケンブリッジ市のStavros Macrakisと、 ネブラスカ大学カーニー校(UNK)のBarton Willisが、 Maximaの集合関数とそれらのドキュメンテーションを書きました。
Next: Functions and Variables for Sets, Previous: Sets, Up: Sets [Contents][Index]