Definition globals_separate {F V:Type} (ge: Genv.t F V) mu nu :=
    forall b1 b2 d, as_inj mu b1 = None ->
            as_inj nu b1 =Some(b2,d) ->
            isGlobalBlock ge b2 = false.

(* Specifications: *)
Lemma gsep_refl: forall {F V} mu (ge: Genv.t F V), globals_separate ge mu mu.
Lemma gsep_domain_eq: forall {F1 F2 V1 V2} mu mu' (ge1: Genv.t F1 V1) (ge2: Genv.t F2 V2), globals_separate ge1 mu mu' -> genvs_domain_eq ge1 ge2 -> globals_separate ge2 mu mu'.
Lemma gsep_trans: forall {F V} (ge: Genv.t F V) mu mu' mu'', Values.inject_incr (as_inj mu') (as_inj mu'') -> globals_separate ge mu mu' -> globals_separate ge mu' mu'' -> globals_separate ge mu mu''.
Lemma gsep_trans': forall {F V} (ge: Genv.t F V) mu mu' mu'', SM_wd mu'' -> intern_incr mu' mu'' -> globals_separate ge mu mu' -> globals_separate ge mu' mu'' -> globals_separate ge mu mu''.
Lemma meminj_preserves_globals_extern_incr_separate {F V:Type} (ge: Genv.t F V) mu nu: forall (INC: extern_incr mu nu) (PG: meminj_preserves_globals ge (as_inj mu)) (WDnu: SM_wd nu) (GSep: globals_separate ge mu nu), meminj_preserves_globals ge (as_inj nu).
Lemma meminj_preserves_globals_intern_incr_separate {F V:Type} (ge': Genv.t F V) mu nu: forall (INC: intern_incr mu nu) (PG: meminj_preserves_globals ge' (as_inj mu)) (WDnu: SM_wd nu) (GSep: globals_separate ge' mu nu), meminj_preserves_globals ge' (as_inj nu).
Lemma intern_incr_globals_separate {F V:Type} (ge: Genv.t F V) mu nu: forall (INC: intern_incr mu nu) (PG: meminj_preserves_globals ge (as_inj mu)) (GF: forall b, isGlobalBlock ge b = true -> frgnBlocksSrc mu b = true) (WD: SM_wd mu) (WDnu: SM_wd nu), globals_separate ge mu nu.
Lemma exter_incr_globals_separate {F V:Type} (ge: Genv.t F V) mu nu: forall (EE: extern_of mu = extern_of nu) (PG: meminj_preserves_globals ge (as_inj mu)) (GF: forall b, isGlobalBlock ge b = true -> frgnBlocksSrc mu b = true) (WD: SM_wd mu) (WDnu: SM_wd nu), globals_separate ge mu nu.