def unify(self, t): if (isinstance(t, Fun)): s_domain = self.domain.unify(t.domain) s_range = self.range.unify(t.range).compose(s_domain) try: s_self = self.domain.unify(self.range) except: s_self = Sustitucion() try: s_t = t.domain.unify(t.range) except: s_t = Sustitucion() return s_range.compose(s_domain.compose(s_t.compose(s_self.compose(s_range)))) else: return t.unify(self)
def test_compose_simple(self): s1 = Sustitucion() s1.push(Var('a'), Fun(Var('c'), Int())) s2 = Sustitucion() s2.push(Var('b'), Fun(Var('a'), Int())) s = Sustitucion() s.push(Var('a'), Fun(Var('c'), Int())) s.push(Var('b'), Fun(Var('a'), Int())) self.assertEqual(s1.compose(s2), s)
def test_compose(self): s1 = Sustitucion() s1.push(Var('a'), Fun(Var('b'), Int())) s1.push(Var('w'), Fun(Var('c'), Fun(Var('b'), Bool()))) s2 = Sustitucion() s2.push(Var('b'), Bool()) s2.push(Var('c'), Int()) s2.push(Var('a'), Bool()) s2.push(Var('w'), Int()) s = s1.compose(s2) self.assertEqual( s.all(), [ (Var('a'), Fun(Bool(), Int())), (Var('w'), Fun(Int(), Fun(Bool(), Bool()))), (Var('b'), Bool()), (Var('c'), Int()), ] )