● 概要
実数の部分集合を表す抽象クラスSetOfRを含むパッケージです。実数といっても実装はdouble型の変数です。有限個の区間からなる部分集合を扱うことができます。
● 概念
実数の集合には全順序が入っています。Javaでもdouble型に対して大小関係を与える演算子(==、<、>、>=、<=)があります。これにより特定の区間について、与えられたdouble型の変数がその区間に含まれるか否か判定することができます。
実数の区間は、両端の値と、端でその値を含むか否かを指定すれば定まります。Javaでは正負の無限大(Double.POSITIVE_INFINITY、Double.NEGATIVE_INFINITY)が定義されていて、これも区間の指定に使えます。端の値がdouble型の値になる開区間や閉区間は表すことができます。
区間同士の間には順序関係を定めることができます。より小さな値を含む区間をより小さいと定義します。下端が等しい区間同士では、包含関係を順序にします。
実数の部分集合に対して、補集合を取る操作が単項演算になります。2つの部分集合の合併を取る操作、共通部分を取る操作が2項演算になります。開区間や閉区間を含む範囲では、有限個の区間からなる集合がこれらの演算について閉じています。
● 構成
実数の部分集合を表す抽象クラスSetOfRを作ります。これを継承し、単一の区間を表す抽象クラスIntervalを作ります。また、有限個の区間からなる集合のインスタンスを実装するため、SetOfRの実装クラスSetOfR_SortedSetを用意します。
● 抽象クラスSetOfR
与えられた値を含むか否かを判定する抽象メソッドcontains(double): booleanを持ちます。この特性関数をRtoBのインスタンスとして返すメソッドgetRtoB(): RtoBを提供します。
部分集合の性質を返す抽象メソッドを持ちます。
+ isOpen(): boolean
+ isClose(): boolean
+ isCompact(): boolean
+ sup(): double
+ inf(): double
補集合、合併、共通部分を得るためのメソッドを持ちます。
+ complement(): SetOfR
+ union(SetOfR): SetOfR
+ intersection(SetOfR): SetOfR
また、閉包と内点も取れます。
+ closure(): SetOfR
+ interior(): SetOfR
SetOfRのインスタンスは(少なくとも現時点の実装では)有限個の区間からなる集合を表します。それらに分解するための抽象メソッドを持ちます。
+ numberOfIntervals(): int
+ intervals(): Interval[]
また、集合の測度(1次元体積)を求めるメソッドvolume()を提供します。
● 抽象クラスInterval
単一の区間からなる集合は、抽象クラスIntervalのサブクラスで表します。
+ Interval_Empty: SetOfRのサブクラスとしての、空集合を表すクラスです。このクラスはシングルトンで、定数EMPTYを持ちます。
+ Interval_Whole:SetOfRのサブクラスとしての、実数全体の集合(-Infitity, Infinity)を表すクラスです。このクラスはシングルトンで定数WHOLEを持ちます。
+ Interval_Point: 1点からなる集合を表すクラスです。
+ Interval_Closed: 閉区間[a, b]を表すクラスです。properな(aとbが異なる)区間に限ります。
+ Interval_Open:開区間(a, b)を表すクラスです。端点のうち一方は無限大でも構いません。
+ Interval_Neither:端のうち一方が閉じていて他方が開いている区間を表すクラスです。開いている端は無限大でも構いません。
継承したメソッドのうち、closure()とinterior()は共変戻り値でIntervalを返します。
numberOfIntervals()は1を返します。空集合を表すInterval_Emptyだけは例外で0を返します。intervals()は自分自身を要素として持つ長さ1の配列を返します。やはりInterval_Emptyだけは例外で長さ0の配列を返します。
SetOfRの抽象メソッドを実装するために、抽象クラスIntervalは以下の抽象メソッドを持ちます。
+ hasIntersectionWith(Interval): boolean
+ isAdjacentTo(Interval): boolean
これらは共通部分があるかどうか、接しているかどうかを判定します。
+ connect(Interval): Interval
共通部分があるかあるいは接している区間との合併を作ります。
区間の順序を与えるために抽象クラスIntervalはjava.lang.Comparableを継承します。
● クラスSetOfR_SortedSet
複数の区間から成る集合を表すためのクラスです。現時点ではInterval以外で唯一のSetOfRの実装クラスです。データとしてIntervalをjava.util.SortedSetに保持しています。
Intervalは不変(immutable)ですが、SetOfR_SortedSetは可変(mutable)です。区間を追加するメソッドadd(Interval): voidを持ちます。
● 実装
空集合に対応するインスタンスは2種類あります。ひとつはクラスInterval_Emptyの定数Interval_Empty.EMPTYです。クラスSetOfR_SortedSetも初期化した時点では何もadd()されていないので空集合を表します。このライブラリの実装は、戻り値が空集合になる場合には必ずInterval_Empty.EMPTYを返します。
実数全体の集合に対応するインスタンスは定数Interval_Whole.WHOLEのみです。戻り値が実数全体の集合になる場合、その値はInterval_Whole.WHOLEです。
単一の区間からなる集合に対応するインスタンスは、Intervalのインスタンスと、SetOfR_SortedSetのadd()が1回呼び出されたインスタンスの2種類あります。戻り値が単一の区間からなる集合になる場合には、Intervalのインスタンスを返すように実装しています。
メソッドtoString(): Stringは、Intervalの実装では区間を表すASCII文字列になります。閉区間は"[0.0, 1.0]"、開区間は"(0.0, 1.0)"、1点からなる集合は"{0.0}"の形式です。SetOfR_SortedSetは、区間を表す文字列を文字"U"で結合したものになります。
● まとめ
抽象クラスSetOfRにより、有限個の区間からなる実数の集合を扱うことができます。補集合、合併、共通部分を自由に取ることが可能です。抽象クラスSetOfRとIntervalはパッケージjp.inubuyo.bone.domainに、これらの実装クラスはパッケージjp.inubuyo.bone.domain.implにあります。