anchor.diff:      else fail3 "%s : %s does not exactly solve the goal %s"
                       (N.term_to_string goal.context t)
                       (N.term_to_string goal.context (bnorm goal.context typ))
  -                    (N.term_to_string goal.context goal.goal_ty)))
  +                    (N.term_to_string goal.context goal.goal_ty))))
   
   let exact (tm:term) : tac<unit> = wrap_err "exact" <|
       mlog (fun () -> BU.print1 "exact: tm = %s\n" (Print.term_to_string tm)) (fun _ ->
  
positive.code: let unshelve (t : term) : tac<unit> = wrap_err "unshelve" <|
      bind cur_goal (fun goal ->
      bind (__tc goal.context t) (fun (t, typ, guard) ->
      if not (Rel.is_trivial <| Rel.discharge_guard goal.context guard)
      then fail "got non-trivial guard"
      else add_goals [{ goal with witness  = bnorm goal.context t;
                                  goal_ty  = bnorm goal.context typ;
                                  is_guard = false; }]))
  
  let unify (t1 : term) (t2 : term) : tac<bool> =
      bind get (fun ps ->
  
negative.code:     bind cur_goal (fun goal ->
      bind (__tc goal.context t) (fun (t, typ, guard) ->
      bind (if force_guard
            then must_trivial goal.context guard
            else add_goal_from_guard "__exact typing" goal.context guard goal.opts
            ) (fun _ ->
      if do_unify goal.context typ goal.goal_ty
  