Section SOUNDNESS_CONSTRUCTORS.
Variable ce: composite_env.
Variable e: typenv.
Variable rt: type.
Hint Resolve check_rval_wt check_lval_wt: ty.
Hint Extern 1 (wt_expr _ _ _) => (unfold wt_expr; simpl): ty.
End SOUNDNESS_CONSTRUCTORS.
(** * Subject reduction *)
(** We show that reductions preserve well-typedness *)
Proof with (try discriminate).
intros. unfold sem_binarith, binarith_type in *.
set (ty' := Cop.binarith_type (classify_binarith ty1 ty2)) in *.
destruct (sem_cast v1 ty1 ty' m) as [v1'|] eqn:CAST1...
destruct (sem_cast v2 ty2 ty' m) as [v2'|] eqn:CAST2...
DestructCases.
- specialize (H s i i0). rewrite H3 in H.
destruct v; auto with ty; contradiction.
- specialize (H0 s i i0). rewrite H3 in H0.
destruct v; auto with ty; contradiction.
- specialize (H1 f f0). rewrite H3 in H1.
destruct v; auto with ty; contradiction.
- specialize (H2 f f0). rewrite H3 in H2.
destruct v; auto with ty; contradiction.
Qed.

Lemma pres_sem_cmp:
forall ty1 ty2 msg ty c v1 v2 m v,
comparison_type ty1 ty2 msg = OK ty ->
sem_cmp c v1 ty1 v2 ty2 m = Some v ->
wt_val v ty.