End MSUBST_DENOTE_TC_ASSERT.
Definition legal_tc_init (Delta: tycontext): tc_assert -> Prop :=
fix legal_tc_init (tc: tc_assert): Prop :=
match tc with
| tc_andp' tc1 tc2 => legal_tc_init tc1 /\ legal_tc_init tc2
| tc_orp' tc1 tc2 => legal_tc_init tc1 /\ legal_tc_init tc2
| tc_initialized i t => (temp_types Delta) ! i = Some t
| _ => True
end.

(* Specifications: *)
Lemma temp_tc_initialized: forall Delta i t v,
(temp_types Delta) ! i = Some t ->
local (tc_environ Delta) && local (locald_denote (temp i v))
|-- denote_tc_initialized i t.
Lemma msubst_simpl_tc_assert_sound: forall {cs: compspecs} Delta P T1 T2 Q R tc,
legal_tc_init Delta tc ->
local (tc_environ Delta) && PROPx P (LOCALx (LocalD T1 T2 Q) (SEPx R)) &&
denote_tc_assert (msubst_simpl_tc_assert T1 tc) |--
denote_tc_assert tc.
Lemma legal_tc_init_tc_bool: forall Delta b err,
legal_tc_init Delta (tc_bool b err).
Lemma legal_tc_init_tc_andp: forall Delta tc1 tc2,
legal_tc_init Delta tc1 ->
legal_tc_init Delta tc2 ->
legal_tc_init Delta (tc_andp tc1 tc2).
Lemma legal_tc_init_tc_nonzero: forall {cs: compspecs} Delta e,
legal_tc_init Delta (tc_nonzero e).
Lemma legal_tc_init_tc_iszero: forall {cs: compspecs} Delta e,
legal_tc_init Delta (tc_iszero e).
Lemma legal_tc_init_tc_test_eq: forall {cs: compspecs} Delta e1 e2,
legal_tc_init Delta (tc_test_eq e1 e2).
Lemma legal_tc_init_tc_test_order: forall {cs: compspecs} Delta e1 e2,
legal_tc_init Delta (tc_test_order e1 e2).
Lemma legal_tc_init_tc_nodivover: forall {cs: compspecs} Delta e1 e2,
legal_tc_init Delta (tc_nodivover e1 e2).
Lemma legal_tc_init_tc_ilt: forall {cs: compspecs} Delta e i,
legal_tc_init Delta (tc_ilt e i).
Lemma legal_tc_init_tc_llt: forall {cs: compspecs} Delta e i,
legal_tc_init Delta (tc_llt e i).
Lemma legal_tc_init_binarithType: forall Delta t1 t2 t err err',
legal_tc_init Delta (binarithType t1 t2 t err err').
Lemma legal_tc_init_tc_nobinover: forall {cs: compspecs} Delta op e1 e2,
legal_tc_init Delta (tc_nobinover op e1 e2).