anchor.diff:        st2_app (st2_app (st2_pure f) a1) a2
     *)
     let c_lift2 =
  -    let t1 = S.gen_bv "t1" None U.ktype in
  -    let t2 = S.gen_bv "t2" None U.ktype in
  -    let t3 = S.gen_bv "t3" None U.ktype in
  +    let t1 = S.gen_bv "t1" None U.ktype0 in
  +    let t2 = S.gen_bv "t2" None U.ktype0 in
  +    let t3 = S.gen_bv "t3" None U.ktype0 in
       let t_f = U.arrow
         [ S.null_binder (S.bv_to_name t1); S.null_binder (S.bv_to_name t2) ]
         (S.mk_GTotal (S.bv_to_name t3))
  
positive.code:                     st2_app (st2_pure f) a1
    *)
    let c_lift1 =
      let t1 = S.gen_bv "t1" None U.ktype in
      let t2 = S.gen_bv "t2" None U.ktype in
      let t_f = U.arrow [ S.null_binder (S.bv_to_name t1) ] (S.mk_GTotal (S.bv_to_name t2)) in
      let f = S.gen_bv "f" None t_f in
      let a1 = S.gen_bv "a1" None (mk_gctx (S.bv_to_name t1)) in
      let ret = Some (Inl (U.lcomp_of_comp (mk_Total (mk_gctx (S.bv_to_name t2))))) in
      U.abs (binders_of_list [ t1, true; t2, true; f, false; a1, false ]) (
        U.mk_app c_app (List.map S.as_arg [
          unknown; unknown;
          U.mk_app c_pure (List.map S.as_arg [ unknown; S.bv_to_name f ]);
          S.bv_to_name a1 ])
      ) ret
    in
    check env "lift1" (U.abs (binders @ [ S.mk_binder a ]) c_lift1 None);
  
  
    (* val st2_liftGA2 : #heap:Type -> #a:Type -> #t1:Type -> #t2:Type -> #t3:Type ->
  
negative.code:                         Tot (st2_wp heap a)
      let st2_close_wp heap a b f = st2_app (st2_pure l_Forall) (st2_push f) *)
    let wp_close =
      let b = S.gen_bv "b" None U.ktype0 in
      let t_f = U.arrow [ S.null_binder (S.bv_to_name b) ] (S.mk_Total wp_a) in
      let f = S.gen_bv "f" None t_f in
      let body =
        U.mk_app c_app (List.map S.as_arg [
          U.mk_app c_pure (List.map S.as_arg [ tforall ]);
          U.mk_app c_push (List.map S.as_arg [ S.bv_to_name f ])])
      in
      U.abs (S.binders_of_list [ a; b; f ]) body ret_tot_wp_a
    in
  