Definition cast_no_val_change (from: type)(to:type) : bool :=
match from, to with
| Tint _ _ _, Tint I32 _ _ => true
| Tpointer _ _, Tpointer _ _ => 
    eqb_type from to || 
    negb (eqb_type from int_or_ptr_type) && 
    negb (eqb_type to int_or_ptr_type)
| Tfloat F64 _ , Tfloat F64 _ => true
| Tfloat F32 _ , Tfloat F32 _ => true
| _, _ => false
end.

(* Specifications: *)
Lemma cast_no_change : forall v from to m, tc_val from v -> is_true (cast_no_val_change from to) -> Cop.sem_cast v from to m = Some v.
Lemma tc_exprlist_length : forall {CS: compspecs} Delta tl el rho phi, denote_tc_assert (typecheck_exprlist Delta tl el) rho phi -> length tl = length el.
Lemma neutral_cast_tc_val : forall {CS: compspecs} e t rho phi Delta, true = is_neutral_cast (implicit_deref (typeof e)) t -> denote_tc_assert (isCastResultType (implicit_deref (typeof e)) t e) rho phi -> denote_tc_assert (typecheck_expr Delta e) rho phi -> typecheck_environ Delta rho -> tc_val t (eval_expr e rho).
Lemma typecheck_tid_ptr_compare_sub: forall Delta Delta', tycontext_sub Delta Delta' -> forall id, typecheck_tid_ptr_compare Delta id = true -> typecheck_tid_ptr_compare Delta' id = true.
Lemma int64_eq_e: forall i j, Int64.eq i j = true -> i=j.
Lemma tc_val_sem_cast: forall {CS: compspecs} t2 e2 rho phi Delta, typecheck_environ Delta rho -> denote_tc_assert (typecheck_expr Delta e2) rho phi -> denote_tc_assert (isCastResultType (typeof e2) t2 e2) rho phi -> tc_val t2 (force_val (sem_cast (typeof e2) t2 (eval_expr e2 rho))).