This commit is contained in:
Thomas Baruchel 2023-01-13 21:44:27 +01:00
parent f55b756129
commit 8a73ed35ad
2 changed files with 125 additions and 123 deletions

View File

@ -898,6 +898,131 @@ Proof.
Qed.
Lemma tm_step_pattern4_odd_prefix : forall (n : nat) (hd a tl : list bool),
tm_step n = hd ++ a ++ tl
-> length a = 4 -> odd (length hd) = true
-> exists (x : bool) (u v : list bool), a = u ++ [x;x] ++ v.
Proof.
intros n hd a tl. intros H I J.
assert (K: 1 = (length hd) mod 2).
apply Nat.mod_unique with (q := Nat.div2 (length hd)). apply Nat.lt_1_2.
replace (1) with (Nat.b2n (Nat.odd (length hd))) at 2.
apply Nat.div2_odd. rewrite J. reflexivity.
assert (L: (length hd) mod (2*2)
= (length hd) mod 2 + 2 * (((length hd) / 2) mod 2)).
apply Nat.mod_mul_r; easy. rewrite <- K in L.
replace (2*2) with (4) in L. rewrite <- Nat.bit0_mod in L.
assert (M: (length hd) mod 4 = 1 \/ (length hd) mod 4 = 3). rewrite L.
destruct (Nat.testbit (length hd / 2) 0) ; [right | left] ; reflexivity.
assert (forall (n' : nat) (w z y : list bool),
tm_step n' = w ++ z ++ y
-> length z = 4 -> length w mod 4 = 1
-> exists (x : bool), firstn 2 z = [x;x]).
intros n' w z y. intros G0 G1 G2.
assert (U: 4 * (length w / 4) <= length w).
apply Nat.mul_div_le. easy.
assert (W: length w < length (tm_step n')). rewrite G0.
rewrite app_length. rewrite <- Nat.add_0_r at 1. rewrite <- Nat.add_lt_mono_l.
rewrite app_length. rewrite G1. apply Nat.lt_0_succ.
assert (Q: length z <= length (tm_step n')). rewrite G0.
rewrite app_length. rewrite app_length.
rewrite Nat.add_assoc. rewrite Nat.add_shuffle0.
apply Nat.le_add_l. rewrite tm_size_power2 in Q. rewrite G1 in Q.
replace (4) with (2^2) in Q. rewrite <- Nat.pow_le_mono_r_iff in Q.
assert (O: nth_error (tm_step 2) 1 = nth_error (tm_step 2) 2
<-> nth_error (tm_step (2+(n'-2))) (length w / 4 * 2 ^ 2 + 1)
= nth_error (tm_step (2+(n'-2))) (length w / 4 * 2 ^ 2 + 2)).
apply tm_step_repeating_patterns.
simpl. rewrite <- Nat.succ_lt_mono. apply Nat.lt_0_succ.
simpl. rewrite <- Nat.succ_lt_mono. rewrite <- Nat.succ_lt_mono.
apply Nat.lt_0_succ.
rewrite Nat.mul_lt_mono_pos_l with (p := 2^2). rewrite <- Nat.pow_add_r.
rewrite Nat.add_comm. rewrite Nat.sub_add.
replace (2^2) with 4.
rewrite tm_size_power2 in W. generalize W. generalize U.
apply Nat.le_lt_trans. reflexivity.
assumption.
rewrite <- Nat.neq_0_lt_0. apply Nat.pow_nonzero. easy.
rewrite Nat.mul_comm in O. replace (2^2) with 4 in O.
rewrite <- G2 in O at 9. rewrite <- G2 in O at 14.
replace (4 * (length w / 4) + S (length w mod 4))
with (S (length w)) in O. rewrite <- Nat.div_mod_eq in O.
replace (2+(n'-2)) with n' in O. rewrite G0 in O.
rewrite nth_error_app2 in O. rewrite Nat.sub_diag in O.
rewrite nth_error_app1 in O. rewrite nth_error_app2 in O.
rewrite Nat.sub_succ_l in O. rewrite Nat.sub_diag in O.
rewrite nth_error_app1 in O. destruct O.
assert (nth_error z 0 = nth_error z 1). apply H0. reflexivity.
rewrite nth_error_nth' with (d := false) in H2.
rewrite nth_error_nth' with (d := false) in H2.
exists (nth 0 z false). inversion H2.
rewrite H4 at 2.
destruct z. inversion G1. destruct z. inversion G1. reflexivity.
rewrite G1. rewrite <- Nat.succ_lt_mono. apply Nat.lt_0_succ.
rewrite G1. apply Nat.lt_0_succ.
rewrite G1. rewrite <- Nat.succ_lt_mono. apply Nat.lt_0_succ.
apply Nat.le_refl. apply Nat.le_succ_diag_r.
rewrite G1. apply Nat.lt_0_succ. apply Nat.le_refl.
rewrite Nat.add_sub_assoc. rewrite Nat.add_sub_swap.
reflexivity. easy. assumption.
rewrite Nat.add_succ_r. rewrite <- Nat.div_mod_eq. reflexivity.
reflexivity. apply Nat.lt_1_2. reflexivity.
destruct M as [M | M].
- assert (exists (x : bool), firstn 2 a = [x;x]).
generalize M. generalize I. generalize H. apply H0.
destruct H1. exists x. exists nil. exists (skipn 2 a).
rewrite app_nil_l. rewrite <- H1. symmetry. apply firstn_skipn.
- assert ((length (hd ++ (firstn 2 a))) mod 4 = 1).
rewrite app_length. rewrite firstn_length. rewrite I.
rewrite <- Nat.add_mod_idemp_l. rewrite M. reflexivity. easy.
assert (tm_step (S n) = tm_step n ++ map negb (tm_step n)).
apply tm_build. rewrite H in H2.
assert (length ((skipn 2 a)
++ (firstn 2 (tl ++ (map negb (hd ++ a ++ tl))))) = 4).
rewrite app_length. rewrite skipn_length. rewrite I.
rewrite firstn_length. rewrite app_length. rewrite <- H.
rewrite map_length.
assert (4 <= length tl + length (tm_step n)).
assert (Q: length a <= length (tm_step n)). rewrite H.
rewrite app_length. rewrite app_length.
rewrite Nat.add_assoc. rewrite Nat.add_shuffle0.
apply Nat.le_add_l. rewrite I in Q.
rewrite <- Nat.add_0_l at 1. apply Nat.add_le_mono.
apply Nat.le_0_l. assumption. rewrite Nat.min_l. reflexivity.
assert (2 <= 4). apply le_n_S. apply le_n_S. apply Nat.le_0_l.
generalize H3. generalize H4. apply Nat.le_trans.
replace ((hd ++ a ++ tl) ++ map negb (hd ++ a ++ tl))
with ((hd ++ firstn 2 a)
++ (skipn 2 a ++ firstn 2 (tl ++ map negb (hd ++ a ++ tl)))
++ (skipn 2 (tl ++ map negb (hd ++ a ++ tl)))) in H2.
assert (exists (x : bool),
firstn 2 (skipn 2 a ++ firstn 2 (tl ++ map negb (hd ++ a ++ tl)))
= [x;x]).
generalize H1. generalize H3. generalize H2. apply H0.
destruct H4. exists x. exists (firstn 2 a). exists nil.
rewrite <- H4. rewrite firstn_app. rewrite skipn_length. rewrite I.
replace (2 - (4 - 2)) with 0. rewrite firstn_O.
rewrite app_nil_r. rewrite app_nil_r.
destruct a. inversion I. destruct a. inversion I.
destruct a. inversion I. destruct a. inversion I.
destruct a. reflexivity. inversion I.
reflexivity.
rewrite <- app_assoc. symmetry. rewrite <- app_assoc.
apply app_inv_head_iff.
rewrite <- app_assoc. symmetry. rewrite <- app_assoc.
rewrite firstn_skipn.
rewrite <- firstn_skipn with (n := 2) (l := a) at 4.
rewrite <- app_assoc. reflexivity.
- reflexivity.
Qed.
(**
The following lemmas and theorems are related to the sequence being
cubefree. Only the final theorem is of general interest; all other

View File

@ -833,126 +833,3 @@ Admitted.
Lemma xxx : forall (n : nat) (hd a tl : list bool),
tm_step n = hd ++ a ++ tl
-> length a = 4 -> odd (length hd) = true
-> exists (x : bool) (u v : list bool), a = u ++ [x;x] ++ v.
Proof.
intros n hd a tl. intros H I J.
assert (K: 1 = (length hd) mod 2).
apply Nat.mod_unique with (q := Nat.div2 (length hd)). apply Nat.lt_1_2.
replace (1) with (Nat.b2n (Nat.odd (length hd))) at 2.
apply Nat.div2_odd. rewrite J. reflexivity.
assert (L: (length hd) mod (2*2)
= (length hd) mod 2 + 2 * (((length hd) / 2) mod 2)).
apply Nat.mod_mul_r; easy. rewrite <- K in L.
replace (2*2) with (4) in L. rewrite <- Nat.bit0_mod in L.
assert (M: (length hd) mod 4 = 1 \/ (length hd) mod 4 = 3). rewrite L.
destruct (Nat.testbit (length hd / 2) 0) ; [right | left] ; reflexivity.
assert (forall (n' : nat) (w z y : list bool),
tm_step n' = w ++ z ++ y
-> length z = 4 -> length w mod 4 = 1
-> exists (x : bool), firstn 2 z = [x;x]).
intros n' w z y. intros G0 G1 G2.
assert (U: 4 * (length w / 4) <= length w).
apply Nat.mul_div_le. easy.
assert (W: length w < length (tm_step n')). rewrite G0.
rewrite app_length. rewrite <- Nat.add_0_r at 1. rewrite <- Nat.add_lt_mono_l.
rewrite app_length. rewrite G1. apply Nat.lt_0_succ.
assert (Q: length z <= length (tm_step n')). rewrite G0.
rewrite app_length. rewrite app_length.
rewrite Nat.add_assoc. rewrite Nat.add_shuffle0.
apply Nat.le_add_l. rewrite tm_size_power2 in Q. rewrite G1 in Q.
replace (4) with (2^2) in Q. rewrite <- Nat.pow_le_mono_r_iff in Q.
assert (O: nth_error (tm_step 2) 1 = nth_error (tm_step 2) 2
<-> nth_error (tm_step (2+(n'-2))) (length w / 4 * 2 ^ 2 + 1)
= nth_error (tm_step (2+(n'-2))) (length w / 4 * 2 ^ 2 + 2)).
apply tm_step_repeating_patterns.
simpl. rewrite <- Nat.succ_lt_mono. apply Nat.lt_0_succ.
simpl. rewrite <- Nat.succ_lt_mono. rewrite <- Nat.succ_lt_mono.
apply Nat.lt_0_succ.
rewrite Nat.mul_lt_mono_pos_l with (p := 2^2). rewrite <- Nat.pow_add_r.
rewrite Nat.add_comm. rewrite Nat.sub_add.
replace (2^2) with 4.
rewrite tm_size_power2 in W. generalize W. generalize U.
apply Nat.le_lt_trans. reflexivity.
assumption.
rewrite <- Nat.neq_0_lt_0. apply Nat.pow_nonzero. easy.
rewrite Nat.mul_comm in O. replace (2^2) with 4 in O.
rewrite <- G2 in O at 9. rewrite <- G2 in O at 14.
replace (4 * (length w / 4) + S (length w mod 4))
with (S (length w)) in O. rewrite <- Nat.div_mod_eq in O.
replace (2+(n'-2)) with n' in O. rewrite G0 in O.
rewrite nth_error_app2 in O. rewrite Nat.sub_diag in O.
rewrite nth_error_app1 in O. rewrite nth_error_app2 in O.
rewrite Nat.sub_succ_l in O. rewrite Nat.sub_diag in O.
rewrite nth_error_app1 in O. destruct O.
assert (nth_error z 0 = nth_error z 1). apply H0. reflexivity.
rewrite nth_error_nth' with (d := false) in H2.
rewrite nth_error_nth' with (d := false) in H2.
exists (nth 0 z false). inversion H2.
rewrite H4 at 2.
destruct z. inversion G1. destruct z. inversion G1. reflexivity.
rewrite G1. rewrite <- Nat.succ_lt_mono. apply Nat.lt_0_succ.
rewrite G1. apply Nat.lt_0_succ.
rewrite G1. rewrite <- Nat.succ_lt_mono. apply Nat.lt_0_succ.
apply Nat.le_refl. apply Nat.le_succ_diag_r.
rewrite G1. apply Nat.lt_0_succ. apply Nat.le_refl.
rewrite Nat.add_sub_assoc. rewrite Nat.add_sub_swap.
reflexivity. easy. assumption.
rewrite Nat.add_succ_r. rewrite <- Nat.div_mod_eq. reflexivity.
reflexivity. apply Nat.lt_1_2. reflexivity.
destruct M as [M | M].
- assert (exists (x : bool), firstn 2 a = [x;x]).
generalize M. generalize I. generalize H. apply H0.
destruct H1. exists x. exists nil. exists (skipn 2 a).
rewrite app_nil_l. rewrite <- H1. symmetry. apply firstn_skipn.
- assert ((length (hd ++ (firstn 2 a))) mod 4 = 1).
rewrite app_length. rewrite firstn_length. rewrite I.
rewrite <- Nat.add_mod_idemp_l. rewrite M. reflexivity. easy.
assert (tm_step (S n) = tm_step n ++ map negb (tm_step n)).
apply tm_build. rewrite H in H2.
assert (length ((skipn 2 a)
++ (firstn 2 (tl ++ (map negb (hd ++ a ++ tl))))) = 4).
rewrite app_length. rewrite skipn_length. rewrite I.
rewrite firstn_length. rewrite app_length. rewrite <- H.
rewrite map_length.
assert (4 <= length tl + length (tm_step n)).
assert (Q: length a <= length (tm_step n)). rewrite H.
rewrite app_length. rewrite app_length.
rewrite Nat.add_assoc. rewrite Nat.add_shuffle0.
apply Nat.le_add_l. rewrite I in Q.
rewrite <- Nat.add_0_l at 1. apply Nat.add_le_mono.
apply Nat.le_0_l. assumption. rewrite Nat.min_l. reflexivity.
assert (2 <= 4). apply le_n_S. apply le_n_S. apply Nat.le_0_l.
generalize H3. generalize H4. apply Nat.le_trans.
replace ((hd ++ a ++ tl) ++ map negb (hd ++ a ++ tl))
with ((hd ++ firstn 2 a)
++ (skipn 2 a ++ firstn 2 (tl ++ map negb (hd ++ a ++ tl)))
++ (skipn 2 (tl ++ map negb (hd ++ a ++ tl)))) in H2.
assert (exists (x : bool),
firstn 2 (skipn 2 a ++ firstn 2 (tl ++ map negb (hd ++ a ++ tl)))
= [x;x]).
generalize H1. generalize H3. generalize H2. apply H0.
destruct H4. exists x. exists (firstn 2 a). exists nil.
rewrite <- H4. rewrite firstn_app. rewrite skipn_length. rewrite I.
replace (2 - (4 - 2)) with 0. rewrite firstn_O.
rewrite app_nil_r. rewrite app_nil_r.
destruct a. inversion I. destruct a. inversion I.
destruct a. inversion I. destruct a. inversion I.
destruct a. reflexivity. inversion I.
reflexivity.
rewrite <- app_assoc. symmetry. rewrite <- app_assoc.
apply app_inv_head_iff.
rewrite <- app_assoc. symmetry. rewrite <- app_assoc.
rewrite firstn_skipn.
rewrite <- firstn_skipn with (n := 2) (l := a) at 4.
rewrite <- app_assoc. reflexivity.
- reflexivity.
Qed.