Proof with eauto with val_renamings.
intros.
destruct v1, v1'; inversion Hval_obs;
inversion Hval_obs'; subst; simpl...
Qed.

(* Specifications: *)
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_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_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_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.