Next: , Previous: Sets, Up: Sets   [Contents][Index]

35.1 Introduction to Sets

Maximaは、 陽な列挙によって定義された有限集合のために、 積集合や和集合のような、集合関数を提供します。 Maximaは、リストと集合を別のオブジェクトとして扱います。 この特長は、 リストまたは集合であるメンバーがリストであったり集合であったりする集合を扱うことを可能にします。

有限集合のための関数に加えて、 Maximaは、 組み合わせ論に関係したいくつかの関数を提供します; これらは、第一種と第二種スターリング数、ベル数、第一種と第二種の多項係数、 非負整数の分割、と2,3の他の関数です。 Maximaは、クロネッカーのデルタ関数も定義します。

35.1.1 Usage

メンバー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つの要素志望xyは、 is(x = y)trueをもたらす (すなわち、集合構成の目的で同じと見なされる) 時だけ 冗長です。 is(x = y)falseをもたらす一方、 is(equal(x, y))は、trueをもたらす可能性があることに 注意してください; その場合、要素xyは異なったものと見なされます。

(%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に評価されるなら、 集合の元xyは等しいです。 従って、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は、リストと集合を異なるオブジェクトとして扱います; unionintersectionのような関数は、 もし引数のいずれかがしゅうごうでないなら、文句を言います。 もしリストに集合関数を適用する必要があるなら、 集合に変換するために、 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の集合関数の完全なリストを持ちます。

Sets ·

35.1.2 Set Member Iteration

集合の元上を反復する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関数firstrestは、 集合に対して正しく機能します。 集合に適用されると、 firstは、最初に表示される集合の要素を返します; それは、実装依存かもしれません。 もしsが集合なら rest(s)は、disjoin(first(s), s)と同値です。 現在、 集合に対して正しく機能する他のMaxima関数があります。 集合関数の将来のバージョンでは、 firstrestは、違うように機能するかもしれませんし、そうでないかもしれません。

35.1.3 Bugs

集合関数は、 集合の元を並び換えるために、 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.

これらのバグは、 orderlessplikeの中にあるバグに原因します; それらは、集合関数の中のバグが原因ではありません。 例証するには、以下の式を試してください。

(%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のorderlessordergreatメカニズムは、 集合関数と互換性がありません。 もし、orderlessordergreatのいずれかを使う必要があるなら、 いかなる集合を構成する前に、これらの関数をコールしてください。 そして、unorderをコールしないでください。

もし集合関数のバグかもしれないと思う何かを見つけたら、 どうかMaximaのバグデータベースに報告してください。 bug_reportを参照してください。

35.1.4 Authors

マサチューセッツ州ケンブリッジ市のStavros Macrakisと、 ネブラスカ大学カーニー校(UNK)のBarton Willisが、 Maximaの集合関数とそれらのドキュメンテーションを書きました。


Next: , Previous: Sets, Up: Sets   [Contents][Index]