事例:演算 **

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

    m = VDM_Map({1:2,2:3,3:4,4:1})
n = 2
print ">>> %s ** %s"%(m,n)
X = m ** n
print X; assert X == VDM_Map({1:3,2:4,3:1,4:2})

同一写像を繰り返し適用した写像を得るには、演算子 ** を利用します。このコードを実行すると、

>>> {4 |-> 1, 3 |-> 4, 2 |-> 3, 1 |-> 2} ** 2
{4 |-> 2, 3 |-> 1, 2 |-> 4, 1 |-> 3}

同一写像を2回繰り返して適用した写像は {4 |-> 2, 3 |-> 1, 2 |-> 4, 1 |-> 3} になります。

    m = VDM_Map({1:2,2:3,3:4,4:1})
n = 0
print ">>> %s ** %s"%(m,n)
X = m ** n
print X; assert X == VDM_Map({1:1,2:2,3:3,4:4})

同一写像を0回繰り返して適用した写像は、恒等写像となります。このコードを実行すると、

>>> {4 |-> 1, 3 |-> 4, 2 |-> 3, 1 |-> 2} ** 0
{4 |-> 4, 3 |-> 3, 2 |-> 2, 1 |-> 1}

キーと値とが同一の写像対からなる(なにもしない)恒等写像になります。

    m = VDM_Map({1:2,2:3,3:4,4:1})
n = 1
print ">>> %s ** %s"%(m,n)
X = m ** n
print X; assert X == VDM_Map({1:1,2:2,3:3,4:4})

同一写像を1回繰り返して適用した写像は、もとの写像となります。このコードを実行すると、

>>> {4 |-> 1, 3 |-> 4, 2 |-> 3, 1 |-> 2} ** 1
{4 |-> 1, 3 |-> 4, 2 |-> 3, 1 |-> 2}

与えられた写像と同じ写像になります。

    m = VDM_Map({1:2,2:3,3:4})
n = 0
print ">>> %s ** %s"%(m,n)
try:
X = m ** n
except AssertionError,name:
print name

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

>>> {3 |-> 4, 2 |-> 3, 1 |-> 2} ** 0

: {3 |-> 4, 2 |-> 3, 1 |-> 2} ** 0
: (>>{2, 3, 4}<<).subset({1, 2, 3})
: m ** n: the range of m must be a subset of dom m

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