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 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).