演算 :> および :-> を実現する

VDM++ での演算 :> および :-> に準拠するように、メソッド VDM_Map.rngTo/VDM_Map.rngBy を実現します。

class VDM_Map:
def rngTo(m,s):
"""
m :> s
; map A to B * set of B -> map A to B
;
; Range restricted to
; creates the map consisting of the elements in m
; whose information value is in s. s need not be a
; subset of rng m.
"""
return VDM_Map(m._range(rng(m).inter(s)))

def rngBy(m,s):
"""
m :-> s
; map A to B * set of B -> map A to B
;
; Range restricted by
; creates the map consisting of the elements in m
; whose information value is not in s. s need not be
; a subset of rng m.
"""
return VDM_Map(m._range(rng(m) - s))

def _range(m,s):
mm = {}
for k,v in m.dict.items():
if v in s:
mm[k] = v
return mm

メソッド rngTo では、写像 m の値域を集合 s の要素に限定した写像を生成して、これをリターン値とします。
メソッド rngBy では、写像 m の値域から集合 s の要素を削除した写像を生成して、これをリターン値とします。
メソッド _range は、rngTo/rngBy に共通の補助関数です。空の辞書 mm を用意して、写像 m のすべての写像対 k,v について、集合 s の要素 v だけを値として追加します。


《ひよ子のきもち♪2006/10/25》