示例#1
0
  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()),
      ]
    )