anchor.diff:  
           let encoding = mkAnd(tm_has_type_with_fuel, refinement) in
   
  +        //earlier we used to get cvars from encoding
  +        //but mkAnd is optimized and when refinement is False, it returns False
  +        //in that case, cvars was turning out to be empty, resulting in non well-formed encoding (e.g. of hasEq, since free variables of base_t are not captured in cvars)
  +        //to get around that, computing cvars separately from the components of the encoding variable
           let cvars = BU.remove_dups fv_eq (Term.free_variables refinement @ Term.free_variables tm_has_type_with_fuel) in
           let cvars = cvars |> List.filter (fun (y, _) -> y <> x && y <> fsym) in
   
  
positive.code:               if is_impure lc && not (is_reifiable env.tcenv lc)
                then fallback() //we know it's not pure; so don't encode it precisely
                else
                  let cache_size = BU.smap_size env.cache in
                  let vars, guards, envbody, decls, _ = encode_binders None bs env in
                  let lc, body =
                    if is_reifiable env.tcenv lc
  
negative.code:                 in
                  let key_body = mkForall([], vars, mkImp(mk_and_l guards, body)) in
                  let cvars = Term.free_variables key_body in
                  //adding free variables of the return type also to cvars
                  let cvars =
                    match arrow_t_opt with
                    | None   -> cvars
  