From 8a26248e6fd42e83a2038ff530c9677a8f8f0a32 Mon Sep 17 00:00:00 2001 From: Snir Broshi <26556598+SnirBroshi@users.noreply.github.com> Date: Mon, 15 Jun 2026 13:32:08 +0300 Subject: [PATCH 1/4] feat(Combinatorics/SimpleGraph/Finite): `Set.ncard` of `neighborSet` --- Mathlib/Combinatorics/SimpleGraph/Finite.lean | 32 ++++++++++++++++--- .../Combinatorics/SimpleGraph/IncMatrix.lean | 3 +- .../Combinatorics/SimpleGraph/Subgraph.lean | 2 +- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/Mathlib/Combinatorics/SimpleGraph/Finite.lean b/Mathlib/Combinatorics/SimpleGraph/Finite.lean index c5f2e356c5f83c..90cb9b01ad9b07 100644 --- a/Mathlib/Combinatorics/SimpleGraph/Finite.lean +++ b/Mathlib/Combinatorics/SimpleGraph/Finite.lean @@ -7,6 +7,7 @@ module public import Mathlib.Combinatorics.SimpleGraph.Maps public import Mathlib.Data.Finset.Max +public import Mathlib.Data.Set.Card public import Mathlib.Data.Sym.Card /-! @@ -125,7 +126,7 @@ theorem card_edgeSet : Fintype.card G.edgeSet = #G.edgeFinset := .symm <| Set.toFinset_card _ theorem edgeSet_univ_card : #(univ : Finset G.edgeSet) = #G.edgeFinset := by - simp [card_edgeSet] + simp [card_edgeSet, -Set.fintypeCard_eq_ncard] variable [Fintype V] @@ -205,6 +206,10 @@ theorem card_neighborFinset_eq_degree : #(G.neighborFinset v) = G.degree v := rf theorem card_neighborSet_eq_degree : Fintype.card (G.neighborSet v) = G.degree v := (Set.toFinset_card _).symm +@[simp] +theorem ncard_neighborSet : (G.neighborSet v).ncard = G.degree v := by + simp [Set.ncard_eq_toFinset_card', card_neighborSet_eq_degree, -Set.fintypeCard_eq_ncard] + lemma degree_eq_zero : G.degree v = 0 ↔ G.IsIsolated v := by simp [← card_neighborFinset_eq_degree] lemma degree_pos : 0 < G.degree v ↔ ¬ G.IsIsolated v := by simp [← card_neighborFinset_eq_degree] @@ -250,8 +255,7 @@ theorem degree_compl [Fintype (Gᶜ.neighborSet v)] [Fintype V] : Gᶜ.degree v = Fintype.card V - 1 - G.degree v := by classical rw [← card_neighborSet_union_compl_neighborSet G v, Set.toFinset_union] - simp [card_union_of_disjoint (Set.disjoint_toFinset.mpr (compl_neighborSet_disjoint G v)), - card_neighborSet_eq_degree] + simp [card_union_of_disjoint (Set.disjoint_toFinset.mpr (compl_neighborSet_disjoint G v))] instance incidenceSetFintype [DecidableEq V] : Fintype (G.incidenceSet v) := Fintype.ofEquiv (G.neighborSet v) (G.incidenceSetEquivNeighborSet v).symm @@ -472,7 +476,7 @@ lemma minDegree_le_maxDegree [DecidableRel G.Adj] : G.minDegree ≤ G.maxDegree theorem IsRegularOfDegree.minDegree_eq [Nonempty V] [DecidableRel G.Adj] {d : ℕ} (h : G.IsRegularOfDegree d) : G.minDegree = d := by - simp [minDegree, h.degree_eq, Finset.image_const] + simp [minDegree, h.degree_eq, Finset.image_const, -ENat.some_eq_coe] @[simp] lemma minDegree_bot_eq_zero : (⊥ : SimpleGraph V).minDegree = 0 := @@ -520,7 +524,13 @@ theorem Adj.card_commonNeighbors_lt_degree {G : SimpleGraph V} [DecidableRel G.A theorem card_commonNeighbors_top [DecidableEq V] {v w : V} (h : v ≠ w) : Fintype.card (commonNeighbors ⊤ v w) = Fintype.card V - 2 := by - simp [commonNeighbors_top_eq, ← Set.toFinset_card, Finset.card_sdiff, h] + simp [commonNeighbors_top_eq, ← Set.toFinset_card, Finset.card_sdiff, h, + -Set.fintypeCard_eq_ncard] + +omit [Fintype V] +theorem encard_commonNeighbors_top {u v : V} (h : u ≠ v) : + (commonNeighbors ⊤ u v).encard = ENat.card V - 2 := by + simp [commonNeighbors_top_eq, Set.encard_sdiff, Set.encard_pair h] end Finite @@ -631,6 +641,18 @@ theorem card_edgeFinset_map (f : V ↪ W) (G : SimpleGraph V) [DecidableRel G.Ad rw [edgeFinset_map] exact G.edgeFinset.card_map f.sym2Map +theorem degree_map_apply {V W : Type*} (G : SimpleGraph V) (f : V ↪ W) (v : V) + [Fintype <| G.neighborSet v] [Fintype <| G.map f |>.neighborSet <| f v] : + (G.map f).degree (f v) = G.degree v := by + simp_rw [← ncard_neighborSet, neighborSet_map, Set.ncard_image_of_injective _ f.injective] + +theorem Embedding.degree_eq_of_neighborSet_subset_range {V V' : Type*} {G : SimpleGraph V} + {G' : SimpleGraph V'} {f : G ↪g G'} {v : V} [Fintype <| G.neighborSet v] + [Fintype <| G'.neighborSet <| f v] (h : G'.neighborSet (f v) ⊆ Set.range f) : + G'.degree (f v) = G.degree v := by + simp_rw [← ncard_neighborSet, ← Set.ncard_image_of_injective _ f.injective, + ← f.preimage_neighborSet, Set.image_preimage_eq_inter_range, Set.inter_eq_left.mpr h] + end Map end SimpleGraph diff --git a/Mathlib/Combinatorics/SimpleGraph/IncMatrix.lean b/Mathlib/Combinatorics/SimpleGraph/IncMatrix.lean index b95034f8a5fc9c..d92a15ea0e729b 100644 --- a/Mathlib/Combinatorics/SimpleGraph/IncMatrix.lean +++ b/Mathlib/Combinatorics/SimpleGraph/IncMatrix.lean @@ -106,7 +106,8 @@ variable [NonAssocSemiring R] [DecidableEq α] [DecidableRel G.Adj] {a : α} {e theorem sum_incMatrix_apply [Fintype (Sym2 α)] [Fintype (neighborSet G a)] : ∑ e, G.incMatrix R a e = G.degree a := by - simp [incMatrix_apply', sum_boole, Set.filter_mem_univ_eq_toFinset, card_incidenceSet_eq_degree] + simp [incMatrix_apply', sum_boole, Set.filter_mem_univ_eq_toFinset, card_incidenceSet_eq_degree, + -Set.fintypeCard_eq_ncard] theorem incMatrix_mul_transpose_diag [Fintype (Sym2 α)] [Fintype (neighborSet G a)] : (G.incMatrix R * (G.incMatrix R)ᵀ) a a = G.degree a := by diff --git a/Mathlib/Combinatorics/SimpleGraph/Subgraph.lean b/Mathlib/Combinatorics/SimpleGraph/Subgraph.lean index bc9ccfecd07846..7caefefe14ed3c 100644 --- a/Mathlib/Combinatorics/SimpleGraph/Subgraph.lean +++ b/Mathlib/Combinatorics/SimpleGraph/Subgraph.lean @@ -875,7 +875,7 @@ theorem card_neighborSet_toSubgraph (G H : SimpleGraph V) (h : H ≤ G) lemma degree_toSubgraph (G H : SimpleGraph V) (h : H ≤ G) {v : V} [Fintype ↑((toSubgraph H h).neighborSet v)] [Fintype ↑(H.neighborSet v)] : (toSubgraph H h).degree v = H.degree v := by - simp [Subgraph.degree, card_neighborSet_toSubgraph] + simp [Subgraph.degree, card_neighborSet_toSubgraph, -Set.fintypeCard_eq_ncard] section MkProperties From aea42534a0b41dc68101eec37bcd8da7ef685180 Mon Sep 17 00:00:00 2001 From: Snir Broshi <26556598+SnirBroshi@users.noreply.github.com> Date: Mon, 15 Jun 2026 19:02:28 +0300 Subject: [PATCH 2/4] `omit ... in` --- Mathlib/Combinatorics/SimpleGraph/Finite.lean | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mathlib/Combinatorics/SimpleGraph/Finite.lean b/Mathlib/Combinatorics/SimpleGraph/Finite.lean index 90cb9b01ad9b07..ffeea88b8ae90b 100644 --- a/Mathlib/Combinatorics/SimpleGraph/Finite.lean +++ b/Mathlib/Combinatorics/SimpleGraph/Finite.lean @@ -527,7 +527,7 @@ theorem card_commonNeighbors_top [DecidableEq V] {v w : V} (h : v ≠ w) : simp [commonNeighbors_top_eq, ← Set.toFinset_card, Finset.card_sdiff, h, -Set.fintypeCard_eq_ncard] -omit [Fintype V] +omit [Fintype V] in theorem encard_commonNeighbors_top {u v : V} (h : u ≠ v) : (commonNeighbors ⊤ u v).encard = ENat.card V - 2 := by simp [commonNeighbors_top_eq, Set.encard_sdiff, Set.encard_pair h] From bf9b82a8637d01882ae498532c958bec0c6d4d31 Mon Sep 17 00:00:00 2001 From: Snir Broshi <26556598+SnirBroshi@users.noreply.github.com> Date: Sat, 18 Jul 2026 01:54:33 +0300 Subject: [PATCH 3/4] fix deprecation --- Mathlib/Combinatorics/SimpleGraph/Finite.lean | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mathlib/Combinatorics/SimpleGraph/Finite.lean b/Mathlib/Combinatorics/SimpleGraph/Finite.lean index 9f148fb9119b56..66cce72a0ff31d 100644 --- a/Mathlib/Combinatorics/SimpleGraph/Finite.lean +++ b/Mathlib/Combinatorics/SimpleGraph/Finite.lean @@ -489,7 +489,7 @@ lemma minDegree_le_maxDegree [DecidableRel G.Adj] : G.minDegree ≤ G.maxDegree theorem IsRegularOfDegree.minDegree_eq [Nonempty V] [DecidableRel G.Adj] {d : ℕ} (h : G.IsRegularOfDegree d) : G.minDegree = d := by - simp [minDegree, h.degree_eq, Finset.image_const, -ENat.some_eq_coe] + simp [minDegree, h.degree_eq, Finset.image_const, -ENat.some_eq_natCast] @[simp] lemma minDegree_bot_eq_zero : (⊥ : SimpleGraph V).minDegree = 0 := From 7c6196c20fe284a41865a765d4ab7fab1241b038 Mon Sep 17 00:00:00 2001 From: Snir Broshi <26556598+SnirBroshi@users.noreply.github.com> Date: Sat, 18 Jul 2026 02:22:31 +0300 Subject: [PATCH 4/4] add `incidenceSet` and `encard` variants --- Mathlib/Combinatorics/SimpleGraph/Finite.lean | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Mathlib/Combinatorics/SimpleGraph/Finite.lean b/Mathlib/Combinatorics/SimpleGraph/Finite.lean index 66cce72a0ff31d..2771f93636e979 100644 --- a/Mathlib/Combinatorics/SimpleGraph/Finite.lean +++ b/Mathlib/Combinatorics/SimpleGraph/Finite.lean @@ -208,7 +208,11 @@ theorem card_neighborSet_eq_degree : Fintype.card (G.neighborSet v) = G.degree v @[simp] theorem ncard_neighborSet : (G.neighborSet v).ncard = G.degree v := by - simp [Set.ncard_eq_toFinset_card', card_neighborSet_eq_degree, -Set.fintypeCard_eq_ncard] + simp [← Set.fintypeCard_eq_ncard, card_neighborSet_eq_degree] + +@[simp] +theorem encard_neighborSet : (G.neighborSet v).encard = G.degree v := by + simp [← Set.coe_fintypeCard] lemma degree_eq_zero : G.degree v = 0 ↔ G.IsIsolated v := by simp [← card_neighborFinset_eq_degree] lemma degree_pos : 0 < G.degree v ↔ ¬ G.IsIsolated v := by simp [← card_neighborFinset_eq_degree] @@ -268,6 +272,16 @@ theorem card_incidenceSet_eq_degree [DecidableEq V] : Fintype.card (G.incidenceSet v) = G.degree v := by rw [Fintype.card_congr (G.incidenceSetEquivNeighborSet v), card_neighborSet_eq_degree] +@[simp] +theorem ncard_incidenceSet : (G.incidenceSet v).ncard = G.degree v := by + classical + simp [← Set.fintypeCard_eq_ncard, card_incidenceSet_eq_degree] + +@[simp] +theorem encard_incidenceSet : (G.incidenceSet v).encard = G.degree v := by + classical + simp [← Set.coe_fintypeCard] + @[simp, norm_cast] theorem coe_incidenceFinset [DecidableEq V] : (G.incidenceFinset v : Set (Sym2 V)) = G.incidenceSet v := by