犬ぶよツールズ制作記録

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

Inubuyo Logic (BntoB) Libraryの使用例

2012-12-19 00:53:05 | Weblog

● 概要

Inubuyo Logicの使用例をJythonで。

 

● 準備

Jythonを起動して、パッケージjp.inubuyo.bone.logicをimportします。

inubuyo@~$ jython
Jython 2.5.2 (Release_2_5_2:7206, Mar 2 2011, 23:12:06)
[Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_37
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import jp.inubuyo.bone.logic as logic
>>>

この時点で、size()が2以下の全ての写像に対応するB2toBのインスタンスが利用できます。

全16個あります。

>>> logic.BtoBs.FALSE
jp.inubuyo.bone.logic.impl.BtoB_Constant[false]
>>> logic.BtoBs.TRUE
jp.inubuyo.bone.logic.impl.BtoB_Constant[true]
>>> logic.BtoBs.ID
jp.inubuyo.bone.logic.impl.BtoB_Id[]
>>> logic.BtoBs.NOT
jp.inubuyo.bone.logic.impl.BtoB_Not[]
>>>

以上の4個はBtoBのインスタンスです。定値関数の2つはarity()が0、残りの2つはarity()が1です。

B2toBsにも同じインスタンスにアタッチされた定数があります。

>>> logic.B2toBs.FALSE
jp.inubuyo.bone.logic.impl.BtoB_Constant[false]

>>> logic.B2toBs.TRUE
jp.inubuyo.bone.logic.impl.BtoB_Constant[true]
>>> logic.B2toBs.P1
jp.inubuyo.bone.logic.impl.BtoB_Id[]
>>> logic.B2toBs.NOT_P1
jp.inubuyo.bone.logic.impl.BtoB_Not[]

 

以下の12個はB2toBのインスタンスです。

>>> logic.B2toBs.P2
jp.inubuyo.bone.logic.impl.B2toB_Injection2[jp.inubuyo.bone.logic.impl.BtoB_Id[]]
>>> logic.B2toBs.NOT_P2
jp.inubuyo.bone.logic.impl.B2toB_Not[jp.inubuyo.bone.logic.impl.B2toB_Injection2[jp.inubuyo.bone.logic.impl.BtoB_Id[]]]

ここまではarity()が1のもので、以降が2項演算です。

2項演算は10個あります。

>>> logic.B2toBs.AND
jp.inubuyo.bone.logic.impl.B2toB_And@16916f80
>>> logic.B2toBs.OR
jp.inubuyo.bone.logic.impl.B2toB_Or@651ee017
>>> logic.B2toBs.XOR
jp.inubuyo.bone.logic.impl.B2toB_Xor@618eabf6
>>> logic.B2toBs.NAND
jp.inubuyo.bone.logic.impl.B2toB_Not[jp.inubuyo.bone.logic.impl.B2toB_And@16916f80]
>>> logic.B2toBs.NOR
jp.inubuyo.bone.logic.impl.B2toB_Not[jp.inubuyo.bone.logic.impl.B2toB_Or@651ee017]
>>> logic.B2toBs.NXOR
jp.inubuyo.bone.logic.impl.B2toB_Not[jp.inubuyo.bone.logic.impl.B2toB_Xor@618eabf6]
>>> >

この6つが可換な2項演算です。

>>> logic.B2toBs.P1_OR_NOT_P2
jp.inubuyo.bone.logic.impl.B2toB_Not[jp.inubuyo.bone.logic.impl.B2toB_Composite@78c6cbc]
>>> logic.B2toBs.P1_AND_NOT_P2
jp.inubuyo.bone.logic.impl.B2toB_Not[jp.inubuyo.bone.logic.impl.B2toB_Composite@4e84f566]
>>> logic.B2toBs.NOT_P1_AND_P2
jp.inubuyo.bone.logic.impl.B2toB_Composite@78c6cbc
>>> logic.B2toBs.NOT_P1_OR_P2
jp.inubuyo.bone.logic.impl.B2toB_Composite@4e84f566
>>>

この4つが非可換な2項演算です。

● 定値関数

定値関数B2toBs.FALSEのvalueメソッドには、何を与えてもFalseが返ってきます。

>>> f0 = logic.B2toBs.FALSE
>>> f0.value(True)
False
>>> f0.value(False)
False
>>> f0.value(True, False)
False
>>> f0.value([False, False])
False
>>>

これに対して、定値関数B2toBs.TRUEのvalueメソッドには、何を与えてもTrueが返ってきます。

>>> f1 = logic.B2toBs.TRUE
>>> f1.value(True)
True
>>> f1.value(False)
True
>>> f1.value(True, False)
True
>>> f1.value([False, False])
True
>>>

 

B2toBs.FALSEのbitwiseメソッドには、何を与えても0が返ってきます。

>>> f0.bitwise(5)
0L
>>> f0.bitwise(10L)
0L

Jythonでは、引数の型をintにしてもlong型として扱われています。

 

B2toBs.TRUEのbitwiseメソッドは、符号付き整数型に対しては-1が返ってきます。

>>> f1.bitwise(5)
-1L
>>> f1.bitwise(10L)
-1L

全ビットを1にするからです。

 

定値関数はsize()、arity()とも0です。

>>> f0.size()
0
>>> f1.size()
0
>>> f0.arity()
0
>>> f1.arity()
0

 

IDは、FALSEが0、TRUEが1です。

>>> f0.toID()
0L
>>> f1.toID()
1L

 

● 単項演算

BtoBs.IDは恒等写像、BtoBs.NOTは否定です。

>>> f2 = logic.BtoBs.ID 

>>> f2.value(True)
True
>>> f2.value(False)
False

>>> f3 = logic.BtoBs.NOT

>>> f3.value(True) 

False
>>> f3.value(False)
True
>>>

BtoBs.IDのnot()は、BtoBs.NOTです。

>>> f2.not() == logic.BtoBs.NOT
True
>>>

同一のインスタンスです。
 
 
BtoBs.IDは3番、BtoBs.NOTは4番です。

>>> f2.toID()
2L

>>> f3.toID()
3L

 

今日はここまで。

 

 


Inubuyo Logic (BntoB) Library version 0.1.0

2012-12-18 18:05:10 | Weblog

● 概要
論理値全体の集合をBとして、自然数nについて写像B^n --> Bを扱うライブラリです。写像B^n --> Bは、Javaでは、引数にboolean型の配列を取る戻り値boolean型のメソッドに対応します。

● 基本方針
論理値全体の集合Bは2つの元からなります。Bには、補元を取る単項演算(否定)と、2項演算(AND, ORなど)が定義されています。
Javaでは、集合Bはboolean型で表されます。boolean型の変数x, yに対し、xの否定!x、xとyのANDのx && y、ORの x || y、XORの x != yが使えます。

集合Bの直積集合B^nから集合Bへの写像を考えます。n=1なら4通り(恒等写像、否定、定値写像2つ)の写像があります。n=2なら16通り、一般のnに対しては2^(2^n)通りになります。Javaの長さnのboolean型の配列aは、直積集合B^nの元と見做すことができ、直積集合B^nから集合Bへの写像は、引数にboolean型の配列を取る戻り値boolean型のメソッドになります。

集合B^2から集合Bへの写像のうち、引数の配列の最初の要素のみに依存するものは、BからBへの写像と見做せます。一般に正整数m<nについて、集合B^nから集合Bへの写像のうち、引数の最初のm個の要素のみに依存するものは、B^mからBへの写像と見做せます。このmをこの写像のsizeと呼ぶことにします。
この同一視の下で、これらの写像を抽象クラスBntoBで表すことにします。ここまでで、BntoBが持つ抽象メソッドは次の2つです。
+ value(boolean[]): boolean
+ size(): int

BntoBを継承したB2toB、B2toBを継承したBtoBも用意します。

B2toBが継承するメソッドvalue(boolean[]): booleanは抽象メソッドvalue(boolean, boolean): booleanで実装されます。BtoBが継承するメソッドvalue(boolean, boolean): booleanは抽象メソッドvalue(boolean): booleanで実装されます。

● 整数型に対するbitwiseメソッド
BからBへの写像は、単項演算として整数に2進数の桁毎(bitwise)に作用することができます。Javaでも整数型に対するbitwiseの否定の演算子~が定義されています。クラスBtoBはこれを抽象メソッドとして提供します。
+ bitwise(int): int
+ bitwise(long): long
+ bitwise(short): int
+ bitwise(byte): int
引数がshort型, byte型の場合に戻り値がint型になるのは演算子~に従ったものです。

同様に、B^2からBへの写像は、2項演算として整数の組にbitwiseに作用することができます。Javaでも整数型に対する演算子&, |, ^が定義されています。クラスB2toBはこれを抽象メソッドとして提供します。
+ bitwise(int, int): int
+ bitwise(long, long): long
+ bitwise(short, short): int
+ bitwise(byte, byte): int
ここでも引数がshort型, byte型の場合に戻り値がint型になるのは&などの演算子に従ったものです。

このbitwiseな演算はそのまま任意の項数に拡張できます。クラスBntoBはこれを抽象メソッドとして提供します。
+ bitwise(int[]): int
+ bitwise(long[]): long
+ bitwise(short[]): int
+ bitwise(byte[]): int
当然のことながら、これらはメソッドvalue(boolean[]): booleanとコンシステントに動作しなければなりません。

● 写像間の演算
論理値に対する演算により、集合B^nから集合Bへの写像に対する演算が自然に定まります。クラスBntoBではこれを抽象メソッドにより扱うことができます。

単項演算は引数が無いメソッドです。
+ not(): BntoB
これは否定を返します。

2項演算は引数を1つ取るメソッドです。
+ and(BntoB): BntoB
+ or(BntoB): BntoB
+ xor(BntoB): BntoB
+ nand(BntoB): BntoB
+ nor(BntoB): BntoB
+ nxor(BntoB): BntoB
+ implies(BntoB): BntoB

メソッドnot()は共変戻り値型です。B2toB#not()はB2toBを返し、BtoB#not()はBtoBを返します。2項演算については、B2toB#and(BntoB): BntoBとB2toB#and(B2toB): B2toBのように、引数の型が異なるメソッドが提供されます。

● 認識番号(ID)
写像B^n --> Bと自然数の間に1対1対応を構成してあります。これにより、次のようなことが容易に実装されます。
+ BntoBの異なるインスタンスが、写像B^n --> Bとして等しいか否か判定する。
+ 自然数kに対し、sizeがk以下の写像B^n --> Bを全て列挙する。
+ BntoBのインスタンスが必要になったとき、その写像に対応するインスタンスが既に生成されていたら、それを使う。

BntoBのインスタンスのIDはメソッドtoID(): longで得られます。IDからインスタンスを得るには、クラスBntoBsのクラスメソッドid(long):BntoBを使います。このクラスBntoBsはメソッド・ファクトリーです。

● 代入
自然数k < nについて、写像B^n --> Bのk番目の引数に値を代入すると、別の写像が得られます。クラスBntoBでは、メソッドsubstitute(int, boolean): BntoBでこの操作を提供します。

● 依存項数(arity)
size()がnであるBntoBのインスタンスのメソッドvalue(boolean[])は、戻り値を計算するために、引数の1番目からn番目の要素を使うことができます。一方で、戻り値が引数の1番目からn番目の要素全てに依存するとは限りません。例えば、引数の2番目の要素をそのまま返す写像

public boolean value(boolean[] x) { return x[1]; }

の場合、size()は2ですが、引数のうちの1個の要素にしか依存していません。

クラスBntoBでは、そのインスタンスが実際に依存している要素の個数をメソッドarity()で返します。上の例では、arity()の値は1です。

● まとめ
以上が主要な仕様です。これらのクラスをjp.inubuyo.bone.logicパッケージに入れます。抽象クラスBntoBの実装はjp.inubuyo.bone.logic.implパッケージにあります。