Inductive match_freelists (j:meminj): list (block * Z * Z) -> list (block * Z * Z) -> Prop :=
  match_freelists_nil: match_freelists j nil nil
| match_freelists_cons: forall b1 lo1 hi1 t1 b2 lo2 hi2 t2 delta,
        j b1 = Some (b2,delta) ->
        lo2 = lo1+delta -> hi2 = hi1+delta ->
        match_freelists j t1 t2 ->
        match_freelists j ((b1,lo1,hi1)::t1) ((b2,lo2,hi2)::t2).Inductive match_freelists (j:meminj): list (block * Z * Z) -> list (block * Z * Z) -> Prop :=
  match_freelists_nil: match_freelists j nil nil
| match_freelists_cons: forall b1 lo1 hi1 t1 b2 lo2 hi2 t2 delta,
        j b1 = Some (b2,delta) ->
        lo2 = lo1+delta -> hi2 = hi1+delta ->
        match_freelists j t1 t2 ->
        match_freelists j ((b1,lo1,hi1)::t1) ((b2,lo2,hi2)::t2).Inductive match_freelists (j:meminj): list (block * Z * Z) -> list (block * Z * Z) -> Prop :=
  match_freelists_nil: match_freelists j nil nil
| match_freelists_cons: forall b1 lo1 hi1 t1 b2 lo2 hi2 t2 delta,
        j b1 = Some (b2,delta) ->
        lo2 = lo1+delta -> hi2 = hi1+delta ->
        match_freelists j t1 t2 ->
        match_freelists j ((b1,lo1,hi1)::t1) ((b2,lo2,hi2)::t2).

Lemma core_initial_wd_as_inj : forall {F1 V1 F2 V2} (ge1: Genv.t F1 V1) (ge2: Genv.t F2 V2) vals1 m1 j vals2 m2 DomS DomT (MInj: Mem.inject j m1 m2) (VInj: Forall2 (val_inject j) vals1 vals2) (HypJ: forall b1 b2 d, j b1 = Some (b2, d) -> DomS b1 = true /\ DomT b2 = true) (R: forall b, REACH m2 (fun b' => isGlobalBlock ge2 b' || getBlocks vals2 b') b = true -> DomT b = true) (PG: meminj_preserves_globals ge1 j) (GenvsDomEQ: genvs_domain_eq ge1 ge2) (HS: forall b, DomS b = true -> Mem.valid_block m1 b) (HT: forall b, DomT b = true -> Mem.valid_block m2 b) mu (Hmu: mu = initial_SM DomS DomT (REACH m1 (fun b => isGlobalBlock ge1 b || getBlocks vals1 b)) (REACH m2 (fun b => isGlobalBlock ge2 b || getBlocks vals2 b)) j), (forall b, REACH m1 (fun b' => isGlobalBlock ge1 b' || getBlocks vals1 b') b = true -> DomS b = true) /\ SM_wd mu /\ sm_valid mu m1 m2 /\ meminj_preserves_globals ge1 (as_inj mu) /\ (forall b, isGlobalBlock ge1 b = true -> frgnBlocksSrc mu b = true).