Remark type_expect_incr:
  forall e ty1 ty2 e' te, type_expect e ty1 ty2 = OK e' -> S.satisf te e' -> S.satisf te e.

(* Specifications: *)
Lemma type_expect_sound: forall e ty1 ty2 e', type_expect e ty1 ty2 = OK e' -> ty1 = ty2.
Lemma type_builtin_arg_incr: forall e a ty e' te, type_builtin_arg e a ty = OK e' -> S.satisf te e' -> S.satisf te e.
Lemma type_builtin_args_incr: forall a ty e e' te, type_builtin_args e a ty = OK e' -> S.satisf te e' -> S.satisf te e.
Lemma type_builtin_res_incr: forall e a ty e' te, type_builtin_res e a ty = OK e' -> S.satisf te e' -> S.satisf te e.
Lemma type_builtin_arg_sound: forall e a ty e' te, type_builtin_arg e a ty = OK e' -> S.satisf te e' -> type_of_builtin_arg te a = ty.
Lemma type_builtin_args_sound: forall al tyl e e' te, type_builtin_args e al tyl = OK e' -> S.satisf te e' -> List.map (type_of_builtin_arg te) al = tyl.
Lemma type_builtin_res_sound: forall e a ty e' te, type_builtin_res e a ty = OK e' -> S.satisf te e' -> type_of_builtin_res te a = ty.
Lemma type_instr_incr: forall e i e' te, type_instr e i = OK e' -> S.satisf te e' -> S.satisf te e.
Lemma type_instr_sound: forall e i e' te, type_instr e i = OK e' -> S.satisf te e' -> wt_instr f te i.
Theorem type_function_correct: forall env, type_function = OK env -> wt_function f env.
Lemma type_ros_complete: forall te ros e, S.satisf te e -> match ros with inl r => te r = Tptr | inr s => True end -> exists e', type_ros e ros = OK e' /\ S.satisf te e'.
Lemma check_successor_complete: forall s, valid_successor f s -> check_successor s = OK tt.
Lemma type_expect_complete: forall e ty, type_expect e ty ty = OK e.
Lemma type_builtin_arg_complete: forall te a e, S.satisf te e -> exists e', type_builtin_arg e a (type_of_builtin_arg te a) = OK e' /\ S.satisf te e'.
Lemma type_builtin_args_complete: forall te al e, S.satisf te e -> exists e', type_builtin_args e al (List.map (type_of_builtin_arg te) al) = OK e' /\ S.satisf te e'.
Lemma type_builtin_res_complete: forall te a e, S.satisf te e -> exists e', type_builtin_res e a (type_of_builtin_res te a) = OK e' /\ S.satisf te e'.
Lemma type_instr_complete: forall te e i, S.satisf te e -> wt_instr f te i -> exists e', type_instr e i = OK e' /\ S.satisf te e'.
Theorem type_function_complete: forall te, wt_function f te -> exists te, type_function = OK te.
Lemma wt_regset_setres: forall env rs v res, wt_regset env rs -> Val.has_type v (type_of_builtin_res env res) -> wt_regset env (regmap_setres res v rs).
Lemma wt_init_regs: forall env rl args, Val.has_type_list args (List.map env rl) -> wt_regset env (init_regs args rl).
Lemma wt_exec_Ibuiltin: forall env f ef (ge: genv) args res s vargs m t vres m' rs, wt_instr f env (Ibuiltin ef args res s) -> external_call ef ge vargs m t vres m' -> wt_regset env rs -> wt_regset env (regmap_setres res vres rs).