The comparison H1Tail D ≃ₗ Cech.H1 D (laurent-tails, design §4.3/§5) #
Unit: laurent-tails (docs/design/laurent-tails.md).
Status (honest, full account in the file-end note; this is a FINISHER-pass update — three of the unit's four original deferrals are now closed):
tailToH1 : T D →ₗ[ℂ] Cech.H1 D— fully built (zero sorries), constructed from scratch via a per-point Mittag-Leffler classmlClassAt D p ψ : H1 D(a 2-member cover{V, X∖{p}}realizingψon a clean neighbourhoodV), proved independent of every choice involved (mlClassAtOf_agree), then assembled viaSubmodule.liftQ/DFinsupp.lsum.tailToH1_alpha(tailToH1 D (alphaL D f) = 0) — CLOSED. The needed multi-point combination is built viamlSumCochain/alphaPatch/alphaAuxD(an(|S|+1)-member adapted cover realizing a globalf's restriction at each of its finitely many "bad" points,0on background) plus aFinset.induction_oncombination (CLAIM1relates each point'smlClassAtto the big cover via apairCover-to-𝒱refinement,mlClass_addcombines two at a time); the whole sum vanishes viamlClass_eq_zero_of_existswith the global witnessfitself, using that off-diagonal cover overlaps never meet the marked-point FinsetS(pure adaptedness).H1Tail.toH1 : H1Tail D →ₗ[ℂ] Cech.H1 D(Submodule.liftQofftailToH1_alpha) andH1Tail.toH1_injective— CLOSED (both). Injectivity needed a second, independent multi-point construction (injG/injPatch/injD', this time realizing an arbitrary tail datumz : T Dvia chosen representativesψ prather than one global function — no globalfis available a priori, that is exactly what injectivity produces), thenCech.mlClass_eq_zero_iff's⇒half (Forster 12.4, confirmed landed) extracts a global witnessφ : LinSys D'realizingzpointwise, i.e.z = alpha D φ.H1Tail.equivOfSurjective— a genuine, honestly-parametrized (CONVENTIONS.mdrule 3) conditional equivalence:Function.Surjective (tailToH1 D) → H1Tail D ≃ₗ[ℂ] Cech.H1 D, built from the now-unconditionalH1Tail.toH1_injective. Surjectivity itself is NOT proved — see the file-end note for a full account of why (this is now a proven-hard fact, not a bookkeeping gap: it requires resolving an arbitrary Čech cohomology class into a sum of Mittag-Leffler local data, which afterdolbeault-comparison's Leray theorem gives cocycle-on-a-good-cover representatives but does not by itself resolve the "collapse an arbitrary good-cover cocycle to marked-point-supported data" step — genuinely new complex analysis, comparable in depth to a Mittag-Leffler/Cousin-I existence theorem, well beyond a single finisher session; the file-end note records the full risk analysis for whoever picks this up next).
An important build-engineering lesson recorded here for future large proofs in this codebase
(see the file-end note's "gotchas" section): composing an Opens X-level ≤ with a Set X-level
⊆ via bare .trans (relying on the automatic coercion) causes catastrophic isDefEq/whnf
slowdowns (confirmed: a single lemma this way took >4,000,000 heartbeats and did not finish in
7+ minutes; converting the Opens-level term to an explicit Set-level inclusion first, then
using plain Set.Subset.trans, fixed it in under 10 seconds). Likewise, a single tactic proof
accumulating ~25 have/set steps hits a severe elaboration performance wall regardless of
maxHeartbeats; factoring the construction into separate top-level def/theorem declarations
(each against an explicit variable/include list) — mirroring how tailToH1_alpha's own
helpers (alphaPatch/mlSumCochain/…) were already structured — restores normal compile times.
Small helper lemmas towards the construction #
Isolated-singularity fact for a general (not necessarily connected/global) germ: away from
p, φ is regular (order ≥ 0) on some open neighbourhood of p inside its domain.
C1.retype commutes with restriction along a refinement index (both sides are literally the
same restriction of the same underlying germ).
mlClass is compatible with refining the underlying cover: pulling the realizing 0-cochain
back along a refinement index gives the same class in H1 D.
The per-point construction: realizing a clean representative #
The 2-member cover {V, X ∖ {p}}, used to realize a single tail datum at p.
Equations
Instances For
The 0-cochain realizing ψV on V, 0 on the background X ∖ {p}.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The bump divisor supported only at p, covering -(ψ.ord p) there.
Equations
Instances For
mlClass invariance under raising the auxiliary divisor D' (from #
`scratch_ltails2.lean`)
A chart neighbourhood of p clean for ψ: small enough that ψ is the only departure from D
on it.
Equations
- RS.LaurentTail.cleanNbhd D p ψ = ⋯.choose ⊓ RS.Cech.compOpens (⋯.toFinset.erase p)
Instances For
The auxiliary divisor D' bumped at p #
The order of the pole that ψ contributes at p.
Instances For
The auxiliary divisor admitting ψ at p on top of D.
Equations
- RS.LaurentTail.DPrimeOf D p ψ = D + RS.LaurentTail.bumpDivisor p (RS.LaurentTail.nOf D p ψ - D p)
Instances For
ψ restricted to its clean neighbourhood, as a section of the auxiliary linear system.
Equations
- RS.LaurentTail.ψVOf D p ψ = ⟨(RS.MeroGermOn.restrict ⋯) ψ, ⋯⟩
Instances For
Generic version: gOf's coboundary is D-bounded whenever V is clean for ψ away from
p and avoids D's other poles, and D' agrees with D away from p. Stated with fully
abstract V/ψV/D' (no unfolding of cleanNbhd/ψVOf/DPrimeOf needed inside the proof).
Transport mlClass along an equality of the underlying 0-cochain (avoids the
"motive is not type correct" failure of rw on mlClass's dependent hg argument).
The single-point Mittag-Leffler class, and its independence of choices #
The Mittag-Leffler class of ψ at p, computed through a chosen clean neighbourhood V.
Equations
- RS.LaurentTail.mlClassAtOf p D D' ψ V hpV hVsub hVclean hVDzero ψV hψV = RS.Cech.mlClass (RS.LaurentTail.pairCover p V hpV) (RS.LaurentTail.gOf p V hpV D' ψV) ⋯
Instances For
Raise-then-refine identity: mlClassAtOf computed via (D',V) equals the one computed via
(D'', W) for W ≤ V and D' ≤ D'', provided the D''-typed representative on W is again
restrict ψ.
Independence of choices. mlClassAtOf's value does not depend on which valid
(V, D', ψV) data is used to represent the same ambient germ ψ.
The Mittag-Leffler class in H¹(D) of a germ ψ at the point p.
Equations
- RS.LaurentTail.mlClassAt D p ψ = RS.LaurentTail.mlClassAtOf p D (RS.LaurentTail.DPrimeOf D p ψ) ψ (RS.LaurentTail.cleanNbhd D p ψ) ⋯ ⋯ ⋯ ⋯ (RS.LaurentTail.ψVOf D p ψ) ⋯
Instances For
AddCommGroup (H1 D), registered globally: Module.DirectLimit.addCommGroup is stated with
G/f as leading explicit arguments (not instance-implicit), so plain inferInstance/typeclass
search for AddCommGroup (H1 D) does not find it automatically through the H1 abbrev — needed
explicitly here so Submodule.liftQ's own instance search (for its codomain) succeeds.
Equations
- RS.LaurentTail.instAddCommGroupH1 D = Module.DirectLimit.addCommGroup (fun (𝒰 : RS.Cech.FinCover ⊤) => RS.Cech.H1Cover D 𝒰) fun (x x_1 : RS.Cech.FinCover ⊤) (h : x ≤ x_1) => RS.Cech.resH1' D h
mlClassAt packaged as a linear map on germs at p.
Equations
- RS.LaurentTail.mlClassAtRaw D p = { toFun := RS.LaurentTail.mlClassAt D p, map_add' := ⋯, map_smul' := ⋯ }
Instances For
The tail-to-cohomology map at a single point.
Equations
- RS.LaurentTail.tailAtToH1 D p = (RS.Cech.ordGe p (-D p)).liftQ (RS.LaurentTail.mlClassAtRaw D p) ⋯
Instances For
The tail-to-cohomology map on the whole tail space T D.
Equations
- RS.LaurentTail.tailToH1 D = (DFinsupp.lsum ℕ) fun (p : X) => RS.LaurentTail.tailAtToH1 D p
Instances For
General helpers #
The auxiliary divisor D ⊔ (-div f), which admits f.
Equations
- RS.LaurentTail.alphaAuxD D f = D ⊔ -RS.divisor f
Instances For
The clean patch at a marked point, avoiding the other marked points #
A neighbourhood of p clean for f and meeting no other marked point of S.
Equations
- RS.LaurentTail.alphaPatch D f S p = RS.LaurentTail.cleanNbhd D p ((RS.MeroGermOn.restrict ⋯) f) ⊓ RS.Cech.compOpens (S.erase p)
Instances For
The Finset-indexed Mittag-Leffler cochain #
The 0-cochain assembling f's local data over the marked points of T.
Equations
- RS.LaurentTail.mlSumCochain D' f hf T k = if _h : ∃ p ∈ T, p ∈ 𝒱.U k then ⟨(RS.MeroGermOn.restrict ⋯) f, ⋯⟩ else 0
Instances For
Pieces of tailToH1_alpha #
The theorem is assembled from these lemmas rather than written as one proof: as a single
declaration it exceeded both the default heartbeat budget and the 200-line size we hold ourselves
to. alphaFinset D f / alphaAuxD D f are spelled out rather than generalized over, because the
proofs below use that definitional identity.
The main theorem #
The induced map from the tail quotient to H¹(D).
Equations
Instances For
Injectivity: helper constructions, factored to top-level declarations for elaboration #
speed (a single giant tactic proof accumulating ~25 haves/sets hits a severe performance wall:
confirmed by direct experiment, set_option maxHeartbeats 20000000 still did not finish in
10 minutes of wall-clock time). Each piece below is proved against only the section variables it
actually needs, mirroring tailToH1_alpha's own successful top-level-helper structure.
The clean patch at a marked point p, avoiding the other points of S (generalizes
alphaPatch to an arbitrary per-point representative ψ, not tied to one global function).
Equations
- RS.LaurentTail.injPatch ψ S D p = RS.LaurentTail.cleanNbhd D p (ψ p) ⊓ RS.Cech.compOpens (S.erase p)
Instances For
A single auxiliary divisor dominating DPrimeOf at every point of S.
Equations
- RS.LaurentTail.injD' ψ S D hSne = S.sup' hSne fun (p : X) => RS.LaurentTail.DPrimeOf D p (ψ p)
Instances For
The D'-typed representative at each marked point, restricted to its own patch.
Equations
- RS.LaurentTail.injψVD' ψ S D D' hD'mem p hp = (RS.Cech.LinSysOn.restrictL D' ⋯) ((Submodule.inclusion ⋯) (RS.LaurentTail.ψVOf D p (ψ p)))
Instances For
The multi-point cochain, restricted to the marked points of T (intersected with S).
Equations
- RS.LaurentTail.injG ψ S D D' hD'mem hOclause T k = if h : ∃ p ∈ T ∩ S, p ∈ 𝒱.U k then (RS.Cech.LinSysOn.restrictL D' ⋯) (RS.LaurentTail.injψVD' ψ S D D' hD'mem h.choose ⋯) else 0
Instances For
CLAIM1-analogue: a single marked point's mlClassAt equals the big cover's mlClass of the
one-point cochain injG {p}.
The multi-point induction: sum of individual mlClassAts over any T ⊆ S equals the big
cover's mlClass of injG T.
The coboundary/order identity used to read φ's bound back into ψ q's tail data.
H1Tail.equiv, conditional on surjectivity (§8 R1's own fallback: an honest #
explicit-hypothesis statement, not a vacuous one, per CONVENTIONS.md rule 3)
CC8's mandate, conditional on tailToH1's surjectivity (item 3 of the four deferrals,
gated on dolbeault-comparison's Leray/Mittag-Leffler-existence machinery — see this file's
file-end note for the exact obstruction). Injectivity (H1Tail.toH1_injective) is unconditional
and fully proved above; this is the one remaining hypothesis.
Equations
Instances For
File-end note (FINISHER pass): what closed, what's built, what's still deferred, and why #
Closed this pass (three of the unit's four original deferrals):
tailToH1_alpha(tailToH1 D (alphaL D f) = 0). Built via a from-scratch multi-point Mittag-Leffler combination, specialized to the case where every local datum comes from restricting one globalf : ℳ X(which is exactlyalpha D f's shape):alphaAuxD D f := D ⊔ (-(divisor f))(a single auxiliary divisor bounding bothDandfitself globally,f ≠ 0case;f = 0is handled first, trivially, viamap_zero).alphaPatch D f S p := cleanNbhd D p (restrict f) ⊓ compOpens (S.erase p)(S := alphaFinset D f): the per-point clean patch, now also excluding every other point ofS.- An adapted cover
𝒱forSviaCech.exists_adapted_refinementwithO := alphaPatch D f S(reused verbatim from the concurrentSixTerm.leanbuilder's own "prescribed neighbourhood" idiom, per the interface note the earlier build recorded). mlSumCochain D' f hf T: the cochain that isrestrict fonT ∩ S's marked members,0elsewhere (aditeon∃ p ∈ T ∩ S, p ∈ 𝒱.U k, well-defined regardless of which witnesspis chosen becausehunique_S/hexcl— themselves consequences of adaptedness and thecompOpens (S.erase p)exclusion, not of adaptedness alone: a genuine subtlety — two different marked points sharing one cover member is not excluded byFinCover.IsAdapted's bare definition, only by this file's own choice ofOshrinking each patch away from the rest ofS).- Off-diagonal cover overlaps never meet
S(hoffdiag, pure consequence of the∃!inIsAdapted, noO-shrinking needed): this is what makesmlSumCochain's coboundaryD-bounded everywhere (hg_MemLD) — diagonal is0trivially, off-diagonal points are automatically outsideS, wherefis regular andD = 0(not_mem_alphaFinset). CLAIM1: each point's ownmlClassAt D p (restrict f)equalsmlClass 𝒱 (mlSumCochain {p})via apairCover p (alphaPatch …) → 𝒱refinement (mlClass_res), packaged through the samemlClassAt_eq_of_validused formlClassAt's original construction.main(Finset.induction_on): combinesCLAIM1's individual classes across all ofSvia two-argumentmlClass_add, giving∑ p ∈ S, mlClassAt D p (restrict f) = mlClass 𝒱 (mlSumCochain S).- Finally
mlClass 𝒱 (mlSumCochain S) = 0directly viamlClass_eq_zero_of_existswith the global witnessfitself (the differencemlSumCochain S i - restrict fis0exactly on marked members,D-bounded via off-Sregularity elsewhere) — this is the "genuinely the same direct application" the design doc's §5.2(a) always expected, now unlocked.
H1Tail.toH1/H1Tail.toH1_injective— closed viaSubmodule.liftQoff (1), then a second, independent multi-point construction (injPatch/injD'/injψVD'/injG,inj_CLAIM1/inj_main/inj_hcoe), this time for an arbitraryz : T D(no global function available a priori — representativesψ pare chosen viaTailAt.mk_surjective, and the auxiliary divisorD' := S.sup' hSne (fun p => DPrimeOf D p (ψ p))needs a genuineFinset.sup'sinceRS.Divisor Xhas noOrderBot— confirmed by direct inspection ofFunction.locallyFinsuppWithin's instances: divisors can be arbitrarily negative, soFinset.sup(which needs⊥) is unavailable;Finset.sup'with the Finset's own nonemptiness witness is the correct tool). GiventailToH1 D z = 0, the same "sum equals one bigmlClass" machinery reduces this toCech.mlClass_eq_zero_iff's⇒half (Forster 12.4,toH1_injective, confirmed landed atInjectivity.lean:247), which hands back a globalφ : LinSys D'with∀ i x ∈ 𝒰.U i, D-boundedmlSumCochain-analogue i - restrict φ; reading this bound off at each marked pointp(x = p) givesTailAt.mk p D (ψ p) = TailAt.mk p D (restrict φ)directly viaTailAt.mk_eq_zero_iff, i.e.z = alpha D φ. At non-marked pointsp ∉ S(wherez p = 0already), the same bound read off at a different pointq ∈ Ssharingp's cover member (or directly, ifp's member is unmarked) givesφ's own order bound atp, via the sum-splitting trickrestrict φ = ψ q + (-(ψ q - restrict φ))andord_add/ord_neg(mirrors exactly howgOf_memLD_of_cleanbounds a coboundary from two one-sided pieces, one level up).H1Tail.equivOfSurjective: a conditional equivalence, parametrized by an explicitFunction.Surjective (tailToH1 D)hypothesis (perCONVENTIONS.mdrule 3 and the design's own R1 fallback plan) — an honest statement, not a vacuous one, ready the moment surjectivity lands.
NOT closed: surjectivity of tailToH1 (item 3). This is the one item that resisted this
finisher pass, and — contrary to the previous builder's framing (design doc §5.2(b), "gated on
dolbeault-comparison's Leray theorem, not yet on disk") — it is not simply a citation away
now that Jacobian/DolbeaultComparison/Leray.lean (677 lines, confirmed complete: exists_trade,
toH1_surjective_of_isGood, h1CoverEquiv) has landed. A careful proof attempt (recorded here so
the next builder does not have to redo this analysis) shows:
toH1_surjective_of_isGoodlets us represent anyξ : Cech.H1 Dby a cocyclefon a good cover𝒰₀(all members chart disks). Refining𝒰₀to be also adapted toD's support (viaexists_adapted_refinement, no extra work) gives a representativef'on a refinement𝒱— this refinement step is free (resZ1/toH1_resH1, no surjectivity needed).- The genuinely hard step is showing
f''s class is already of Mittag-Leffler shape (a sum of localmlClassAt-type contributions atD's finitely many marked points) modulo a coboundary on𝒱. This is not implied by𝒰₀being good: the induced sub-cocycle on the "background" members (away from all marked points, whereD = 0) is a bona fide ČechH¹(𝒪_X)-valued obstruction (dimension = genus), and there is no elementary reason it vanishes — indeed it should generically not vanish; what Mittag-Leffler theory guarantees is that the marked-point tail data can absorb it, which is a genuinely analytic fact (classically proved via dbar-solving with prescribed principal parts, i.e. subtracting a local singular correction then solving a smooth dbar-problem for the remainder) — not a fact this unit's editable surface (Jacobian/LaurentTail/only, per the task's hard rules) has the machinery to prove: it would need a genuinely new result inJacobian/Dbar//Jacobian/DolbeaultComparison/(a meromorphic, not smooth, dbar-existence theorem), which is out of scope for this unit to build even if time permitted, since those directories are not in this unit's edit surface. - An inductive bootstrap from the
D = 0case (dolbeaultEquiv/cechToH01, PDE-based, is built inDolbeaultComparison/Comparison.lean) via the six-term sequence'sH1Incl_surjectivewas also considered: raisingDone point at a time viaH1Inclonly transports surjectivity forward (from smaller to largerD), and a divisor with mixed-sign values can't be reached from0by a monotone chain in one direction only — this route does not close either without additional (unbuilt) input. - Recommendation for whoever picks this up: either (a) prove a bespoke local statement in
Jacobian/Dbar/(a meromorphic dbar-existence lemma: given a smooth(0,1)-form and finitely many prescribed principal parts, solvedbar u = ηaway from the marked points withuhaving exactly those principal parts — the classical route), filed as adocs/requests/dolbeault-comparison.mdordocs/requests/dbar-solvability.mdask since it is outside this unit's own surface, or (b) acceptH1Tail.equivOfSurjective's conditional form as the unit's final deliverable on this point, matching the design's own R1 fallback plan exactly.
Two build-engineering gotchas hit and fixed this pass (recorded so no one repeats the slow path):
Opens X-level≤composed with aSet X-level⊆via bare.trans(relying on the automaticOpens → Setcoercion to make the composition typecheck) causes catastrophicisDefEq/whnfslowdown once the surrounding terms are sufficiently abstract (fully generic𝒱/D/q, no concrete instantiation to short-circuit unification): confirmed by direct isolation, a single lemma (inj_hcoe) this way did not finish in 4,000,000 heartbeats / 7+ minutes wall-clock, whereas rewriting it to first coerce to an explicit(𝒱.U k : Set X) ⊆ (patch : Set X)term and then.trans(now a plainSet.Subset.trans, monomorphic, fast to resolve) closes in under 10 seconds. Grep for this pattern ().trans (immediately after anOpens-typed term) if a similar slowdown resurfaces elsewhere in this codebase.- A single tactic proof accumulating ~25
have/setsteps hits a severe elaboration performance wall regardless ofmaxHeartbeats(confirmed:20,000,000heartbeats, 10+ minutes wall-clock, still did not finish) — not the same issue as the.transone above (it persisted after that fix was applied in isolation). The fix is architectural: factor the construction into separate top-levelnoncomputable def/theoremdeclarations, each stated against an explicitvariable (…) := …block plusinclude … in(Lean 4 does not auto-include a sectionvariableinto a declaration just because the declaration's tactic proof references it — only variables appearing in the stated type are auto-included; anything used only in the proof needs an explicitinclude, confirmed by direct experiment). This mirrors exactly howtailToH1_alpha's own helpers (alphaPatch/mlSumCochain/…) were already structured, and is now the pattern used throughoutinjPatch/injG/inj_*as well.
RiemannRoch.lean: Jacobian/Finiteness/Chi.lean has landed (confirmed, Finiteness.lean's
own root docstring: "Unit COMPLETE, all 7 design files, zero sorries") — that gate is now open.
The sole remaining gate for RiemannRoch.lean is H1Tail.equiv itself (unconditional
surjectivity, item 3 above); see that file for the exact transport recipe, unchanged and ready to
apply verbatim the moment surjectivity lands.