事例:演算 comp

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

    m1 = VDM_Map({1:"alpha",2:"beta"})
m2 = VDM_Map({"A":1,"B":2})
print ">>> %s comp %s"%(m1,m2)
X = m1.comp(m2)
print X; assert X == VDM_Map({"A":"alpha","B":"beta"})

2つの写像を合成した写像を得るには、メソッド comp を利用します。このコードを実行すると、

>>> {2 |-> "beta", 1 |-> "alpha"} comp {'A' |-> 1, 'B' |-> 2}
{'A' |-> "alpha", 'B' |-> "beta"}

合成した写像は {'A' |-> "alpha", 'B' |-> "beta"} になります。このとき、写像対の順序には、意味がありません。

    m1 = VDM_Map({1:"alpha",2:"beta"})
m2 = VDM_Map({"A":0,"B":2})
print ">>> %s comp %s"%(m1,m2)
X = m1.comp(m2)
print X; assert X == VDM_Map({"A":"alpha","B":"beta"})

一方の写像の値域が、他方の写像の定義域の部分集合でないなら、この演算を利用できません。このコードを実行すると、

>>> {2 |-> "beta", 1 |-> "alpha"} comp {'A' |-> 0, 'B' |-> 2}

: {2 |-> "beta", 1 |-> "alpha"} comp {'A' |-> 0, 'B' |-> 2}
: (>>{0, 2}<<).subset({1, 2})
: m comp n: rng m2 must be a subset of dom m1

例外を生成して、エラーメッセージが表示されます。なぜなら、写像 m2 の値域 {0, 2} が、写像 m1 の定義域 {1, 2} の部分集合でないからです。