Section Sk.
Hypothesis k:nat.
Hypothesis Base_k: k<>0.
Inductive Base: (nat*(list nat))->Prop :=
| Base_intro s
(Base_a0':fst s = S O)
(Base_a:forall i, ai i s = if Nat.ltb i (k*2) then 2^(k*2-i) else O)
(Base_l:to_l s = k*2+1):
Base s.
Ltac pose_Heb Heb Hl e2 Heb2 rw :=
epose proof (embanked_batch_precond'' Heb Hl _ _) as tmp;
edestruct tmp as [e2 Heb2]; clear tmp;
rewrite rw in Heb2;
cbn in Heb2.
Ltac ex_Heb e Heb :=
exists e; eexists;
split;
[ apply Heb | idtac ].
Ltac pose_eb_len Heb Hl0 Hl :=
pose proof (embanked_batch_len Heb) as Hl;
rewrite Hl0 in Hl; symmetry in Hl.
Ltac pose_eb_a0_a1 Heb Ha0 Ha1 rw :=
destruct (embanked_batch_a0_a1 Heb) as [Ha0 Ha1];
rewrite rw in Ha0,Ha1;
cbn in Ha0,Ha1.
Ltac simpl_Add2s :=
unfold ai';
cbn[negb]; cbn[Bool.eqb];
repeat rewrite Bool.andb_true_r;
repeat rewrite Bool.andb_false_r;
repeat (rewrite Nat_leb_S);
repeat (rewrite Nat_leb_S_l; [idtac|congruence]).
Ltac inv_eb_Add2s Heb := pose proof (embanked_batch_Add2s Heb) as tmp; inverts tmp.
Inductive ctzS_chain:nat->Prop :=
| ctzS_chain_O:
ctzS_chain O
| ctzS_chain_S2 n:
ctzS_chain n ->
ctzS n mod 2 = 0 ->
ctzS (n+1) mod 2 = 1 ->
ctzS_chain (n+2)
| ctzS_chain_S4 n:
ctzS_chain n ->
ctzS n mod 2 = 0 ->
ctzS (n+1) mod 2 = 0 ->
ctzS (n+2) mod 2 = 0 ->
ctzS (n+3) mod 2 = 1 ->
ctzS_chain (n+4)
.
Inductive N'steps: (nat*(list nat))->nat->nat->(nat*(list nat))->nat->nat->Prop :=
| N'steps_O i e ne h1 h2:
embanked_batch i e ne h1 h2 ->
N'steps ne h1 h2 ne h1 h2
| N'steps_S i e ne nne h1 h2 h1a h2a h1b h2b:
N'steps e h1 h2 ne h1a h2a ->
embanked_batch i ne nne h1b h2b ->
N'steps e h1 h2 nne h1b h2b
.
Hypothesis Sk:nat*(list nat).
Hypothesis Base_Sk: Base Sk.

(* m=2^(k*2)-2 is Corollary 4.2 *)
Lemma embanked_batches m:
m < 2^(k*2)-1 ->
ctzS_chain m ->
exists e ne,
N'steps e (2^(k*2)-1) (2^(k*2)) ne (2^(k*2)-1-m) (2^(k*2)+m) /\
embanked_batch (k*2+1) Sk e (2^(k*2)-1) (2^(k*2)) /\
Add2s (k*2+1) Sk e /\
(exists e' i', embanked_batch i' e' ne (2^(k*2)-1-m) (2^(k*2)+m) /\ i' mod 2 = 1) /\
to_l ne = k*2+1 /\
ai' 0 ne = 1+m*2 /\
ai' 1 ne = 2^(k*2)+2+m*2 /\
(forall i, ai i ne = ai i e + 2*(m/2^i)). (* Proposition 4.3 *)