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.

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