Definition symbols_inject : Prop :=
   (forall id, Senv.public_symbol ge2 id = Senv.public_symbol ge1 id)
/\ (forall id b1 b2 delta,
     f b1 = Some(b2, delta) -> Senv.find_symbol ge1 id = Some b1 ->
     delta = 0 /\ Senv.find_symbol ge2 id = Some b2)
/\ (forall id b1,
     Senv.public_symbol ge1 id = true -> Senv.find_symbol ge1 id = Some b1 ->
     exists b2, f b1 = Some(b2, 0) /\ Senv.find_symbol ge2 id = Some b2)
/\ (forall b1 b2 delta,
     f b1 = Some(b2, delta) ->
     Senv.block_is_volatile ge2 b2 = Senv.block_is_volatile ge1 b1).

(* Specifications: *)
Lemma eventval_match_inject: forall ev ty v1 v2, eventval_match ge1 ev ty v1 -> Val.inject f v1 v2 -> eventval_match ge2 ev ty v2.
Lemma eventval_match_inject_2: forall ev ty v1, eventval_match ge1 ev ty v1 -> exists v2, eventval_match ge2 ev ty v2 /\ Val.inject f v1 v2.
Lemma eventval_list_match_inject: forall evl tyl vl1, eventval_list_match ge1 evl tyl vl1 -> forall vl2, Val.inject_list f vl1 vl2 -> eventval_list_match ge2 evl tyl vl2.
Lemma eventval_match_inject: forall ev ty v1 v2, eventval_match ge1 ev ty v1 -> Val.inject f v1 v2 -> eventval_match ge2 ev ty v2.
Lemma eventval_match_inject_2: forall ev ty v1, eventval_match ge1 ev ty v1 -> exists v2, eventval_match ge2 ev ty v2 /\ Val.inject f v1 v2.
Lemma eventval_list_match_inject: forall evl tyl vl1, eventval_list_match ge1 evl tyl vl1 -> forall vl2, Val.inject_list f vl1 vl2 -> eventval_list_match ge2 evl tyl vl2.