(* Lemma val_has_type_obs: *)
(*   forall f v v' ty *)
(*     (Hval_obs: val_obs f v v'), *)
(*     val_casted.val_has_type_func v ty <-> val_casted.val_has_type_func v' ty. *)
(* Proof. *)
(*   intros. *)
(*   destruct v; inversion Hval_obs; subst; simpl; *)
(*     by tauto. *)
(* Qed. *)
(* Lemma val_has_type_list_obs: *)
(*   forall f vs vs' ts *)
(*     (Hval_obs: val_obs_list f vs vs'), *)
(*     val_casted.val_has_type_list_func vs ts <-> *)
(*     val_casted.val_has_type_list_func vs' ts. *)
(* Proof. *)
(*   intros. *)
(*   generalize dependent vs'. *)
(*   generalize dependent ts. *)
(*   induction vs; *)
(*     intros. inversion Hval_obs; subst. *)
(*   simpl; destruct ts; split; *)
(*     by auto. *)
(*   inversion Hval_obs; subst. *)
(*   destruct ts; simpl; first by split; auto. *)
(*   split; intros; move/andP:H=>[H H']; *)
(*     apply/andP. *)
(*   split; *)
(*     [erewrite <- val_has_type_obs; eauto | *)
(*      destruct (IHvs ts _ H3); eauto]. *)
(*   split; *)
(*     [erewrite val_has_type_obs; eauto | *)
(*      destruct (IHvs ts _ H3); eauto]. *)
(* Qed. *)
(* Lemma vals_defined_obs: *)
(*   forall f vs vs' *)
(*     (Hval_obs: val_obs_list f vs vs'), *)
(*     val_casted.vals_defined vs <-> val_casted.vals_defined vs'. *)
(* Proof. *)
(*   intros. *)
(*   induction Hval_obs; *)
(*     simpl; try tauto. *)
(*   destruct v; inversion H; *)
(*     by tauto. *)
(* Qed. *)

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').