Documentation

LeanPool.RegtsSevenster.RS.Novel.Skein.DisjUnionFactor.B

The disjoint union: colour and value splitting #

The colouring sum and the through-summand of a union split into the two components.

theorem RS.notmem_left {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {g : W₁.Flag} (hg : Sum.inl g ∉ F.flags) :
g ∉ (leftSub F).flags

A left flag outside a union subset is outside its left restriction.

theorem RS.notmem_left' {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {g : W₁.Flag} (hg : g ∉ (leftSub F).flags) :
Sum.inl g ∉ F.flags

Conversely, a left flag outside the left restriction is outside the union subset.

theorem RS.notmem_right {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {g : W₂.Flag} (hg : Sum.inr g ∉ F.flags) :
g ∉ (rightSub F).flags

A right flag outside a union subset is outside its right restriction.

theorem RS.notmem_right' {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {g : W₂.Flag} (hg : g ∉ (rightSub F).flags) :
Sum.inr g ∉ F.flags

Conversely, a right flag outside the right restriction is outside the union subset.

Joining even colourings #

noncomputable def RS.joinEvenVal {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {k : ℕ} (ψ₁ : (leftSub F).EvenColouring k) (ψ₂ : (rightSub F).EvenColouring k) :
{ f : (W₁.disjUnion W₂).Flag // f ∉ F.flags } → Fin k

The underlying map of the join of two even colourings: each non-participating flag takes its own component's colour.

Equations
Instances For
    theorem RS.joinEvenVal_inl {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {k : ℕ} (ψ₁ : (leftSub F).EvenColouring k) (ψ₂ : (rightSub F).EvenColouring k) (g : W₁.Flag) (hg : Sum.inl g ∉ F.flags) (hg' : g ∉ (leftSub F).flags) :
    joinEvenVal ψ₁ ψ₂ ⟨Sum.inl g, hg⟩ = ↑ψ₁ ⟨g, hg'⟩

    The join reads the left colouring at a left flag.

    theorem RS.joinEvenVal_inr {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {k : ℕ} (ψ₁ : (leftSub F).EvenColouring k) (ψ₂ : (rightSub F).EvenColouring k) (g : W₂.Flag) (hg : Sum.inr g ∉ F.flags) (hg' : g ∉ (rightSub F).flags) :
    joinEvenVal ψ₁ ψ₂ ⟨Sum.inr g, hg⟩ = ↑ψ₂ ⟨g, hg'⟩

    The join reads the right colouring at a right flag.

    noncomputable def RS.joinEven {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {k : ℕ} (ψ₁ : (leftSub F).EvenColouring k) (ψ₂ : (rightSub F).EvenColouring k) :

    The join of two component even colourings as an even colouring of the union subset.

    Equations
    Instances For
      noncomputable def RS.joinEvenEquiv {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} (F : EdgeSubset (W₁.disjUnion W₂)) (k : ℕ) :

      Even colourings of a union subset are pairs of even colourings of the two restrictions.

      Equations
      • One or more equations did not get rendered due to their size.
      Instances For

        Joining core odd colourings #

        noncomputable def RS.joinCoreVal {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {ℓ : ℕ} (φ₁ : (leftSub F).CoreOddColouring ℓ) (φ₂ : (rightSub F).CoreOddColouring ℓ) :
        ↥F.coreFlags → Fin (2 * ℓ)

        The underlying map of the join of two core odd colourings: each core flag takes its own component's colour.

        Equations
        Instances For
          theorem RS.joinCoreVal_inl {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {ℓ : ℕ} (φ₁ : (leftSub F).CoreOddColouring ℓ) (φ₂ : (rightSub F).CoreOddColouring ℓ) (g : W₁.Flag) (hg : Sum.inl g ∈ F.coreFlags) (hg' : g ∈ (leftSub F).coreFlags) :
          joinCoreVal φ₁ φ₂ ⟨Sum.inl g, hg⟩ = ↑φ₁ ⟨g, hg'⟩

          The core join reads the left colouring at a left flag.

          theorem RS.joinCoreVal_inr {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {ℓ : ℕ} (φ₁ : (leftSub F).CoreOddColouring ℓ) (φ₂ : (rightSub F).CoreOddColouring ℓ) (g : W₂.Flag) (hg : Sum.inr g ∈ F.coreFlags) (hg' : g ∈ (rightSub F).coreFlags) :
          joinCoreVal φ₁ φ₂ ⟨Sum.inr g, hg⟩ = ↑φ₂ ⟨g, hg'⟩

          The core join reads the right colouring at a right flag.

          noncomputable def RS.joinCore {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {ℓ : ℕ} (φ₁ : (leftSub F).CoreOddColouring ℓ) (φ₂ : (rightSub F).CoreOddColouring ℓ) :

          The join of two component core odd colourings as a core odd colouring of the union subset.

          Equations
          Instances For
            noncomputable def RS.joinCoreEquiv {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} (F : EdgeSubset (W₁.disjUnion W₂)) (ℓ : ℕ) :

            Core odd colourings of a union subset are pairs of core odd colourings of the two restrictions.

            Equations
            • One or more equations did not get rendered due to their size.
            Instances For

              Boundary-match transfer #

              theorem RS.genEvenBoundaryMatch_join {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {k ℓ : ℕ} {st : GenBoundaryState k ℓ (α ⊕ β)} (hbnd : genBoundarySubsetMatches (W₁.disjUnion W₂) F.flags st) (hbnd₁ : genBoundarySubsetMatches W₁ (leftSub F).flags fun (a : α) => st (Sum.inl a)) (hbnd₂ : genBoundarySubsetMatches W₂ (rightSub F).flags fun (b : β) => st (Sum.inr b)) (ψ₁ : (leftSub F).EvenColouring k) (ψ₂ : (rightSub F).EvenColouring k) :
              genEvenBoundaryMatch F st hbnd (joinEven ψ₁ ψ₂) ↔ genEvenBoundaryMatch (leftSub F) (fun (a : α) => st (Sum.inl a)) hbnd₁ ψ₁ ∧ genEvenBoundaryMatch (rightSub F) (fun (b : β) => st (Sum.inr b)) hbnd₂ ψ₂

              A join of even colourings meets the union's boundary constraint exactly when both components meet theirs.

              theorem RS.coreOddBoundaryMatch_join {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {k ℓ : ℕ} {st : GenBoundaryState k ℓ (α ⊕ β)} (φ₁ : (leftSub F).CoreOddColouring ℓ) (φ₂ : (rightSub F).CoreOddColouring ℓ) :
              F.coreOddBoundaryMatch st (joinCore φ₁ φ₂) ↔ (leftSub F).coreOddBoundaryMatch (fun (a : α) => st (Sum.inl a)) φ₁ ∧ (rightSub F).coreOddBoundaryMatch (fun (b : β) => st (Sum.inr b)) φ₂

              A join of core odd colourings meets the union's boundary constraint exactly when both components meet theirs.

              Even colour multisets at component vertices #

              noncomputable def RS.leftComplEmb {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} (F : EdgeSubset (W₁.disjUnion W₂)) :
              { g : W₁.Flag // g ∉ (leftSub F).flags } ↪ { f : (W₁.disjUnion W₂).Flag // f ∉ F.flags }

              The left injection embeds the left restriction's non-participating flags into the union's.

              Equations
              Instances For
                noncomputable def RS.rightComplEmb {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} (F : EdgeSubset (W₁.disjUnion W₂)) :
                { g : W₂.Flag // g ∉ (rightSub F).flags } ↪ { f : (W₁.disjUnion W₂).Flag // f ∉ F.flags }

                The right injection embeds the right restriction's non-participating flags into the union's.

                Equations
                Instances For
                  theorem RS.evenColours_aux_inl {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {k : ℕ} (ψ₁ : (leftSub F).EvenColouring k) (ψ₂ : (rightSub F).EvenColouring k) (v : W₁.Vertex) (S : Finset { f : (W₁.disjUnion W₂).Flag // f ∉ F.flags }) (T : Finset { g : W₁.Flag // g ∉ (leftSub F).flags }) (hS : ∀ (x : { f : (W₁.disjUnion W₂).Flag // f ∉ F.flags }), x ∈ S ↔ (W₁.disjUnion W₂).attach ↑x = Sum.inl (Sum.inl v)) (hT : ∀ (y : { g : W₁.Flag // g ∉ (leftSub F).flags }), y ∈ T ↔ W₁.attach ↑y = Sum.inl v) :
                  Multiset.map (↑(joinEven ψ₁ ψ₂)) S.val = Multiset.map (↑ψ₁) T.val

                  At a left vertex, the join's colour multiset over the flags there is the left colouring's.

                  theorem RS.evenColours_aux_inr {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {k : ℕ} (ψ₁ : (leftSub F).EvenColouring k) (ψ₂ : (rightSub F).EvenColouring k) (v : W₂.Vertex) (S : Finset { f : (W₁.disjUnion W₂).Flag // f ∉ F.flags }) (T : Finset { g : W₂.Flag // g ∉ (rightSub F).flags }) (hS : ∀ (x : { f : (W₁.disjUnion W₂).Flag // f ∉ F.flags }), x ∈ S ↔ (W₁.disjUnion W₂).attach ↑x = Sum.inl (Sum.inr v)) (hT : ∀ (y : { g : W₂.Flag // g ∉ (rightSub F).flags }), y ∈ T ↔ W₂.attach ↑y = Sum.inl v) :
                  Multiset.map (↑(joinEven ψ₁ ψ₂)) S.val = Multiset.map (↑ψ₂) T.val

                  At a right vertex, the join's colour multiset over the flags there is the right colouring's.

                  theorem RS.evenColoursAt_join_inl {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {k : ℕ} (ψ₁ : (leftSub F).EvenColouring k) (ψ₂ : (rightSub F).EvenColouring k) (v : W₁.Vertex) :
                  F.evenColoursAt (joinEven ψ₁ ψ₂) (Sum.inl v) = (leftSub F).evenColoursAt ψ₁ v

                  The join's even colours at a left vertex are the left colouring's.

                  theorem RS.evenColoursAt_join_inr {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {k : ℕ} (ψ₁ : (leftSub F).EvenColouring k) (ψ₂ : (rightSub F).EvenColouring k) (v : W₂.Vertex) :
                  F.evenColoursAt (joinEven ψ₁ ψ₂) (Sum.inr v) = (rightSub F).evenColoursAt ψ₂ v

                  The join's even colours at a right vertex are the right colouring's.

                  In-flag lists at component vertices #

                  theorem RS.relInFlagsAt_join_perm_inl {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {κ₁ : (leftSub F).RelTransitionSystem} {κ₂ : (rightSub F).RelTransitionSystem} (o₁ : κ₁.Orientation) (o₂ : κ₂.Orientation) (v : W₁.Vertex) :

                  At a left vertex, the product orientation's in-flags are the left factor's, injected — up to the enumeration order.

                  theorem RS.relInFlagsAt_join_perm_inr {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {κ₁ : (leftSub F).RelTransitionSystem} {κ₂ : (rightSub F).RelTransitionSystem} (o₁ : κ₁.Orientation) (o₂ : κ₂.Orientation) (v : W₂.Vertex) :

                  At a right vertex, the product orientation's in-flags are the right factor's, injected — up to the enumeration order.

                  theorem RS.mem_internal_of_mem_map_inl {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {κ₁ : (leftSub F).RelTransitionSystem} {o₁ : κ₁.Orientation} {v : W₁.Vertex} {f : (W₁.disjUnion W₂).Flag} (hf : f ∈ List.map Sum.inl ((leftSub F).relInFlagsAt o₁ v)) :

                  An injected left in-flag is an internal flag of the union subset.

                  theorem RS.mem_internal_of_mem_map_inr {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {κ₂ : (rightSub F).RelTransitionSystem} {o₂ : κ₂.Orientation} {v : W₂.Vertex} {f : (W₁.disjUnion W₂).Flag} (hf : f ∈ List.map Sum.inr ((rightSub F).relInFlagsAt o₂ v)) :

                  An injected right in-flag is an internal flag of the union subset.

                  pmap helpers (mirrors MixedPartition) #

                  theorem RS.perm_pmap' {β' : Type u_1} {γ' : Type u_2} {p : β' → Prop} (f : (b : β') → p b → γ') {l₁ l₂ : List β'} (hp : l₁.Perm l₂) (H₁ : ∀ b ∈ l₁, p b) (H₂ : ∀ b ∈ l₂, p b) :
                  (List.pmap f l₁ H₁).Perm (List.pmap f l₂ H₂)

                  List.pmap respects permutations.

                  theorem RS.pmap_flatMap_congr' {β' : Type u_1} {β₁ : Type u_2} {β₂ : Type u_3} {γ' : Type u_4} {p₁ p₂ : β' → Prop} (f₁ : (b : β') → p₁ b → β₁) (f₂ : (b : β') → p₂ b → β₂) (G₁ : β₁ → List γ') (G₂ : β₂ → List γ') (l : List β') (H₁ : ∀ b ∈ l, p₁ b) (H₂ : ∀ b ∈ l, p₂ b) (hpt : ∀ b ∈ l, ∀ (h₁ : p₁ b) (h₂ : p₂ b), G₁ (f₁ b h₁) = G₂ (f₂ b h₂)) :
                  List.flatMap G₁ (List.pmap f₁ l H₁) = List.flatMap G₂ (List.pmap f₂ l H₂)

                  Two pmap-then-flatMap passes over one list agree when they agree elementwise.

                  Vertex-local core data at component vertices #

                  theorem RS.coreOddSignFn_join_inl {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {ℓ : ℕ} {κ₁ : (leftSub F).RelTransitionSystem} {κ₂ : (rightSub F).RelTransitionSystem} (φ₁ : (leftSub F).CoreOddColouring ℓ) (φ₂ : (rightSub F).CoreOddColouring ℓ) (g : W₁.Flag) (hg' : Sum.inl g ∈ F.internalFlags) (hg : g ∈ (leftSub F).internalFlags) :
                  F.coreOddSignFn (prodRel κ₁ κ₂) (joinCore φ₁ φ₂) ⟨Sum.inl g, hg'⟩ = (leftSub F).coreOddSignFn κ₁ φ₁ ⟨g, hg⟩

                  The join's odd sign at a left internal flag is the left factor's.

                  theorem RS.coreOddSignFn_join_inr {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {ℓ : ℕ} {κ₁ : (leftSub F).RelTransitionSystem} {κ₂ : (rightSub F).RelTransitionSystem} (φ₁ : (leftSub F).CoreOddColouring ℓ) (φ₂ : (rightSub F).CoreOddColouring ℓ) (g : W₂.Flag) (hg' : Sum.inr g ∈ F.internalFlags) (hg : g ∈ (rightSub F).internalFlags) :
                  F.coreOddSignFn (prodRel κ₁ κ₂) (joinCore φ₁ φ₂) ⟨Sum.inr g, hg'⟩ = (rightSub F).coreOddSignFn κ₂ φ₂ ⟨g, hg⟩

                  The join's odd sign at a right internal flag is the right factor's.

                  theorem RS.coreOddPairFn_join_inl {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {ℓ : ℕ} {κ₁ : (leftSub F).RelTransitionSystem} {κ₂ : (rightSub F).RelTransitionSystem} (φ₁ : (leftSub F).CoreOddColouring ℓ) (φ₂ : (rightSub F).CoreOddColouring ℓ) (g : W₁.Flag) (hg' : Sum.inl g ∈ F.internalFlags) (hg : g ∈ (leftSub F).internalFlags) :
                  F.coreOddPairFn (prodRel κ₁ κ₂) (joinCore φ₁ φ₂) ⟨Sum.inl g, hg'⟩ = (leftSub F).coreOddPairFn κ₁ φ₁ ⟨g, hg⟩

                  The join's odd pair at a left internal flag is the left factor's, injected.

                  theorem RS.coreOddPairFn_join_inr {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {ℓ : ℕ} {κ₁ : (leftSub F).RelTransitionSystem} {κ₂ : (rightSub F).RelTransitionSystem} (φ₁ : (leftSub F).CoreOddColouring ℓ) (φ₂ : (rightSub F).CoreOddColouring ℓ) (g : W₂.Flag) (hg' : Sum.inr g ∈ F.internalFlags) (hg : g ∈ (rightSub F).internalFlags) :
                  F.coreOddPairFn (prodRel κ₁ κ₂) (joinCore φ₁ φ₂) ⟨Sum.inr g, hg'⟩ = (rightSub F).coreOddPairFn κ₂ φ₂ ⟨g, hg⟩

                  The join's odd pair at a right internal flag is the right factor's, injected.

                  theorem RS.coreOddSignAt_join_inl {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {ℓ : ℕ} {κ₁ : (leftSub F).RelTransitionSystem} {κ₂ : (rightSub F).RelTransitionSystem} (o₁ : κ₁.Orientation) (o₂ : κ₂.Orientation) (φ₁ : (leftSub F).CoreOddColouring ℓ) (φ₂ : (rightSub F).CoreOddColouring ℓ) (v : W₁.Vertex) :
                  F.coreOddSignAt (prodOrient o₁ o₂) (joinCore φ₁ φ₂) (Sum.inl v) = (leftSub F).coreOddSignAt o₁ φ₁ v

                  The join's odd-pairing sign at a left vertex is the left factor's.

                  theorem RS.coreOddSignAt_join_inr {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {ℓ : ℕ} {κ₁ : (leftSub F).RelTransitionSystem} {κ₂ : (rightSub F).RelTransitionSystem} (o₁ : κ₁.Orientation) (o₂ : κ₂.Orientation) (φ₁ : (leftSub F).CoreOddColouring ℓ) (φ₂ : (rightSub F).CoreOddColouring ℓ) (v : W₂.Vertex) :
                  F.coreOddSignAt (prodOrient o₁ o₂) (joinCore φ₁ φ₂) (Sum.inr v) = (rightSub F).coreOddSignAt o₂ φ₂ v

                  The join's odd-pairing sign at a right vertex is the right factor's.

                  theorem RS.evalOdd_coreOddListAt_join_inl {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {k ℓ : ℕ} (h : MixedFunctional k ℓ) (μ : Multiset (Fin k)) {κ₁ : (leftSub F).RelTransitionSystem} {κ₂ : (rightSub F).RelTransitionSystem} (o₁ : κ₁.Orientation) (o₂ : κ₂.Orientation) (φ₁ : (leftSub F).CoreOddColouring ℓ) (φ₂ : (rightSub F).CoreOddColouring ℓ) (v : W₁.Vertex) :
                  h.evalOdd μ (F.coreOddListAt (prodOrient o₁ o₂) (joinCore φ₁ φ₂) (Sum.inl v)) = h.evalOdd μ ((leftSub F).coreOddListAt o₁ φ₁ v)

                  The vertex functional's odd evaluation at a left vertex reads the left factor's odd list.

                  theorem RS.evalOdd_coreOddListAt_join_inr {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {k ℓ : ℕ} (h : MixedFunctional k ℓ) (μ : Multiset (Fin k)) {κ₁ : (leftSub F).RelTransitionSystem} {κ₂ : (rightSub F).RelTransitionSystem} (o₁ : κ₁.Orientation) (o₂ : κ₂.Orientation) (φ₁ : (leftSub F).CoreOddColouring ℓ) (φ₂ : (rightSub F).CoreOddColouring ℓ) (v : W₂.Vertex) :
                  h.evalOdd μ (F.coreOddListAt (prodOrient o₁ o₂) (joinCore φ₁ φ₂) (Sum.inr v)) = h.evalOdd μ ((rightSub F).coreOddListAt o₂ φ₂ v)

                  The vertex functional's odd evaluation at a right vertex reads the right factor's odd list.

                  The colouring-sum factorization #

                  theorem RS.joinEvenEquiv_apply {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {k : ℕ} (ψ₁ : (leftSub F).EvenColouring k) (ψ₂ : (rightSub F).EvenColouring k) :
                  (joinEvenEquiv F k) (ψ₁, ψ₂) = joinEven ψ₁ ψ₂

                  The even-colouring equivalence is the join.

                  theorem RS.joinCoreEquiv_apply {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {ℓ : ℕ} (φ₁ : (leftSub F).CoreOddColouring ℓ) (φ₂ : (rightSub F).CoreOddColouring ℓ) :
                  (joinCoreEquiv F ℓ) (φ₁, φ₂) = joinCore φ₁ φ₂

                  The core-colouring equivalence is the join.

                  theorem RS.prod_vertex_split {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} (X : (W₁.disjUnion W₂).Vertex → ℂ) :
                  ∏ v : (W₁.disjUnion W₂).Vertex, X v = (∏ v : W₁.Vertex, X (Sum.inl v)) * ∏ v : W₂.Vertex, X (Sum.inr v)

                  A product over the union's vertices splits into the two components' products.

                  theorem RS.colouringSum_split {α β : Type} {W₁ : Fragment α} {W₂ : Fragment β} {F : EdgeSubset (W₁.disjUnion W₂)} {k ℓ : ℕ} (h : MixedFunctional k ℓ) (st : GenBoundaryState k ℓ (α ⊕ β)) (hbnd : genBoundarySubsetMatches (W₁.disjUnion W₂) F.flags st) (hbnd₁ : genBoundarySubsetMatches W₁ (leftSub F).flags fun (a : α) => st (Sum.inl a)) (hbnd₂ : genBoundarySubsetMatches W₂ (rightSub F).flags fun (b : β) => st (Sum.inr b)) {κ₁ : (leftSub F).RelTransitionSystem} {κ₂ : (rightSub F).RelTransitionSystem} (o₁ : κ₁.Orientation) (o₂ : κ₂.Orientation) :
                  (∑ ψ : F.EvenColouring k, if genEvenBoundaryMatch F st hbnd ψ then ∑ φ : F.CoreOddColouring ℓ, if F.coreOddBoundaryMatch st φ then ∏ v : (W₁.disjUnion W₂).Vertex, ↑(F.coreOddSignAt (prodOrient o₁ o₂) φ v) * h.evalOdd (F.evenColoursAt ψ v) (F.coreOddListAt (prodOrient o₁ o₂) φ v) else 0 else 0) = (∑ ψ : (leftSub F).EvenColouring k, if genEvenBoundaryMatch (leftSub F) (fun (a : α) => st (Sum.inl a)) hbnd₁ ψ then ∑ φ : (leftSub F).CoreOddColouring ℓ, if (leftSub F).coreOddBoundaryMatch (fun (a : α) => st (Sum.inl a)) φ then ∏ v : W₁.Vertex, ↑((leftSub F).coreOddSignAt o₁ φ v) * h.evalOdd ((leftSub F).evenColoursAt ψ v) ((leftSub F).coreOddListAt o₁ φ v) else 0 else 0) * ∑ ψ : (rightSub F).EvenColouring k, if genEvenBoundaryMatch (rightSub F) (fun (b : β) => st (Sum.inr b)) hbnd₂ ψ then ∑ φ : (rightSub F).CoreOddColouring ℓ, if (rightSub F).coreOddBoundaryMatch (fun (b : β) => st (Sum.inr b)) φ then ∏ v : W₂.Vertex, ↑((rightSub F).coreOddSignAt o₂ φ v) * h.evalOdd ((rightSub F).evenColoursAt ψ v) ((rightSub F).coreOddListAt o₂ φ v) else 0 else 0

                  The colouring sum factors: a colouring of the union is a pair of componentwise colourings, and the summand is their product.

                  The subset-sum factorization #