'Attempt to unify this Clause with the other, returning a list of
resulting, unified, Clauses.
:param other: ``Clause`` with which to unify
:param bindings: ``BindingDict`` containing bindings that should be used
during the unification
:param used: tuple of two lists of atoms.  The first lists the
atoms from \'self\' that were successfully unified with atoms from
\'other\'.  The second lists the atoms from \'other\' that were successfully
unified with atoms from \'self\'.
:param skipped: tuple of two ``Clause`` objects.  The first is a list of all
the atoms from the \'self\' Clause that have not been unified with
anything on the path.  The second is same thing for the \'other\' Clause.
:param debug: bool indicating whether debug statements should print
:return: list containing all the resulting ``Clause`` objects that could be
obtained by unification'

def unify(self, other, bindings=None, used=None, skipped=None, debug=False):

    if (bindings is None):
        bindings = BindingDict()
    if (used is None):
        used = ([], [])
    if (skipped is None):
        skipped = ([], [])
    if isinstance(debug, bool):
        debug = DebugObject(debug)
    newclauses = _iterate_first(self, other, bindings, used, skipped, _complete_unify_path, debug)
    subsumed = []
    for (i, c1) in enumerate(newclauses):
        if (i not in subsumed):
            for (j, c2) in enumerate(newclauses):
                if ((i != j) and (j not in subsumed) and c1.subsumes(c2)):
                    subsumed.append(j)
    result = []
    for i in range(len(newclauses)):
        if (i not in subsumed):
            result.append(newclauses[i])
    return result
