犬ぶよツールズ制作記録

Javaによる研究生活のためのパッケージ、犬ぶよツールズ。
その開発と保守のための備忘録

jp.inubuyo.bone.domain (SetOfR) パッケージ

2013-01-05 00:37:06 | Weblog

● 概要

実数の部分集合を表す抽象クラス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にあります。

 


jp.inubuyo.bone.domain.core (RntoB) パッケージ

2013-01-04 20:56:17 | Weblog

● 概要

double[]を引数としbooleanを戻り値とする写像を表す抽象クラスRntoBを提供するパッケージです。

Inubuyo Logic (BntoB) Libraryに依存します。

 

● 構成

抽象クラスRntoBは、抽象メソッドvalue(double[]): booleanを持ちます。

メソッドvalue(double[]): booleanは、引数の配列の0番目からn番目の要素により定まるものとします。

この、依存する要素の数を抽象メソッドsize(): intにより返します。

valueメソッドの引数には長さがsize()以上の配列を指定してください。

短い場合には、RntoBの実装クラスはArrayIndexOutOfBoundsExceptionを送出することができます。

 

size()が1、つまり配列の最初の要素のみに依存するRntoBのインスタンスは自然に、doubleを引数としbooleanを返すメソッドと見做せます。

これを抽象クラスRtoBとその抽象メソッドvalue(double): booleanで表します。

同様に、size()が2のRntoBのインスタンスは抽象メソッドvalue(double, double): booleanで表せます。

これを抽象クラスR2toBとします。

抽象クラスR2toBはRntoBを継承し、抽象メソッドvalue(double, double): booleanで継承したメソッドvalue(double): booleanを実装します。抽象クラスRtoBはR2toBを継承し、抽象メソッドvalue(double): booleanで継承したメソッドvalue(double, double): booleanを実装します。

 

定値関数はsize()が0になります。このインスタンスは、クラスRtoB_Constantの定数RtoB_Constant.TRUE、RtoB_Constant.FALSEとして提供します。

 

boolean値に対する単項演算not(否定)から、RntoBに対する単項演算が定まります。これをクラスRntoBのメソッドnot(): RntoBで提供します。

メソッドnot()は共変戻り値型になります。つまり、RntoB#not(): RntoB、 R2toB#not(): R2toB、RtoB#not(): RtoBです。

 

boolean値に対する二項演算から、RntoBに対する二項演算が定まります。これをRntoBのメソッドoperateWith(B2toB, RntoB): RntoB

で提供します。特に、可換な二項演算についてはメソッドを提供します。

+ and(RntoB): RntoB

+ or(RntoB): RntoB

+ xor(RntoB): RntoB

+ nand(RntoB): RntoB

+ nor(RntoB): RntoB

+ nxor(RntoB): RntoB

二項演算に対してはサブクラスで引数の異なるメソッドが提供されます。つまり、R2toB#and(R2toB): R2toB、RtoB#or(RtoB): RtoBなどです。
 
R2toBのメソッドvalue(double, double): booleanの第2引数に値を代入したものを考えると、これはRtoBになります。
同様に第1引数に代入してもRtoBになります。これらをメソッドR2toB#substitute0(double): RtoB、R2toB#substitute1(double): RtoBで提供します。引数は代入する値です。
RtoBはsubstitute1(double): RtoBを自分自身を返すメソッドとしてオーバーライドします。また、substitute0(double): RtoBをRtoB_Constantを返すメソッドとしてオーバーライドします。
 
これと同様に、RntoBは代入した写像のインスタンスを返すメソッドsubstitute(int, double): RntoBを持ちます。引数は代入する成分のインデックス(第1引数)と代入する値(第2引数)です。
 
集合R^nから集合Bへの写像fと、集合R^mから集合Bへの写像gと、B上の2項演算・から、直積写像:R^n×R^m → Bが、(x, y)をf(x)・g(y)に写す写像として定義されます。これを、メソッドRntoB#directProduct(B2toB, RntoB): RntoBにより提供します。RtoB同士の場合には戻り値がR2toBになるので、型が異なるメソッドRtoB#directProduct(B2toB, RtoB): R2toBもあります。
 
● まとめ
以上、RntoBに関わる抽象クラスをjp.inbuyo.bone.domain.coreパッケージに収めます。実装に必要なクラスがjp.inubuyo.bone.domain.core.implにあります。