anchor.diff:          end
       | _ -> (); //TODO
       ()
  +
  +let mk_eq2 prob t1 t2 =
  +    (* NS: Rather than introducing a new variable, it would be much preferable
  +            to simply compute the type of t1 here.
  +            Sadly, it seems to be way too expensive to call env.type_of here.
  +    *)
  +    let t_type, u = U.type_u () in
  +    let tt, _ = new_uvar t1.pos (p_scope prob) t_type in
  +    U.mk_eq2 u tt t1 t2
   
   let p_invert = function
      | TProb p -> TProb <| invert p
  
positive.code: (* --------------------------------------------------------- *)
  (* </new_uvar>                                               *)
  (* --------------------------------------------------------- *)
  
  let mk_eq2 env t1 t2 =
      (* NS: Rather than introducing a new variable, it would be much preferable
              to simply compute the type of t1 here.
              Sadly, it seems to be way too expensive to call env.type_of here.
      *)
      let t_type, u = U.type_u () in
      let tt, _ = new_uvar t1.pos (Env.all_binders env) t_type in
      U.mk_eq2 u tt t1 t2
  
  (* Instantiation of unification variables *)
  type uvi =
  
negative.code:               // GM: No. We could be in a contradictory environment.
                then let guard = if U.eq_tm t1 t2 = U.Equal
                                 then None
                                 else Some <| mk_eq2 orig t1 t2 in
                     solve env (solve_prob orig guard [] wl)
                else rigid_rigid_delta env orig wl head1 head2 t1 t2
           else rigid_rigid_delta env orig wl head1 head2 t1 t2
  