Notation val_inject:= Val.inject.

(* Specifications: *)
Lemma valid_block_dec: forall m b, {Mem.valid_block m b} + {~Mem.valid_block m b}.
Lemma Forall2_length {A B} {f:A -> B -> Prop} {l1 l2} (F:Forall2 f l1 l2): length l1 = length l2.
Lemma Forall2_Zlength {A B} {f:A -> B -> Prop} {l1 l2} (F:Forall2 f l1 l2): Zlength l1 = Zlength l2.
Lemma pos_succ_plus_assoc: forall n m, (Pos.succ n + m = n + Pos.succ m)%positive.
Lemma mem_unchanged_on_sub: forall (P Q: block -> BinInt.Z -> Prop) m m', Mem.unchanged_on Q m m' -> (forall b ofs, P b ofs -> Q b ofs) -> Mem.unchanged_on P m m'.
Lemma mem_unchanged_on_sub_strong: forall (P Q: block -> BinInt.Z -> Prop) m m', Mem.unchanged_on Q m m' -> (forall b ofs, Mem.valid_block m b -> P b ofs -> Q b ofs) -> Mem.unchanged_on P m m'.
Lemma inject_separated_same_meminj: forall j m m', Events.inject_separated j j m m'.
Lemma compose_meminj_idR: forall j, j = compose_meminj j inject_id.
Lemma compose_meminj_idL: forall j, j = compose_meminj inject_id j.
Theorem drop_extends: forall m1 m2 lo hi b p m1', Mem.extends m1 m2 -> Mem.drop_perm m1 b lo hi p = Some m1' -> exists m2', Mem.drop_perm m2 b lo hi p = Some m2' /\ Mem.extends m1' m2'.
Lemma mem_inj_id_trans: forall m1 m2 (Inj12: Mem.mem_inj inject_id m1 m2) m3 (Inj23: Mem.mem_inj inject_id m2 m3),Mem.mem_inj inject_id m1 m3.
Lemma extends_trans: forall m1 m2 (Ext12: Mem.extends m1 m2) m3 (Ext23: Mem.extends m2 m3), Mem.extends m1 m3.
Lemma memval_inject_id_refl: forall v, memval_inject inject_id v v.
Lemma extends_refl: forall m, Mem.extends m m.
Lemma perm_decE: forall m b ofs k p PF, (Mem.perm_dec m b ofs k p = left PF <-> Mem.perm m b ofs k p).
Lemma flatinj_E: forall b b1 b2 delta (H:Mem.flat_inj b b1 = Some (b2, delta)), b2=b1 /\ delta=0 /\ Plt b2 b.
Lemma flatinj_I: forall bb b, Plt b bb -> Mem.flat_inj bb b = Some (b, 0).
Lemma flatinj_mono: forall b b1 b2 b' delta (F: Mem.flat_inj b1 b = Some (b', delta)), Plt b1 b2 -> Mem.flat_inj b2 b = Some (b', delta).