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:       (fun g i1 i2 -> Env.conj_guard g (Rel.teq env i1 i2))
        Env.trivial_guard c_is f_sort_is in
  
    let is = effect_args_from_repr lift_ct.result_typ (Env.is_layered_effect env tgt) r in
  
    let c = mk_Comp ({
      comp_univs = lift_ct.comp_univs;  //AR: TODO: not too sure about this
      effect_name = tgt;
      result_typ = a;
      effect_args = is |> List.map (SS.subst substs) |> List.map S.as_arg;
      flags = []  //AR: setting the flags to empty
    }) in
  
    if debug env <| Options.Other "LayeredEffects" then
      BU.print1 "} Lifted comp: %s\n" (Print.comp_to_string c);
  
    c, Env.conj_guard g guard_f
  
  (*
   * Creating the Env.mlift.mlift_term function for layered effects
  
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
  