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 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_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).