anchor.diff:                      | pre::post::_ -> fst pre, fst post
                       | _ -> failwith "exact_lemma: impossible: not a lemma"
       in
  -    if Rel.teq_nosmt goal.context post goal.goal_ty
  +    if do_unify goal.context post goal.goal_ty
       then let _ = solve goal t in bind dismiss (fun _ -> add_irrelevant_goal goal.context pre goal.opts)
       else fail3 "%s : %s does not exactly solve the goal %s"
                       (Print.term_to_string t)
  
positive.code:           with e -> // printfn "Exception %A" e;
                      fail2 "exact: term is not typeable: %s (%s)" (Print.term_to_string t) (Print.tag_of_term t)) (fun (t, typ, guard) ->
      if not (Rel.is_trivial <| Rel.discharge_guard goal.context guard) then fail "exact: got non-trivial guard" else
      if Rel.teq_nosmt goal.context typ goal.goal_ty
      then let _ = solve goal t in dismiss
      else fail3 "%s : %s does not exactly solve the goal %s"
                      (Print.term_to_string t)
  
negative.code:                     | pre::post::_ -> fst pre, fst post
                      | _ -> failwith "apply_lemma: impossible: not a lemma"
      in
      if not (do_unify goal.context (U.mk_squash post) goal.goal_ty)
      then fail3 "apply_lemma: Cannot instantiate lemma %s (with postcondition: %s) to match goal (%s)"
                              (Print.term_to_string tm)
                              (Print.term_to_string (U.mk_squash post))
                              (Print.term_to_string goal.goal_ty)
  