(** Properties of [switch] compilation *)
Remark switch_table_shift:
forall n sl base dfl,
switch_target n (S dfl) (switch_table sl (S base)) =
S (switch_target n dfl (switch_table sl base)).
Remark length_switch_table:
forall sl base1 base2,
length (switch_table sl base1) = length (switch_table sl base2).
Inductive transl_lblstmt_cont(cenv: compilenv) (xenv: exit_env): lbl_stmt -> cont -> cont -> Prop :=
| tlsc_default: forall s k ts,
transl_stmt cenv (switch_env (LSdefault s) xenv) s = OK ts ->
transl_lblstmt_cont cenv xenv (LSdefault s) k (Kblock (Kseq ts k))
| tlsc_case: forall i s ls k ts k',
transl_stmt cenv (switch_env (LScase i s ls) xenv) s = OK ts ->
transl_lblstmt_cont cenv xenv ls k k' ->
transl_lblstmt_cont cenv xenv (LScase i s ls) k (Kblock (Kseq ts k')).

Lemma transl_lblstmt_suffix:
forall n cenv xenv ls body ts,
transl_lblstmt cenv (switch_env ls xenv) ls body = OK ts ->
let ls' := select_switch n ls in
exists body', exists ts',
transl_lblstmt cenv (switch_env ls' xenv) ls' body' = OK ts'.