'If \'other\' is a constant, then it must be equal to \'self\'.  If \'other\' is a variable,
then it must not be bound to anything other than \'self\'.
:param other: ``Expression``
:param bindings: ``BindingDict`` A dictionary of all current bindings
:return: ``BindingDict`` A new combined dictionary of of \'bindings\' and any new binding
:raise UnificationException: If \'self\' and \'other\' cannot be unified in the context of \'bindings\''

def unify(self, other, bindings):

    assert isinstance(other, Expression)
    if isinstance(other, VariableExpression):
        try:
            return (bindings + BindingDict([(other, self)]))
        except VariableBindingException:
            pass
    elif (self == other):
        return bindings
    raise UnificationException(self, other, bindings)
