Admissible-cut enumeration on rose trees #
The combinatorics of admissible cuts, independent of the Hopf-algebra
structures built on it in Core/Algebra/RootedTree/Coproduct/: the
policy-parameterized enumeration (cutSummandsG), its Δ^ρ instance
(cutSummandsP) and Δ^c instance (extractC, cutSummandsCP), the
projections to RoseTree.Nonplanar with their Perm-invariance
(cutSummandsN, cutSummandsCN), and the single-cut count
(countSingleCutsRho).
The admissible-cut enumeration parameterized by an extraction policy
extract : RoseTree α → Option (List (RoseTree α)). A cut at a child
position calls extract on the cut subtree:
extract t = none— cuts at this subtree are forbidden (the "extract whole" branch is omitted).extract t = some []— extract whole, leaving NOTHING in the parent's child slot (the deletion / Δ^ρ convention).extract t = some [r]— extract whole, leaving a single replacement leafrin the parent's child slot (the trace / Δ^c convention).extract t = some [r₁, r₂, ...]— extract whole, leaving multiple replacement leaves (general; not used by current consumers).
Both Δ^ρ (deletion-style, Pruning.lean) and Δ^c (trace-preserving,
Trace.lean) are specializations of this enumeration. The
combinatorial cut bookkeeping is shared; only the per-cut remainder
semantics varies.
Status #
[UPSTREAM] candidate. Once a single cut enumeration is in place, the
per-cut remainder function (deletion vs trace vs other) is just a
parameter to the same combinatorial bookkeeping.
MCB anchor #
[MCB25] Definition 1.2.8 (book p. 33), formula (1.2.8) defines Δ^ω(T) := T ⊗ 1 + 1 ⊗ T + Σ F_v ⊗ T/^ω F_v for ω ∈ {c, d, ρ}. The three remainder semantics differ in T/^ω F_v but the cut enumeration F_v is the same. This file factors the cut enumeration out of the remainder choice.
cutSummandsG — enumeration parameterized by extract #
Mirrors cutSummandsP/cutListSummandsP/augActionP (in Pruning.lean)
but with the per-child decision factored through extract. The
remainder type is List (RoseTree α) (zero, one, or many replacement
leaves per cut), uniform across deletion and trace variants.
For Δ^ρ: extract t := some [] (always extract, leave nothing).
For Δ^c: extract returns some [traceLeaf (τ t)] for Sum.inl-rooted
inputs and none for Sum.inr-rooted inputs.
Multiset of (cut forest, remainder) pairs for a tree, under
the extraction policy extract.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Auxiliary: cut summands for a list of children. The remainder is a
list of replacement entries — each surviving child contributes one
entry (its remainder); each extracted child contributes
extract t-many entries.
Equations
- One or more equations did not get rendered due to their size.
- ConnesKreimer.cutListSummandsG extract [] = {(0, [])}
Instances For
Auxiliary: per-child action under extract. The extract branch
contributes ({t}, replacement) if extract t = some replacement
(omitted if extract t = none). The recursive branch contributes
(cut, [remainder]) for each cut summand of t.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Recursive formula on a node: cutSummandsG unfolds via cutListSummandsG.
Recursive formula for cutListSummandsG on empty list.
Recursive formula for cutListSummandsG on a cons list.
Recursive formula for augActionG.
Specialized form of augActionG_eq when extract t = none: only
the inherited cut summands survive.
Specialized form of augActionG_eq when extract t = some r: the
extract-whole branch contributes ({t}, r).
Node-count conservation under generic cuts #
For extraction policies whose replacement entries carry a single node
total (Δ^c's single trace leaf, extractC), every cut summand conserves
vertices up to one replacement vertex per crown component: crown node
count plus remainder node count equals the original node count plus the
crown's component count. At the edge level this is exact conservation —
the grading of MCB Lemma 1.2.10 (Trace.lean).
A child list's total node count is (l.map RoseTree.numNodes).sum, so
List.map_append/List.sum_append discharge the append step directly
and RoseTree.numNodes_node unfolds the node count — no bespoke child-list
recursion or append lemma is needed.
Cut summands conserve node count (tree level): crown node count plus trunk node count equals the tree node count plus one replacement vertex per crown component. Requires single-node replacement entries.
Mutual aux: node-count conservation for children-list cut summands.
Mutual aux: node-count conservation for per-child actions.
Sanity: cuts of a leaf are just the empty cut #
cutSummandsP — multiset of (cut forest, deletion remainder) pairs #
Recursive enumeration of cut summands. For a leaf, the only cut is the empty cut. For a node, sum over all per-child decisions: each child can either be extracted whole (contributes to cut forest, drops from remainder) OR recurse with a smaller cut (contributes whatever its cut extracts, leaves its deletion-remainder in the remainder list).
This bespoke block is the deletion (Δ^ρ) sibling of the
extraction-policy-parameterized cutSummandsG. It is deliberately NOT
re-expressed as cutSummandsG (fun _ => some []): the Δ^ρ consumers are
written against the Option remainder encoding used here — deletion is
Option.none, a surviving child is Option.some r — whereas
cutSummandsG carries List remainders (deletion [], survival [r]).
Folding onto cutSummandsG would change the public return type of
augActionP and the shapes of augActionP_eq/cutListSummandsP_cons,
so the two enumerations coexist. (Δ^c does derive from cutSummandsG,
being written against the List encoding.)
Multiset of (cut forest, deletion remainder) pairs for a tree. Each summand corresponds to one admissible cut on T under the deletion semantics.
Equations
- ConnesKreimer.cutSummandsP (RoseTree.node a cs) = Multiset.map (fun (p : Multiset (RoseTree α) × List (RoseTree α)) => (p.1, RoseTree.node a p.2)) (ConnesKreimer.cutListSummandsP cs)
Instances For
Auxiliary: cut summands for a list of children. The remainder is a list (children of the parent that survived the cut).
Equations
- One or more equations did not get rendered due to their size.
- ConnesKreimer.cutListSummandsP [] = {(0, [])}
Instances For
Auxiliary: per-child action — either extract whole (none remainder)
or recurse with a cut (some remainder).
Equations
- ConnesKreimer.augActionP x✝ = ({x✝}, none) ::ₘ Multiset.map (fun (p : Multiset (RoseTree α) × RoseTree α) => (p.1, some p.2)) (ConnesKreimer.cutSummandsP x✝)
Instances For
Recursive formula on a node: cutSummandsP unfolds via cutListSummandsP.
Recursive formula for cutListSummandsP on empty list.
Recursive formula for cutListSummandsP on a cons list.
Recursive formula for augActionP.
Named version of the combine_P function (extracted to avoid Lean's "inline match generates fresh matchers" issue when this is reused across proofs via rewrite).
Equations
- ConnesKreimer.combineP_fn p = match p.1.2 with | none => (p.1.1 + p.2.1, p.2.2) | some r => (p.1.1 + p.2.1, r :: p.2.2)
Instances For
Projection of cut summands and descent to Nonplanar #
To descend Δ^ρ from RoseTree to Nonplanar, we need a Nonplanar-side
cut-summand multiset that is Perm-invariant. The strategy:
project each tree-level cut summand through mk componentwise, then prove
the resulting multiset depends on T : RoseTree α only through mk T.
The proof factors through three layers:
- Pointwise projection (
projSummand,projForest,projAugAction): the per-elementNonplanar.mklifts. - Combine factoring (
cutListSummandsP_cons_proj): the cons case ofcutListSummandsPdistributes over the projection, giving a clean cartesian-product recursion at theNonplanarlevel. - Headline recursion (
cutSummandsP_proj_permwith itsPermListcompanioncutListSummandsP_proj_permList, and the derivedcutListSummandsP_proj_componentwise): structural recursion over the mutualPerm/PermListfor the substantive content; a pureList.Forall₂lift for the rest.
Pointwise projection #
Project a tree-level cut summand to a nonplanar one.
Equations
- ConnesKreimer.projSummand p = (Multiset.map RoseTree.Nonplanar.mk p.1, RoseTree.Nonplanar.mk p.2)
Instances For
Project a cutListSummandsP summand to nonplanar level, discarding
the list-order of the remainder children. The discarded order doesn't
affect the eventual mk (.node a remainder), since mk is invariant
under children-list permutation (RoseTree.Perm.node_of_perm).
Equations
- ConnesKreimer.projForest p = (Multiset.map RoseTree.Nonplanar.mk p.1, ↑(List.map RoseTree.Nonplanar.mk p.2))
Instances For
Project an augActionP summand to nonplanar level (per-child decision).
Equations
- ConnesKreimer.projAugAction p = (Multiset.map RoseTree.Nonplanar.mk p.1, Option.map RoseTree.Nonplanar.mk p.2)
Instances For
Bridge: applying cutSummandsP_node's wrapper (p.1, .node a p.2)
then projSummand factors through projForest followed by the
Nonplanar.node a smart constructor.
Combine factoring through projection #
The cons case of cutListSummandsP combines a per-child decision
(augActionP) with the cut-summands of the remaining children. This
combination distributes over the Nonplanar projection: the "projected
combiner" innerCombinerProj operates on
(Forest × Option) × (Forest × Multiset) and matches projForest of
the inline tree-level combiner. The headline result is
cutListSummandsP_cons_proj, which expresses the cons case of the
projected cutListSummandsP as a clean cartesian product at the
Nonplanar level.
The Nonplanar-level combiner: given a per-child decision and the
accumulated cuts of the remaining children, produce the merged
(cut forest, remainder multiset) pair. Mirrors the inline lambda in
cutListSummandsP's cons case but operates on Multiset remainders.
Equations
- ConnesKreimer.innerCombinerProj ((F, none), G, ms) = (F + G, ms)
- ConnesKreimer.innerCombinerProj ((F, some r), G, ms) = (F + G, r ::ₘ ms)
Instances For
Cartesian-product distributivity #
The pair-componentwise Prod.map distributes over Multiset.product
(×ˢ). Mathlib has the bind-side analogues but not this exact form for
multiset products; the proof is one inductive line via cons_product.
Headline factoring: cons case of projected cutListSummandsP #
The projected cutListSummandsP on a cons list factors as a clean
cartesian product at the Nonplanar level. This is the key lemma
enabling all subsequent invariance proofs.
List-side projection invariants #
These three theorems establish that the projected cutListSummandsP is
invariant under (1) substituting an "augAction-projection-equal" child,
(2) substituting a "projForest-equal" tail, and (3) any list permutation.
Triple-combiner symmetry: combining three pieces (two decisions plus the accumulated rest) at the projected level is symmetric in the first two decision arguments.
Doubly-applied innerCombinerProj over a triple cartesian product
is symmetric in the first two factors. The substantive content of
cutListSummandsP_proj_perm's swap case.
The projected cutListSummandsP is List.Perm-invariant: two
permutation-related child lists yield the same projected
cut-summand multiset.
Headline: Perm + PermList recursion #
Structural recursion over the mutual Perm/PermList. The node case lifts
the companion's list-level equality through the Nonplanar.node a wrapper; the
PermList.cons case changes the head child then the tail; the PermList.swap
case reorders identical siblings (cutListSummandsP_proj_perm).
Projection invariance of cutSummandsP under Perm.
Componentwise Perm invariance for child lists, from the PermList
companion via PermList.of_forall₂.
Δ^ρ on Nonplanar via descent #
The cutSummandsP_proj_perm invariance lifts cutSummandsP
through Nonplanar.lift, giving a well-defined cutSummandsN. The
tree-level coproduct comulTreeN then extends multiplicatively to a
forest-level monoid hom and finally to the algebra hom comulAlgHomN.
The Nonplanar cut-summand multiset, defined via Nonplanar.lift
using the cutSummandsP_proj_perm invariance.
Equations
- ConnesKreimer.cutSummandsN = RoseTree.Nonplanar.lift (fun (T : RoseTree α) => Multiset.map ConnesKreimer.projSummand (ConnesKreimer.cutSummandsP T)) ⋯
Instances For
The cut summands of a leaf: only the empty cut (0, leaf a).
Number of Δ^ρ cut summands of T whose cut forest is {T₁} and whose
remainder tree is T₂ — the Δ^ρ analog of the count c^T_{T₁,T₂} of
[MCB25].
Equations
- ConnesKreimer.countSingleCutsRho T T₁ T₂ = Multiset.countP (fun (p : Multiset (RoseTree.Nonplanar α) × RoseTree.Nonplanar α) => p.1 = {T₁} ∧ p.2 = T₂) (ConnesKreimer.cutSummandsN T)
Instances For
augActionN and cutForestSummandsN substrate #
cutForestSummandsN F is the Nonplanar-level multiset of
(cut_forest, remainder_forest) pairs ranging over per-tree decisions
on the forest F. Each per-tree decision (augActionN T) is either
"extract T whole" (pair ({T}, none)) or "recurse with a cut summand
of T" (pair (s.1, some s.2) for s ∈ cutSummandsN T).
Defined recursively at the Nonplanar level via Multiset.foldr, with
the LeftCommutative obligation discharged by swap_double_combinerProj
(the per-tree-decision swap symmetry, established for the tree-level
projection in §3 above and reused here verbatim).
Per-tree decision multiset at the Nonplanar level: extract this tree
whole (({T}, none)), or recurse into a cut summand.
Equations
- ConnesKreimer.augActionN T = ({T}, none) ::ₘ Multiset.map (fun (s : Multiset (RoseTree.Nonplanar α) × RoseTree.Nonplanar α) => (s.1, some s.2)) (ConnesKreimer.cutSummandsN T)
Instances For
Bridge to the tree-level augActionP: at a tree-level lift, augActionN
agrees with (augActionP T).map projAugAction.
The forest cut summand multiset: every per-tree decision tuple on
F : Multiset (Nonplanar α) produces a pair (cut_forest, remainder_forest),
and cutForestSummandsN F enumerates them all (as a multiset). The
public Nonplanar-level analog of (cutListSummandsP ps).map projForest,
independent of the tree-level list representation.
Equations
- ConnesKreimer.cutForestSummandsN F = Multiset.foldr ConnesKreimer.cutForestCombinerN✝ {(0, 0)} F
Instances For
Bridges to the tree-level list representation #
The tree-level substrate cutListSummandsP (defined on List (RoseTree α))
evaluates cutForestSummandsN on a tree-level list rep and characterizes
cuts of a Nonplanar node (cutSummandsN_node).
cutForestSummandsN evaluated on a tree-level list rep agrees with the
tree-level cutListSummandsP projected through projForest. By
induction on ps using cutListSummandsP_cons_proj and
augActionN_mk.
Cuts of a node decompose via the tree-level cutListSummandsP projected
through projForest — the tree-level-list-rep form of cutSummandsN_node.
The map (p ↦ (p.1, Nonplanar.node a p.2)) re-grafts the remainder
children onto a fresh root with label a.
Cuts of Nonplanar.node a F decompose along the per-tree decisions
of F: each pair (cf, rem) ∈ cutForestSummandsN F gives a cut
summand (cf, Nonplanar.node a rem). The Nonplanar-level form.
The trace-marker placeholder leaf carrying the encoded label b : β.
Equations
- ConnesKreimer.traceLeaf b = RoseTree.node (Sum.inr b) []
Instances For
Δ^c extraction policy #
The Δ^c extraction policy: for Sum.inl-rooted (non-trace)
subtrees, extract whole leaving a single traceLeaf (τ t) in the
parent's child slot. For Sum.inr-rooted (trace) subtrees, decline
to extract.
Declining at trace subtrees is required for coassociativity — without it, iterated Δ^c produces "trace of trace" right-channel terms that break the double-cut bijection — and matches [MCB25] Definition 1.2.2's restriction of cuts to accessible terms, which excludes trace placeholders.
Equations
- ConnesKreimer.extractC τ (RoseTree.node (Sum.inl val) children) = some [ConnesKreimer.traceLeaf (τ (RoseTree.node (Sum.inl val) children))]
- ConnesKreimer.extractC τ (RoseTree.node (Sum.inr val) children) = none
Instances For
cutSummandsCP — Δ^c cut enumeration via the generic cutSummandsG #
Defined as cutSummandsG (extractC τ). The generic-side simp lemmas
(cutSummandsG_node, cutListSummandsG_*, augActionG_*) compose with
extractC_inl/extractC_inr to give the Δ^c-specific reductions.
The Δ^c cut summands: cuts at non-trace subtrees with trace placeholders, skipping cuts at trace leaves.
Equations
Instances For
Sanity: the trace policy on leaves #
Descent of cut-summand enumeration #
Mirrors Coproduct/Pruning.lean's descent of cutSummandsP,
but for the generic cutSummandsG (which uses a List-shaped per-cut
remainder rather than Option). The descent applies whenever the
extract policy is invariant under RoseTree.Perm modulo
Nonplanar.mk. For Δ^c (extractC (τ ∘ Nonplanar.mk)) this follows
from Perm.value_eq.
Pointwise projection for the G-form #
Bridge: projSummand factors through projForestG + node #
Combiner factoring #
The cons case of cutListSummandsG adds the cut forest and concatenates
the remainder lists. At the Nonplanar level (via projForestG), the
remainder concatenation becomes multiset addition.
The Nonplanar-level combiner: clean addition on both components.
Equations
- ConnesKreimer.combinerProjG ((F1, m1), F2, m2) = (F1 + F2, m1 + m2)
Instances For
Cartesian-product distributivity (G-form copy) #
Headline factoring: cons case of projected cutListSummandsG #
Extract-policy invariance #
The hypothesis on the extract policy: its return value, projected
component-wise through Nonplanar.mk, is the same on Perm-equal
inputs. For Δ^c (extractC (τ ∘ Nonplanar.mk)) this holds because the
root label and the τ value are both Perm-invariant.
An extract policy is Nonplanar.mk-invariant if its return
value, projected componentwise through Nonplanar.mk, depends on
its input only through Nonplanar.mk.
Equations
- One or more equations did not get rendered due to their size.
Instances For
List-side projection invariants #
Three theorems parallel to cutListSummandsP_proj_at_via_augAction,
cutListSummandsP_proj_tail_lift, and cutListSummandsP_proj_perm.
Swap symmetry for combinerProjG #
Triple-combiner symmetry: combining three projected pieces at the Nonplanar level is symmetric in the first two factors.
Doubly-applied combinerProjG over a triple cartesian product is
symmetric in the first two factors. The substantive content of
cutListSummandsG_proj_perm's swap case.
Headline: Perm + PermList recursion #
Structural recursion over the mutual Perm/PermList. The node case lifts
the companion's list-level equality through the Nonplanar.node a wrapper; the
PermList.cons case changes the head child (via cutSummandsG_proj_perm and
augActionG_proj_eq_of_step_data) then the tail; the PermList.swap case is
the identical-siblings reorder (cutListSummandsG_proj_perm).
Projection invariance of cutSummandsG under Perm.
Generic cut convolution: treeCutsG and forestCutsG #
All cut summands of a tree as (crown forest, trunk forest) pairs — the
full cut ({T}, 0) plus each cuts-summand with a singleton trunk —
and their combinerProjG-convolution over the trees of a forest. The
generic coproduct expands as a single sum over these
(comulTreeNG_eq_sum/comulForestNG_eq_sum, Coproduct/WithCuts.lean).
All cut summands of a tree as (crown, trunk-forest) pairs: the full
cut ({T}, 0) plus each summand of cuts T with a singleton trunk.
Equations
- ConnesKreimer.treeCutsG cuts T = ({T}, 0) ::ₘ Multiset.map (fun (p : Multiset (RoseTree.Nonplanar α) × RoseTree.Nonplanar α) => (p.1, {p.2})) (cuts T)
Instances For
Convolution-of-cuts is left-commutative (it is the symmetric
combinerProjG); needed for Multiset.foldr.
Forest-level cut enumeration: combinerProjG-convolution of
treeCutsG over the component trees.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The Δ^ρ forest cut enumeration is the generic convolution at
cuts := cutSummandsN: augActionN (Option-encoded) and
treeCutsG cutSummandsN (forest-encoded) enumerate the same
per-tree decisions, and innerCombinerProj matches combinerProjG
across the encoding.
Trace specialization #
The Δ^c policy extractC (τ ∘ Nonplanar.mk) is ExtractInvariant:
- For
Sum.inl _-rooted inputs,extractCreturnssome [traceLeaf (τ (mk t))]. - For
Sum.inr _-rooted inputs,extractCreturnsnone.
Both cases are determined by the root label and the τ value, both of
which are Perm-invariant.
The Δ^c extract policy is ExtractInvariant.
Δ^c cut-summand-projection invariance under Perm.
Descent of cutSummandsCP through Nonplanar.mk #
The Nonplanar Δ^c cut summands, descended from cutSummandsCP via
Nonplanar.lift using the descent invariance
cutSummandsCP_proj_perm.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Edge conservation for Δ^c cut summands: the trace marker replaces
the cut subtree by a unit-weight leaf, so crown edges plus trunk
weight recover the tree weight exactly. Descends
cutSummandsG_numNodes through Nonplanar.mk.
Empty-cut uniqueness — combinatorial substrate for the per-tree counit law #
For any extract policy and tree T, the unique cut summand of
cutSummandsG extract T with empty cut forest (p.1.card = 0) is the
empty cut (0, T). By mutual structural induction with the list and
per-child cases. This is the substrate for the Δ^c per-tree counit law:
under (counit ⊗ id), only this summand survives, contributing
1 ⊗ ofTree T.
The unique cut summand of cutSummandsG extract T with empty cut
forest is the empty cut (0, T).
The unique list-cut summand of cutListSummandsG extract cs with
empty cut forest is (0, cs).
The unique per-child decision of augActionG extract t with empty
cut forest is (0, [t]) (the "recurse with empty cut" branch).
Nonplanar-level descent: the unique cut summand of cutSummandsCN τ T
with empty cut forest is (0, T).