docs: def merge(self, other):
          """
          We can merge unless the merge results in an empty set -- a
          contradiction
          """
          other = self.coerce(other)
          if self.is_equal(other):
              # pick among dependencies
              return self
          elif other.is_entailed_by(self):
              # other is a subset of self
              return self
          elif self.is_entailed_by(other):
              # self is a subset of other.
              self.values = other.values.copy()
          elif self.is_contradictory(other):
              raise Contradiction("Cannot merge set with %s" % (str(other)))
          else:
              # merge mutual information
              if self.values:
                  self.values = self.values.intersection(other.values)
              else:
                  self.values = other.values.copy()
          return self