code: def constraint_matches(self, c, m):
          
          if isinstance(m, tuple):
              d = {}
              if isinstance(c, Operator) and c._op_name == m[0]:
                  for c1, m1 in zip(c._args, m[1:]):
                      r = self.constraint_matches(c1, m1)
                      if r is False:
                          return r
                      d.update(r)
                  return d
              return False
          return m.match(c)
docs: Return dict noting the substitution values (or False for no match)