anchor.diff:   * let substs = [a/a_c; wp/wp_c; x_i/?u_i]
    *
    * We return M'<u_c> a_c i_i[substs]
  + *
  + * + we add wp (fun _ -> True) to the returned guard
    *)
   let lift_tf_layered_effect (tgt:lident) (lift_ts:tscheme) env (c:comp) : comp * guard_t =
     if Env.debug env <| Options.Other "LayeredEffects" then
  
positive.code:  * let c = M<u_c> a_c wp_c
   *
   * let lift_M_eff_name = (u, lift_t) where
   *   lift_t = a:Type u -> wp:M_wp a -> (x_i:t_i) -> f:(unit -> M a wp) -> repr<u> a i_1 ... i_n)
   *
   * We first instantiate lift_t with u_c
   *
  
negative.code:       (Ident.string_of_lid ct.effect_name) (Ident.string_of_lid tgt)
        s (Print.term_to_string lift_t) in
  
    let a_b, (rest_bs, [f_b]), lift_c =  //lift_c is the computation type of the lift combinator (PURE a wp)
      match (SS.compress lift_t).n with
      | Tm_arrow (bs, c) when List.length bs >= 2 ->
        let ((a_b::bs), c) = SS.open_comp bs c in
        a_b, bs |> List.splitAt (List.length bs - 1), c
      | _ ->
        raise_error (Errors.Fatal_UnexpectedEffect, lift_t_shape_error
          "either not an arrow or not enough binders") r in
  