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 に対する、逆写像が得られます。

>>> 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


関連記事

Last updated♪2009/10/11