Python.use(better)《余録》VDM_map.inverse
‖記事一覧‖
Python.use(better)
《余録》VDM_map.inverse
《著》小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28
課題:VDM_map.inverse
VDM++/map で規定された inverse 演算に準拠したものを実現します。
>>> # -------------------------------------------------- inverse >>> s = VDM_map({"A":1, "B":2, "C":3}); s {'A' |-> 1, 'B' |-> 2, 'C' |-> 3} >>> s.inverse() {1 |-> 'A', 2 |-> 'B', 3 |-> 'C'}
>>> s = VDM_map({"A":0, "B":2, "C":0}); s {'A' |-> 0, 'B' |-> 2, 'C' |-> 0} >>> s.inverse() # ! -- must be a 1-to-1
1対1でない写像 s は、その逆写像が得られないので、エラーメッセージを出力します。
《Note》VDM++ では、次のような演算が規定されています。
inverse m Map inverse yields the inverse map of m. m must be a 1-to-1 mapping. inmap A to B → inmap B to A
。□
課題:テストケース
def ex_inverse(spec, local): source = ''' s = %s({"A":1, "B":2, "C":3}); s s = %s({"A":0, "B":2, "C":0}); s '''.split("\n") for e in source[1:-1]: try: X = e%spec print_(X, local) X = 's.inverse()' print_(X, local) except AssertionError as error: print(error)
課題:コードの解説
VDM++/map で規定された inverse 操作に準拠した機能を実現します。
class VDM_map(VDM_object): def _pre_inverse(f): def pre(self): value = self.dict.values() assert len(value) == len(set(value)), ( "# ! -- must be a 1-to-1") return f(self) return pre @_pre_inverse def inverse(self): m = {v:k for k,v in self.dict.items()} return VDM_map(m)
》こちらに移動中です《
↑TOP