anchor.diff:      defer_ok=true;
       smt_ok=true;
       umax_heuristic_ok=true;
  -    wl_implicits=[]
  +    wl_implicits=[];
  +    repr_subcomp_allowed=false;
   }
   
   let giveup env (reason : lstring) prob =
  
positive.code:     umax_heuristic_ok: bool;                    //whether or not it's ok to apply a structural match on umax us = umax us'
      tcenv:        Env.env;
      wl_implicits: implicits;                    //additional uvars introduced
  }
  
  (* --------------------------------------------------------- *)
  
negative.code:         in
          if Env.is_layered_effect env c2.effect_name
          then solve_layered_sub c1 edge c2
          else if not wl.repr_subcomp_allowed
                  && not (lid_equals c1.effect_name c2.effect_name)
                  && Env.is_reifiable_effect env c2.effect_name
                    // GM: What I would like to write instead of these two
                    // last conjuncts is something like
                    // [Option.isSome edge.mlift.mlift_term],
                    // but it seems that we always carry around a Some
                    // (fun _ _ e -> e) instead of a None even for
                    // primitive effects.
          then giveup env (mklstr (fun () -> BU.format2 "Cannot lift from %s to %s, it needs a lift\n"
                                              (string_of_lid c1.effect_name)
                                              (string_of_lid c2.effect_name)))
                          orig
          else let is_null_wp_2 = c2.flags |> BU.for_some (function TOTAL | MLEFFECT | SOMETRIVIAL -> true | _ -> false) in
               let wpc1, wpc2 = match c1.effect_args, c2.effect_args with
                | (wp1, _)::_, (wp2, _)::_ -> wp1, wp2
  