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:     bind cur_goal (fun goal ->
      bind (__tc goal.context t) (fun (t, typ, guard) ->
      bind (if force_guard
            then (if not (Rel.is_trivial <| Rel.discharge_guard goal.context guard) then fail "got non-trivial guard" else ret ())
            else add_goal_from_guard "__exact typing" goal.context guard goal.opts
            ) (fun _ ->
      if do_unify goal.context typ goal.goal_ty
  
negative.code:     bind get (fun ps ->
      try ret (ps.main_context.type_of e t) with e -> fail "not typeable")
  
  let must_trivial (e : env) (g : guard_t) : tac<unit> =
      try if not (Rel.is_trivial <| Rel.discharge_guard_no_smt e g)
          then fail "got non-trivial guard"
          else ret ()
      with
      | _ -> fail "got non-trivial guard"
  
  let tc (t : term) : tac<typ> = wrap_err "tc" <|
      bind cur_goal (fun goal ->
      bind (__tc goal.context t) (fun (t, typ, guard) ->
      bind (must_trivial goal.context guard) (fun _ ->
      ret typ
      )))
  
  let add_irrelevant_goal reason env phi opts : tac<unit> =
      bind (mk_irrelevant_goal reason env phi opts) (fun goal ->
  