事例:演算 munion

VDM++ での演算 munion に準拠した事例(VDM_Map.munion)を紹介します。

    m1 = VDM_Map({"A":1,"B":2})
m2 = VDM_Map({"A":1,"C":3})
print ">>> %s munion %s"%(m1,m2)
X = m1.munion(m2)
print X; assert X == VDM_Map({"A":1,"B":2,"C":3})

写像 m1 および m2 を併合した写像を得るには、メソッド munion を利用します。このコードを実行すると、

>>> {'A' |-> 1, 'B' |-> 2} munion {'A' |-> 1, 'C' |-> 3}
{'A' |-> 1, 'C' |-> 3, 'B' |-> 2}

併合した写像は {'A' |-> 1, 'C' |-> 3, 'B' |-> 2} になります。このとき、写像対の順序には、意味がありません。

    m1 = VDM_Map({"A":1,"B":2})
m2 = VDM_Map({"A":0,"C":3})
print ">>> %s munion %s"%(m1,m2)
try:
X = m1.munion(m2)
except AssertionError,name:
print name

写像 m1 および m2 において、同じキーに異なる値が対応するなら、この演算を利用できません。このコードを実行すると、

>>> {'A' |-> 1, 'B' |-> 2} munion {'A' |-> 0, 'C' |-> 3}

: {'A' |-> 1, 'B' |-> 2} munion {'A' |-> 0, 'C' |-> 3}
: A |-> (>>1<<) == A |-> (>>0<<)

例外を生成して、エラーメッセージが表示されます。なぜなら、同じキー A に対して、異なる値 1 および 0 が対応するからです。