anchor.diff:  
       | Tm_type _, Tm_type _
       | Tm_arrow _, Tm_arrow _ -> HeadMatch
  -
  -    | Tm_match _, Tm_match _ ->
  -    begin
  -      (* This flags causes a bunch of messages to be printed when `term_eq` fails,
  -       * useful to find the actual discrepancy. *)
  -      if debug env (Options.Other "RelDelta") then
  -          U.debug_term_eq := true;
  -      if U.term_eq t1 t2
  -      then FullMatch
  -      else MisMatch (None, None)
  -    end
   
       | Tm_app(head, _), Tm_app(head', _) -> head_matches env head head' |> head_match
       | Tm_app(head, _), _ -> head_matches env head t2 |> head_match
  
positive.code:         let t1 = force_refinement <| base_and_refinement env t1 in
          solve_t env ({problem with lhs=t1}) wl
  
        | Tm_match _, _
        | Tm_uinst _, _
        | Tm_name _, _
        | Tm_constant _, _
        | Tm_fvar _, _
        | Tm_app _, _
        | _, Tm_match _
        | _, Tm_uinst _
        | _, Tm_name _
        | _, Tm_constant _
  
negative.code:     commit sol;
      {wl with ctr=wl.ctr+1}
  
  let solve_prob (prob : prob) (logical_guard : option<term>) (uvis : list<uvi>) (wl:worklist) : worklist =
      def_check_prob "solve_prob.prob" prob;
      BU.iter_opt logical_guard (def_check_scoped "solve_prob.guard" prob);
      let conj_guard t g = match t, g with
  