Skip to content

Deduplicate redundant proofs: closed-range cokernel argument and diagonal-operator self-adjointness - #15

Merged
JonBannon merged 8 commits into
mainfrom
dedupe-redundancies
Jun 21, 2026
Merged

JonBannon merged 8 commits into
mainfrom
dedupe-redundancies

Conversation

@JonBannon

@JonBannon JonBannon commented Jun 20, 2026 •

Copy link
Copy Markdown
Owner

Summary

Follow-up to a redundancy sweep across main: two genuine instances of the same mathematical fact being proved independently in more than one place, now consolidated into shared lemmas.

  • Submodule.quotientEquivOrthogonal (+ finrank_quotient_eq_finrank_orthogonal, finiteDimensional_quotient_of_finiteDimensional_orthogonal) in CompactOperators.lean: Examples/Shift.lean proved this fact by hand for H over ℂ, while isFredholm_one_sub independently derived the same underlying fact inline for general RCLike 𝕜. Extracted once, generalized, both call sites now reuse it.
  • lpDiag.diracDomain/diracDirac/diracDirac_isSelfAdjoint in DiagonalOperator.lean: Examples/Circle.lean (scalar eigenvalues) and Examples/Torus.lean (2×2 Hermitian spinor blocks) each proved, by hand, that their diagonal Dirac operator is self-adjoint on its maximal H¹ domain via an essentially identical argument (symmetry from Hermitian blocks, domain density via single-mode basis vectors, adjoint-domain inclusion by testing against the same vectors). Generalized to any family of symmetric blocks B i : G i →ₗ[𝕜] G i; both files now instantiate it instead of duplicating the proof.

Also:

  • Cleaned up [DecidableEq α] lint warnings in DiagonalOperator.lean properly — per the project's own style linter, declarations whose statement needs lp.single keep it as an explicit hypothesis; declarations that only need it inside their proof use the classical tactic instead.
  • Backfilled scripts/axiom_report.lean, which never picked up CompactOperators.lean's tracked declarations after an earlier merge.
  • Synced the blueprint with CompactOperators.lean's Riesz–Schauder content and the new FourierHolomorphic.lean (M3a/M3b: the exact dimension count dim H⁰(L_k) = k, dim H¹(L_k) = 0), which had landed on main without blueprint coverage.
  • Fixed stale file:line references in audit/FAITHFULNESS.md (the Torus.lean refactor shifted ~14 declaration lines by ~98; a new import in DiagonalOperator.lean shifted 3 more by 1) and added a row for the new shared lpDiag.diracDirac_isSelfAdjoint lemma.

What did not change

All public names and statements are preserved exactly (diracDomain, mem_diracDomain_iff, diracDirac, diracDirac_apply, diracDirac_isSelfAdjoint, fredholmIndex_shift, isFredholm_one_sub), so no downstream theorem needed any change — resolvent compactness, the algebra representations, grading, index_eq_zero all build unchanged. The regenerated axiom report is byte-identical to the existing golden file.

Checklist

Build & correctness

  • lake build SpectralTriples is clean (no errors, no warnings).
  • No new sorry and no new axiom (search the diff).
  • New/changed headline declarations are axiom-clean: #print axioms shows only propext, Classical.choice, Quot.sound.

Assurance sync

  • scripts/axiom_report.lean lists every new/renamed headline declaration (and drops removed ones) — also backfilled the pre-existing gap for CompactOperators.lean.
  • Regenerated the golden trace: lake env lean scripts/axiom_report.lean > audit/axiom-report.txt — byte-identical to the prior committed version (no behavior change, only proof reorganization).
  • audit/FAITHFULNESS.md updated: fixed stale file:line references shifted by this PR's refactor, added a row for the new shared lemma.
  • README "Current status" table checked — it links to files, not line numbers, so unaffected.

Definition changes

  • Updated every downstream user (Circle.lean, Torus.lean, Shift.lean) in this PR; no signatures changed, so nothing further needed.

Test plan

  • lake build clean across the whole project.
  • lake env lean scripts/axiom_report.lean output is byte-identical to the committed audit/axiom-report.txt.
  • Spot-checked axiom-cleanliness directly on the refactored declarations (lpDiag.diracDirac_isSelfAdjoint, Circle.diracDirac_isSelfAdjoint, Torus.diracDirac_isSelfAdjoint, Torus.index_eq_zero, Shift.fredholmIndex_shift, Fredholm.isFredholm_one_sub) — all [propext, Classical.choice, Quot.sound].
  • Blueprint PDF and web builds both clean; all newly referenced declarations verified to resolve.

🤖 Generated with Claude Code

JonBannon and others added 6 commits June 20, 2026 10:08
… (M3a/M3b)

Add the "Compact perturbations of the identity" subsection (Riesz-Schauder
Fredholm theorem and its supporting lemmas) and the new "Fourier-coefficient
recursion" section covering periodIntegral_eq_of_periodic, the holSection/
holCoeff machinery, and the exact dimension count dim H^0(L_k) = k,
dim H^1(L_k) = 0. Update the theta-sections status note and chapter intro
accordingly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Examples/Shift.lean proved finrank_quotient_range_eq_orthogonal by hand for
H over ℂ, while CompactOperators.lean's isFredholm_one_sub independently
derived the same underlying fact (quotient by a closed-range submodule is
linearly equivalent to its orthogonal complement) inline, for general
RCLike 𝕜. Extract the shared fact as Submodule.quotientEquivOrthogonal (plus
the finrank and FiniteDimensional-transfer corollaries) in CompactOperators.lean,
generalized to RCLike 𝕜, and have both call sites reuse it.

Also backfills scripts/axiom_report.lean, which never picked up
CompactOperators.lean's tracked declarations (IsCompactOperator.adjoint,
isFredholm_one_sub, etc.) after the chiral-fredholm merge.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Circle.lean and Torus.lean each proved, by hand, that their respective
diagonal Dirac operator (scalar eigenvalues vs. 2x2 Hermitian spinor blocks)
is self-adjoint on its maximal H^1 domain, via an essentially identical
argument: symmetry from the blocks being Hermitian, domain density via
testing against single-mode basis vectors, and the adjoint-domain inclusion
by testing the adjoint relation against the same vectors.

Extract this as a generic construction in DiagonalOperator.lean
(lpDiag.diracDomain/diracDirac/diracDirac_isSelfAdjoint, parametrized by any
family of symmetric blocks B i : G i ->l[k] G i), and have both Circle.lean
and Torus.lean instantiate it instead of duplicating the proof. All public
names and statements are preserved exactly (diracDomain, mem_diracDomain_iff,
diracDirac, diracDirac_apply, diracDirac_isSelfAdjoint), so every downstream
theorem (resolvent compactness, representation, grading, index_eq_zero) is
unaffected -- verified axiom-clean, and the regenerated axiom report is
byte-identical to the existing golden file.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
It was declared at the top of the whole lpDiag.diracDirac section, so every
earlier lemma (diracDomain, diracDirac_apply, diracDirac_isFormalAdjoint,
etc., none of which touch lp.single) picked it up as an unused hypothesis.
Move it down to right before single_mem_diracDomain, where it's first
actually needed, and add the now-possible omit clauses for CompleteSpace on
lemmas that don't need adjoint/density machinery either.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
open scoped Classical (my previous fix) is itself flagged by the project's
own style linter: it silently fills in decidability for every declaration
that follows, which can hide statements that would be better off explicit.
The linter's own suggestion is the right fix: declarations whose *statement*
mentions lp.single (single_mem_diracDomain, diracDirac_single) take
[DecidableEq alpha] as an explicit hypothesis; declarations that only need it
inside their *proof* (dense_diracDomain, diracDirac_isSelfAdjoint) use the
`classical` tactic instead, so the hypothesis never leaks into their type.
diracDirac_le_adjoint needed neither, once decidability isn't pulled in via
a blanket `variable`.

No remaining linter warnings in the file; axiom report unchanged (Classical.
choice was already a dependency everywhere in this development).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…red lemma

The Torus.lean domain/self-adjointness refactor shifted every later declaration
by ~98 lines; the new import in DiagonalOperator.lean shifted diagL/norm_diagL_le/
isCompactOperator_diagL by 1. Also adds a row for the new shared
lpDiag.diracDirac_isSelfAdjoint lemma that Circle.lean and Torus.lean now both
instantiate.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@JonBannon JonBannon changed the title feat : remove redundancies Deduplicate redundant proofs: closed-range cokernel argument and diagonal-operator self-adjointness Jun 20, 2026
JonBannon and others added 2 commits June 20, 2026 19:42
…ations

The file/section-level summaries said this proves "the Hilbert-space case of
the classical Riesz-Schauder theorem," but the classical theorem's conclusion
includes index 0, which isFredholm_one_sub explicitly does not prove (its own
docstring already says so). Reword the summaries to match: only the
structural Fredholm-ness part (finite kernel, closed range, finite
codimension) is proved.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
\and rendered fine in the PDF but plastex's web template dropped the word
entirely, showing "Jon Bannon Michael R. Douglas". Spell it out literally so
both renderers agree.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@JonBannon
JonBannon merged commit 98efcb0 into main Jun 21, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant