定義域と値域

VDM++ での map 型には、写像定義域値域を定義できます。VDM++ では、次のように表現します。

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

写像 {'A' |-> 1, 'B' |-> 2, 'C' |-> 3} の定義域は {A, B, C} になります。

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

写像 {'A' |-> 1, 'B' |-> 2, 'C' |-> 3} の値域は {1, 2, 3} になります。
ただし、空写像にこれらの演算を利用すると、空集合が得られます。

事例:演算 dom

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

    m = VDM_Map({"A":1,"B":2,"C":3})
print ">>> dom %s"%(m)
X = dom(m)
print X; assert X == VDM_Set("ABC")

写像 m の定義域を得るには、関数 dom を利用します。このコードを実行すると、

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

定義域は {A, B, C} になります。

    m = VDM_Map({})
print ">>> dom %s"%(m)
X = dom(m)
print X; assert X == VDM_Set()

写像についても同様です。このコードを実行すると、

>>> dom {|->}
{}

定義域は、空集合 {} になります。

事例:演算 rng

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

    m = VDM_Map({"A":1,"B":2,"C":3})
print ">>> rng %s"%(m)
X = rng(m)
print X; assert X == VDM_Set(range(1,4))

写像 m の値域を得るには、関数 rng を利用します。このコードを実行すると、

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

値域は {1, 2, 3} になります。

    m = VDM_Map()
print ">>> rng %s"%(m)
X = rng(m)
print X; assert X == VDM_Set()

写像についても同様です。このコードを実行すると、

>>> rng {|->}
{}

値域は、空集合 {} になります。

演算 dom/rng を実現する

VDM++ での演算 dom/rng に準拠するように(モジュール VDM_Map で)関数 dom/rng を実現します。

def dom(m):
"""
dom m
; map A to B -> set of A
;
; Domain
; yields the domain (the set of keys) of m.
"""
return VDM_Set(m.dict.keys())

関数 dom は、写像 m のキー集合を生成して、これをリターン値とします。


関連記事Python の組み込み型 dict には、次のメソッドが規定されています。
a.keys()
変数 a が dict 型の値を束縛するとき、そのキー要素をもとにした、list 型の値が得られます。□

def rng(m):
"""
rng m
; map A to B -> set of B
;
; Range
; yields the range (the set of information values) of
; m.
"""
return VDM_Set(m.dict.values())

関数 rng は、写像 m の値集合を生成して、これをリターン値とします。


関連記事Python の組み込み型 dict には、次のメソッドが規定されています。
a.values()
変数 a が dict 型の値を束縛するとき、その値要素をもとにした、list 型の値が得られます。□


《ひよ子のきもち♪2008/08/23》