Inductive plus: state -> state -> Prop :=
  | plus_left: forall s1 s2 s3,
      CCstep s1 s2 -> star s2 s3 -> plus s1 s3.Inductive plus: state -> state -> Prop :=
  | plus_left: forall s1 s2 s3,
      CCstep s1 s2 -> star s2 s3 -> plus s1 s3.

(* Specifications: *)
Lemma plus_one: forall s1 s2, CCstep s1 s2 -> plus s1 s2.
Lemma plus_two: forall s1 s2 s3, CCstep s1 s2 -> CCstep s2 s3 -> plus s1 s3.
Lemma plus_star: forall s1 s2, plus s1 s2 -> star s1 s2.
Lemma plus_trans: forall {s1 s2 s3}, plus s1 s2 -> plus s2 s3 -> plus s1 s3.
Lemma star_plus_trans: forall {s1 s2 s3}, star s1 s2 -> plus s2 s3 -> plus s1 s3.
Lemma plus_star_trans: forall {s1 s2 s3}, plus s1 s2 -> star s2 s3 -> plus s1 s3.
Lemma exec_skips: forall {s0 k s k'} (H1: match_cont (Kseq s0 :: k) (strip_skip' (CC.Kseq s k'))) f ve te m, match s0 with Sskip => False | Scontinue => False | Sloop _ _ => False | Sifthenelse _ _ _ => False | Sreturn _ => False | _ => True end -> exists k2, strip_skip' (CC.Kseq s k') = CC.Kseq s0 k2 /\ star (CC.State f s k' ve te m) (CC.State f s0 k2 ve te m).
Lemma strip_skip_not: forall s k, s<>Sskip -> strip_skip (Kseq s :: k) = (Kseq s :: k).
Lemma strip_skip'_not: forall s k, s<>Sskip -> strip_skip' (CC.Kseq s k) = (CC.Kseq s k).
Lemma dec_skip: forall s, {s=Sskip}+{s<>Sskip}.
Lemma dec_continue: forall s, {s=Scontinue}+{s<>Scontinue}.
Lemma strip_step: forall ge ve te k m st' m', cl_step ge (State ve te (strip_skip k)) m st' m' <-> cl_step ge (State ve te k) m st' m'.
Lemma continue_cont_skip: forall k, continue_cont k = continue_cont (strip_skip k).
Lemma break_cont_skip: forall k, break_cont (strip_skip k) = break_cont k.
Lemma continue_cont_is: forall k, match (continue_cont k) with nil => True | Kseq e3 :: Kloop2 s e3' :: _ => e3=e3' | _ => False end.
Lemma match_cont_strip: forall s k k', match_cont (strip_skip k) (strip_skip' k') -> match_cont (strip_skip (Kseq s :: k)) (strip_skip' (CC.Kseq s k')).
Lemma exec_skips': forall f s k' s0 k0' ve te m, strip_skip' (CC.Kseq s k') = CC.Kseq s0 k0' -> star (CC.State f s k' ve te m) (CC.State f s0 k0' ve te m).
Lemma break_strip: forall f ve te m k, star (CC.State f Sbreak k ve te m) (CC.State f Sbreak (strip_skip' k) ve te m).
Lemma strip_skip'_loop2: forall f ve te m a3 s k1 k, CC.Kloop2 a3 s k1 = strip_skip' k -> star (CC.State f Sskip k ve te m) (CC.State f Sskip (CC.Kloop2 a3 s k1) ve te m).
Lemma call_strip: forall k, call_cont (strip_skip k) = call_cont k.
Lemma strip_call: forall k, strip_skip (call_cont k) = call_cont k.
Lemma call_strip': forall k, CC.call_cont (strip_skip' k) = CC.call_cont k.
Lemma strip_call': forall k, strip_skip' (CC.call_cont k) = CC.call_cont k.
Lemma strip_skip'_loop1: forall f ve te m a3 s k1 k, CC.Kloop1 a3 s k1 = strip_skip' k -> star (CC.State f Sskip k ve te m) (CC.State f Sskip (CC.Kloop1 a3 s k1) ve te m).
Lemma strip_skip'_call: forall f ve te m lid f' ve' te' k1 k, CC.Kcall lid f' ve' te' k1 = strip_skip' k -> star (CC.State f Sskip k ve te m) (CC.State f Sskip (CC.Kcall lid f' ve' te' k1) ve te m).
Lemma match_cont_call_strip: forall k k', call_cont k <> nil -> match_cont (strip_skip k) (strip_skip' k') -> match_cont (Kseq (Sreturn None) :: call_cont k) (CC.call_cont k').
Lemma match_cont_strip1: forall k k', match_cont k k' -> match_cont (strip_skip k) (strip_skip' k').
Lemma match_find_label_None: forall lbl s1 k0 k0', match_cont (strip_skip k0) (strip_skip' k0') -> find_label lbl s1 k0 = None -> CC.find_label lbl s1 k0' = None with match_find_ls_None: forall lbl ls k0 k0', match_cont (strip_skip k0) (strip_skip' k0') -> find_label_ls lbl ls k0 = None -> CC.find_label_ls lbl ls k0' = None.
Lemma match_find_label: forall lbl k' s1 k0 k0', match_cont (strip_skip k0) (strip_skip' k0') -> (find_label lbl s1 k0 = Some k' -> exists s2 : statement, exists k2' : CC.cont, CC.find_label lbl s1 k0' = Some (s2, k2') /\ match_cont k' (CC.Kseq s2 k2')) with match_find_label_ls: forall lbl k' s1 k0 k0', match_cont (strip_skip k0) (strip_skip' k0') -> (find_label_ls lbl s1 k0 = Some k' -> exists s2 : statement, exists k2' : CC.cont, CC.find_label_ls lbl s1 k0' = Some (s2, k2') /\ match_cont k' (CC.Kseq s2 k2')).
Lemma current_function_strip: forall k, current_function (strip_skip k) = current_function k.
Lemma current_function_call_cont: forall k, current_function (call_cont k) = current_function k.
Lemma current_function_find_label: forall lbl f s k k', current_function k = Some f -> find_label lbl s k = Some k' -> current_function k' = Some f with current_function_find_label_ls: forall lbl f s k k', current_function k = Some f -> find_label_ls lbl s k = Some k' -> current_function k' = Some f.
Lemma step_continue_strip: forall f k ve te m, star (CC.State f Scontinue k ve te m) (CC.State f Scontinue (strip_skip' k) ve te m).