Paper
Logical Equivalences, Homomorphism Indistinguishability, and Forbidden Minors
25 pages · 35 marked passages · pdflatex · download PDF · lax-871432
-
Lovász's theorem
Lovász (1967): two finite graphs are isomorphic if and only if they are homomorphism indistinguishable over all graphs, i.e. if and only if for every graph .
It suffices to test the graphs on vertex set , since every finite graph is isomorphic to one of these and is an isomorphism invariant.
The theorem is deduced from the invertibility of the homomorphism matrix of a family of graphs. Let be pairwise non-isomorphic graphs on at most vertices which represent every isomorphism class of graphs on at most vertices. Then the matrix is invertible over .
1 import Mathlib.LinearAlgebra.Matrix.NonsingularInverse 2 import Lax871432.GraphFamilies 3 import Lax871432.HomomorphismCounts 4 … module docstring, 22 lines 27 28 open Lax871432.GraphFamilies Lax871432.HomomorphismCounts 29 30 namespace Lax871432.LovaszTheorem 31 32 variable {n : ℕ} {ι : Type*} 33 34 /-- The *homomorphism matrix* of a graph family, `M i j = hom(F i, F j)`. -/ 35 noncomputable def homMatrix (F : GraphFamily n ι) : Matrix ι ι ℚ := 36 Matrix.of fun i j => (homCount (F.graph i) (F.graph j) : ℚ) 37 38 /-- **Lovász's homomorphism matrix lemma.** For a finite family of pairwise non-isomorphic 39 graphs on at most `n` vertices which represents every isomorphism class of graphs on at most 40 `n` vertices, the matrix of homomorphism counts between its members is invertible. -/ 41 axiom homMatrix_isUnit [Fintype ι] [DecidableEq ι] (F : GraphFamily n ι) 42 (hni : F.PairwiseNonIso) (hF : F.IsExhaustive) : IsUnit (homMatrix F) 43 44 /-- **Lovász's theorem.** Finite graphs with equal homomorphism counts from every graph are 45 isomorphic, and conversely. -/ 46 axiom nonempty_iso_iff_forall_homCount_eq {V W : Type} [Finite V] [Finite W] 47 (G : SimpleGraph V) (H : SimpleGraph W) : 48 (∀ (m : ℕ) (K : SimpleGraph (Fin m)), homCount K G = homCount K H) ↔ Nonempty (G ≃g H) 49 50 end Lax871432.LovaszTheorem 51 -
Taking minors and preservation under complements
For a graph class and the assertions
- is minor-closed,
- the relaxation is preserved under taking complements,
- is minor-closed,
the implications (1) (2) (3) hold.
1 import Lax871432.ClosureProperties 2 import Lax871432.DistinguishingClosure 3 import Lax871432.PreservationProperties 4 … module docstring, 13 lines 18 19 open Lax871432.ClosureProperties Lax871432.DistinguishingClosure 20 open Lax871432.GraphClasses 21 open Lax871432.HomomorphismIndistinguishability Lax871432.PreservationProperties 22 23 namespace Lax871432.MinorsComplements 24 25 /-- **(1) (2).** If `𝓕` is minor-closed then is 26 preserved under taking complements. -/ 27 axiom preservedUnderCompl_of_isMinorClosed (𝓕 : GraphClass) : 28 IsMinorClosed 𝓕 → PreservedUnderCompl (homIndRel 𝓕) 29 30 /-- **(2) (3).** is preserved under taking 31 complements if and only if is minor-closed. -/ 32 axiom preservedUnderCompl_iff_cl_isMinorClosed (𝓕 : GraphClass) : 33 PreservedUnderCompl (homIndRel 𝓕) ↔ IsMinorClosed (cl 𝓕) 34 35 end Lax871432.MinorsComplements 36 -
Roberson's conjecture
Roberson (2022) conjectured that every graph class closed under taking minors and disjoint unions is homomorphism distinguishing closed: for such a class , adding any further graph to strictly refines .
1 import Lax871432.ClosureProperties 2 import Lax871432.DistinguishingClosure 3 … module docstring, 17 lines 21 22 open Lax871432.ClosureProperties Lax871432.DistinguishingClosure 23 open Lax871432.GraphClasses 24 25 namespace Lax871432.RobersonConjecture 26 27 /-- **Roberson's conjecture.** Every nonempty, minor-closed, union-closed class of finite 28 simple graphs is homomorphism distinguishing closed. -/ 29 axiom isHomDistinguishingClosed_of_isMinorClosed_of_isUnionClosed (𝓕 : GraphClass) 30 (hne : ∃ (n : ℕ) (F : SimpleGraph (Fin n)), 𝓕.Mem F) : 31 IsMinorClosed 𝓕 → IsUnionClosed 𝓕 → IsHomDistinguishingClosed 𝓕 32 33 end Lax871432.RobersonConjecture 34 -
Homomorphism counts
A homomorphism from a graph to a graph is a map sending adjacent vertices to adjacent vertices. We write for the number of such maps.
1 import Mathlib.Combinatorics.SimpleGraph.Maps 2 import Mathlib.SetTheory.Cardinal.Finite 3 … module docstring, 8 lines 12 13 namespace Lax871432.HomomorphismCounts 14 15 /-- , the number of homomorphisms from `F` to `G`. -/ 16 noncomputable def homCount {V W : Type*} (F : SimpleGraph V) (G : SimpleGraph W) : ℕ := 17 Nat.card (F →g G) 18 19 end Lax871432.HomomorphismCounts 20 -
Homomorphism indistinguishability
Two graphs and are homomorphism indistinguishable over a class , written , if for every .
Since is an isomorphism invariant, this is a graph isomorphism relaxation, and it is defined as one: is the relaxation itself, and is notation for the relation it carries.
1 import Mathlib.SetTheory.Cardinal.NatCard 2 import Lax871432.GraphClasses 3 import Lax871432.HomomorphismCounts 4 import Lax871432.IsomorphismRelaxations 5 … module docstring, 13 lines 19 20 open Lax871432.GraphClasses Lax871432.HomomorphismCounts Lax871432.IsomorphismRelaxations 21 22 namespace Lax871432.HomomorphismIndistinguishability 23 24 /-- *Homomorphism indistinguishability over `𝓕`*: the graph isomorphism relaxation relating 25 two graphs when they receive the same number of homomorphisms from every graph of `𝓕`. -/ 26 def homIndRel (𝓕 : GraphClass) : GraphIsoRelaxation where 27 Rel := @fun _ _ _ _ G H => 28 ∀ ⦃m : ℕ⦄ (F : SimpleGraph (Fin m)), 𝓕.Mem F → homCount F G = homCount F H 29 rel_of_iso := by 30 -- Postcomposing with the isomorphism is a bijection between the two hom-sets, so 31 -- isomorphic graphs receive equally many homomorphisms from every graph. 32 rintro V W _ _ G H ⟨e⟩ m F - 33 exact Nat.card_congr 34 { toFun f := e.toHom.comp f 35 invFun f := e.symm.toHom.comp f 36 left_inv _ := by ext a; simp 37 right_inv _ := by ext a; simp } 38 symm := by 39 intro V W _ _ G H h m F hF 40 exact (h F hF).symm 41 trans := by 42 intro U V W _ _ _ G H K h h' m F hF 43 exact (h F hF).trans (h' F hF) 44 45 @[inherit_doc homIndRel] 46 scoped notation:50 G " ≡[" 𝓕 "] " H => GraphIsoRelaxation.Rel (homIndRel 𝓕) G H 47 48 end Lax871432.HomomorphismIndistinguishability 49 -
The homomorphism distinguishing closure
The homomorphism distinguishing closure of a graph class is
the largest graph class whose homomorphism indistinguishability relation coincides with that of . A class is homomorphism distinguishing closed if it equals its own closure, i.e. if adding any further graph strictly refines its homomorphism indistinguishability relation.
1 import Lax871432.HomomorphismIndistinguishability 2 … module docstring, 14 lines 17 18 open Lax871432.GraphClasses 19 open Lax871432.HomomorphismCounts Lax871432.HomomorphismIndistinguishability 20 open Lax871432.IsomorphismRelaxations 21 22 open scoped Lax871432.HomomorphismIndistinguishability 23 24 namespace Lax871432.DistinguishingClosure 25 26 /-- The relaxation `R` *determines* the homomorphism counts of `K` if related graphs receive 27 equally many homomorphisms from `K`. -/ 28 structure Determines (R : GraphIsoRelaxation) {U : Type} [Finite U] (K : SimpleGraph U) : 29 Prop where 30 /-- Graphs related by `R` receive equally many homomorphisms from `K`. -/ 31 homCount_eq : ∀ {V W : Type} [Finite V] [Finite W] (G : SimpleGraph V) (H : SimpleGraph W), 32 R.Rel G H → homCount K G = homCount K H 33 34 /-- , the homomorphism distinguishing closure of `𝓕`. -/ 35 def cl (𝓕 : GraphClass) : GraphClass where 36 Mem K := Determines (homIndRel 𝓕) K 37 mem_congr {_ _ _ _ F F'} he := by 38 -- Precomposition with the isomorphism is a bijection between the homomorphisms out of 39 -- `F` and those out of `F'`, so the two are counted alike into every target. 40 obtain ⟨e⟩ := he 41 have key : ∀ {W : Type} (K : SimpleGraph W), homCount F K = homCount F' K := fun K => 42 Nat.card_congr 43 { toFun f := f.comp e.symm.toHom 44 invFun f := f.comp e.toHom 45 left_inv _ := by ext a; exact congrArg _ (e.symm_apply_apply a) 46 right_inv _ := by ext a; exact congrArg _ (e.apply_symm_apply a) } 47 constructor <;> intro h <;> refine ⟨fun G H hGH => ?_⟩ 48 · rw [← key G, ← key H]; exact h.homCount_eq G H hGH 49 · rw [key G, key H]; exact h.homCount_eq G H hGH 50 51 /-- `𝓕` is *homomorphism distinguishing closed* if it contains its own closure, i.e. if 52 adding any graph to `𝓕` strictly refines . -/ 53 def IsHomDistinguishingClosed (𝓕 : GraphClass) : Prop := 54 ∀ ⦃V : Type⦄ [Finite V] (F : SimpleGraph V), (cl 𝓕).Mem F → 𝓕.Mem F 55 56 end Lax871432.DistinguishingClosure 57 -
The homomorphism distinguishing closure is a closure operator
The map is a closure operator on graph classes ordered by inclusion: for all graph classes and ,
- if ,
- , and
- .
1 import Mathlib.Order.Closure 2 import Lax871432.DistinguishingClosure 3 … module docstring, 13 lines 17 18 open Lax871432.DistinguishingClosure Lax871432.GraphClasses 19 20 namespace Lax871432.DistinguishingClosureOperator 21 22 /-- is a closure operator: it is monotone, extensive and idempotent. -/ 23 axiom isClosureOperator : ∃ c : ClosureOperator GraphClass, ∀ 𝓕, c 𝓕 = cl 𝓕 24 25 end Lax871432.DistinguishingClosureOperator 26 -
no assumptions
is a closure operator. It is monotone because enlarging can only shrink , and extensive because determines the homomorphism counts from every member of by definition. It is idempotent because and are the same relation.
-
The closure of intersections and unions
Let be an arbitrary index set and let be a family of graph classes. Then
1 import Lax871432.DistinguishingClosure 2 … module docstring, 12 lines 15 16 open Lax871432.DistinguishingClosure Lax871432.GraphClasses 17 18 namespace Lax871432.IntersectionsUnions 19 20 /-- The closure of an intersection is contained in the intersection of the closures. -/ 21 axiom cl_iInf_le_iInf_cl {I : Type*} (𝓕 : I → GraphClass) : 22 cl (⨅ i, 𝓕 i) ≤ ⨅ i, cl (𝓕 i) 23 24 /-- The union of the closures is contained in the closure of the union. -/ 25 axiom iSup_cl_le_cl_iSup {I : Type*} (𝓕 : I → GraphClass) : 26 ⨆ i, cl (𝓕 i) ≤ cl (⨆ i, 𝓕 i) 27 28 end Lax871432.IntersectionsUnions 29 -
no assumptions
, first inclusion. For every , the intersection is contained in , so its closure is contained in by monotonicity of .
-
no assumptions
, second inclusion. For every , is contained in the union, so is contained in its closure by monotonicity of .
-
Products of graphs
Two products of simple graphs, both on the product of the vertex sets.
In the categorical product , the pairs and are adjacent when and . It is the product in the category of graphs and graph homomorphisms, whence ; it also goes by tensor, Kronecker, weak or conjunction product.
In the lexicographic product , the pairs and are adjacent when , or else and .
1 import Mathlib.Combinatorics.SimpleGraph.Prod 2 … module docstring, 15 lines 18 19 namespace Lax871432.GraphProducts 20 21 variable {α β : Type*} 22 23 /-- The *categorical product* of simple graphs: it relates `(a₁, b₁)` and `(a₂, b₂)` when `G` 24 relates `a₁` and `a₂` and `H` relates `b₁` and `b₂`. Contrast with `SimpleGraph.boxProd`. -/ 25 def catProd (G : SimpleGraph α) (H : SimpleGraph β) : SimpleGraph (α × β) where 26 Adj x y := G.Adj x.1 y.1 ∧ H.Adj x.2 y.2 27 symm := ⟨fun _ _ h => ⟨h.1.symm, h.2.symm⟩⟩ 28 loopless := ⟨fun _ h => G.irrefl h.1⟩ 29 30 @[inherit_doc] 31 scoped infixl:70 " ×g " => catProd 32 33 /-- The *lexicographic product* of simple graphs: it relates `(a₁, b₁)` and `(a₂, b₂)` when `G` 34 relates `a₁` and `a₂`, or when `a₁ = a₂` and `H` relates `b₁` and `b₂`. -/ 35 def lexProd (G : SimpleGraph α) (H : SimpleGraph β) : SimpleGraph (α × β) where 36 Adj x y := G.Adj x.1 y.1 ∨ (x.1 = y.1 ∧ H.Adj x.2 y.2) 37 symm := ⟨fun _ _ h => h.imp SimpleGraph.Adj.symm fun h' => ⟨h'.1.symm, h'.2.symm⟩⟩ 38 loopless := ⟨fun _ h => h.elim (G.irrefl ·) fun h' => H.irrefl h'.2⟩ 39 40 end Lax871432.GraphProducts 41 -
Homomorphism counts from a disjoint union
For simple graphs , and ,
where denotes the disjoint union of and .
1 import Mathlib.Combinatorics.SimpleGraph.Sum 2 import Lax871432.HomomorphismCounts 3 … module docstring, 9 lines 13 14 open Lax871432.HomomorphismCounts 15 16 namespace Lax871432.CoproductCounts 17 18 /-- A homomorphism from a disjoint union is a pair of homomorphisms from its two parts. -/ 19 axiom homCount_sum_left {U V W : Type*} [Finite U] [Finite V] [Finite W] (F₁ : SimpleGraph U) 20 (F₂ : SimpleGraph V) (G : SimpleGraph W) : 21 homCount (F₁ ⊕g F₂) G = homCount F₁ G * homCount F₂ G 22 23 end Lax871432.CoproductCounts 24 -
no assumptions
. Restricting a homomorphism out of to the two parts is a bijection onto pairs of homomorphisms out of and out of , since there are no edges between the parts.
-
Homomorphism counts into a categorical product
For simple graphs , and ,
1 import Lax871432.GraphProducts 2 import Lax871432.HomomorphismCounts 3 … module docstring, 8 lines 12 13 open Lax871432.GraphProducts Lax871432.HomomorphismCounts 14 15 open scoped Lax871432.GraphProducts 16 17 namespace Lax871432.CategoricalProductCounts 18 19 /-- A homomorphism into a categorical product is a pair of homomorphisms into its two 20 factors. -/ 21 axiom homCount_catProd_right {U V W : Type*} [Finite U] [Finite V] [Finite W] 22 (F : SimpleGraph U) (G₁ : SimpleGraph V) (G₂ : SimpleGraph W) : 23 homCount F (G₁ ×g G₂) = homCount F G₁ * homCount F G₂ 24 25 end Lax871432.CategoricalProductCounts 26 -
no assumptions
. Composing with the two projections is a bijection from the homomorphisms into onto pairs of homomorphisms into and into : the categorical product is the product in the category of graphs and graph homomorphisms.
-
Homomorphism counts into a disjoint union
For a connected simple graph and simple graphs and ,
where denotes the disjoint union of and .
1 import Mathlib.Combinatorics.SimpleGraph.Connectivity.Connected 2 import Mathlib.Combinatorics.SimpleGraph.Sum 3 import Lax871432.HomomorphismCounts 4 … module docstring, 9 lines 14 15 open Lax871432.HomomorphismCounts 16 17 namespace Lax871432.DisjointUnionCounts 18 19 /-- A homomorphism from a connected graph into a disjoint union maps into one of its two 20 parts. -/ 21 axiom homCount_sum_right {U V W : Type*} [Finite U] [Finite V] [Finite W] (K : SimpleGraph U) 22 (hK : K.Connected) (G₁ : SimpleGraph V) (G₂ : SimpleGraph W) : 23 homCount K (G₁ ⊕g G₂) = homCount K G₁ + homCount K G₂ 24 25 end Lax871432.DisjointUnionCounts 26 -
no assumptions
. The image of a connected graph under a homomorphism is connected, so it lies entirely in or entirely in ; hence the homomorphisms into are the disjoint union of those into and those into .
-
Partitions into connected parts
A partition into connected parts of a simple graph is a partition of such that the subgraph induced by every class is connected.
1 import Mathlib.Combinatorics.SimpleGraph.Connectivity.Connected 2 … module docstring, 32 lines 35 36 namespace Lax871432.ConnectedPartitions 37 38 variable {V : Type*} 39 40 /-- A partition of the vertices of `F`, all of whose classes induce connected subgraphs. -/ 41 structure ConnPart (F : SimpleGraph V) where 42 /-- The partition, as an equivalence relation on the vertices. -/ 43 setoid : Setoid V 44 /-- Every class induces a connected subgraph of `F`. -/ 45 connected : ∀ a : Quotient setoid, (F.induce {v | Quotient.mk setoid v = a}).Connected 46 47 namespace ConnPart 48 49 variable {F : SimpleGraph V} (𝓡 : ConnPart F) 50 51 /-- The class of a vertex. -/ 52 def proj (v : V) : Quotient 𝓡.setoid := Quotient.mk 𝓡.setoid v 53 54 /-- The subgraph of `F` induced by a class. -/ 55 def part (a : Quotient 𝓡.setoid) : SimpleGraph {v | 𝓡.proj v = a} := F.induce _ 56 57 /-- The quotient `F / 𝓡`: distinct classes are adjacent when `F` joins them. -/ 58 def quotientGraph : SimpleGraph (Quotient 𝓡.setoid) where 59 Adj a b := a ≠ b ∧ ∃ x y, F.Adj x y ∧ 𝓡.proj x = a ∧ 𝓡.proj y = b 60 symm := ⟨fun _ _ h => by 61 obtain ⟨hne, x, y, hxy, hx, hy⟩ := h 62 exact ⟨hne.symm, y, x, hxy.symm, hy, hx⟩⟩ 63 loopless := ⟨fun _ h => h.1 rfl⟩ 64 65 /-- `∐ R ∈ 𝓡, F[R]`, the disjoint union of the subgraphs induced by the classes. -/ 66 def parts : SimpleGraph (Σ a : Quotient 𝓡.setoid, {v | 𝓡.proj v = a}) where 67 Adj p q := F.Adj p.2.1 q.2.1 ∧ 𝓡.proj p.2.1 = 𝓡.proj q.2.1 68 symm := ⟨fun _ _ h => ⟨h.1.symm, h.2.symm⟩⟩ 69 loopless := ⟨fun _ h => F.irrefl h.1⟩ 70 71 72 /-- A finite graph has finitely many partitions into connected parts. -/ 73 instance instFinite [Finite V] : Finite (ConnPart F) := 74 Finite.of_injective (fun 𝓡 => (𝓡.setoid.r : V → V → Prop)) <| by 75 intro R S h 76 obtain ⟨s, hs⟩ := R 77 obtain ⟨t, ht⟩ := S 78 obtain rfl : s = t := Setoid.ext fun a b => Eq.to_iff (congrFun (congrFun h a) b) 79 rfl 80 81 noncomputable instance instFintype [Finite V] : Fintype (ConnPart F) := Fintype.ofFinite _ 82 83 end ConnPart 84 85 end Lax871432.ConnectedPartitions 86 -
Contracting edges
A graph is obtained from a simple graph by contracting edges when the vertices of are the classes of a partition of into parts inducing connected subgraphs, two distinct classes being adjacent in exactly when joins a vertex of one to a vertex of the other. In the notation of the paper, .
1 import Mathlib.Combinatorics.SimpleGraph.Connectivity.Connected 2 … module docstring, 21 lines 24 25 namespace Lax871432.Contractions 26 27 /-- A presentation of `K` as the graph obtained from `F` by contracting the edges inside the 28 classes of a partition of `V(F)` into connected parts. -/ 29 structure Contraction {V W : Type*} (K : SimpleGraph W) (F : SimpleGraph V) where 30 /-- The vertex of `K` a vertex of `F` is contracted to. -/ 31 proj : V → W 32 /-- Each class induces a connected — in particular nonempty — subgraph of `F`. -/ 33 connected : ∀ w, (F.induce {v | proj v = w}).Connected 34 /-- Distinct classes are adjacent in `K` exactly when `F` joins them. -/ 35 adj_iff : ∀ a b, K.Adj a b ↔ a ≠ b ∧ ∃ x y, F.Adj x y ∧ proj x = a ∧ proj y = b 36 37 /-- `K` is *obtained from `F` by contracting edges*. -/ 38 def IsContraction {V W : Type*} (K : SimpleGraph W) (F : SimpleGraph V) : Prop := 39 Nonempty (Contraction K F) 40 41 end Lax871432.Contractions 42 -
Closure properties of graph classes
Five closure properties of a class of finite simple graphs.
is closed under taking summands if implies and , where denotes disjoint union, and union-closed if conversely implies . It is minor-closed if every minor of a member is a member.
It is closed under taking induced subgraphs if every induced subgraph of a member is a member, and closed under contracting edges if every graph obtained from a member by contracting edges is a member.
1 import Mathlib.Combinatorics.SimpleGraph.Sum 2 import Mathlib.Data.Finite.Sum 3 import Lax68.GraphMinors 4 import Lax871432.Contractions 5 import Lax871432.GraphClasses 6 … module docstring, 17 lines 24 25 open Lax871432.Contractions Lax871432.GraphClasses 26 27 namespace Lax871432.ClosureProperties 28 29 /-- `𝓕` is *closed under taking summands* if both summands of a disjoint union in the class 30 are themselves in the class. -/ 31 def IsSummandClosed (𝓕 : GraphClass) : Prop := 32 ∀ {V W : Type} [Finite V] [Finite W] (F₁ : SimpleGraph V) (F₂ : SimpleGraph W), 33 𝓕.Mem (F₁ ⊕g F₂) → 𝓕.Mem F₁ ∧ 𝓕.Mem F₂ 34 35 /-- `𝓕` is *union-closed* if the disjoint union of two members is a member. -/ 36 def IsUnionClosed (𝓕 : GraphClass) : Prop := 37 ∀ {V W : Type} [Finite V] [Finite W] (F₁ : SimpleGraph V) (F₂ : SimpleGraph W), 38 𝓕.Mem F₁ → 𝓕.Mem F₂ → 𝓕.Mem (F₁ ⊕g F₂) 39 40 /-- `𝓕` is *closed under taking induced subgraphs* if every induced subgraph of a member is a 41 member. -/ 42 def IsInducedSubgraphClosed (𝓕 : GraphClass) : Prop := 43 ∀ {V : Type} [Finite V] (F : SimpleGraph V) (U : Set V), 𝓕.Mem F → 𝓕.Mem (F.induce U) 44 45 /-- `𝓕` is *closed under contracting edges* if every quotient of a member by a partition into 46 connected parts is a member. -/ 47 def IsContractionClosed (𝓕 : GraphClass) : Prop := 48 ∀ {V W : Type} [Finite V] [Finite W] {F : SimpleGraph V} (K : SimpleGraph W), 49 IsContraction K F → 𝓕.Mem F → 𝓕.Mem K 50 51 /-- `𝓕` is *minor-closed* if every minor of a member is a member. -/ 52 def IsMinorClosed (𝓕 : GraphClass) : Prop := 53 ∀ {V W : Type} [Finite V] [Finite W] {F : SimpleGraph V} (K : SimpleGraph W), 54 Lax68.GraphMinors.IsMinor K F → 𝓕.Mem F → 𝓕.Mem K 55 56 end Lax871432.ClosureProperties 57 -
Preservation properties of a graph isomorphism relaxation
Five properties an equivalence relation on finite simple graphs may have.
It is preserved under disjoint unions if and imply , and preserved under categorical products if implies for every graph . It is preserved under taking complements if implies ; since complementation is an involution and is symmetric, this one implication already gives the biconditional of the paper.
It is preserved under left lexicographic products if implies for every graph , and preserved under right lexicographic products if implies for every graph .
1 import Mathlib.Combinatorics.SimpleGraph.Sum 2 import Mathlib.Data.Finite.Sum 3 import Lax871432.GraphProducts 4 import Lax871432.IsomorphismRelaxations 5 … module docstring, 18 lines 24 25 open Lax871432.GraphProducts Lax871432.IsomorphismRelaxations 26 27 open scoped Lax871432.GraphProducts 28 29 namespace Lax871432.PreservationProperties 30 31 /-- `R` is *preserved under disjoint unions*. -/ 32 def PreservedUnderDisjointUnion (R : GraphIsoRelaxation) : Prop := 33 ∀ {V V' W W' : Type} [Finite V] [Finite V'] [Finite W] [Finite W'] 34 (G : SimpleGraph V) (G' : SimpleGraph V') (H : SimpleGraph W) (H' : SimpleGraph W'), 35 R.Rel G G' → R.Rel H H' → R.Rel (G ⊕g H) (G' ⊕g H') 36 37 /-- `R` is *preserved under categorical products*: multiplying both sides by a fixed graph 38 keeps them related. -/ 39 def PreservedUnderCatProd (R : GraphIsoRelaxation) : Prop := 40 ∀ {V W X : Type} [Finite V] [Finite W] [Finite X] 41 (G : SimpleGraph V) (H : SimpleGraph W) (K : SimpleGraph X), 42 R.Rel G H → R.Rel (G ×g K) (H ×g K) 43 44 /-- `R` is *preserved under left lexicographic products*: multiplying on the left by a fixed 45 graph keeps related graphs related. -/ 46 def PreservedUnderLeftLexProd (R : GraphIsoRelaxation) : Prop := 47 ∀ {V W W' : Type} [Finite V] [Finite W] [Finite W'] 48 (G : SimpleGraph V) (H : SimpleGraph W) (H' : SimpleGraph W'), 49 R.Rel H H' → R.Rel (lexProd G H) (lexProd G H') 50 51 /-- `R` is *preserved under right lexicographic products*: multiplying on the right by a fixed 52 graph keeps related graphs related. -/ 53 def PreservedUnderRightLexProd (R : GraphIsoRelaxation) : Prop := 54 ∀ {V V' W : Type} [Finite V] [Finite V'] [Finite W] 55 (G : SimpleGraph V) (G' : SimpleGraph V') (H : SimpleGraph W), 56 R.Rel G G' → R.Rel (lexProd G H) (lexProd G' H) 57 58 /-- `R` is *preserved under taking complements*. -/ 59 def PreservedUnderCompl (R : GraphIsoRelaxation) : Prop := 60 ∀ {V W : Type} [Finite V] [Finite W] (G : SimpleGraph V) (H : SimpleGraph W), 61 R.Rel G H → R.Rel Gᶜ Hᶜ 62 63 end Lax871432.PreservationProperties 64 -
Graph isomorphism relaxations
A graph isomorphism relaxation is an equivalence relation on finite simple graphs that is coarser than isomorphism: isomorphic graphs are related, and the relation is symmetric and transitive.
1 import Mathlib.Combinatorics.SimpleGraph.Maps 2 … module docstring, 9 lines 12 13 namespace Lax871432.IsomorphismRelaxations 14 15 /-- A *graph isomorphism relaxation*: an equivalence relation on finite simple graphs which 16 relates any two isomorphic graphs, and is therefore invariant under isomorphism. -/ 17 structure GraphIsoRelaxation where 18 /-- The relation itself. -/ 19 Rel : ∀ ⦃V W : Type⦄ [Finite V] [Finite W], SimpleGraph V → SimpleGraph W → Prop 20 /-- Isomorphic graphs are related; in particular the relation is reflexive. -/ 21 rel_of_iso : ∀ {V W : Type} [Finite V] [Finite W] {G : SimpleGraph V} {H : SimpleGraph W}, 22 Nonempty (G ≃g H) → Rel G H 23 /-- The relation is symmetric. -/ 24 symm : ∀ {V W : Type} [Finite V] [Finite W] {G : SimpleGraph V} {H : SimpleGraph W}, 25 Rel G H → Rel H G 26 /-- The relation is transitive. -/ 27 trans : ∀ {U V W : Type} [Finite U] [Finite V] [Finite W] {G : SimpleGraph U} 28 {H : SimpleGraph V} {K : SimpleGraph W}, Rel G H → Rel H K → Rel G K 29 30 end Lax871432.IsomorphismRelaxations 31 -
A determined linear combination determines its constituents
Let be a graph isomorphism relaxation preserved under categorical products, let be a finite family of pairwise non-isomorphic simple graphs, and let for every . If determines the linear combination — that is, if implies
— then it determines each constituent separately.
1 import Mathlib.Algebra.BigOperators.Group.Finset.Basic 2 import Mathlib.Data.Rat.Defs 3 import Lax871432.DistinguishingClosure 4 import Lax871432.GraphFamilies 5 import Lax871432.PreservationProperties 6 … module docstring, 12 lines 19 20 open Lax871432.DistinguishingClosure Lax871432.GraphFamilies Lax871432.HomomorphismCounts 21 open Lax871432.IsomorphismRelaxations Lax871432.PreservationProperties 22 23 namespace Lax871432.LinearCombinationLemma 24 25 /-- A relaxation preserved under categorical products which determines a linear combination of 26 homomorphism counts, over pairwise non-isomorphic graphs and with nonzero coefficients, 27 determines each of its constituents. -/ 28 axiom determines_of_determines_sum (R : GraphIsoRelaxation) (hprod : PreservedUnderCatProd R) 29 {n : ℕ} {ι : Type} [Fintype ι] (L : GraphFamily n ι) (hL : L.PairwiseNonIso) 30 (α : ι → ℚ) (hα : ∀ i, α i ≠ 0) 31 (hdet : ∀ {V W : Type} [Finite V] [Finite W] (G : SimpleGraph V) (H : SimpleGraph W), 32 R.Rel G H → 33 ∑ i, α i * (homCount (L.graph i) G : ℚ) = ∑ i, α i * (homCount (L.graph i) H : ℚ)) 34 (i : ι) : Determines R (L.graph i) 35 36 end Lax871432.LinearCombinationLemma 37 -
Lovász's theorem
Lovász (1967): two finite graphs are isomorphic if and only if they are homomorphism indistinguishable over all graphs, i.e. if and only if for every graph .
It suffices to test the graphs on vertex set , since every finite graph is isomorphic to one of these and is an isomorphism invariant.
The theorem is deduced from the invertibility of the homomorphism matrix of a family of graphs. Let be pairwise non-isomorphic graphs on at most vertices which represent every isomorphism class of graphs on at most vertices. Then the matrix is invertible over .
1 import Mathlib.LinearAlgebra.Matrix.NonsingularInverse 2 import Lax871432.GraphFamilies 3 import Lax871432.HomomorphismCounts 4 … module docstring, 22 lines 27 28 open Lax871432.GraphFamilies Lax871432.HomomorphismCounts 29 30 namespace Lax871432.LovaszTheorem 31 32 variable {n : ℕ} {ι : Type*} 33 34 /-- The *homomorphism matrix* of a graph family, `M i j = hom(F i, F j)`. -/ 35 noncomputable def homMatrix (F : GraphFamily n ι) : Matrix ι ι ℚ := 36 Matrix.of fun i j => (homCount (F.graph i) (F.graph j) : ℚ) 37 38 /-- **Lovász's homomorphism matrix lemma.** For a finite family of pairwise non-isomorphic 39 graphs on at most `n` vertices which represents every isomorphism class of graphs on at most 40 `n` vertices, the matrix of homomorphism counts between its members is invertible. -/ 41 axiom homMatrix_isUnit [Fintype ι] [DecidableEq ι] (F : GraphFamily n ι) 42 (hni : F.PairwiseNonIso) (hF : F.IsExhaustive) : IsUnit (homMatrix F) 43 44 /-- **Lovász's theorem.** Finite graphs with equal homomorphism counts from every graph are 45 isomorphic, and conversely. -/ 46 axiom nonempty_iso_iff_forall_homCount_eq {V W : Type} [Finite V] [Finite W] 47 (G : SimpleGraph V) (H : SimpleGraph W) : 48 (∀ (m : ℕ) (K : SimpleGraph (Fin m)), homCount K G = homCount K H) ↔ Nonempty (G ≃g H) 49 50 end Lax871432.LovaszTheorem 51 -
Homomorphism indistinguishability is preserved under categorical products
For every graph class , the relaxation is preserved under categorical products: if then for every graph .
1 import Lax871432.HomomorphismIndistinguishability 2 import Lax871432.PreservationProperties 3 … module docstring, 9 lines 13 14 open Lax871432.GraphClasses 15 open Lax871432.HomomorphismIndistinguishability Lax871432.PreservationProperties 16 17 namespace Lax871432.ProductPreservation 18 19 /-- Homomorphism indistinguishability over any graph class is preserved under categorical 20 products. -/ 21 axiom preservedUnderCatProd (𝓕 : GraphClass) : 22 PreservedUnderCatProd (homIndRel 𝓕) 23 24 end Lax871432.ProductPreservation 25 -
Taking summands and preservation under disjoint unions
For a graph class and the assertions
- is closed under taking summands,
- the relaxation is preserved under disjoint unions,
- is closed under taking summands,
the implications (1) (2) (3) hold.
1 import Lax871432.ClosureProperties 2 import Lax871432.DistinguishingClosure 3 import Lax871432.PreservationProperties 4 … module docstring, 13 lines 18 19 open Lax871432.ClosureProperties Lax871432.DistinguishingClosure 20 open Lax871432.GraphClasses 21 open Lax871432.HomomorphismIndistinguishability Lax871432.PreservationProperties 22 23 namespace Lax871432.TakingSummands 24 25 /-- **(1) (2).** If `𝓕` is closed under taking summands then 26 is preserved under disjoint unions. -/ 27 axiom preservedUnderDisjointUnion_of_isSummandClosed (𝓕 : GraphClass) : 28 IsSummandClosed 𝓕 → PreservedUnderDisjointUnion (homIndRel 𝓕) 29 30 /-- **(2) (3).** is preserved under disjoint unions 31 if and only if is closed under taking summands. -/ 32 axiom preservedUnderDisjointUnion_iff_cl_isSummandClosed (𝓕 : GraphClass) : 33 PreservedUnderDisjointUnion (homIndRel 𝓕) ↔ IsSummandClosed (cl 𝓕) 34 35 end Lax871432.TakingSummands 36 -
Taking minors and preservation under complements
For a graph class and the assertions
- is minor-closed,
- the relaxation is preserved under taking complements,
- is minor-closed,
the implications (1) (2) (3) hold.
1 import Lax871432.ClosureProperties 2 import Lax871432.DistinguishingClosure 3 import Lax871432.PreservationProperties 4 … module docstring, 13 lines 18 19 open Lax871432.ClosureProperties Lax871432.DistinguishingClosure 20 open Lax871432.GraphClasses 21 open Lax871432.HomomorphismIndistinguishability Lax871432.PreservationProperties 22 23 namespace Lax871432.MinorsComplements 24 25 /-- **(1) (2).** If `𝓕` is minor-closed then is 26 preserved under taking complements. -/ 27 axiom preservedUnderCompl_of_isMinorClosed (𝓕 : GraphClass) : 28 IsMinorClosed 𝓕 → PreservedUnderCompl (homIndRel 𝓕) 29 30 /-- **(2) (3).** is preserved under taking 31 complements if and only if is minor-closed. -/ 32 axiom preservedUnderCompl_iff_cl_isMinorClosed (𝓕 : GraphClass) : 33 PreservedUnderCompl (homIndRel 𝓕) ↔ IsMinorClosed (cl 𝓕) 34 35 end Lax871432.MinorsComplements 36 -
Homomorphism counts into a full complement
For a simple graph and a graph ,
where is the spanning subgraph of with edge set (Lovász, Large Networks and Graph Limits, equation (5.23)).
1 import Mathlib.Algebra.BigOperators.Ring.Finset 2 import Lax871432.LoopGraphs 3 … module docstring, 10 lines 14 15 open Lax871432.LoopGraphs 16 17 namespace Lax871432.FullComplementCounts 18 19 /-- **Homomorphisms into a full complement**, Lovász's equation (5.23): by inclusion–exclusion 20 over the edges of `F`, the number of homomorphisms from `F` to the full complement of `X` is 21 the alternating sum, over the subsets `s` of `E(F)`, of the numbers of homomorphisms from the 22 spanning subgraph `F_s` to `X`. -/ 23 axiom homCount_fullCompl {V W : Type*} [Finite V] [Finite W] (F : SimpleGraph V) 24 (X : LoopGraph W) : 25 letI : Fintype F.edgeSet := Fintype.ofFinite _ 26 (LoopGraph.homCount (toLoopGraph F) X.fullCompl : ℤ) = 27 ∑ s : Finset F.edgeSet, (-1 : ℤ) ^ s.card * 28 (LoopGraph.homCount (toLoopGraph ((spanningSubgraph F) ((edgeSetOf F) s))) X : ℤ) 29 30 end Lax871432.FullComplementCounts 31 -
Graphs with loops
A loop graph is a graph in which loops are allowed: a symmetric, not necessarily irreflexive, relation on a vertex type. Simple graphs are the loopless case, and a loop graph without loops is a simple graph again. A homomorphism of loop graphs sends adjacent vertices to adjacent vertices, so a loop is sent to a loop and an edge to an edge or to a loop, and counts these maps as for simple graphs. Besides homomorphisms and isomorphisms, loop graphs carry here the full complement , which replaces every edge by a non-edge and every loop by a non-loop, the sub-loop-graph induced on a set of vertices, and the edge set, which for a loop graph may contain a pair , one for each loop.
Loops arise from two constructions on simple graphs. The looped graph is obtained from a simple graph by adding a loop at every vertex; the complement then factors as , which is what makes a two-step expansion of homomorphism counts into a complement possible.
The other is a quotient. For a simple graph and a set of unordered pairs of vertices, the contraction quotient has as vertices the connected components of the graph on with edge set , and joins two of them when some edge of joins a vertex of the one to a vertex of the other. It is a graph obtained from by contracting the edges of whenever it is loopless; in general it is not, carrying a loop at a component for every edge of with both endpoints inside it, which is why loops must be allowed here.
Two operations on simple graphs accompany these: the spanning subgraph , which keeps all vertices of and those of its edges that lie in a set , and the passage from a set of edges of to the underlying set of unordered pairs.
1 import Mathlib.Combinatorics.SimpleGraph.Connectivity.Connected 2 import Mathlib.SetTheory.Cardinal.Finite 3 … module docstring, 51 lines 55 56 namespace Lax871432.LoopGraphs 57 58 variable {U V W : Type*} 59 60 /-- A graph in which loops are allowed: a symmetric relation on the vertex type. Contrast 61 with `SimpleGraph`, which additionally requires irreflexivity, and with `Digraph`, which 62 requires nothing. -/ 63 @[ext] 64 structure LoopGraph (V : Type*) where 65 /-- The adjacency relation. A vertex may be adjacent to itself, i.e. carry a loop. -/ 66 Adj : V → V → Prop 67 /-- The adjacency relation is symmetric. -/ 68 symm : Std.Symm Adj := by aesop 69 70 namespace LoopGraph 71 72 /-- A homomorphism of loop graphs is a map preserving adjacency; loops are therefore sent to 73 loops, and edges to edges or to loops. -/ 74 abbrev Hom (X : LoopGraph V) (Y : LoopGraph W) := X.Adj →r Y.Adj 75 76 /-- An isomorphism of loop graphs. -/ 77 abbrev Iso (X : LoopGraph V) (Y : LoopGraph W) := X.Adj ≃r Y.Adj 78 79 end LoopGraph 80 81 @[inherit_doc LoopGraph.Hom] scoped infixl:50 " →lg " => Lax871432.LoopGraphs.LoopGraph.Hom 82 @[inherit_doc LoopGraph.Iso] scoped infixl:50 " ≃lg " => Lax871432.LoopGraphs.LoopGraph.Iso 83 84 namespace LoopGraph 85 86 /-- The number of homomorphisms from `X` to `Y`. -/ 87 noncomputable def homCount (X : LoopGraph V) (Y : LoopGraph W) : ℕ := Nat.card (X →lg Y) 88 89 /-- A loop graph is *loopless* if no vertex is adjacent to itself. -/ 90 def IsLoopless (X : LoopGraph V) : Prop := ∀ v, ¬ X.Adj v v 91 92 /-- The simple graph underlying a loopless loop graph. -/ 93 def toSimpleGraph (X : LoopGraph V) (h : X.IsLoopless) : SimpleGraph V where 94 Adj := X.Adj 95 symm := X.symm 96 loopless := ⟨h⟩ 97 98 /-- The *full complement* of `X`: every edge becomes a non-edge and every loop a non-loop. -/ 99 def fullCompl (X : LoopGraph V) : LoopGraph V where 100 Adj u v := ¬ X.Adj u v 101 symm := ⟨fun _ _ h h' => h (X.symm.symm _ _ h')⟩ 102 103 /-- The sub-loop-graph induced on a set of vertices. -/ 104 def induce (X : LoopGraph V) (s : Set V) : LoopGraph s where 105 Adj a b := X.Adj a b 106 symm := ⟨fun _ _ h => X.symm.symm _ _ h⟩ 107 108 /-- The edges (and loops) of `X`, as a set of unordered pairs. Unlike for simple graphs this 109 set may contain diagonal elements `s(v, v)`, one for each loop. -/ 110 def edgeSet (X : LoopGraph V) : Set (Sym2 V) := Sym2.fromRel X.symm 111 112 end LoopGraph 113 114 /-- A simple graph, viewed as a loop graph. -/ 115 def toLoopGraph (G : SimpleGraph V) : LoopGraph V where 116 Adj := G.Adj 117 symm := G.symm 118 119 /-- The *looped* graph `G°`: a loop is added at every vertex of `G`. -/ 120 def looped (G : SimpleGraph V) : LoopGraph V where 121 Adj u v := G.Adj u v ∨ u = v 122 symm := ⟨fun _ _ h => h.imp (fun ha => ha.symm) (fun he => he.symm)⟩ 123 124 /-- The spanning subgraph of `F` whose edges are those of `F` lying in `s`. It has the same 125 vertex type as `F`. -/ 126 def spanningSubgraph (F : SimpleGraph V) (s : Set (Sym2 V)) : SimpleGraph V where 127 Adj u v := F.Adj u v ∧ s(u, v) ∈ s 128 symm := ⟨fun _ _ h => ⟨h.1.symm, Sym2.eq_swap ▸ h.2⟩⟩ 129 loopless := ⟨fun _ h => F.irrefl h.1⟩ 130 131 /-- The set of unordered pairs selected by a finite set of edges of `F`. -/ 132 def edgeSetOf (F : SimpleGraph V) (s : Finset F.edgeSet) : Set (Sym2 V) := 133 Subtype.val '' (s : Set F.edgeSet) 134 135 /-- The *contraction quotient* `F ⊘ L`: its vertices are the connected components of the graph 136 on `V(F)` with edge set `L`, and `[v]` is adjacent to `[w]` when some edge of `E(F) \ L` joins 137 a vertex of `[v]` to a vertex of `[w]`. 138 139 The result may have loops, so it is a `LoopGraph`. -/ 140 def contractionQuotient (F : SimpleGraph V) (L : Set (Sym2 V)) : 141 LoopGraph (SimpleGraph.fromEdgeSet L).ConnectedComponent where 142 Adj c d := ∃ x y, F.Adj x y ∧ s(x, y) ∉ L ∧ 143 (SimpleGraph.fromEdgeSet L).connectedComponentMk x = c ∧ 144 (SimpleGraph.fromEdgeSet L).connectedComponentMk y = d 145 symm := ⟨fun _ _ ⟨x, y, hxy, hL, hx, hy⟩ => 146 ⟨y, x, hxy.symm, Sym2.eq_swap ▸ hL, hy, hx⟩⟩ 147 148 @[inherit_doc] scoped notation:70 F:70 " ⊘ " L:71 => Lax871432.LoopGraphs.contractionQuotient F L 149 150 end Lax871432.LoopGraphs 151 -
Homomorphism counts into a looped graph
For finite simple graphs and ,
where carries a loop at every vertex and is the contraction quotient of by the edge set .
1 import Mathlib.Algebra.BigOperators.Ring.Finset 2 import Lax871432.LoopGraphs 3 … module docstring, 10 lines 14 15 open Lax871432.LoopGraphs 16 17 open scoped Lax871432.LoopGraphs 18 19 namespace Lax871432.LoopedGraphCounts 20 21 /-- **Homomorphisms into a looped graph**: a homomorphism from `F` to `G°` is the same thing 22 as a set `L` of edges of `F`, those it collapses to loops, together with a homomorphism from 23 the contraction quotient `F ⊘ L` to `G`. -/ 24 axiom homCount_looped {V W : Type*} [Finite V] [Finite W] (F : SimpleGraph V) 25 (G : SimpleGraph W) : 26 letI : Fintype F.edgeSet := Fintype.ofFinite _ 27 LoopGraph.homCount (toLoopGraph F) (looped G) = 28 ∑ L : Finset F.edgeSet, LoopGraph.homCount (F ⊘ (edgeSetOf F) L) (toLoopGraph G) 29 30 end Lax871432.LoopedGraphCounts 31 -
Homomorphism counts into a complement
For finite simple graphs and ,
where is the spanning subgraph of with edge set and is the contraction quotient of by : the graph obtained from by contracting the edges in when it is loopless, and a graph with loops otherwise.
1 import Mathlib.Algebra.BigOperators.Ring.Finset 2 import Lax871432.HomomorphismCounts 3 import Lax871432.LoopGraphs 4 … module docstring, 13 lines 18 19 open Lax871432.HomomorphismCounts Lax871432.LoopGraphs 20 21 open scoped Lax871432.LoopGraphs 22 23 namespace Lax871432.ComplementCounts 24 25 /-- **Homomorphisms into a complement**: the number of homomorphisms from `F` to `Gᶜ` is a 26 signed sum of the numbers of homomorphisms into `G` from the graphs obtained from `F` by 27 deleting the edges outside a set `S` and contracting those in a subset `L` of `S` — all of 28 them minors of `F`. -/ 29 axiom homCount_compl {V W : Type*} [Finite V] [Finite W] (F : SimpleGraph V) 30 (G : SimpleGraph W) : 31 letI : Fintype F.edgeSet := Fintype.ofFinite _ 32 (homCount F Gᶜ : ℤ) = 33 ∑ s : Finset F.edgeSet, (-1 : ℤ) ^ s.card * 34 ∑ L ∈ s.powerset, 35 (LoopGraph.homCount 36 (((spanningSubgraph F) ((edgeSetOf F) s)) ⊘ (edgeSetOf F) L) (toLoopGraph G) : ℤ) 37 38 end Lax871432.ComplementCounts 39 -
Taking induced subgraphs and left lexicographic products
For a graph class and the assertions
- is closed under taking induced subgraphs,
- the relaxation is preserved under left lexicographic products,
- is closed under taking induced subgraphs,
the implications (1) (2) (3) hold.
1 import Lax871432.ClosureProperties 2 import Lax871432.DistinguishingClosure 3 import Lax871432.PreservationProperties 4 … module docstring, 13 lines 18 19 open Lax871432.ClosureProperties Lax871432.DistinguishingClosure 20 open Lax871432.GraphClasses 21 open Lax871432.HomomorphismIndistinguishability Lax871432.PreservationProperties 22 23 namespace Lax871432.InducedSubgraphs 24 25 /-- **(1) (2).** -/ 26 axiom preservedUnderLeftLexProd_of_isInducedSubgraphClosed (𝓕 : GraphClass) : 27 IsInducedSubgraphClosed 𝓕 → PreservedUnderLeftLexProd (homIndRel 𝓕) 28 29 /-- **(2) (3).** -/ 30 axiom preservedUnderLeftLexProd_iff_cl_isInducedSubgraphClosed (𝓕 : GraphClass) : 31 PreservedUnderLeftLexProd (homIndRel 𝓕) ↔ IsInducedSubgraphClosed (cl 𝓕) 32 33 end Lax871432.InducedSubgraphs 34 -
Contracting edges and right lexicographic products
For a graph class and the assertions
- is closed under contracting edges,
- the relaxation is preserved under right lexicographic products,
- is closed under contracting edges,
the implications (1) (2) (3) hold.
1 import Lax871432.ClosureProperties 2 import Lax871432.DistinguishingClosure 3 import Lax871432.PreservationProperties 4 … module docstring, 13 lines 18 19 open Lax871432.ClosureProperties Lax871432.DistinguishingClosure 20 open Lax871432.GraphClasses 21 open Lax871432.HomomorphismIndistinguishability Lax871432.PreservationProperties 22 23 namespace Lax871432.EdgeContractions 24 25 /-- **(1) (2).** -/ 26 axiom preservedUnderRightLexProd_of_isContractionClosed (𝓕 : GraphClass) : 27 IsContractionClosed 𝓕 → PreservedUnderRightLexProd (homIndRel 𝓕) 28 29 /-- **(2) (3).** -/ 30 axiom preservedUnderRightLexProd_iff_cl_isContractionClosed (𝓕 : GraphClass) : 31 PreservedUnderRightLexProd (homIndRel 𝓕) ↔ IsContractionClosed (cl 𝓕) 32 33 end Lax871432.EdgeContractions 34 -
Homomorphism counts into a lexicographic product
For simple graphs , and ,
the sum ranging over the partitions of all of whose classes induce connected subgraphs.
1 import Mathlib.Algebra.BigOperators.Ring.Finset 2 import Lax871432.ConnectedPartitions 3 import Lax871432.GraphProducts 4 import Lax871432.HomomorphismCounts 5 … module docstring, 11 lines 17 18 open Lax871432.ConnectedPartitions Lax871432.GraphProducts Lax871432.HomomorphismCounts 19 20 namespace Lax871432.LexicographicProductCounts 21 22 /-- **Homomorphisms into a lexicographic product**: they are counted by the partitions of the 23 source into connected parts, a homomorphism from the quotient into the left factor and a 24 homomorphism from the disjoint union of the parts into the right factor. -/ 25 axiom homCount_lexProd {U V W : Type*} [Finite U] [Finite V] [Finite W] (F : SimpleGraph U) 26 (G : SimpleGraph V) (H : SimpleGraph W) : 27 homCount F (lexProd G H) = 28 ∑ 𝓡 : ConnPart F, homCount 𝓡.quotientGraph G * homCount 𝓡.parts H 29 30 end Lax871432.LexicographicProductCounts 31