def rubylog_unify other
      # check if we are bound
      if @bound
        # if we are bound
        # proceed to our dereferenced value
        rubylog_dereference.rubylog_unify(other) do yield end
      else
        # if we are unbound
        
        # dereference the other
        other = other.rubylog_dereference

        # if the other is a variable
        if other.is_a? Rubylog::Variable
          # succeed if same object
          (yield; return) if self.equal? other

          # we union our guards with the other's
          other.append_guards guards do
            # and bind to the other
            bind_to other do
              yield
            end
          end
        else
          # if the other is a value
          # bind to it and 
          bind_to other do
            # check our guards
            if guards.all? {|g|g.rubylog_matches_as_guard? other}
              yield
            end
          end
        end
      end
    end
def rubylog_unify other
      # check if we are bound
      if @bound
        # if we are bound
        # proceed to our dereferenced value
        rubylog_dereference.rubylog_unify(other) do yield end
      else
        # if we are unbound
        
        # dereference the other
        other = other.rubylog_dereference

        # if the other is a variable
        if other.is_a? Rubylog::Variable
          # succeed if same object
          (yield; return) if self.equal? other

          # we union our guards with the other's
          other.append_guards guards do
            # and bind to the other
            bind_to other do
              yield
            end
          end
        else
          # if the other is a value
          # bind to it and 
          bind_to other do
            # check our guards
            if guards.all? {|g|g.rubylog_matches_as_guard? other}
              yield
            end
          end
        end
      end
    end
Unifies the receiver with another value.

 First dereferences both the receiver and the other. If both dereferenced
 values are variables, unifies them with the other being bound to the
 receiver. If one of them is a variable, it gets bound to the other value.
 If none of them is a variable, they are checked for equality with eql?.
 Succeeds if other is the same object as the receiver.