WIP/Discussion: ValuationSpectrum as one-field structure (alternative to #38009)#38042
WIP/Discussion: ValuationSpectrum as one-field structure (alternative to #38009)#38042CBirkbeck wants to merge 16 commits intoleanprover-community:masterfrom
Conversation
…ology
Define the valuation spectrum `Spv A` of a commutative ring as the type
of valuative relations on `A`, following Definition 4.1 of Wedhorn's
*Adic Spaces*. Equip it with the topology generated by basic open sets
`{ v | v(f) ≤ v(s) ∧ v(s) ≠ 0 }`.
## New files
* `ValuativeRel/Comap.lean`: Pullback of a `ValuativeRel` along a ring
homomorphism, and the lemma that units cannot map to zero.
* `ValuationSpectrum.lean`: The valuation spectrum with:
- basic open sets and their properties
- contravariant functoriality (`comap`) and its continuity
- support map `Spv A → Spec A` and its continuity
- quotient lifting and topological embedding
- localization lifting and range characterization
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…cstrings Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…rings The module docstring already references Wedhorn; no need to repeat it on individual declarations. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Both files were missing the `module` keyword, `public import`, and `@[expose] public section` required by the Lean 4 module system. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Comap.lean: - @[reducible] → @[implicit_reducible] - use ≤ᵥ notation in comap field body - comap_vle now returns ↔ / Iff.rfl (these are Props) - rename ValuativeRel.not_vle_zero_of_isUnit → IsUnit.not_vle_zero (enables dot notation hu.not_vle_zero) - golf not_vle_zero proof to a single simpa ValuationSpectrum.lean: - fix Wedhorn bib key (wedhorn_adic) - basicOpen_mul_subset: refactor with refine + simpa - docstrings: Spv(φ) → comap φ, v ∈ Spv A → v : Spv A - comap_id, comap_comp: by ext; rfl - instIsPrimeSupp: term-mode inferInstanceAs - add @[simp] rfl lemma vle_ofValuation and eliminate change in supp_ofValuation - replace let := with letI := for typeclass instance bindings Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add ValuativeRel.comap_id and ValuativeRel.comap_comp in Comap.lean as named rfl lemmas. Use them in ValuationSpectrum.comap_id / comap_comp via congr_arg (·.vle), rather than closing the underlying goal with a bare rfl. Addresses reviewer comment on line 117. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Per riccardobrasca's suggestion, define ValuationSpectrum as a one-field
structure { toValuativeRel : ValuativeRel A } rather than `extends ValuativeRel A`.
This makes the semantic distinction between Spv points and ValuativeRels explicit.
To recover the dot-notation accessors that `extends` previously provided for free,
add explicit wrapper API:
- abbrev vle (v : Spv A) : A → A → Prop := v.toValuativeRel.vle
- vle_total, vle_trans, vle_add, mul_vle_mul_left, vle_mul_cancel,
not_vle_one_zero (all delegate to v.toValuativeRel)
Existing call sites continue to work because v.vle resolves to ValuationSpectrum.vle
(unfolding to v.toValuativeRel.vle definitionally via the abbrev).
Proofs that previously relied on the auto-derived ValuationSpectrum.ext chaining
all the way down to vle = vle now need an extra `apply ValuativeRel.ext` step,
since the new structure's @[ext] only descends to toValuativeRel = toValuativeRel.
Net diff: +40 / -11 lines.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
PR summary bc7bce2142Import changes for modified filesNo significant changes to the import graph Import changes for all files
|
Draft / discussion PR — do not merge.
(In case its not obvious, this was all written by Claude).
This is an alternative design for #38009, prototyping the suggestion in this comment from @riccardobrasca:
Tagging the others mentioned there for visibility: @mariainesdff @faenuccio @jjdishere @kbuzzard.
What this PR is
The same content as #38009 (all reviewer fixes already applied), but with
ValuationSpectrumdefined as a one-field structure instead ofextends ValuativeRel A.What changes vs #38009
1. Structure definition
A point of
Spv Ais no longer literally aValuativeRel A; you must explicitly.toValuativeRelto access the relation. This makes the semantic distinction "points ofSpv A" vs "valuative relations onA" explicit at the type level.2. Wrapper API to recover dot notation (~16 lines)
With
extendswe gotv.vle,v.vle_total,v.mul_vle_mul_left, etc. for free. Without it, those need to be introduced explicitly:vleis anabbrev, so existing call sites likebasicOpen f s := { v | v.vle f s ∧ ¬ v.vle s 0 }continue to work without modification.3. Proof updates (4 places)
Some proofs that previously closed via
ValuationSpectrum.extchaining all the way down tovle = vle(via theextends-derived ext lemma) now need an extraapply ValuativeRel.extstep, since the new structure's@[ext]only descends totoValuativeRel = toValuativeRel. Affected:ofValuation_eq_of_isEquiv,ofValuation_valuation,quotientLift_comap,comap_injective.A couple of proofs (
comap_id,comap_comp) actually got cleaner — they no longer need acongr_arg (·.vle) ...projection trick.Net stats vs #38009
ValuativeRel.extcomap_id,comap_comp)letI/@count at the derived-API layerWhat this design does NOT change
The
letI/@noise that triggered the original design discussion lives at the derived API layer (ValuativeRel.supp,ValuativeRel.valuation,ValuativeRel.supp_eq_valuation_supp, etc.), not at the structure level. Those operations take[ValuativeRel R]as a typeclass argument, so we still needletI := v.toValuativeRelto pass our specific relation. Bothextendsand the one-field design hit this wall.The cleanest fix for the
letI/@noise (IMO) would be a separate PR adding term-mode versions of those operations toValuativeRel/Basic.lean— e.g.ValuativeRel.supp' (v : ValuativeRel R) : Ideal Rtaking the relation as an explicit argument. That refactor is independent of which shapeSpvtakes here, and would benefit both designs equally.