let local_scope m vars scope_kind p =
    let vmh = m.vbits in
    let mh = F.var vmh in
    let do_var p v =
      let alloc v p =
        Wp_parameters.debug ~dkey "[local_scope] alloc %s@." v.vname;
        let ma = RtLib.alloc mh (name_of_var v) in
        let p = L.subst vmh ma p in
        p
      in
(*
      let init v p = (* initialize parameter : v@Here = v@Pre *)
        let m_pre = mem_at env Clabels.Pre in
        let v_loc = cvar m_here v in
        let v_pre = load m_pre t v_loc in
        let p = subst_lval env t v_loc v_pre p in
        p
      in
*)

        let p = match scope_kind with
        | Mcfg.SC_Function_in ->
            let p = alloc v p in p
            (*
              let p = match logic_of_mem (mem_at env Clabels.Pre) with
              | None -> p
              | Some tbl ->
                try let lv = Varinfo.Hashtbl.find tbl v in
                  L.forall [lv] p
                with Not_found -> p
            in p *)

        | Mcfg.SC_Function_frame ->
            (* let p = init v p in  *)
            let p = alloc v p in
            p
        | Mcfg.SC_Block_in ->
            let p = alloc v p in
            (*let h = add_int_format_hyp (name_of_var v) t F.p_true in
             F.p_implies h p
             *)
 p
        | Mcfg.SC_Block_out | Mcfg.SC_Function_out ->
            Wp_parameters.debug ~dkey "[local_scope] free %s@." v.vname;
            L.subst vmh (RtLib.free mh (name_of_var v)) p
        | Mcfg.SC_Global -> (* nothing to do *) p
      in p
    in List.fold_left do_var p vars