Cycle–Krylov spectral slice (#70 square-moment descent) #
The finite-dimensional linear algebra closing the cycle–Krylov–kernel proof of
square-moment descent (docs/sqmoment-cycle-krylov.md), kept in its own file
because it imports inner-product-space machinery that must not pollute
Lovasz.lean (known simp-conflict issue).
Contents #
inner_eq_zero_of_orthogonal_pos_powers— the abstract lemma over a finite-dimensional real inner product space: ifAis self-adjoint,u ∈ range A, ande ⊥ A^q ufor allq ≥ 1, thene ⊥ u. Proof by orthogonal projection onto the positive-power Krylov spanK: the residualw = u - proj_K usatisfiesA w = 0(sinceA² w ∈ Kand‖A w‖² = ⟪w, A² w⟫ = 0), hence⟪w, u⟫ = ⟪w, A z⟫ = ⟪A w, z⟫ = 0, hence‖w‖² = 0, sou ∈ Kande ⊥ u.sqrtScale/conjAdj— transport of theW-weighted inner productwInnertoEuclideanSpace ℝ (Fin T)via√W-rescaling;conjAdjis the conjugated operator, i.e. the symmetric matrixS(t,s) = √(W t) · B t s · √(W s).wInner_eq_zero_of_iter_orthogonal— the weighted instantiation in terms ofweightedAdj/weightedAdjIter.sqMoment_eq_of_closedWalkProfile_eq— the assembled spectral slice: equal closed-walk profiles at all lengths ≥ 3 force equal square moments. After this, the remaining content ofsqMoment_descends_of_rootedProfileEquivis pure graph plumbing (rooted cycles realizeclosedWalkProfile, and rpe kills their differences).
The abstract finite-dimensional lemma #
Krylov span membership for range elements — the projection core of the
spectral slice, extracted as a standalone lemma: if A is self-adjoint and
u ∈ range A, then u lies in the span of its own positive A-powers.
(The "missing zeroth power" is recovered because u ∈ range A forces the
ker A-component of u to vanish.)
Krylov-kernel lemma: in a finite-dimensional real inner product space,
if A is self-adjoint, u lies in the range of A, and e is orthogonal to
A^q u for every q ≥ 1, then e is orthogonal to u itself.
The direct-sum (common-coefficient) lemma #
The block-diagonal operator A ⊕ A on WithLp 2 (E × E).
Equations
- Graphon.Lovasz.prodMapL2 A = ↑(WithLp.linearEquiv 2 ℝ (E × E)).symm ∘ₗ A.prodMap A ∘ₗ ↑(WithLp.linearEquiv 2 ℝ (E × E))
Instances For
Powers of prodMapL2 A act componentwise as powers of A.
Common Krylov coefficients for a pair (the direct-sum trick): if u
and v both lie in the range of a self-adjoint A, then there are COMMON
coefficients expressing each of them as a combination of its own positive
A-powers. Obtained by applying mem_span_pos_powers_of_mem_range to the
block operator on WithLp 2 (E × E) and projecting the two coordinates.
Note a triple (or longer) version with REPEATED vectors needs nothing more:
the slots of a multilinear form repeat u or v, and this pair of common
expansions feeds every slot.
The k-fold direct-sum (family common-coefficient) lemma #
The block-diagonal operator ⨁_{i : Fin m} A on PiLp 2 (fun _ : Fin m => E)
(the Fin m-fold generalization of prodMapL2).
Equations
- Graphon.Lovasz.piMapL2 m A = ↑(WithLp.linearEquiv 2 ℝ (Fin m → E)).symm ∘ₗ (LinearMap.pi fun (i : Fin m) => A ∘ₗ LinearMap.proj i) ∘ₗ ↑(WithLp.linearEquiv 2 ℝ (Fin m → E))
Instances For
Powers of piMapL2 m A act componentwise as powers of A.
Common Krylov coefficients for a finite family (the k-fold direct-sum
trick): if every member of a family w : Fin m → E lies in the range of a
self-adjoint A, there are COMMON coefficients expressing each member as a
combination of its own positive A-powers. Generalizes
pair_mem_common_pos_power_span; obtained from the block operator on
PiLp 2 (fun _ : Fin m => E) by projecting each coordinate.
Transport of the W-weighted form to Euclidean space #
√W-rescaling into EuclideanSpace ℝ (Fin T): an isometry from the
wInner W form to the standard inner product (for W > 0).
Equations
- Graphon.Lovasz.sqrtScale W f = WithLp.toLp 2 fun (t : Fin T) => √(W t) * f t
Instances For
The conjugated weighted adjacency as a linear endomorphism of
EuclideanSpace ℝ (Fin T).
Equations
- Graphon.Lovasz.conjAdj B W = { toFun := fun (x : EuclideanSpace ℝ (Fin T)) => WithLp.toLp 2 (Graphon.Lovasz.conjAdjFun B W x.ofLp), map_add' := ⋯, map_smul' := ⋯ }
Instances For
Common Krylov coefficients in the weighted setting: if f and g
both lie in the range of weightedAdj B W, there are COMMON coefficients
expressing each as a combination of its own positive weightedAdjIter-powers.
This is the algebraic core of the K₂,₃-arms cube proof (and of the k ≥ 4
lift): every slot of the multilinear polarization can be expanded with the
SAME coefficient family.
Trilinear polarization — the graph-free cube core #
The polarized cube observable (algebraic form): the trilinear
polarization of the rooted K₂,₃-with-arms profile difference at arm lengths
(a, b, c) — one ε-placement per root edge, plus the all-ε term. The graph
slice will identify 4 · (the K₂,₃-arms profile difference) with this.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The graph-free cube core: if every polarized cube observable (at
positive arm lengths) vanishes, the cube gap is zero. With the (separate)
graph slice identifying polarizedCubeObs with 4 · the rooted K₂,₃-arms
profile difference, this reduces cubeMoment_descends_of_rootedProfileEquiv
to pure graph plumbing.
k-linear polarization — the graph-free power-moment core (k ≥ 4 lift) #
Multilinear expansion with common coefficients (k-ary analog of
wTriple_triple_expansion, in one shot via Finset.prod_univ_sum): a k-linear
form whose every slot has a shared-coefficient finite expansion equals the sum
over coefficient tuples of weighted evaluations.
The polarized k-th power observable: the odd-subset polarization of
the rooted K₂,ₖ-arms profile difference at arm-length vector φ (the k-ary
generalization of polarizedCubeObs; the graph slice will identify
2^(k-1) · the K₂,ₖ-arms profile difference with this).
Equations
- One or more equations did not get rendered due to their size.
Instances For
The graph-free k-th power core: if every polarized k-th power
observable at positive arm lengths vanishes, the k-th power-moment gap is
zero. With the (since-proved) graph slice identifying polarizedPowObs with
2^(k-1) · the rooted K₂,ₖ-arms profile difference, this reduces
powerSum_descends_of_rootedProfileEquiv (k ≥ 4) to pure graph plumbing.
The weighted Krylov-kernel lemma (target shape of the spectral slice):
if u is in the range of weightedAdj B W and eps is wInner-orthogonal to
all positive weightedAdjIter-iterates of u, then eps ⊥ u.
The assembled spectral slice #
Square moments from closed walks — the spectral slice of the
cycle–Krylov proof, fully assembled: if two vertices have equal closed-walk
profiles at every length ≥ 3, their W-weighted square moments agree.
Combines (from SimpleRank.lean): sqMoment_sub_eq_wInner (gap = ⟪ε, u⟫_W),
rowSum_eq_weightedAdj (u ∈ Im M), closedWalkProfile_sub_eq_wInner
(closed-walk diffs = ⟪ε, M^[q] u⟫_W), and the weighted Krylov-kernel lemma
above. The remaining content of sqMoment_descends_of_rootedProfileEquiv is
graph plumbing: rooted cycles realize closedWalkProfile
(rootedProfile_rootedCycleGraph_eq_closedWalkProfile, formerly a focused
sorry in Lovasz.lean, since proved there), and rpe makes their profiles
agree.
The assembled theorem: square-moment descent #
Square-moment descent (#70 minimal test case) — PROVED.
If i and j are rooted-profile equivalent (twin-freeness NOT needed), their
W-weighted square moments agree. This was the designated first obstruction
beyond the simple rooted algebra: ∑ t, W t * B i t ^ 2 is inherently a
multigraph observable (double edge i–t), yet rooted simple CYCLES pin it.
Assembly of the cycle–Krylov–kernel proof (docs/sqmoment-cycle-krylov.md):
rpe applied to rootedCycleGraph (m+1) + the bridge
rootedProfile_rootedCycleGraph_eq_closedWalkProfile (proved in Lovasz.lean)
give equal closed-walk profiles at all
lengths ≥ 3, and sqMoment_eq_of_closedWalkProfile_eq (the spectral slice)
concludes.
Supersedes the version formerly in SimpleRank.lean that was derived from the
(then still open, strictly stronger — since proved below)
classwise_sqMoment_descends; this proof is
sorry-free and drops the htwin hypothesis.
The K₂,₃-with-arms graph family (the cube's graph bridge) #
Vertex layout on Fin (4 + a + b + c + 1): 0 the root, 1, 2, 3 the
anchors (root-adjacent), 4 the hub, then three internal blocks of sizes
a, b, c (so the arm from anchor l + 1 to the hub has length
armLen + 1 ≥ 1 — positive arm lengths by construction, matching the
(a+1, b+1, c+1) indices of polarizedCubeObs).
The rooted K₂,₃-with-arms graph: root 0 adjacent to anchors
1, 2, 3; arm l a path of length armLen + 1 from anchor l + 1 to the
hub 4.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
The edge index type of k23Arms: three root edges plus, per arm,
armLen + 1 chain edges.
Equations
- Graphon.Lovasz.K23EdgeIdx a b c = (Fin 3 ⊕ (l : Fin 3) × Fin (Graphon.Lovasz.armLen a b c ↑l + 1))
Instances For
Every indexed edge is an edge of k23Arms.
Edge classification for k23Arms (reusable form): the edge finset is
the image of the indexed family — three root-anchor edges plus the three
anchor-to-hub arm chains, and nothing else.
The indexed edge family is injective (no duplicate edges).
Edge-product factorization for k23Arms: the edge product splits into
the three root-edge factors times the three independent arm-chain products.
One-arm chain collapse #
The (q+1)-edge arm kernel from x to y (q internal vertices),
defined recursively — the normal form the internal sums collapse to.
Equations
- Graphon.Lovasz.armSum B W 0 x✝¹ x✝ = B x✝¹ x✝
- Graphon.Lovasz.armSum B W q.succ x✝¹ x✝ = ∑ t : Fin T, W t * B x✝¹ t * Graphon.Lovasz.armSum B W q t x✝
Instances For
One-arm collapse, weighted form (the consumer shape): summing the
anchor against the root edge and the arm kernel yields weightedAdjIter
at the hub.
Block-structured assignments (the global split) #
The structured K₂,₃-arms assignment: anchors, hub, and the three internal arm blocks, assembled into a flat assignment.
Equations
- Graphon.Lovasz.k23Assign a b c x h₁ σa σb σc = Graphon.Lovasz.appendFn (Graphon.Lovasz.appendFn (Graphon.Lovasz.appendFn (Graphon.Lovasz.appendFn x h₁) σa) σb) σc
Instances For
Raw evaluation of the K₂,₃-arms profile (PROVED — the brittle
Fin/edge-product slice, isolated here per plan; an earlier revision
carried a SORRY marker while the plumbing was pending): the rooted profile
factorizes through the hub as a wTriple of weightedAdjIters of the
root's row. Mathematically: summing each arm's internals gives the walk
kernel K_{armLen+1}(anchor, hub); summing each anchor against its root
edge gives (M^{armLen+1} (B v ·))(hub); the hub sum is wTriple.
Machine-precision validated in scripts/validate_cube_k23_arms.py.
weightedAdj is subtractive (mirror of weightedAdj_add).
Iterates of weightedAdj are subtractive.
The cube's graph bridge (proved modulo k23Arms_eval):
4 · the K₂,₃-arms profile difference is exactly the polarized cube
observable at arm lengths (a+1, b+1, c+1).
The Hadamard-power lift (historical planning note; since closed) #
Historical note (resolved): this section's "open content" has since
been closed — powerSum_descends_of_rootedProfileEquiv is proved below
for ALL k (k = 3 via the K₂,₃-arms bridge, k ≥ 4 via the K₂,ₖ-arms
bridge). The analysis below is retained as the design record.
With the square moment closed, the route to the full rank theorem
vertexOrbitRel_of_rootedProfileEquiv runs through ALL weighted power sums
of the rows: powerSum_descends_of_rootedProfileEquiv below (k ≥ 3 was the
open content), then weighted_powersum_determines_measure (proved, in
Lovasz.lean) recovers equality of the W-weighted row-value measures
(rowValueMeasure_eq_of_rootedProfileEquiv).
Status of k ≥ 3 at the time (then the genuine open math): writing ε = B i - B j, the gap
is ⟨ε, ρᵢ^{∘(k-1)} + ρᵢ^{∘(k-2)}∘ρⱼ + ⋯ + ρⱼ^{∘(k-1)}⟩_W (Hadamard powers
of the rows). The available rpe-killed observables with d root edges give
d-leg kernels from the Hadamard-ordinary closure of walk kernels (theta
graphs; at most ONE bare-B factor per Hadamard bundle — parallel edges are
multigraph). The k = 2 proof recovered the forbidden diagonal 2-tensor via
u ∈ Im M; k ≥ 3 needs the analogous recovery of the diagonal k-tensor, one
level up. Note B^{∘(k-1)} itself is NOT in the observable kernel algebra
(even off the root), so the lift is a genuine extension, not a substitution.
Cube-moment descent — MATHEMATICALLY RESOLVED (2026-06-10);
formalization COMPLETE (an earlier revision carried a SORRY marker
pending the K₂,₃-arms plumbing, which has since landed — see
k23Arms_eval and rootedProfile_k23Arms_sub_eq_polarizedCubeObs).
The K₂,₃-ARMS proof (machine-precision validated,
scripts/validate_cube_k23_arms.py; mechanism UNIFORM in k — at k = 2 the
K₂,₂-with-arms graph IS the rooted cycle, recovering the proved case):
- Arms identity: for the rooted K₂,₃-with-arms graph (root adjacent to
anchors
t₁,t₂,t₃; internal huby; armla path of lengtha_l ≥ 1fromt_ltoy— a SIMPLE graph), the profile difference is exactly(1/4)·Σ_{|S| odd} T₃(M^{a_l}ε [l∈S], M^{a_l}u [l∉S])whereT₃(f,g,h) = ∑ t, W t * f t * g t * h t(trilinear polarization of the three root edges; arms act asM-powers). rpe kills these for all arms. - Common expansion (direct-sum trick):
(ε, u) ∈ Im (M ⊕ M), self-adjoint, so the k = 2 projection lemma applied toE ⊕ Eyields COMMON coefficientsc_qwithε = Σ_{q≥1} c_q M^q εANDu = Σ_{q≥1} c_q M^q usimultaneously. - Reconstruction:
gap₃ = (1/4)·Σ_{|S| odd} T₃(ε[S], u[S^c]) = Σ_{a⃗≥1} c_{a₁}c_{a₂}c_{a₃} · ObsDiff(a⃗) = 0. ∎ OnlyhB,hWneeded.
How it was found: the LM falsification run (k=2 harness, cube gap pinned) went infeasible at T=4 already at the base m≤3 family; at T=5 it was exactly feasible at m≤3 and the top m=4 separators were the four rooted K₂,₃'s — identifying the family, after which the identity is three lines.
Superseded analysis (kept as history; the earlier residual-branch frontier
is BYPASSED by the right family): in eigenbasis coordinates the theta/wedge/
triangle-wedge families force F ≡ 0 generically but left open the branch
G = 0 ∧ f_λf_μ = -g_λg_μ ≠ 0 ∧ F ≠ 0; the K₂,₃-arms constraints close the
gap without case analysis.
Formalization plan (as executed): trilinear polarization lemma
(generalizing wInner_sub_iter_add), the direct-sum common-coefficient lemma
(from inner_eq_zero_of_orthogonal_pos_powers's projection core applied to
E ⊕ E — extract the span-membership statement), and the K₂,₃-arms graph
family + evaluation bridge (generalizing rootedCycleGraph +
rootedProfile_rootedCycleGraph_eq_closedWalkProfile).
The K₂,ₖ-with-arms family (k ≥ 4 lift) — structured-vertex design #
The cube case used k23Arms, a SimpleGraph (Fin (4 + a + b + c + 1)) built
from explicit offset arithmetic (armSeq, armStart, nested appendFn). That
layout does not scale to an arbitrary number k of arms: the dependent block
offsets become unmanageable.
Instead we reason on a structured finite vertex type K2kVertex k armLen
and transport the graph to Fin (n + 1) only at the boundary forced by
rootedProfile, which is hardwired to SimpleGraph (Fin (n + 1)) with the root
at position 0. All human reasoning stays on the constructors; the Fin
version is a pure transport artifact (SimpleGraph.comap along an equivalence
that pins the root to 0).
Structured vertex type of the rooted K₂,ₖ-with-arms graph: a root,
one anchor per arm l : Fin k, a shared hub, and armLen l internal
vertices on arm l. Arm l is the path
anchor l — internal l 0 — ⋯ — internal l (armLen l - 1) — hub
(when armLen l = 0 the arm degenerates to the single edge anchor l — hub).
- root {k : ℕ} {armLen : Fin k → ℕ} : K2kVertex k armLen
- anchor {k : ℕ} {armLen : Fin k → ℕ} (l : Fin k) : K2kVertex k armLen
- hub {k : ℕ} {armLen : Fin k → ℕ} : K2kVertex k armLen
- internal {k : ℕ} {armLen : Fin k → ℕ} (l : Fin k) (s : Fin (armLen l)) : K2kVertex k armLen
Instances For
Equations
- One or more equations did not get rendered due to their size.
- Graphon.Lovasz.instDecidableEqK2kVertex.decEq Graphon.Lovasz.K2kVertex.root Graphon.Lovasz.K2kVertex.root = isTrue ⋯
- Graphon.Lovasz.instDecidableEqK2kVertex.decEq Graphon.Lovasz.K2kVertex.root (Graphon.Lovasz.K2kVertex.anchor l) = isFalse ⋯
- Graphon.Lovasz.instDecidableEqK2kVertex.decEq Graphon.Lovasz.K2kVertex.root Graphon.Lovasz.K2kVertex.hub = isFalse ⋯
- Graphon.Lovasz.instDecidableEqK2kVertex.decEq Graphon.Lovasz.K2kVertex.root (Graphon.Lovasz.K2kVertex.internal l s) = isFalse ⋯
- Graphon.Lovasz.instDecidableEqK2kVertex.decEq (Graphon.Lovasz.K2kVertex.anchor l) Graphon.Lovasz.K2kVertex.root = isFalse ⋯
- Graphon.Lovasz.instDecidableEqK2kVertex.decEq (Graphon.Lovasz.K2kVertex.anchor a) (Graphon.Lovasz.K2kVertex.anchor b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- Graphon.Lovasz.instDecidableEqK2kVertex.decEq (Graphon.Lovasz.K2kVertex.anchor l) Graphon.Lovasz.K2kVertex.hub = isFalse ⋯
- Graphon.Lovasz.instDecidableEqK2kVertex.decEq (Graphon.Lovasz.K2kVertex.anchor l) (Graphon.Lovasz.K2kVertex.internal l_1 s) = isFalse ⋯
- Graphon.Lovasz.instDecidableEqK2kVertex.decEq Graphon.Lovasz.K2kVertex.hub Graphon.Lovasz.K2kVertex.root = isFalse ⋯
- Graphon.Lovasz.instDecidableEqK2kVertex.decEq Graphon.Lovasz.K2kVertex.hub (Graphon.Lovasz.K2kVertex.anchor l) = isFalse ⋯
- Graphon.Lovasz.instDecidableEqK2kVertex.decEq Graphon.Lovasz.K2kVertex.hub Graphon.Lovasz.K2kVertex.hub = isTrue ⋯
- Graphon.Lovasz.instDecidableEqK2kVertex.decEq Graphon.Lovasz.K2kVertex.hub (Graphon.Lovasz.K2kVertex.internal l s) = isFalse ⋯
- Graphon.Lovasz.instDecidableEqK2kVertex.decEq (Graphon.Lovasz.K2kVertex.internal l s) Graphon.Lovasz.K2kVertex.root = isFalse ⋯
- Graphon.Lovasz.instDecidableEqK2kVertex.decEq (Graphon.Lovasz.K2kVertex.internal l s) (Graphon.Lovasz.K2kVertex.anchor l_1) = isFalse ⋯
- Graphon.Lovasz.instDecidableEqK2kVertex.decEq (Graphon.Lovasz.K2kVertex.internal l s) Graphon.Lovasz.K2kVertex.hub = isFalse ⋯
Instances For
K2kVertex is root adjoined to K2kRest (root ↦ none). This single
equivalence supplies the Fintype instance and pins the root for the Fin
transport.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Graphon.Lovasz.instFintypeK2kVertex k armLen = Fintype.ofEquiv (Option (Graphon.Lovasz.K2kRest k armLen)) (Graphon.Lovasz.k2kVertexOptionEquiv k armLen).symm
Vertex equivalence to Fin (n + 1) with the root pinned to 0 —
the position simpleEvalAt/rootedProfile fix to the labelled vertex.
Built as K2kVertex ≃ Option (K2kRest) ≃ Option (Fin n) ≃ Fin (n + 1); the last
step (finSuccEquiv n).symm sends none ↦ 0, and the root is the unique
preimage of none.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The s-th vertex along arm l: 0 ↦ anchor, 1 .. armLen ↦ internal,
anything beyond armLen ↦ hub. The structured analogue of armSeq, valued in
the constructors (no Fin-offset arithmetic). When armLen l = 0 the chain is
just anchor l —(s=0)→ hub —(s=1)→ hub, i.e. the single edge anchor l — hub.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The structured rooted K₂,ₖ-with-arms graph on K2kVertex k armLen:
the root is adjacent to every anchor l; arm l is the path
anchor l — internal l 0 — ⋯ — internal l (armLen l - 1) — hub (the consecutive
pairs armNode l s — armNode l (s+1) for s ≤ armLen l). All reasoning about
the family happens here; the Fin version k2kArms is a transport of this.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Graphon.Lovasz.instDecidableRelK2kVertexAdjK2kArmsStructured k armLen x✝¹ x✝ = id inferInstance
The Fin-indexed K₂,ₖ-with-arms graph consumed by rootedProfile:
the structured graph pulled back along the root-pinned equivalence. Because
K2kVertex_equivFin .root = 0, position 0 of Fin (n + 1) is the root — the
position simpleEvalAt/rootedProfile fix to the labelled vertex.
Equations
- Graphon.Lovasz.k2kArms k armLen = SimpleGraph.comap (⇑(Graphon.Lovasz.K2kVertex_equivFin k armLen).symm) (Graphon.Lovasz.k2kArmsStructured k armLen)
Instances For
Equations
- One or more equations did not get rendered due to their size.
The edge index type of k2kArmsStructured: k root-anchor edges plus, per
arm l, the armLen l + 1 chain edges.
Instances For
The edge family of k2kArmsStructured, indexed by K2kEdgeIdx.
Equations
- Graphon.Lovasz.k2kEdge k armLen (Sum.inl l) = s(Graphon.Lovasz.K2kVertex.root, Graphon.Lovasz.K2kVertex.anchor l)
- Graphon.Lovasz.k2kEdge k armLen (Sum.inr ⟨l, s⟩) = s(Graphon.Lovasz.K2kVertex.armNode k armLen l ↑s, Graphon.Lovasz.K2kVertex.armNode k armLen l (↑s + 1))
Instances For
Every indexed edge is an edge of k2kArmsStructured.
Edge classification for the K₂,ₖ-with-arms family: the edge finset is
exactly the image of the indexed family k2kEdge — the k root-anchor edges
plus the k arm chains, and nothing else. This is the structured, reusable form
(the analogue of k23Arms_edgeFinset); the eventual k2kArms_eval will reindex
the edge product of the Fin graph through this.
Commit 1 — Fin/structured edge transport + edge-product factorization #
Arm index of a vertex (anchors/internals carry their arm; root/hub none).
Used to recover (l, s) from a chain endpoint in k2kEdge_injective.
Equations
Instances For
Step (depth) of a vertex along its arm (0 for anchor, s+1 for
internal s); 0 on root/hub (irrelevant there).
Equations
Instances For
The indexed edge family is injective (each (l, s) recovered from the
non-hub chain endpoint via armOf/stepOf; the reversed orientation is killed
by omega). The structured analogue of armSeq_pair_inj.
Edge-product factorization on the structured graph (the analogue of
k23Arms_prod_eq): the edge product splits into the k root-edge factors and
the k independent arm-chain products.
Edge finset of a graph pulled back along an equivalence's inverse is the
Sym2-image of the source edge finset (generic transport lemma).
Edge-finset transport for the Fin-rooted graph: k2kArms' edges are
the K2kVertex_equivFin-images of the structured graph's edges.
Edge-product factorization on the Fin graph (transport + structured
factorization combined): the rootedProfile edge product over k2kArms
factors, through K2kVertex_equivFin, into the k root-edge factors and the
k arm-chain products. This is the replacement for the brittle k23Arms
offset work; k2kArms_eval consumes it directly.
Commit 2 — structured eval expansion (reindex + per-arm collapse) #
The non-root part of K2kVertex_equivFin as a standalone equivalence
K2kRest ≃ Fin (k2kRestCard) (definitionally the rest-equiv inside
K2kVertex_equivFin).
Equations
Instances For
Vertex → Fin-position value lemma: a non-root vertex r (as a K2kRest
element adjoined via k2kVertexOptionEquiv.symm) sits at position
(k2kRestEquivFin r).succ — i.e. one past the root (which is 0). This is the
sole fact about the opaque rest-equiv the reindexing needs.
The structured assignment K2kVertex → Fin T with root ↦ v and each
non-root vertex r taking the value ρ r.
Equations
- Graphon.Lovasz.extendV v ρ w = ((Graphon.Lovasz.k2kVertexOptionEquiv k armLen) w).elim v ρ
Instances For
Edge-product transport (product form): the Fin-graph edge product equals
the structured edge product with vertices read through K2kVertex_equivFin.
Reindexing the eval onto structured assignments: the rooted profile of
k2kArms is the sum over structured non-root assignments ρ : K2kRest → Fin T
of the structured weight × edge product (root pinned to v).
Assignment splitting equivalence: a non-root structured assignment is
exactly a triple (anchor values, hub value, per-arm internal values). Built
directly so the component value lemmas are rfl.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Structured eval expansion (Commit 2b): the rooted profile of k2kArms
expands as a hub sum of an anchor sum of per-arm armSum kernels.
Commit 3 — wMulti collapse + polarization bridge #
3.1 — k2kArms evaluation in wMulti form: the rooted profile is the
weighted k-linear form of the root-row walk kernels M^{armLen l + 1}(B v).
Multilinear product polarization (per-slot generalization of
pow_sub_pow_expand): 2^k (∏ a − ∏ b) is 2 · the odd-subset sum of the
slot products with a−b inside the subset and a+b outside.
3.2 — the graph bridge: 2 · the polarized k-th power observable at
arm lengths armLen l + 1 equals 2^k · the rooted K₂,ₖ-arms profile
difference (the k-ary generalization of rootedProfile_k23Arms_sub_eq_polarizedCubeObs;
at k = 3, 2^3 = 8 = 2·4).
Weighted power sums descend — now PROVED for ALL k (k ≤ 2 directly,
k = 3 via cubeMoment_descends_of_rootedProfileEquiv, k ≥ 4 via the
K₂,ₖ-arms bridge rootedProfile_k2kArms_sub_eq_polarizedPowObs feeding
powGap_eq_zero_of_polarized_obs).
weighted_powersum_determines_measure upgrades this to equality of the
W-weighted row-value measures, the key step toward the rank theorem
vertexOrbitRel_of_rootedProfileEquiv.
Row-value measures descend (now unconditional): under rooted-profile
equivalence, the W-weighted preimage masses of the two rows agree at every
value — the rows are equal as weighted value measures.
Single-vertex decoration — the gluing primitive for the weight-mod crux #
decorateAt F H u glues H onto vertex u of F (identifying H's root with
u). Its rooted profile factorizes: the H-block contributes
rootedProfile B W (value at u) H to each F-assignment. Decorating EVERY
unlabeled vertex by H then realizes the modified weight W · (profile of H),
which is the engine of rootedProfileEquiv_weightMod.
The structured single-vertex decoration on Fin (n+1) ⊕ Fin m: F on the
inl block, ⊔ H glued with its root at u (via hDecorEmb).
Equations
- Graphon.Lovasz.decorateAtSum F H u = SimpleGraph.map (⇑Function.Embedding.inl) F ⊔ SimpleGraph.map (⇑(Graphon.Lovasz.hDecorEmb u)) H
Instances For
Single-vertex decoration as a SimpleGraph (Fin (n+m+1)) (transported
from the structured form), consumable by rootedProfile.
Equations
- Graphon.Lovasz.decorateAt F H u = SimpleGraph.comap (⇑(Graphon.Lovasz.decorVertexEquiv n m).symm) (Graphon.Lovasz.decorateAtSum F H u)
Instances For
The F-block and H-block edge sets of decorateAtSum are disjoint: an
H-edge has at most one Sum.inl endpoint (only its root maps there), while an
F-edge has two — so a shared edge would force a self-loop in H.
Edge-product transport + split (Commit 1 steps 1–2): the rootedProfile
edge product over decorateAt F H u factors, through decorVertexEquiv, into the
F-edge product and the H-edge product.
rootedProfile in Fin.cons form (re-derived here; the SimpleRank version
is private).
H-side assignment value lemma: under appendFn σF σH, the value at an
H-vertex hDecorEmb u a is Fin.cons (Fin.cons v σF u) σH a — i.e. H rooted
at the value vertex u receives.
Single-vertex decoration factorization (Commit 1 target — PROVED):
gluing H at vertex u multiplies each F-assignment's contribution by the
H-profile rooted at the value u receives. Analogue of rootedProfile_rootAttach,
but the attachment point is an arbitrary unlabeled vertex, not a fresh pendant root.
Proof plan: transport the edge product to decorateAtSum (comap along
decorVertexEquiv, as in k2kArms_prod_eq_structured); the structured edge set
is the disjoint union (F.map inl).edgeFinset ∪ (H.map (hDecorEmb u)).edgeFinset,
so the product splits into the F-edge product and the H-edge product; reindex
the assignment sum over Fin (n+m) → Fin T into (Fin n → Fin T) × (Fin m → Fin T);
the H-factor, with its root pinned to the value at u, sums to
rootedProfile B W (Fin.cons v σ u) H.
All-vertex decoration (Route B) — glue a copy of H at EVERY unlabeled #
vertex of F. One fixed structured vertex type Fin(n+1) ⊕ (Fin n × Fin m):
inl 0 = F-root, inl (succ w) = unlabeled vertex w, inr (w, z) = the
z-th internal vertex of the H-copy glued at w. Decorating all vertices
realizes the modified weight W · (profile of H), the engine of
rootedProfileEquiv_weightMod.
Embedding of the w-th H-copy: root 0 ↦ inl (succ w), succ z ↦ inr (w, z).
Equations
Instances For
The structured all-vertex decoration: F on the inl block, joined with one
H-copy per unlabeled vertex (via Finset.sup, not iSup, to keep decidability
and edge-finset instances controllable).
Equations
- Graphon.Lovasz.decorateAllSum F H = SimpleGraph.map (⇑Function.Embedding.inl) F ⊔ Finset.univ.sup fun (w : Fin n) => SimpleGraph.map (⇑(Graphon.Lovasz.embedHCopy w)) H
Instances For
Fin (n+1) ⊕ (Fin n × Fin m) ≃ Fin (n + n*m + 1) with inl 0 ↦ 0.
Equations
- Graphon.Lovasz.decorAllVertexEquiv n m = ((Equiv.refl (Fin (n + 1))).sumCongr finProdFinEquiv).trans (finSumFinEquiv.trans (finCongr ⋯))
Instances For
All-vertex decoration as a SimpleGraph (Fin (n+n*m+1)).
Equations
Instances For
Finset.sup-adjacency over Fin n is the existential of the per-w adjacencies.
Equations
- One or more equations did not get rendered due to their size.
Equations
Distinct H-copies have disjoint edge sets (disjoint vertex images).
The F-block is disjoint from every H-copy block: a sup-edge has at most
one Sum.inl endpoint, an F-edge has two.
The Finset.sup of the H-copies has edge finset the disjoint union of the
per-copy edge finsets.
Edge-product transport + split (B2): the rootedProfile edge product over
decorateAll F H factors, through decorAllVertexEquiv, into the F-edge product
times the product over the n H-copy edge products.
B3 H-side value lemma: under appendFn σF σHflat, the w-th H-copy's
assignment is Fin.cons (Fin.cons v σF w.succ) (fun z => σHflat (finProdFinEquiv (w,z)))
— i.e. the w-th copy rooted at the value F-vertex w receives.
Flat ↔ curried assignment equivalence: a flat assignment over the n*m
internal H-copy vertices is the same as n separate H-copy assignments,
matched via finProdFinEquiv.
Equations
- One or more equations did not get rendered due to their size.
Instances For
n-fold H-copy collapse (B3 engine): summing the flat internal-vertex
assignment factors the contribution of the n glued H-copies into a product of
n rooted profiles, each rooted at the value r w its anchor vertex receives.
B3 — all-vertex decoration factorization (the key theorem): decorating
every unlabeled vertex of F with a copy of H multiplies each F-assignment's
contribution by the product, over unlabeled vertices w, of the H-profile rooted
at the value w receives. The engine of rootedProfileEquiv_weightMod.
B4 — single-profile weight modification stays in the span: modifying the
weight W by the rooted profile of a single graph H turns the profile of F
into the profile of the all-vertex decoration decorateAll F H, which is a bare
profile and hence in InRootedProfileSpan B W. This is the single-H case of
rootedProfileEquiv_weightMod; the general g ∈ span case follows by linearity.
Per-vertex-family decoration (decorateAllFam) — the Σ-indexed generalization #
decorateAll glues ONE graph H at every unlabeled vertex; for the general
g = ∑_k c_k · rootedProfileFun B W H_k we must glue a possibly DIFFERENT graph
Hfam w at each unlabeled vertex w. Sizes vary with w, so the internal vertices
form a Σ-type (w : Fin n) × Fin (mfam w) (flattened via finSigmaFinEquiv, never
common-size padding, which would scale the profile by (∑ W)^extra — zero for signed W).
Embedding of the w-th H-copy (family version): 0 ↦ inl (succ w),
succ z ↦ inr ⟨w, z⟩.
Equations
Instances For
The structured per-vertex-family decoration.
Equations
- Graphon.Lovasz.decorateAllFamSum F Hfam = SimpleGraph.map (⇑Function.Embedding.inl) F ⊔ Finset.univ.sup fun (w : Fin n) => SimpleGraph.map (⇑(Graphon.Lovasz.embedHCopyFam w)) (Hfam w)
Instances For
Fin (n+1) ⊕ ((w : Fin n) × Fin (mfam w)) ≃ Fin (n + (∑ w, mfam w) + 1) with inl 0 ↦ 0.
Equations
- Graphon.Lovasz.decorAllFamVertexEquiv mfam = ((Equiv.refl (Fin (n + 1))).sumCongr finSigmaFinEquiv).trans (finSumFinEquiv.trans (finCongr ⋯))
Instances For
Per-vertex-family decoration as a SimpleGraph (Fin (n + (∑ mfam) + 1)).
Equations
- Graphon.Lovasz.decorateAllFam F Hfam = SimpleGraph.comap (⇑(Graphon.Lovasz.decorAllFamVertexEquiv mfam).symm) (Graphon.Lovasz.decorateAllFamSum F Hfam)
Instances For
Equations
- One or more equations did not get rendered due to their size.
Equations
- Graphon.Lovasz.instDecidableRelSumFinHAddNatOfNatSigmaAdjDecorateAllFamSum F Hfam x y = id (⋯.mpr (⋯.mpr inferInstance))
Equations
- One or more equations did not get rendered due to their size.
Edge-product transport + split (C3 / B2-analog): the rootedProfile edge
product over decorateAllFam F Hfam factors into the F-edge product times the
product over the n per-vertex H-copy edge products.
C3 H-side value lemma: under appendFn σF σHflat, the w-th H-copy's
assignment is Fin.cons (Fin.cons v σF w.succ) (fun z => σHflat (finSigmaFinEquiv ⟨w, z⟩)).
Family flat ↔ curried assignment equivalence: a flat assignment over the
∑ mfam internal vertices is the same as n dependent per-copy assignments, matched
via finSigmaFinEquiv.
Equations
- One or more equations did not get rendered due to their size.
Instances For
n-fold family H-copy collapse (C3 engine): summing the flat internal
assignment factors the n per-vertex glued copies into a product of the n
rooted profiles rootedProfile B W (r w) (Hfam w).
C3 — per-vertex-family decoration factorization: decorating each unlabeled
vertex w of F with Hfam w multiplies each F-assignment's contribution by
∏ w, rootedProfile B W (σF w) (Hfam w). The varying-graph generalization of
rootedProfile_decorateAll.
Decorated power sums — the bridge to classwise row-value measures #
rowValueMeasure_eq_of_rootedProfileEquiv gives equality of the GLOBAL
W-weighted row-value measures. The next step toward the rank theorem
vertexOrbitRel_of_rootedProfileEquiv is equality INSIDE each rooted-profile
atom class — obtained by decorating the power sums with atom indicators.
Finite-sum closure of the rooted-profile span (CycleKrylov-local copy of the
private Lovasz helper, built from .zero/.add).
C3 — modified-weight profile stays in the span (PROVED). For any g in the
(B, W)-rooted-profile span and any graph F, the modified-weight profile
v ↦ rootedProfile B (W·g) v F lies in InRootedProfileSpan B W.
Construction: expanding g = ∑_k c_k · rootedProfileFun B W H_k from hg,
the per-vertex product ∏_w g(σ w) = ∑_φ ∏_w c_{φ w} · rootedProfile B W (σ w) H_{φ w}
(Finset.prod_univ_sum); distributing turns rootedProfile B (W·g) v F into
∑_φ (∏_w c_{φ w}) · rootedProfile B W v (decorateAllFam F (fun w => H_{φ w})),
a finite linear combination of bare profiles of per-vertex glued graphs — hence in
the span by InRootedProfileSpan.{finset_sum, smul}. The single-H case
(decorateAllFam constant) is rootedProfile_weightMul_of_profile_mem_span (B4).
The general case uses the per-vertex-family glue decorateAllFam (a Σ-indexed
generalization of decorateAll, sizes handled by finSigmaFinEquiv, not casts).
Weight modification preserves rooted-profile equivalence (C4 — PROVED
modulo the focused span-membership lemma weightMod_profile_mem_span). For any
g in the (B, W)-rooted-profile span, rooted-profile-equivalent vertices stay
equivalent under the modified weight W · g. The analytic content is discharged:
the modified-weight profile lies in the span (weightMod_profile_mem_span), and
span elements are constant on rpe-classes (InRootedProfileSpan.const_on_rpe).
Decorated power sums descend (PROVED, via
rootedProfileEquiv_weightMod above).
For g in the rooted-profile span (e.g. an atom indicator rpeIndicator C),
the g-decorated power sums of rpe-equivalent rows agree at every degree k.
With g = 1_C and k = 2 this is classwise_sqMoment_descends; in general it
gives equality of the row-value measures inside every atom class.
Proof: shift g by a positive constant c so g + c > 0 and stays in the span,
apply powerSum_descends_of_rootedProfileEquiv at the positive weight
W·(g + c) (rpe-preserved by rootedProfileEquiv_weightMod) and at W, then
subtract (∑ W·g·B^k = ∑ W·(g+c)·B^k − c·∑ W·B^k).
Classwise square-moment descent (PROVED — no twin-free needed). For any
atom-invariant g, the g-decorated square moments of rpe-equivalent rows agree.
The k = 2 specialization of decoratedPowerSum_descends_of_rootedProfileEquiv,
with span membership supplied by the K=1 fullness theorem
InRootedProfileSpan.of_const_on_rpe (atom-invariant ⟹ in the span). The htwin
hypothesis is retained for API compatibility but is unused — the weight-modification
route closes this WITHOUT twin-freeness, unlike the older singular-M stratum route.
Classwise row-value measures descend (PROVED). Under rooted-profile
equivalence i ~ j, the two rows B i and B j have the SAME W-weighted
value distribution INSIDE every atom class C = atom(r) (the rpe-class of a
representative r). Phrased with the atom-restricting weight W · rpeIndicator B W r
(which is W on the class and 0 off it), so the indicator-weighted preimage mass
∑_{t : B i t = a} W t · 1_{atom(r)}(t) is exactly the W-mass of
{t ∈ atom(r) : B i t = a} — see classwise_rowValueMeasure_eq_filter for the
class-filtered restatement.
The classwise refinement of rowValueMeasure_eq_of_rootedProfileEquiv: apply
weighted_powersum_determines_measure with weight W · rpeIndicator B W r, whose
moments descend by decoratedPowerSum_descends_of_rootedProfileEquiv (span membership
from rpeIndicator_mem_span). The bridge to the orbit/rank theorem.
Chunk A — the atom-class coherent structure #
The invariants needed to build a weighted coherent configuration on the atom
partition of rootedProfileEquiv. atomTransMeasure q i a = the W-mass of the
value-a fibre of row B i restricted to atom class atom(q) — the "transition
measure" from the atom of i to the atom of q. The key fact
(atomTransMeasure_eq_of_rpe) is that it depends only on the atom of i, not the
representative — exactly the coherent-configuration coherence condition. This is
the constructive input for the orbit/rank theorem
vertexOrbitRel_of_rootedProfileEquiv; it does NOT yet build automorphisms (equal
W-masses give a coupling, not a bijection, with arbitrary positive real weights).
Indicator-if form of classwise row-value-measure equality (wrapper around
classwise_rowValueMeasure_eq_of_rootedProfileEquiv): for rpe-equivalent i, j and
any atom representative r and value a, the atom-restricted value masses agree.
The total W-mass of the atom class of r (= ∑_{t ∈ atom(r)} W t).
Equations
- Graphon.Lovasz.atomWeight B W r = ∑ t : Fin T, W t * Graphon.Lovasz.rpeIndicator B W r t
Instances For
Atom transition measure: the W-mass of the value-a fibre of row B i
inside atom class atom(q). (The source atom is the atom of i.)
Equations
- Graphon.Lovasz.atomTransMeasure B W q i a = ∑ t : Fin T, W t * Graphon.Lovasz.rpeIndicator B W q t * if B i t = a then 1 else 0
Instances For
Coherence: the atom transition measure depends only on the ATOM of i, not
the chosen representative — the coherent-configuration condition.
Row signature equality inside atoms (the coherent-configuration object):
rpe-equivalent rows B i, B j have the SAME atom-restricted value distribution
(a ↦ atomTransMeasure q i a) for every target atom q.
§7 — atoms = orbits (#70 paper-root), via the DIRECT multigraph route #
The #70 rank theorem vertexOrbitRel_of_rootedProfileEquiv factors through the
PROVED, axiom-clean multigraph Lemma 2.4 tupleEquivMulti_implies_orbit:
rootedProfileEquiv → tupleEquivMulti → vertexOrbitRel.
The middle arrow was the only remaining content when this section was
written — the focused bridge tupleEquivMulti_of_rootedProfileEquiv
(simple-rpe ⟹ multigraph tuple-equivalence at K=1) — and it is now PROVED
below, closing #70. No marker/augmentation is needed: tupleEquivMulti uses the SAME (B,W),
with multigraphs as the PROBES. These declarations were relocated here from
SimpleRank.lean (they have no upstream consumers) because the bridge's eventual
proof uses the decorated/classwise power-sum machinery defined above.
Tree-fragment, base case: the multiplicity-a star probe descends — its
evaluation is the a-th weighted power sum, which descends by powerSum_descends.
Tree-fragment, inductive step: if the sub-probe Mχ descends (its evaluation
is atom-invariant), then the decorated star probe decoratedProbe a Mχ descends. Its
evaluation ∑ₜ W t · B i t ^ a · χ(t) is a decorated power sum with χ in the span
(of_const_on_rpe), so decoratedPowerSum_descends applies. Together with
starProbe_descends this gives, by induction on tree depth, that EVERY tree (= WL)
multigraph probe descends — the part of tupleEquivMulti_of_rootedProfileEquiv already
in reach.
Base case (simple M): a 0/1-multigraph ofSimple F evaluates to the rooted
profile of F, so it lies in the span directly (of_profile).
Base case (root-incident multi-edge / power sum): the multiplicity-a star
probe evaluates to ∑ₜ W t · B v t ^ a, atom-invariant by powerSum_descends, hence
in the span by of_const_on_rpe (non-circular — the descent is independently proved).
Base case (tree / decorated probe): if the sub-probe Mχ lies in the span,
so does decoratedProbe a Mχ — atom-invariance via decoratedProbe_descends
(using const_on_rpe of the Mχ-membership), then of_const_on_rpe.
Warm-up diagonal primitive (one neighbour, PROVED): for g, h in the span,
the "same-vertex" decorated first moment v ↦ ∑ₛ W s · B v s · g s · h s lies in the
span — via InRootedProfileSpan.mul then .weightedAdj. This extracts a coincidence
at ONE neighbour; the internal doubled edge needs the two-variable coincidence
detector (tupleEquivSimple_preserves_diagonal).
Common-neighbour simple graph: two labels 0, 1 both joined to the single
unlabeled vertex 2 (no 0–1 edge). Its rooted evaluation reads ⟨B(ξ 0), B(ξ 1)⟩_W.
Instances For
Coincidence detector (tupleEquivSimple preserves the diagonal) — the KEY
book step for internal multi-edge elimination (formerly a FOCUSED SORRY;
PROVED below). If two 2-tuples are
simple-equivalent and one is diagonal (ξ 0 = ξ 1), so is the other.
Mechanism (non-circular, settled): instantiate tupleEquivSimple at the
common-neighbour simple graph (two labels both joined to one unlabeled vertex),
whose eval is ⟨B (ξ 0), B (ξ 1)⟩_W = ∑ᵤ W u · B (ξ 0) u · B (ξ 1) u. For diagonal
ξ (so ξ 0 = ξ 1 = s) this and the single-label squares give
⟨B (ξ' 0), B (ξ' 1)⟩_W = ‖B (ξ' 0)‖²_W = ‖B (ξ' 1)‖²_W = sqMoment s (single-label
restriction + sqMoment_descends), whence ‖B (ξ' 0) − B (ξ' 1)‖²_W = s − 2s + s = 0,
so B (ξ' 0) = B (ξ' 1) (positive W); twin-free then forces ξ' 0 = ξ' 1.
Uses only proved tools. Consequence: the diagonal indicator is constant on
tupleEquivSimple-classes ⟹ in the simple closure (of_const_on_tupleEquivSimple,
the Lagrange-over-values step), the primitive that extracts the internal B s t².
Diagonal indicator in the simple profile closure (PROVED): the function
ξ ↦ [ξ 0 = ξ 1] lies in the K = 2 simple-profile closure. Since
tupleEquivSimple_preserves_diagonal shows it is constant on
tupleEquivSimple-classes, the proved Lagrange-fullness
of_const_on_tupleEquivSimple puts it in the closure. This is the clean algebraic
diagonal extractor (the idempotent that detects vertex coincidence).
K=1 bridge: simple-eval span ⟹ rooted-profile span. At K = 1 the carrier
types coincide (Σ n, SimpleGraph (Fin (n + 1)) in both) and
rootedProfileFun B W F v = simpleEvalAt B W F (·↦v) definitionally
(rootedProfile := simpleEvalAt _ _ _ (fun _ : Fin 1 => ·)), so a Fin 1-tuple
simple-eval span element, read at the constant tuple, is a rooted-profile span
element with the SAME data.
Rooted multigraph evaluations lie in the simple rooted-profile span
(THE #70 paper-root — the K=1 case of InTupleMultiEvalSpan.toSimple, i.e. Lovász
Lemma 2.5 specialized to a single root). For every rooted multigraph probe M, the
function v ↦ multiLabeledEvalK 1 n M B W (·↦v) lies in InRootedProfileSpan B W.
PROVED via the (formerly canonical-residue, since-proved)
InTupleMultiEvalSpan.toSimple (Lovász §3 /
Lemma 2.5): the K=1 multigraph eval lies in the multigraph-eval span (of_multi);
toSimple hB hW htwin collapses it into the simple-eval span (this is where the
Hadamard-square obstruction — internal multiplicity ≥2 — genuinely lives, equivalently
InTupleSimpleEvalSpan.mul); the K=1 bridge of_tupleSimpleEvalSpan repackages it as
a rooted-profile span element. This consolidates #70 onto the single canonical residue:
the direct diagonal-extraction route (diagIndicator_mem_simpleClosure,
tupleEquivSimple_preserves_diagonal, the decorated/star machinery) bottoms out at the
same closure→linear-span gap, so the honest dependency is toSimple, not a separate
multi-edge-elimination theorem.
The simple → multigraph bridge at K=1 (PROVED, via
rootedMultiEval_mem_rootedProfileSpan, itself proved above — closing
#70). Rooted simple-profile equivalence implies
MULTIGRAPH tuple-equivalence: every multigraph probe evaluates identically on
rpe-equivalent vertices. Immediate from membership of each rooted multigraph eval in
the simple span (rootedMultiEval_mem_rootedProfileSpan) and the fact that span
elements are constant on rpe-classes (InRootedProfileSpan.const_on_rpe).
The K=1 simple-graph rank theorem (#70): rooted-profile equivalence implies
vertex-orbit equivalence — the atoms of the rooted simple-profile algebra are exactly
the (B, W)-automorphism orbits. Fully PROVED: routes through the focused
bridge tupleEquivMulti_of_rootedProfileEquiv (proved above) and the proved
multigraph Lemma 2.4.
Atoms = orbits, packaged form of the rank theorem. Fully PROVED, via
tupleEquivMulti_of_rootedProfileEquiv (proved above) and
vertexOrbitRel_of_rootedProfileEquiv.
Non-circular of_const_on_orbit — an orbit-invariant function is
atom-invariant (atoms = orbits) hence in the span (of_const_on_rpe). Replaces the
cyclically-proved InRootedProfileSpan.of_const_on_orbit in Lovasz.lean. Fully
PROVED, via tupleEquivMulti_of_rootedProfileEquiv (proved above).
Eval spans as Submodules + Phase C1+D rank skeleton #
MOVED upstream to Lovasz.lean (§ the rank-theorem section, 2026-07-02): the submodule
packaging (simpleEvalSubmodule/multiEvalSubmodule/orbitInvariantSubmodule + membership
iffs and inclusions) and the full rank skeleton (incl. instFintypeOrbitClass and the PROVED
simpleEvalSubmodule_eq_orbitInvariantSubmodule) now live directly after
simpleEvalAt_aut_invariant in Lovasz.lean, where the Cai–Govorov machinery they need is
in scope. All names resolve through the import chain.