Definition binary_constructor_correct
    (make: expr -> type -> expr -> type -> res expr)
    (sem: val -> type -> val -> type -> mem -> option val): Prop :=
  forall a tya b tyb c va vb v e le m,
  sem va tya vb tyb m = Some v ->
  make a tya b tyb = OK c ->
  eval_expr ge e le m a va ->
  eval_expr ge e le m b vb ->
  eval_expr ge e le m c v.Definition shift_constructor_correct
    (make: expr -> type -> expr -> type -> res expr)
    (sem: val -> type -> val -> type -> option val): Prop :=
  forall a tya b tyb c va vb v e le m,
  sem va tya vb tyb = Some v ->
  make a tya b tyb = OK c ->
  eval_expr ge e le m a va ->
  eval_expr ge e le m b vb ->
  eval_expr ge e le m c v.

(* Specifications: *)
Lemma make_binarith_correct: binary_constructor_correct (make_binarith iop iopu fop sop lop lopu) (sem_binarith sem_int sem_long sem_float sem_single).
Lemma make_binarith_int_correct: binary_constructor_correct (make_binarith_int iop iopu lop lopu) (sem_binarith sem_int sem_long (fun x y => None) (fun x y => None)).
Lemma make_add_correct: binary_constructor_correct (make_add cunit.(prog_comp_env)) (sem_add prog.(prog_comp_env)).
Lemma make_sub_correct: binary_constructor_correct (make_sub cunit.(prog_comp_env)) (sem_sub prog.(prog_comp_env)).
Lemma make_mul_correct: binary_constructor_correct make_mul sem_mul.
Lemma make_div_correct: binary_constructor_correct make_div sem_div.
Lemma make_mod_correct: binary_constructor_correct make_mod sem_mod.
Lemma make_and_correct: binary_constructor_correct make_and sem_and.
Lemma make_or_correct: binary_constructor_correct make_or sem_or.
Lemma make_xor_correct: binary_constructor_correct make_xor sem_xor.