.
Proof.
).
Proof.
'.
Proof.
'.
Proof.
.
Proof.
).
Proof.
'.
Proof.
).
Proof.
.
Proof.
'.
Proof.
.
Proof.
).
Proof.
).
Proof.
unfold corestep_locality_1.
intros.
pose proof H as R.
inv H.
inv H1.
inv H2.
{
destruct H0 as [
Memeq Fleq].
unfold exec_instr in H4.
unfold exec_instr_fp in *.
ex_match;
subst;
try (
inv H4;
exists (
strip (
combine m0 (
Mem.freelist m'0)(
Mem.nextblockid m'0) (
FreelistEq_mem_fl_wd _ _ Fleq)));
split;[
econstructor;
eauto;[
eapply gmem_fl_wd_embed;
eauto|
econstructor;
eauto;
unfold exec_instr;
eauto;
try rewrite Hx1;
try rewrite Hx2;
try rewrite Hx0;
try rewrite Hx3;
eauto]|
rewrite strip_combine;
split;
auto;
apply MemPostemp];
fail);
try (
unfold goto_label in H4;
ex_match;
inv H4;
inv H;
exists (
strip (
combine m0 (
Mem.freelist m'0)(
Mem.nextblockid m'0) (
FreelistEq_mem_fl_wd _ _ Fleq)));
split;[
econstructor;
eauto;[
eapply gmem_fl_wd_embed;
eauto|
econstructor;
eauto;
unfold exec_instr,
goto_label;
try rewrite Hx;
try rewrite Hx0;
try rewrite Hx1;
try rewrite Hx2;
try rewrite Hx;
try rewrite Hx0;
try rewrite Hx1;
try rewrite Hx2;
eauto]|
rewrite strip_combine;
split;
auto;
apply MemPostemp];
fail);
try (
unfold exec_load,
exec_load_fp in *;
ex_match;
inv H4;
eapply MemPre_mem_loadv_eq in Hx as ?;
eauto;
exists (
strip (
combine m0 (
Mem.freelist m'0)(
Mem.nextblockid m'0) (
FreelistEq_mem_fl_wd m'0
m0 Fleq)));
split;[
econstructor;
eauto;[
eapply gmem_fl_wd_embed;
eauto|
econstructor;
eauto;
unfold exec_instr,
exec_load;
try rewrite Hx;
eauto;
erewrite H0;
eauto]|
rewrite strip_combine;
split;
auto;
apply MemPost_loadv_fp];
fail);
try (
unfold exec_store,
exec_store_fp in *;
ex_match;
inv H4;
eapply LPre_mem_storev_LPost with(
Fleq:=
Fleq)
in Hx as ?;
eauto;
Hsimpl;
eexists;
split;
eauto;
econstructor;
eauto;[
eapply gmem_fl_wd_embed|];
econstructor;
eauto;
unfold exec_instr,
exec_store;
try rewrite H0;
auto;
fail).
all:
try (
try erewrite MemPre_check_compare_ints_eq in Hx1;
try eapply MemPre_compare_ints_LPost with(
Fleq:=
Fleq)
in H4;
try eapply MemPre_compare_longs_LPost with(
Fleq:=
Fleq)
in H4;
eauto;
Hsimpl;
subst;
eexists;
split;
eauto;
econstructor;
try eapply gmem_fl_wd_embed with(
wd:=
FreelistEq_mem_fl_wd m'0
m0 Fleq);
eauto;
econstructor;
eauto;
unfold exec_instr;
try rewrite Hx0;
eauto;
auto;
fail).
{
erewrite MemPre_check_compare_ints_eq in Hx1;
eauto.
eapply MemPre_compare_ints_LPost with (
Fleq:=
Fleq)
in H4;
eauto.
Hsimpl.
subst.
eexists;
split;
eauto.
econstructor;
eauto.
eapply gmem_fl_wd_embed with (
wd:=
FreelistEq_mem_fl_wd m'0
m0 Fleq).
econstructor;
eauto;
unfold exec_instr;
try rewrite Hx0,
Hx1;
eauto. }
{
erewrite MemPre_check_compare_ints_eq in Hx1;
eauto.
eapply MemPre_compare_ints_LPost with (
Fleq:=
Fleq)
in H4;
eauto.
Hsimpl.
subst.
eexists;
split;
eauto.
econstructor;
eauto.
eapply gmem_fl_wd_embed with (
wd:=
FreelistEq_mem_fl_wd m'0
m0 Fleq).
econstructor;
eauto;
unfold exec_instr;
try rewrite Hx0,
Hx1;
eauto. }
{
eapply MemPre_mem_alloc_LPost with(
Fleq:=
Fleq)
in Hx0 as ?;[|
eapply MemPre_subset;
eauto;
eapply FP.union_subset].
Hsimpl.
assert(
LPre (
strip m1)
m0 (
FP.union (
FMemOpFP.alloc_fp m1 0
sz)(
FP.union(
FMemOpFP.storev_fp AST.Mptr (
Values.Val.offset_ptr (
Values.Vptr b0 Integers.Ptrofs.zero)
ofs_link))(
FMemOpFP.storev_fp AST.Mptr (
Values.Val.offset_ptr (
Values.Vptr b0 Integers.Ptrofs.zero)
ofs_ra)))) (
Mem.freelist m1)).
split;
auto.
apply mem_alloc_eff in Hx0 as e1.
apply mem_alloc_eff in H0 as e2.
rewrite strip_combine in e2.
eapply LPre_LEffect_LPost_Rule in H6;
eauto.
pose proof Hx0 as A1.
apply Mem.alloc_freelist in Hx0.
rewrite<-
Hx0 in H6.
assert(
LPre (
strip m)(
strip x) (
FMemOpFP.storev_fp AST.Mptr (
Values.Val.offset_ptr (
Values.Vptr b0 Integers.Ptrofs.zero)
ofs_link))(
Mem.freelist m)).
eapply LPre_subset;
eauto.
apply FP.union_subset.
pose proof H7 as [
Mempre2 Fleq2].
eapply LPre_mem_storev_LPost with(
Fleq:=
Fleq2)
in Mempre2 as ?;
eauto;
Hsimpl.
apply mem_storev_eff in Hx1 as e3.
apply mem_storev_eff in H8 as e4.
apply LPost_comm in H9.
apply LPost_comm in H5.
eapply LPost_LEffect_LPost_Rule in H9 as Lp1;
try apply e3;
try apply e4;
try rewrite strip_combine;
eauto.
apply LPost_comm in H9.
rewrite strip_combine in e4.
eapply LPre_LEffect_LPost_Rule in H9 as ?;
try apply e3;
try apply e4;
eauto.
apply mem_storev_fleq in Hx1.
rewrite Hx1 in H12.
pose proof H12 as [
Mempre3 Fleq3].
eapply LPre_mem_storev_LPost with(
Fleq:=
Fleq3)
in Mempre3 as ?;
eauto;
Hsimpl.
apply mem_storev_eff in Hx2 as e5.
apply mem_storev_eff in H13 as e6.
apply mem_storev_fleq in Hx2.
rewrite<-
Hx1,
Hx0 in H14.
apply LPost_comm in H14.
eapply LPost_LEffect_LPost_Rule in H14;
try apply e5;
try apply e6;
eauto.
inv H4.
rewrite<-
FP.fp_union_assoc in H14.
apply LPost_comm in H14.
Esimpl;
eauto.
econstructor;
eauto.
eapply gmem_fl_wd_embed.
econstructor;
eauto.
unfold exec_instr.
rewrite H0.
assert(
Mem.freelist x =
Mem.freelist m /\
Mem.nextblockid x =
Mem.nextblockid m).
Local Transparent Mem.alloc.
revert A1 H0;
clear;
unfold Mem.alloc;
intros.
inv A1;
inv H0.
simpl.
auto.
destruct H4.
assert(
x =(
combine (
strip x) (
Mem.freelist m) (
Mem.nextblockid m)
(
FreelistEq_mem_fl_wd m (
strip x)
Fleq2))).
pose proof combine_refl x.
pose proof combine_equiv2 (
strip x) (
Mem.freelist x)(
Mem.freelist m) (
Mem.nextblockid x) (
Mem.nextblockid m)(
fmem_strip_fl_wd x) (
FreelistEq_mem_fl_wd m (
strip x)
Fleq2)
H4 H17.
congruence.
rewrite <-
H18 in *.
rewrite H8.
rewrite strip_combine in *.
assert(
x0 = (
combine (
strip x0) (
Mem.freelist m2) (
Mem.nextblockid m2)
(
FreelistEq_mem_fl_wd m2 (
strip x0)
Fleq3))).
pose proof combine_refl x0.
pose proof combine_equiv2 (
strip x0) (
Mem.freelist x0)(
Mem.freelist m2) (
Mem.nextblockid x0) (
Mem.nextblockid m2)(
fmem_strip_fl_wd x0) (
FreelistEq_mem_fl_wd m2 (
strip x0)
Fleq3).
Hsimpl.
congruence.
rewrite <-
H19 in *.
rewrite H13.
auto.
unfold exec_instr_fp;
rewrite H0;
auto.
}
{
eapply LPre_mem_free_LPost with(
Fleq:=
Fleq)
in Hx3 as ?;
eauto.
Focus 2.
eapply MemPre_subset;
eauto.
rewrite FP.union_comm_eq;
apply FP.union_subset.
Hsimpl.
inv H4.
apply LPost_comm in H2.
eapply MemPre_mem_loadv_eq with(
Fleq:=
Fleq)
in Hx0 as ?;
eauto.
Focus 2.
eapply MemPre_subset;
eauto.
rewrite<-
FP.fp_union_assoc.
apply FP.union_subset.
eapply MemPre_mem_loadv_eq with(
Fleq:=
Fleq)
in Hx1 as ?;
eauto.
Focus 2.
eapply MemPre_subset;
eauto.
rewrite FP.union_comm_eq with(
fp2:= (
FMemOpFP.loadv_fp AST.Mptr(
Values.Val.offset_ptr (
Values.Vptr b0 i0)
ofs_link))),<-
FP.fp_union_assoc.
apply FP.union_subset.
Esimpl;
eauto.
econstructor;
eauto.
eapply gmem_fl_wd_embed.
instantiate(2:=(
Mem.nextblockid m1)).
instantiate(1:=
FreelistEq_mem_fl_wd m1 m0 Fleq).
econstructor.
eauto.
eauto.
eauto.
unfold exec_instr.
rewrite Hx2,
H4,
H7,
H0;
auto.
unfold exec_instr_fp.
rewrite Hx2.
auto.
}
}
{
destruct H0 as [
Mempre Fleq].
exists m0.
split;
auto.
pose proof FreelistEq_mem_fl_wd _ _ Fleq.
econstructor .
eapply gmem_fl_wd_embed;
eauto.
econstructor 2;
eauto.
Focus 2.
rewrite strip_combine;
eauto.
eapply LPre_evalbuiltin_args_equiv;
eauto.
split;
auto.
apply MemPost_effect_emp.
revert H6.
clear.
revert rs ge fp.
induction args.
intros.
inv H6.
unfold FP.emp,
effects;
simpl.
apply Locs.union_refl.
intros.
inv H6.
eapply IHargs in H2.
enough(
Locs.eq (
effects fp1)
Locs.emp).
apply Locs.locs_eq in H.
apply Locs.locs_eq in H2.
rewrite effects_union.
rewrite H,
H2.
apply Locs.union_refl.
clear args H2 IHargs fp2.
revert rs ge fp1 H1.
induction a;
intros;
inv H1;
try(
unfold effects;
simpl;
apply Locs.union_refl;
fail);
try apply loadv_fp_emp_effects.
apply IHa1 in H2.
apply IHa2 in H3.
rewrite effects_union.
apply Locs.locs_eq in H2.
apply Locs.locs_eq in H3.
rewrite H2,
H3.
apply Locs.union_refl.
}
{
destruct H0.
assert(
forall m args rs ef,
extcall_arguments rs m ef args ->
forall m'
fp ,
MemPre (
strip m)(
strip m')
fp ->
FreelistEq (
strip m)(
strip m')(
Mem.freelist m) ->
ASM_local.extcall_arguments_fp rs ef fp ->
extcall_arguments rs m'
ef args).
clear.
unfold extcall_arguments,
ASM_local.extcall_arguments_fp.
induction 1;
intros.
constructor.
inv H3.
econstructor;
eauto.
Focus 2.
eapply IHlist_forall2;
try apply H7;
eauto.
eapply MemPre_subset.
eapply FP.union_subset.
rewrite FP.union_comm_eq;
eauto.
pose proof FP.union_subset fp1 fp2.
eapply MemPre_subset in H1;
eauto.
revert H H1 H2 H6.
clear;
intros.
inv H;
constructor.
inv H0.
constructor.
econstructor;
eauto.
inv H6.
inv H0.
eapply MemPre_mem_loadv_eq2;
eauto.
inv H0;
econstructor;
eauto.
inv H6.
inv H5.
eapply MemPre_mem_loadv_eq2;
eauto.
eapply MemPre_subset;
eauto.
eapply FP.union_subset.
inv H3;
econstructor;
eauto.
inv H6.
inv H7.
eapply MemPre_mem_loadv_eq2;
eauto.
eapply MemPre_subset;
eauto.
rewrite FP.union_comm_eq.
eapply FP.union_subset.
remember (
combine m0 (
Mem.freelist m'0)(
Mem.nextblockid m'0)(
FreelistEq_mem_fl_wd m'0
m0 H2))
as m1.
assert(
strip m1 =
m0).
rewrite Heqm1,
strip_combine;
auto.
pose proof H2 as L.
rewrite <-
H6 in *.
eapply H5 in H4 as ?;
eauto.
assert(
embed m0 (
Mem.freelist m'0)
m1).
econstructor;
eauto.
rewrite Heqm1;
auto.
exists m0.
split.
econstructor.
rewrite H6.
eauto.
econstructor;
eauto.
auto.
split;
auto.
apply MemPost_effect_emp.
revert H4.
clear;
intros.
unfold ASM_local.extcall_arguments_fp in H4.
induction H4.
unfold FP.emp,
effects;
simpl.
apply Locs.union_refl.
rewrite <-
H0.
rewrite effects_union.
apply Locs.locs_eq in IHload_arguments_fp.
rewrite IHload_arguments_fp.
rewrite Locs.locs_union_emp.
clear fp2 H0 H4 fp pll IHload_arguments_fp.
inv H.
inv H0.
unfold FP.emp,
effects;
apply Locs.union_refl.
apply loadv_fp_emp_effects.
inv H0;
inv H1.
rewrite FP.fp_union_emp.
unfold FP.emp,
effects;
apply Locs.union_refl.
rewrite FP.emp_union_fp.
apply loadv_fp_emp_effects.
rewrite FP.fp_union_emp.
apply loadv_fp_emp_effects.
rewrite effects_union.
pose proof loadv_fp_emp_effects.
specialize (
H (
AST.chunk_of_type ty)(
Values.Val.offset_ptr (
rs (
Asm.IR Asm.RSP))(
Integers.Ptrofs.repr (
Stacklayout.fe_ofs_arg + 4 *
ofs))))
as ?.
specialize (
H (
AST.chunk_of_type ty0) (
Values.Val.offset_ptr (
rs (
Asm.IR Asm.RSP))(
Integers.Ptrofs.repr (
Stacklayout.fe_ofs_arg + 4 *
ofs0)))).
apply Locs.locs_eq in H.
apply Locs.locs_eq in H0.
rewrite H,
H0.
apply Locs.union_refl.
}
{
exists m0.
split;
auto.
econstructor;
eauto;[|
econstructor;
eauto|].
eapply gmem_fl_wd_embed;
eauto.
rewrite strip_combine.
auto.
destruct H0;
split;
auto.
apply MemPostemp.
}
{
pose proof H0 as [
Memeq Fleq].
eapply MemPre_mem_alloc_LPost with(
Fleq:=
Fleq)
in H1 as ?;
eauto.
Focus 2.
eapply MemPre_subset;
eauto.
apply FP.union_subset.
Hsimpl.
apply mem_alloc_eff in H1 as e1.
apply mem_alloc_eff in H2 as e2.
rewrite strip_combine in e2.
eapply LPre_LEffect_LPost_Rule in H5 as ?;
eauto.
pose proof H6 as [
Memeq2 Fleq2].
apply mem_alloc_fleq in H1 as fleq1.
rewrite fleq1 in Fleq2.
eapply Mempre_store_args_rec_fmem_LPost with(
Fleq:=
Fleq2)
in Memeq2 as ?;
eauto.
Hsimpl.
apply store_args_eff in H7 as e4.
apply store_args_eff in H4 as e3.
rewrite strip_combine in *.
simpl in e4.
eapply LPost_LEffect_LPost_Rule in H8 as ?;
try apply e3;
eauto.
rewrite <-
fleq1 in H11.
unfold store_args_fp.
apply store_args_fleq in H4 as fleq2.
pose proof combine_refl x as R1.
pose proof combine_equiv2 (
strip x) (
Mem.freelist x)(
Mem.freelist m2) (
Mem.nextblockid x) (
Mem.nextblockid m2)(
fmem_strip_fl_wd x) (
FreelistEq_mem_fl_wd m2 (
strip x)
Fleq2).
assert(
Mem.freelist x =
Mem.freelist m2).
apply Mem.alloc_freelist in H2.
rewrite H2.
simpl.
auto.
assert(
Mem.nextblockid x =
Mem.nextblockid m2).
unfold Mem.alloc in H2.
inv H2.
simpl.
unfold Mem.alloc in H1.
inv H1.
simpl.
auto.
Hsimpl.
Esimpl;
eauto.
econstructor;
eauto.
eapply gmem_fl_wd_embed.
econstructor;
eauto.
unfold store_args_fmem.
rewrite R1,
H12;
auto.
}
{
exists m0. destruct H0;split;econstructor;eauto;try apply MemPostemp.
Focus 2. econstructor;eauto.
eapply gmem_fl_wd_embed;eauto. rewrite strip_combine;eauto.
}
{
destruct H0 as [Memeq Fleq].
unfold exec_locked_instr in H4.
ex_match;subst.
{
unfold exec_load,exec_load_fp in *;ex_match;inv H4.
eapply MemPre_mem_loadv_eq in Hx as ?;eauto.
exists (strip (combine m0 (Mem.freelist m'0)(Mem.nextblockid m'0) (FreelistEq_mem_fl_wd m'0 m0 Fleq)));split;[econstructor;eauto;[eapply gmem_fl_wd_embed;eauto|econstructor;eauto;unfold exec_locked_instr,exec_load;try rewrite Hx;eauto;erewrite H0;eauto]| rewrite strip_combine;split;auto;apply MemPost_loadv_fp].
}
{
unfold exec_store,exec_store_fp in *;ex_match;inv H4.
eapply LPre_mem_storev_LPost with(Fleq:=Fleq) in Hx1 as ?;eauto;Hsimpl.
Focus 2. unfold exec_locked_instr_fp in Memeq. eapply MemPre_subset;eauto. rewrite FP.union_comm_eq. apply FP.union_subset.
eapply MemPre_mem_loadv_eq in Hx0 as ?;eauto.
Focus 2. unfold exec_locked_instr_fp in Memeq. eapply MemPre_subset;eauto. apply FP.union_subset.
eexists. split;eauto. econstructor;eauto. apply gmem_fl_wd_embed.
econstructor;eauto. unfold exec_locked_instr.
rewrite H0. rewrite H6. eauto.
unfold exec_locked_instr_fp.
rewrite FP.union_comm_eq.
destruct H2;split;auto.
unfold MemPost.
rewrite effects_union.
apply unchanged_content_union2;auto.
apply MemPost_effect_emp. apply loadv_fp_emp_effects.
}
{
unfold exec_store,exec_store_fp in *;ex_match;inv H4.
eapply LPre_mem_storev_LPost with(Fleq:=Fleq) in Hx3 as ?;eauto;Hsimpl.
Focus 2. unfold exec_locked_instr_fp in Memeq. eapply MemPre_subset;eauto.
rewrite Hx0,Hx1,FP.fp_union_assoc,FP.union_comm_eq;apply FP.union_subset.
eapply MemPre_mem_loadv_eq in Hx0 as ?;eauto.
Focus 2. unfold exec_locked_instr_fp in Memeq. eapply MemPre_subset;eauto.
rewrite Hx0,Hx1. apply FP.union_subset.
pose proof Hx1 as ?.
enough(E1: MemPre (strip m1)(strip(combine m0 (Mem.freelist m1) (Mem.nextblockid m1)(FreelistEq_mem_fl_wd m1 m0 Fleq)))((Cop_fp.cmpu_bool_fp_total m1 Integers.Ceq v (rs (Asm.IR Asm.RAX))))).
erewrite MemPre_cmpu_valid_pointer_ceq in Hx1;eauto.
Focus 2. eapply MemPre_subset;eauto.
Focus 2. rewrite strip_combine. eauto.
unfold exec_locked_instr_fp.
rewrite Hx0,Hx1,FP.union_comm_eq,<- FP.fp_union_assoc.
rewrite cmpu_bool_fp_total_eq.
apply FP.union_subset.
eexists. split;eauto. econstructor;eauto. apply gmem_fl_wd_embed.
econstructor;eauto. unfold exec_locked_instr.
rewrite H0. rewrite H6. rewrite Hx1. eauto.
unfold exec_locked_instr_fp.
rewrite H6. rewrite Hx0. rewrite Hx1.
erewrite MemPre_cmpu_valid_pointer_ceq,Hx1.
f_equal. f_equal.
Focus 3. destruct H2.
split;auto.
unfold MemPost,exec_locked_instr_fp. rewrite Hx0,H7.
rewrite effects_union.
apply unchanged_content_union2;auto.
apply MemPost_effect_emp. apply loadv_fp_emp_effects.
rewrite effects_union.
apply unchanged_content_union2;auto.
apply MemPost_effect_emp.
rewrite cmpu_bool_fp_total_eq.
apply cmpu_bool_fp_effemp.
rewrite strip_combine in *. auto. do 2 rewrite cmpu_bool_fp_total_eq.
eapply LPre_cmpu_bool_fp_total_eq;eauto.
rewrite strip_combine.
eapply MemPre_subset;eauto.
unfold exec_locked_instr_fp. rewrite Hx0,H7.
rewrite FP.union_comm_eq. rewrite <- FP.fp_union_assoc.
rewrite cmpu_bool_fp_total_eq.
eapply FP.union_subset.
}
{
inv H4.
unfold exec_locked_instr_fp in *.
rewrite Hx0 in *. rewrite Hx1 in *.
enough(MemPre (strip m'0) m0 ((Cop_fp.cmpu_bool_fp_total m'0 Integers.Ceq v (rs (Asm.IR Asm.RAX))))).
enough(MemPre (strip m'0) m0 (FMemOpFP.loadv_fp AST.Mint32 (ASM_local.eval_addrmode ge a rs))).
eexists;split. econstructor;eauto. eapply gmem_fl_wd_embed.
econstructor;eauto. unfold exec_locked_instr.
erewrite MemPre_mem_loadv_eq.
erewrite MemPre_cmpu_valid_pointer_ceq. rewrite Hx1.
eauto.
rewrite strip_combine.
apply MemPre_comm.
erewrite LPre_cmpu_bool_fp_total_eq;eauto. eauto. eauto.
unfold exec_locked_instr_fp.
erewrite MemPre_mem_loadv_eq;eauto.
erewrite MemPre_cmpu_valid_pointer_ceq;eauto. rewrite Hx1.
f_equal. f_equal. erewrite LPre_cmpu_bool_fp_eq;eauto.
{
eapply MemPre_subset;try apply H0.
unfold Cop_fp.of_optfp,Cop_fp.cmpu_bool_fp,Cop_fp.cmpu_bool_fp_total.
ex_match2;try inv Hx;try apply FP.subset_refl.
}
rewrite strip_combine.
erewrite LPre_cmpu_bool_fp_total_eq;eauto.
apply MemPre_comm;auto.
rewrite strip_combine.
split;auto.
unfold MemPost. rewrite effects_union;apply unchanged_content_union2.
apply MemPost_effect_emp. apply loadv_fp_emp_effects.
apply MemPost_effect_emp.
apply cmpu_bool_fp_effemp0.
eapply MemPre_subset;try apply Memeq;eauto. apply FP.union_subset.
eapply MemPre_subset;eauto. rewrite FP.union_comm_eq.
assert(FP.subset (Cop_fp.cmpu_bool_fp_total m'0 Integers.Ceq v (rs (Asm.IR Asm.RAX)))(ASM_local.of_optfp (Cop_fp.cmpu_bool_fp m'0 Integers.Ceq v (rs (Asm.IR Asm.RAX))))).
unfold Cop_fp.cmpu_bool_fp,Cop_fp.cmpu_bool_fp_total,ASM_local.of_optfp.
ex_match2;try apply FP.subset_refl.
eapply FP.subset_union_subset;eauto.
}
} *)
Unshelve.
auto.
Focus 2.
destruct H0.
eapply FreelistEq_mem_fl_wd in f;
eauto.
Focus 2. eapply FreelistEq_mem_fl_wd;eauto.
eauto. *)Qed.
').
Proof.
).
Proof.
.
Proof.
.
Proof.