@@ -6,6 +6,7 @@ import CollatzFunction.Tm8.Transition
66import CollatzFunction.Tm8.Representation
77import CollatzFunction.Collatz
88import CollatzFunction.ListBlank
9+ import Mathlib.Tactic.Zify
910
1011namespace Tm8
1112
@@ -16,94 +17,112 @@ lemma G_even (n i: ℕ) (h_even: Even n) (init_cfg: Cfg)
1617nth_cfg_is_n (i+(n^2 +3 *n)/2 +3 ) (collatz n) init_cfg
1718:= by
1819obtain ⟨l, h⟩ := h
19- cases n with
20- | zero => unfold collatz nth_cfg_is_n
20+ match n with
21+ | 0 => unfold collatz nth_cfg_is_n
22+ simp
23+ forward h
24+ forward h
25+ forward h
26+ ring_nf at *
27+ simp [h]
28+ use (zero :: l)
29+ | 1 => tauto
30+ | Nat.succ (Nat.succ n) =>
31+ obtain ⟨k, h_even⟩ := h_even
32+ cases k with
33+ | zero => omega
34+ | succ k =>
35+ have h_even : n = 2 * k := by omega
36+ subst n
37+ forward h
38+ forward h
39+ rw [← (ListBlank_empty_eq_single_zero (List.replicate _ one))] at h
40+ apply B_even at h
41+ . forward h
42+ rw [add_comm 1 ] at h
43+ rw [List.replicate_succ] at h
44+ simp at h
45+ forward h
46+ ring_nf at *
47+ have g : 3 + i + ((k * 2 ).succ.succ * 3 + (k * 2 ).succ.succ ^ 2 ) / 2 = 8 + i + k ^ 2 * 4 / 2 + k * 14 / 2 := by
2148 simp
22- forward h
23- forward h
24- forward h
25- ring_nf at *
26- simp [h]
27- use (zero :: l)
28- | succ n => forward h
29- cases n with
30- | zero => ring_nf at *; tauto
31- | succ n => obtain ⟨k, h_even⟩ := h_even
32- cases k with
33- | zero => omega
34- | succ k =>
35- have h_even : n = 2 * k := by omega
36- subst n
37- forward h
38- rw [← (ListBlank_empty_eq_single_zero (List.replicate _ one))] at h
39- apply B_even at h
40- . forward h
41- rw [add_comm 1 ] at h
42- rw [List.replicate_succ] at h
43- simp at h
44- forward h
45- ring_nf at *
46- have g :(3 + i + (10 + k * 14 + k ^ 2 * 4 ) / 2 ) = (8 + i + k ^ 2 * 4 / 2 + k * 14 / 2 ) := by omega
47- rw [g]
48- use (List.replicate k one ++ zero :: zero :: l)
49- simp [h]
50- simp [collatz]
51- rw [List.replicate_succ]
52- . use k; omega
49+ ring_nf
50+ calc
51+ _ = 3 + i + 5 + k * 7 + 2 * k ^ 2 := by omega
52+ _ = 8 + i + k ^ 2 * 2 + k * 7 := by ring_nf
53+ _ = _ := by omega
54+ rw [g]
55+ use (List.replicate k one ++ zero :: zero :: l)
56+ simp [h]
57+ simp [collatz]
58+ ring_nf
59+ simp
60+ rw [List.replicate_succ]
61+ . use k; omega
62+
5363
5464lemma G_odd (n i: ℕ) (h_odd: Odd n) (init_cfg: Cfg)
5565(h: nth_cfg_is_n i n init_cfg) :
5666nth_cfg_is_n (i+(3 * n^2 +4 *n+1 )/2 ) (collatz n) init_cfg
5767:= by
5868obtain ⟨l, h⟩ := h
59- cases n with
60- | zero => ring_nf at *; tauto
61- | succ n => forward h
62- cases n with
63- | zero => ring_nf at *
64- forward h
65- forward h
66- forward h
67- use l
68- simp [h]
69- simp [collatz]
70- | succ n => obtain ⟨k, h_odd⟩ := h_odd
71- cases k with
72- | zero => omega
73- | succ k =>
74- have h_odd : n = 2 * k+1 := by omega
75- subst n
76- forward h
77- rw [← List.replicate_succ] at h
78- rw [← (ListBlank_empty_eq_single_zero (List.replicate _ one))] at h
79- apply B_odd at h
80- . forward h
81- have g : (2 +k*2 ) /2 = k + 1 := by omega
82- rw [g] at h
83- rw [List.replicate_succ] at h
84- simp at h
85- rw [← List.replicate_succ] at h
86- apply copy_half at h
87- rw [← (ListBlank_empty_eq_single_zero (List.replicate _ one))] at h
88- apply G_to_J at h
89- forward h
90- ring_nf at *
91- have g : (i + (40 + k * 44 + k ^ 2 * 12 ) / 2 ) = (16 + i + k * 13 + k ^ 2 * 4 + (8 + k * 18 + k ^ 2 * 4 ) / 2 ) := by omega
92- rw [g]
93- use l
94- simp [h]
95- simp [collatz]
96- rw [← List.replicate_one]
97- rw [List.replicate_append_replicate]
98- rw [← List.replicate_succ]
99- apply congr
100- any_goals rfl
101- apply congr
102- any_goals rfl
103- apply congr
104- any_goals rfl
105- omega
106- . use k; omega
69+ match n with
70+ | 0 => tauto
71+ | 1 => forward h
72+ ring_nf at *
73+ forward h
74+ forward h
75+ forward h
76+ use l
77+ simp [h]
78+ simp [collatz]
79+ | Nat.succ (Nat.succ n) =>
80+ forward h
81+ obtain ⟨k, h_odd⟩ := h_odd
82+ cases k with
83+ | zero => omega
84+ | succ k =>
85+ have h_odd : n = 2 * k+1 := by omega
86+ subst n
87+ forward h
88+ rw [← List.replicate_succ] at h
89+ rw [← (ListBlank_empty_eq_single_zero (List.replicate _ one))] at h
90+ apply B_odd at h
91+ . forward h
92+ have g : (2 +k*2 ) /2 = k + 1 := by omega
93+ rw [g] at h
94+ rw [List.replicate_succ] at h
95+ simp at h
96+ rw [← List.replicate_succ] at h
97+ apply copy_half at h
98+ rw [← (ListBlank_empty_eq_single_zero (List.replicate _ one))] at h
99+ apply G_to_J at h
100+ forward h
101+ ring_nf at *
102+ have g : i + (1 + (1 + k * 2 ).succ.succ * 4 + (1 + k * 2 ).succ.succ ^ 2 * 3 ) / 2 = 16 + i + k * 13 + k ^ 2 * 4 + (8 + k * 18 + k ^ 2 * 4 ) / 2 := by
103+ simp
104+ ring_nf
105+ calc
106+ _ = i + 20 + 22 * k + 6 * k^2 := by omega
107+ _ = 16 + i + k * 13 + k ^ 2 * 4 + 4 + k * 9 + k ^ 2 * 2 := by ring_nf
108+ _ = _ := by omega
109+ rw [g]
110+ use l
111+ simp [h]
112+ simp [collatz]
113+ ring_nf
114+ simp
115+ rw [← List.replicate_one]
116+ rw [List.replicate_append_replicate]
117+ rw [← List.replicate_succ]
118+ apply congr
119+ any_goals rfl
120+ apply congr
121+ any_goals rfl
122+ apply congr
123+ any_goals rfl
124+ omega
125+ . use k; omega
107126
108127-- n -> collatz n
109128theorem G_collatz (n i: ℕ) (init_cfg: Cfg)
0 commit comments