Editor rules updated (.cursorrules, .clinerules, copilot-instructions, .roo): - Build: 3571 jobs, 0 errors - Sorry inventory: 8 across 4 files (all documented) - Q16_16 compliance, new modules list, FPGA info - Fixed stale path in copilot-instructions Opencode agents: - 3 marked RESOLVED (pist-simulation, qfactor, ssms) - 2 new agents created (adjugate-matrix, hamiltonian-mechanics) - 1 updated (hyperbolic-statesurface) SORRY_AUDIT.md: updated to 8 sorries across 4 files
2.8 KiB
| description | mode | model | permission | ||||||
|---|---|---|---|---|---|---|---|---|---|
| Fix the two sorry blocks in AdjugateMatrix.lean (det_self_inverse_approx and det_self_inverse_exact). Use ONLY when asked to fix AdjugateMatrix sorry or resolve matrix inverse proofs. | subagent | anthropic/claude-sonnet-4-6 |
|
Fix AdjugateMatrix.lean sorry blocks
Context
Semantics/AdjugateMatrix.lean has two sorry blocks related to the 8×8 matrix inverse correctness:
Sorry 1: det_self_inverse_approx (line 296)
theorem det_self_inverse_approx {m : Matrix8} {inv : Matrix8} (ε : Q16_16)
(h : matrixInverse m = some inv) :
matrixApproxEq (matrixMultiply m inv) identity8 ε := by
sorry
Blocker: Q16_16 truncation causes 1 LSB error in division/multiplication. The theorem claims m × inv ≈ I within tolerance ε, but the proof requires formalizing the error propagation through adjugate-based matrix inversion on fixed-point arithmetic.
Path forward:
- (a) Prove a bounded-error variant with explicit ε bound derived from Q16_16 division error
- (b) Add exact-div precondition (if det divides cleanly)
- (c) Port to Mathlib ℚ proof where Laplace cofactor identity has a clean proof
Sorry 2: det_self_inverse_exact (line 305)
theorem det_self_inverse_exact {m : Matrix8} {inv : Matrix8}
(h : matrixInverse m = some inv)
(h_div_exact : ∀ i j : Fin 8, ((getEntry (adjugate m) j.val i.val).toInt * 65536) % (det8 m).toInt = 0)
(h_mul_exact : ∀ i j k : Fin 8, ((getEntry m i.val k.val).toInt * (getEntry inv k.val j.val).toInt) % 65536 = 0) :
matrixMultiply m inv = identity8 := by
sorry
Blocker: Requires showing that when all Q16_16 division and multiplication operations are exact (no truncation), the adjugate-based inverse satisfies m × inv = I exactly. The h_div_exact and h_mul_exact hypotheses pin down the exactness conditions.
Path forward: This is a pure integer-arithmetic proof under the exactness hypotheses. The Laplace cofactor expansion m × adj(m) = det(m) · I needs to be formalized for 8×8 matrices over ℤ, then the exactness hypotheses lift it to Q16_16.
Note
det_self_inverse (the original single sorry from prior audits) was refactored into these two variants. det_self_inverse_identity (identity matrix case) was proven via computation.
Steps
- Read
Semantics/AdjugateMatrix.leanlines 270-310 - Read
Semantics/FixedPoint.leanfor Q16_16 arithmetic lemmas - Decide strategy: exact-path (
det_self_inverse_exact) is likely easier since hypotheses remove all rounding concerns - Prove
det_self_inverse_exactfirst (integer-arithmetic Laplace expansion) - Then address
det_self_inverse_approx(requires error-bound analysis) - Build:
lake build Semantics.AdjugateMatrix - Build:
lake build Compiler