Definition val_obsC f v :=
    match v with
    | Vptr b n => match f b with
                 | Some b' => Vptr b' n
                 | None => Vundef
                 end
    | _ => v
    end.

(* Specifications: *)
Lemma val_obsC_correct: forall f v, valid_val f v -> val_obs f v (val_obsC f v).
Lemma zlength_obs: forall f v v' (Hval_obs: val_obs_list f v v'), Zlength v = Zlength v'.
Lemma val_obs_add: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.add v1 v1') (Val.add v2 v2').
Lemma val_obs_addl: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.addl v1 v1') (Val.addl v2 v2').
Lemma val_obs_offset_ptr: forall f v1 v2 ofs (Hval_obs: val_obs f v1 v2), val_obs f (Val.offset_ptr v1 ofs) (Val.offset_ptr v2 ofs).
Lemma val_obs_sign_ext: forall f v v' n (Hval_obs: val_obs f v v'), val_obs f (Val.sign_ext n v) (Val.sign_ext n v').
Lemma val_obs_longofintu: forall f v v' (Hobs: val_obs f v v'), val_obs f (Val.longofintu v) (Val.longofintu v').
Lemma val_obs_longofint: forall f v v' (Hobs: val_obs f v v'), val_obs f (Val.longofint v) (Val.longofint v').
Lemma val_obs_singleoffloat: forall f v v' (Hval_obs: val_obs f v v'), val_obs f (Val.singleoffloat v) (Val.singleoffloat v').
Lemma val_obs_floatofsingle: forall f v v' (Hval_obs: val_obs f v v'), val_obs f (Val.floatofsingle v) (Val.floatofsingle v').
Lemma val_obs_intoffloat: forall f v v' (Hval_obs: val_obs f v v'), val_obs f (Val.maketotal (Val.intoffloat v)) (Val.maketotal (Val.intoffloat v')).
Lemma val_obs_floatofint: forall f v v' (Hval_obs: val_obs f v v'), val_obs f (Val.maketotal (Val.floatofint v)) (Val.maketotal (Val.floatofint v')).
Lemma val_obs_intofsingle: forall f v v' (Hval_obs: val_obs f v v'), val_obs f (Val.maketotal (Val.intofsingle v)) (Val.maketotal (Val.intofsingle v')).
Lemma val_obs_singleofint: forall f v v' (Hval_obs: val_obs f v v'), val_obs f (Val.maketotal (Val.singleofint v)) (Val.maketotal (Val.singleofint v')).
Lemma val_obs_longoffloat: forall f v v' (Hval_obs: val_obs f v v'), val_obs f (Val.maketotal (Val.longoffloat v)) (Val.maketotal (Val.longoffloat v')).
Lemma val_obs_floatoflong: forall f v v' (Hval_obs: val_obs f v v'), val_obs f (Val.maketotal (Val.floatoflong v)) (Val.maketotal (Val.floatoflong v')).
Lemma val_obs_longofsingle: forall f v v' (Hval_obs: val_obs f v v'), val_obs f (Val.maketotal (Val.longofsingle v)) (Val.maketotal (Val.longofsingle v')).
Lemma val_obs_singleoflong: forall f v v' (Hval_obs: val_obs f v v'), val_obs f (Val.maketotal (Val.singleoflong v)) (Val.maketotal (Val.singleoflong v')).
Lemma val_obs_mul: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.mul v1 v1') (Val.mul v2 v2').
Lemma val_obs_mull: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.mull v1 v1') (Val.mull v2 v2').
Lemma val_obs_mulhs: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.mulhs v1 v1') (Val.mulhs v2 v2').
Lemma val_obs_mulhu: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.mulhu v1 v1') (Val.mulhu v2 v2').
Lemma val_obs_mullhs: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.mullhs v1 v1') (Val.mullhs v2 v2').
Lemma val_obs_mullhu: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.mullhu v1 v1') (Val.mullhu v2 v2').
Lemma val_obs_and: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.and v1 v1') (Val.and v2 v2').
Lemma val_obs_or: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.or v1 v1') (Val.or v2 v2').
Lemma val_obs_xor: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.xor v1 v1') (Val.xor v2 v2').
Lemma val_obs_andl: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.andl v1 v1') (Val.andl v2 v2').
Lemma val_obs_orl: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.orl v1 v1') (Val.orl v2 v2').
Lemma val_obs_xorl: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.xorl v1 v1') (Val.xorl v2 v2').
Lemma val_obs_notint: forall f v1 v2 (Hval_obs: val_obs f v1 v2), val_obs f (Val.notint v1) (Val.notint v2).
Lemma val_obs_notl: forall f v1 v2 (Hval_obs: val_obs f v1 v2), val_obs f (Val.notl v1) (Val.notl v2).
Lemma val_obs_shl: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.shl v1 v1') (Val.shl v2 v2').
Lemma val_obs_shr: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.shr v1 v1') (Val.shr v2 v2').
Lemma val_obs_shru: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.shru v1 v1') (Val.shru v2 v2').
Lemma val_obs_ror: forall f v1 v2 ofs (Hval_obs: val_obs f v1 v2), val_obs f (Val.ror v1 (Vint ofs)) (Val.ror v2 (Vint ofs)).
Lemma val_obs_shll: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.shll v1 v1') (Val.shll v2 v2').
Lemma val_obs_shrl: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.shrl v1 v1') (Val.shrl v2 v2').
Lemma val_obs_shrlu: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.shrlu v1 v1') (Val.shrlu v2 v2').
Lemma val_obs_rorl: forall f v1 v2 ofs (Hval_obs: val_obs f v1 v2), val_obs f (Val.rorl v1 (Vint ofs)) (Val.rorl v2 (Vint ofs)).
Lemma val_obs_suboverflow: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.sub_overflow v1 v1') (Val.sub_overflow v2 v2').
Lemma val_obs_subloverflow: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.subl_overflow v1 v1') (Val.subl_overflow v2 v2').
Lemma val_obs_negative: forall f v1 v2 (Hval_obs: val_obs f v1 v2), val_obs f (Val.negative v1) (Val.negative v2).
Lemma val_obs_neg: forall f v1 v2 (Hval_obs: val_obs f v1 v2), val_obs f (Val.neg v1) (Val.neg v2).
Lemma val_obs_negativel: forall f v1 v2 (Hval_obs: val_obs f v1 v2), val_obs f (Val.negativel v1) (Val.negativel v2).
Lemma val_obs_negl: forall f v1 v2 (Hval_obs: val_obs f v1 v2), val_obs f (Val.negl v1) (Val.negl v2).
Lemma val_obs_sub: forall f v1 v2 v1' v2' (Hinjective: forall b1 b1' b2, f b1 = Some b2 -> f b1' = Some b2 -> b1 = b1') (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.sub v1 v1') (Val.sub v2 v2').
Lemma val_obs_subl: forall f v1 v2 v1' v2' (Hinjective: forall b1 b1' b2, f b1 = Some b2 -> f b1' = Some b2 -> b1 = b1') (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.subl v1 v1') (Val.subl v2 v2').
Lemma val_obs_addf: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.addf v1 v1') (Val.addf v2 v2').
Lemma val_obs_addfs: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.addfs v1 v1') (Val.addfs v2 v2').
Lemma val_obs_mulf: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.mulf v1 v1') (Val.mulf v2 v2').
Lemma val_obs_mulfs: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.mulfs v1 v1') (Val.mulfs v2 v2').
Lemma val_obs_negf: forall f v1 v2 (Hval_obs: val_obs f v1 v2), val_obs f (Val.negf v1) (Val.negf v2).
Lemma val_obs_negfs: forall f v1 v2 (Hval_obs: val_obs f v1 v2), val_obs f (Val.negfs v1) (Val.negfs v2).
Lemma val_obs_absf: forall f v1 v2 (Hval_obs: val_obs f v1 v2), val_obs f (Val.absf v1) (Val.absf v2).
Lemma val_obs_absfs: forall f v1 v2 (Hval_obs: val_obs f v1 v2), val_obs f (Val.absfs v1) (Val.absfs v2).
Lemma val_obs_subf: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.subf v1 v1') (Val.subf v2 v2').
Lemma val_obs_subfs: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.subfs v1 v1') (Val.subfs v2 v2').
Lemma val_obs_divf: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.divf v1 v1') (Val.divf v2 v2').
Lemma val_obs_divfs: forall f v1 v2 v1' v2' (Hval_obs': val_obs f v1' v2') (Hval_obs: val_obs f v1 v2), val_obs f (Val.divfs v1 v1') (Val.divfs v2 v2').
Lemma divu_ren: forall f v1 v2 v1' v2' (Hval_obs: val_obs f v1 v1') (Hval_obs': val_obs f v2 v2'), Val.divu v1 v2 = Val.divu v1' v2'.
Lemma modu_ren: forall f v1 v2 v1' v2' (Hval_obs: val_obs f v1 v1') (Hval_obs': val_obs f v2 v2'), Val.modu v1 v2 = Val.modu v1' v2'.
Lemma val_obs_divu_id: forall f v1 v2 v, Val.divu v1 v2 = Some v -> val_obs f v v.
Lemma val_obs_modu_id: forall f v1 v2 v, Val.modu v1 v2 = Some v -> val_obs f v v.
Lemma divs_ren: forall f v1 v2 v1' v2' (Hval_obs: val_obs f v1 v1') (Hval_obs': val_obs f v2 v2'), Val.divs v1 v2 = Val.divs v1' v2'.
Lemma mods_ren: forall f v1 v2 v1' v2' (Hval_obs: val_obs f v1 v1') (Hval_obs': val_obs f v2 v2'), Val.mods v1 v2 = Val.mods v1' v2'.
Lemma val_obs_divs_id: forall f v1 v2 v, Val.divs v1 v2 = Some v -> val_obs f v v.
Lemma val_obs_mods_id: forall f v1 v2 v, Val.mods v1 v2 = Some v -> val_obs f v v.
Lemma divlu_ren: forall f v1 v2 v1' v2' (Hval_obs: val_obs f v1 v1') (Hval_obs': val_obs f v2 v2'), Val.divlu v1 v2 = Val.divlu v1' v2'.
Lemma modlu_ren: forall f v1 v2 v1' v2' (Hval_obs: val_obs f v1 v1') (Hval_obs': val_obs f v2 v2'), Val.modlu v1 v2 = Val.modlu v1' v2'.
Lemma val_obs_divlu_id: forall f v1 v2 v, Val.divlu v1 v2 = Some v -> val_obs f v v.
Lemma val_obs_modlu_id: forall f v1 v2 v, Val.modlu v1 v2 = Some v -> val_obs f v v.
Lemma divls_ren: forall f v1 v2 v1' v2' (Hval_obs: val_obs f v1 v1') (Hval_obs': val_obs f v2 v2'), Val.divls v1 v2 = Val.divls v1' v2'.
Lemma modls_ren: forall f v1 v2 v1' v2' (Hval_obs: val_obs f v1 v1') (Hval_obs': val_obs f v2 v2'), Val.modls v1 v2 = Val.modls v1' v2'.
Lemma val_obs_divls_id: forall f v1 v2 v, Val.divls v1 v2 = Some v -> val_obs f v v.
Lemma val_obs_modls_id: forall f v1 v2 v, Val.modls v1 v2 = Some v -> val_obs f v v.
Lemma val_obs_of_bool: forall f b, val_obs f (Val.of_bool b) (Val.of_bool b).