anchor.diff:                      (lhs:flex_t) (bs_lhs:binders) (t_res_lhs:term)
                       (rhs:term)
           : solution =
  +        //if Env.debug env <| Options.Other "RelCheck"
  +        //then printfn "imitate_app 1:\n\tlhs=%s\n\tbs_lhs=%s\n\tt_res_lhs=%s\n\trhs=%s\n"
  +        //    (flex_t_to_string lhs)
  +        //    (Print.binders_to_string ", " bs_lhs)
  +        //    (Print.term_to_string t_res_lhs)
  +        //    (Print.term_to_string rhs);
           let bs_lhs_args = List.map (fun (x, i) -> S.bv_to_name x, i) bs_lhs in
           let rhs_hd, args = U.head_and_args rhs in
           let args_rhs, last_arg_rhs = BU.prefix args in
           let rhs' = S.mk_Tm_app rhs_hd args_rhs None rhs.pos in
  +        //if Env.debug env <| Options.Other "RelCheck"
  +        //then printfn "imitate_app 2:\n\trhs'=%s\n\tlast_arg_rhs=%s\n"
  +        //            (Print.term_to_string rhs')
  +        //            (Print.args_to_string [last_arg_rhs]);
           let t_lhs, u_lhs, _lhs_args = lhs in
           let lhs', lhs'_last_arg, wl =
                 let _, t_last_arg, wl = copy_uvar u_lhs (fst <| U.type_u()) wl in
  
positive.code:     let rec aux pat_binders formals t_res args =
          match formals, args with
          | [], []
          |  _, [] -> Some (List.rev pat_binders, t_res)
  
          | (formal, _)::formals, (a, _)::args ->
              begin
  
negative.code:     | Flex_rigid -> 3
      | Rigid_flex -> 4
      | Flex_flex -> 5
  let rank_leq r1 r2 = rank_t_num r1 <= rank_t_num r2
  let rank_less_than r1 r2 =
      //writing it as `rank_t_num r1 < rank_t_num r2`
      //doesn't parse in the F# build of F* with #light "off" (!)
      r1 <> r2 &&
      rank_t_num r1 <= rank_t_num r2
  let compress_tprob tcenv p = {p with lhs=whnf tcenv p.lhs; rhs=whnf tcenv p.rhs}
  
  let compress_prob tcenv p =
  