Ltac extend_tc_prover :=
match goal with
| |- _ => solve [immediate]
| |- _ => apply extend_prop
| |- _ => first
[ simple apply extend_tc_bool
| simple apply extend_tc_int_or_ptr_type
| simple apply extend_tc_andp
| simple apply extend_tc_andp'
| simple apply extend_tc_Zge
| simple apply extend_tc_Zle
| simple apply extend_tc_iszero
| simple apply extend_tc_nonzero
| simple apply extend_tc_nodivover
| simple apply extend_tc_nobinover
| simple apply extend_tc_samebase
| simple apply extend_tc_ilt
| simple apply extend_tc_llt
| simple apply extend_isCastResultType
| simple apply extend_tc_test_eq
| simple apply extend_tc_test_order]
| |- boxy _ (denote_tc_assert (if ?A then _ else _) _) => destruct A
| |- boxy _ (denote_tc_assert match tc_bool ?A _ with _ => _ end _) =>
destruct A
| |- boxy _ (denote_tc_assert match ?A with Some _ => _ | None => _ end _) =>
destruct A
end.

(* Specifications: *)
Lemma extend_tc_binop: forall {CS: compspecs} Delta e1 e2 b t rho,
boxy extendM (denote_tc_assert (typecheck_expr Delta e1) rho) ->
boxy extendM (denote_tc_assert (typecheck_expr Delta e2) rho) ->
boxy extendM (denote_tc_assert (isBinOpResultType b e1 e2 t) rho).
Lemma extend_tc_expr: forall {CS: compspecs} Delta e rho, boxy extendM (tc_expr Delta e rho)
with extend_tc_lvalue: forall {CS: compspecs} Delta e rho, boxy extendM (tc_lvalue Delta e rho).
Lemma extend_tc_exprlist: forall {CS: compspecs} Delta t e rho, boxy extendM (tc_exprlist Delta t e rho).
Lemma extend_tc_expropt: forall {CS: compspecs} Delta e t rho, boxy extendM (tc_expropt Delta e t rho).
Hint Resolve extend_tc_expr extend_tc_temp_id extend_tc_temp_id_load extend_tc_exprlist extend_tc_expropt extend_tc_lvalue.