Merges two complex structures (by recursively merging their parts).
        Missing-parts do not trigger contradictions.

def merge(self, other):
        """
        Merges two complex structures (by recursively merging their parts).
        Missing-parts do not trigger contradictions.
        """
        if not isinstance(other, DictCell):
            raise Exception("Incomparable")
        if self.is_equal(other):
            # pick among dependencies
            return self
        elif other.is_entailed_by(self):
            return self
        elif self.is_entailed_by(other):
            self.__dict__['p'] = other.__dict__['p'].copy()
        elif not self.is_contradictory(other):
            # partial information in both, add from other
            for o_key, o_val in other:
                if not o_key in self.__dict__['p']:
                    self.__dict__['p'][o_key] = o_val
                else:
                    self.__dict__['p'][o_key].merge(o_val)
        else:
            raise Contradiction("Dictionaries are contractory, cannot Merge")
        return self