.delta(
)
ZDDオブジェクト
に含まれるアイテム集合
と
に含まれるアイテム集合
の排他的論理和
を求め、 その結果のZDDオブジェクト
を返す。 例えば、アイテム集合abcとbcdの排他的論理和は以下の通り。
abc.delta(bcd) = abc
bcd = ad
複数のアイテム集合間の演算では全組合せについて排他的論理和を求める。
(abc + a).delta(bcd + b) = abc
bcd + abc
b + a
bcd + a
b
= ad + ac + abcd + ab
重みについては、同じアイテム集合を複数に展開して計算すればよい。
(2abc).delta(bcd) = (abc+abc).delta(bcd) = ad + ad = 2ad
ちなみに
を
(共通集合演算)に変更すればdelta関数となる。
以下では、アイテムa,b,c、およびアイテム集合2ab + a + 3b、 abc + 2ab + bc + 1、ab+aに関する排他的論理和を求める。
> require 'zdd'
# まずはアイテム集合の定義
> a=ZDD::itemset("a")
> b=ZDD::itemset("b")
> c=ZDD::itemset("c")
> f=2*a*b+a+3*b
> f.show
2 a b + a + 3 b
(2ab + a + 3b)
a = 3ab + 2b + 1
> f.delta(a).show 3 a b + 2 b + 1
(2ab + a + 3b)
b = ab + 2a + 3
> f.delta(b).show a b + 2 a + 3
(2ab + a + 3b)
ab = 3a + b + 2
> f.delta(a*b).show 3 a + b + 2
(2ab + a + 3b)
1 = 2ab+a+3b 定数1は空のアイテム集合なので、それとの排他的論理和を求めると元の集合のままとなる。
> f.delta(1).show 2 a b + a + 3 b
(abc + 2ab + bc + 1)
(2ab + a)の項別の演算結果は 以下の通りとなる。
abc
2ab = 2c
2ab
2ab = 4
bc
2ab = 2ac
1
2ab = 2ab
abc
a = bc
2ab
a = 2b
bc
a = abc
1
a = a
結果をまとめるとa b c + 2 a b + 2 a c + a + b c + 2 b + 2 c + 4となる。
> g=((a*b*c)+2*(a*b)+(b*c)+1) > h=2*a*b + a > g.show a b c + 2 a b + b c + 1 > h.show 2 a b + a > g.delta(h).show a b c + 2 a b + 2 a c + a + b c + 2 b + 2 c + 4