(*an inject_separated-like property wrt DOM/RNG instead of wrt validity in suitable memories*)
Definition sm_inject_separated (mu mu' : SM_Injection) (m1 m2:mem):Prop :=
(forall b1 b2 d, as_inj mu b1 = None -> as_inj mu' b1 = Some(b2,d) ->
(DomSrc mu b1 = false /\ DomTgt mu b2 = false)) /\
(forall b1, DomSrc mu b1 = false -> DomSrc mu' b1 = true -> ~Mem.valid_block m1 b1) /\
(forall b2, DomTgt mu b2 = false -> DomTgt mu' b2 = true -> ~Mem.valid_block m2 b2).

(* Specifications: *)
Lemma sm_inject_separated_mem: forall mu mu' m1 m2
(SEP: sm_inject_separated mu mu' m1 m2) (WD': SM_wd mu'),
inject_separated (as_inj mu) (as_inj mu') m1 m2.
Lemma sm_inject_separated_asinj_same: forall mu nu m1 m2
(SEP: sm_inject_separated mu nu m1 m2)
nu' (Hnu: as_inj nu = as_inj nu')
(HSrc: DomSrc nu = DomSrc nu')
(HTgt: DomTgt nu = DomTgt nu'),
sm_inject_separated mu nu' m1 m2.
Lemma sm_inject_separated_mem: forall mu mu' m1 m2
(SEP: sm_inject_separated mu mu' m1 m2) (WD': SM_wd mu'),
inject_separated (as_inj mu) (as_inj mu') m1 m2.
Lemma sm_inject_separated_asinj_same: forall mu nu m1 m2
(SEP: sm_inject_separated mu nu m1 m2)
nu' (Hnu: as_inj nu = as_inj nu')
(HSrc: DomSrc nu = DomSrc nu')
(HTgt: DomTgt nu = DomTgt nu'),
sm_inject_separated mu nu' m1 m2.