事例:演算 merge

VDM++ での演算 merge に準拠した事例を紹介します。

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

(集合 ms の要素として列挙された)写像 m1 および m2 から、すべての写像を併合した写像を得るには、関数 merge を利用します。このコードを実行すると、

>>> merge {{'A' |-> 1, 'C' |-> 3}, {'A' |-> 1, 'B' |-> 2}}
{'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})
ms = VDM_Set((m1,m2) )
print ">>> merge %s"%ms
try:
X = merge(ms)
except AssertionError,name:
print name

(集合 ms の要素として列挙された)写像 m1 および m2 において、同じキーに異なる値が対応するなら、この演算を利用できません。このコードを実行すると、

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

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

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