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.

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.