+lemma min_prim : \forall n.\exists p. n < p \land prime p \land
+ \forall q.prime q \to q < p \to q \leq n.
+intro;elim (le_to_or_lt_eq ? ? (le_O_n n))
+ [apply (ex_intro ? ? (min_aux (S (n!)) (S n) primeb));
+ split
+ [split
+ [apply le_min_aux;
+ |apply primeb_true_to_prime;apply f_min_aux_true;elim (ex_prime n);
+ [apply (ex_intro ? ? a);elim H1;elim H2;split
+ [split
+ [assumption
+ |rewrite > plus_n_O;apply le_plus
+ [assumption
+ |apply le_O_n]]
+ |apply prime_to_primeb_true;assumption]
+ |assumption]]
+ |intros;apply not_lt_to_le;intro;lapply (lt_min_aux_to_false ? ? ? ? H3 H2);
+ rewrite > (prime_to_primeb_true ? H1) in Hletin;destruct Hletin]
+ |apply (ex_intro ? ? 2);split
+ [split
+ [rewrite < H;apply lt_O_S
+ |apply primeb_true_to_prime;reflexivity]
+ |intros;elim (lt_to_not_le ? ? H2);apply prime_to_lt_SO;assumption]]
+qed.
+
+(*lemma pippo : \forall k,n.in_list ? (nth_prime (S k)) (sieve n) \to
+ \exists l.sieve n = l@((nth_prime (S k))::(sieve (nth_prime k))).
+intros;elim H;elim H1;clear H H1;apply (ex_intro ? ? a);
+cut (a1 = sieve (nth_prime k))
+ [rewrite < Hcut;assumption
+ |lapply (sieve_sorted n);generalize in match H2*)
+
+lemma le_to_bertrand : \forall n.O < n \to n \leq exp 2 8 \to bertrand n.
+intros;
+elim (min_prim n);apply (ex_intro ? ? a);elim H2;elim H3;clear H2 H3;
+cut (a \leq 257)
+ [|apply not_lt_to_le;intro;apply (le_to_not_lt ? ? H1);apply (H4 ? ? H2);
+ apply primeb_true_to_prime;reflexivity]
+split
+ [split
+ [assumption
+ |elim (prime_to_nth_prime a H6);generalize in match H2;cases a1
+ [simplify;intro;rewrite < H3;rewrite < plus_n_O;
+ change in \vdash (? % ?) with (1+1);apply le_plus;assumption
+ |intro;lapply (H4 (nth_prime n1))
+ [apply (trans_le ? (2*(nth_prime n1)))
+ [rewrite < H3;
+ cut (\exists l1,l2.sieve 257 = l1@((nth_prime (S n1))::((nth_prime n1)::l2)))
+ [elim Hcut1;elim H7;clear Hcut1 H7;
+ apply (checker_sound a2 a3 (sieve 257))
+ [apply H8
+ |reflexivity]
+ |elim (sieve_sound2 257 (nth_prime (S n1)) ? ?)
+ [elim (sieve_sound2 257 (nth_prime n1) ? ?)
+ [elim H8;
+ cut (\forall p.in_list ? p (a3@(nth_prime n1::a4)) \to prime p)
+ [|rewrite < H9;intros;apply (in_list_sieve_to_prime 257 p ? H10);
+ apply leb_true_to_le;reflexivity]
+ apply (ex_intro ? ? a2);apply (ex_intro ? ? a4);
+ elim H7;clear H7 H8;
+ cut ((nth_prime n1)::a4 = a5)
+ [|generalize in match H10;
+ lapply (sieve_sorted 257);
+ generalize in match Hletin1;
+ rewrite > H9 in ⊢ (? %→? ? % ?→?);
+ generalize in match Hcut1;
+ generalize in match a2;
+ elim a3 0
+ [intro;elim l
+ [change in H11 with (nth_prime n1::a4 = nth_prime (S n1)::a5);
+ destruct H11;elim (eq_to_not_lt ? ? Hcut2);
+ apply increasing_nth_prime
+ |change in H12 with (nth_prime n1::a4 = t::(l1@(nth_prime (S n1)::a5)));
+ destruct H12;
+ change in H11 with (sorted_gt (nth_prime n1::l1@(nth_prime (S n1)::a5)));
+ lapply (sorted_to_minimum ? ? ? H11 (nth_prime (S n1)))
+ [unfold in Hletin2;elim (le_to_not_lt ? ? (lt_to_le ? ? Hletin2));
+ apply increasing_nth_prime
+ |apply (ex_intro ? ? l1);apply (ex_intro ? ? a5);reflexivity]]
+ |intros 5;elim l1
+ [change in H12 with (t::(l@(nth_prime n1::a4)) = nth_prime (S n1)::a5);
+ destruct H12;cut (l = [])
+ [rewrite > Hcut2;reflexivity
+ |change in H11 with (sorted_gt (nth_prime (S n1)::(l@(nth_prime n1::a4))));
+ generalize in match H11;generalize in match H8;cases l;intros
+ [reflexivity
+ |lapply (sorted_cons_to_sorted ? ? ? H13);
+ lapply (sorted_to_minimum ? ? ? H13 n2)
+ [simplify in Hletin2;lapply (sorted_to_minimum ? ? ? Hletin2 (nth_prime n1))
+ [unfold in Hletin3;unfold in Hletin4;
+ elim (lt_nth_prime_to_not_prime ? ? Hletin4 Hletin3);
+ apply H12;
+ apply (ex_intro ? ? [nth_prime (S n1)]);
+ apply (ex_intro ? ? (l2@(nth_prime n1::a4)));
+ reflexivity
+ |apply (ex_intro ? ? l2);apply (ex_intro ? ? a4);reflexivity]
+ |simplify;apply in_list_head]]]
+ |change in H13 with (t::(l@(nth_prime n1::a4)) = t1::(l2@(nth_prime (S n1)::a5)));
+ destruct H13;apply (H7 l2 ? ? Hcut3)
+ [intros;apply H8;simplify;apply in_list_cons;
+ assumption
+ |simplify in H12;
+ apply (sorted_cons_to_sorted ? ? ? H12)]]]]
+ rewrite > Hcut2 in ⊢ (? ? ? (? ? ? (? ? ? %)));
+ apply H10
+ |apply (trans_le ? ? ? Hletin);apply lt_to_le;
+ apply (trans_le ? ? ? H5 Hcut)
+ |apply prime_nth_prime]
+ |rewrite > H3;assumption
+ |apply prime_nth_prime]]
+ |apply le_times_r;assumption]
+ |apply prime_nth_prime
+ |rewrite < H3;apply increasing_nth_prime]]]
+ |assumption]
+qed.
+