def encode_num(num): if not isinstance(num, int) or isinstance(num, bool) or not num >= 0: raise TypeError(num) result = lib.zero for i in xrange(num): result = lib.succ(result) return result
'encode_error': [None, 0, 1, 2, [None], [True]], 'decode_error': [I, B, C, APP(C, B)], }, 'byte': { 'ok': [ (lib.byte_table[ord(b'a')], b'a'), (lib.byte_table[0x00], b'\x00'), (lib.byte_table[0xff], b'\xff'), ], 'encode_error': [0, ['a'], 'asdf'], 'decode_error': [I, K, B, C, APP(C, B)], }, 'num': { 'ok': [ (lib.zero, 0), (lib.succ(lib.zero), 1), (lib.succ(lib.succ(lib.zero)), 2), (lib.succ(lib.succ(lib.succ(lib.zero))), 3), ], 'encode_error': [None, False, True, [0], [True]], }, ('prod', 'bool', 'num'): { 'ok': [ (lib.pair(lib.true, lib.zero), (True, 0)), (lib.pair(lib.false, lib.succ(lib.succ(lib.zero))), (False, 2)), ], 'encode_error': [None, (), (True,), [True, 0], True, 0, 'asdf'] }, ('sum', 'bool', 'num'): { 'ok': [ (lib.inl(lib.true), (True, True)),
# ---------------------------------------------------------------------------- # Numerals as Y Maybe def encode_num(num): if not isinstance(num, int) or isinstance(num, bool) or not num >= 0: raise TypeError(num) result = lib.zero for i in xrange(num): result = lib.succ(result) return result _pred_var = unification.var('pred') _succ_pattern = lib.succ(_pred_var) def decode_num(code): result = 0 while True: if code is lib.zero: return result match = unification.unify(_succ_pattern, code) if not match: raise TypeError(code) result += 1 code = match[_pred_var] # ----------------------------------------------------------------------------