77
88public import Mathlib.Combinatorics.SimpleGraph.Paths
99public import Mathlib.Combinatorics.SimpleGraph.Subgraph
10+ public import Mathlib.Combinatorics.SimpleGraph.Operations
1011
1112/-!
1213## Main definitions
@@ -740,19 +741,23 @@ lemma Preconnected.exists_adj_of_nontrivial [Nontrivial V] {G : SimpleGraph V} (
740741/-! ### Bridge edges -/
741742
742743section BridgeEdges
744+ variable {u v : V}
743745
744746/-- An edge of a graph is a *bridge* if, after removing it, its incident vertices
745747are no longer reachable from one another. -/
746748def IsBridge (G : SimpleGraph V) (e : Sym2 V) : Prop :=
747749 e ∈ G.edgeSet ∧
748- Sym2.lift ⟨fun v w => ¬(G \ fromEdgeSet {e}).Reachable v w, by simp [reachable_comm]⟩ e
750+ Sym2.lift ⟨fun v w => ¬(G.deleteEdges {e}).Reachable v w, by simp [reachable_comm]⟩ e
749751
750752theorem isBridge_iff {u v : V} :
751- G.IsBridge s(u, v) ↔ G.Adj u v ∧ ¬(G \ fromEdgeSet {s(u, v)}).Reachable u v := Iff.rfl
753+ G.IsBridge s(u, v) ↔ G.Adj u v ∧ ¬(G.deleteEdges {s(u, v)}).Reachable u v := Iff.rfl
754+
755+ @[simp] lemma IsBridge.of_not_reachable (huv : ¬ G.Reachable u v) (h : G.Adj u v) :
756+ G.IsBridge s(u, v) := ⟨h, fun h ↦ huv <| h.mono <| deleteEdges_le _⟩
752757
753758set_option backward.isDefEq.respectTransparency false in
754- theorem reachable_delete_edges_iff_exists_walk {v w v' w' : V} :
755- (G \ fromEdgeSet {s(v, w)}).Reachable v' w' ↔ ∃ p : G.Walk v' w', s(v, w) ∉ p.edges := by
759+ theorem reachable_deleteEdges_iff_exists_walk {v w v' w' : V} :
760+ (G.deleteEdges {s(v, w)}).Reachable v' w' ↔ ∃ p : G.Walk v' w', s(v, w) ∉ p.edges := by
756761 constructor
757762 · rintro ⟨p⟩
758763 use p.map (.ofLE (by simp))
@@ -761,13 +766,16 @@ theorem reachable_delete_edges_iff_exists_walk {v w v' w' : V} :
761766 simpa using p.edges_subset_edgeSet h
762767 · rintro ⟨p, h⟩
763768 refine ⟨p.transfer _ fun e ep => ?_⟩
764- simp only [edgeSet_sdiff, edgeSet_fromEdgeSet, edgeSet_sdiff_sdiff_isDiag ]
769+ rw [edgeSet_deleteEdges ]
765770 exact ⟨p.edges_subset_edgeSet ep, fun h' => h (h' ▸ ep)⟩
766771
772+ @ [deprecated (since := "2026-03-18" )]
773+ alias reachable_delete_edges_iff_exists_walk := reachable_deleteEdges_iff_exists_walk
774+
767775theorem isBridge_iff_adj_and_forall_walk_mem_edges {v w : V} :
768776 G.IsBridge s(v, w) ↔ G.Adj v w ∧ ∀ p : G.Walk v w, s(v, w) ∈ p.edges := by
769777 rw [isBridge_iff, and_congr_right']
770- rw [reachable_delete_edges_iff_exists_walk , not_exists_not]
778+ rw [reachable_deleteEdges_iff_exists_walk , not_exists_not]
771779
772780theorem reachable_deleteEdges_iff_exists_cycle.aux [DecidableEq V] {u v w : V}
773781 (hb : ∀ p : G.Walk v w, s(v, w) ∈ p.edges) (c : G.Walk u u) (hc : c.IsTrail)
@@ -796,10 +804,10 @@ theorem reachable_deleteEdges_iff_exists_cycle.aux [DecidableEq V] {u v w : V}
796804 exact List.disjoint_of_nodup_append hc hbq hpq'
797805
798806theorem adj_and_reachable_delete_edges_iff_exists_cycle {v w : V} :
799- G.Adj v w ∧ (G \ fromEdgeSet {s(v, w)}).Reachable v w ↔
807+ G.Adj v w ∧ (G.deleteEdges {s(v, w)}).Reachable v w ↔
800808 ∃ (u : V) (p : G.Walk u u), p.IsCycle ∧ s(v, w) ∈ p.edges := by
801809 classical
802- rw [reachable_delete_edges_iff_exists_walk ]
810+ rw [reachable_deleteEdges_iff_exists_walk ]
803811 constructor
804812 · rintro ⟨h, p, hp⟩
805813 refine ⟨w, Walk.cons h.symm p.toPath, ?_, ?_⟩
@@ -856,20 +864,27 @@ theorem IsBridge.anti_of_mem_edgeSet {G' : SimpleGraph V} {e : Sym2 V} (hle : G
856864 (p.mapLe hle) (Walk.IsCycle.mapLe hle hp) (p.edges_mapLe_eq_edges hle ▸ hpe)⟩
857865
858866/-- Connecting two unreachable vertices by an edge creates a bridge. -/
859- theorem IsBridge.sup_fromEdgeSet_of_not_reachable {u v : V} (h : ¬G.Reachable u v) :
860- (G ⊔ fromEdgeSet {s(u, v)} ).IsBridge s(u, v) := by
867+ theorem IsBridge.sup_edge_of_not_reachable {u v : V} (h : ¬G.Reachable u v) :
868+ (G ⊔ edge u v ).IsBridge s(u, v) := by
861869 refine isBridge_iff.mpr ⟨.inr ⟨Set.mem_singleton _, mt (· ▸ .rfl) h⟩, ?_⟩
862870 exact fun h' ↦ h <| .mono (sdiff_le_iff'.mpr <| refl _) h'
863871
872+ @ [deprecated (since := "2026-03-18" )]
873+ alias IsBridge.sup_fromEdgeSet_of_not_reachable := IsBridge.sup_edge_of_not_reachable
874+
864875/-- Connecting two unreachable vertices by an edge preserves existing bridges. -/
865- theorem IsBridge.sup_fromEdgeSet_of_not_reachable_of_isBridge {u v : V} {e : Sym2 V}
866- (h : ¬G.Reachable u v) (h' : G.IsBridge e) : (G ⊔ fromEdgeSet {s(u, v)} ).IsBridge e := by
876+ theorem IsBridge.sup_edge_of_not_reachable_of_isBridge {u v : V} {e : Sym2 V}
877+ (h : ¬G.Reachable u v) (h' : G.IsBridge e) : (G ⊔ edge u v ).IsBridge e := by
867878 refine isBridge_iff_mem_and_forall_cycle_notMem.mpr ⟨edgeSet_mono le_sup_left h'.left, ?_⟩
868879 refine fun _ p hp hpe ↦ isBridge_iff_mem_and_forall_cycle_notMem.mp h' |>.right
869880 (p.transfer G fun e' he' ↦ ?_) (hp.transfer _) (Walk.edges_transfer p _ ▸ hpe)
870881 refine edgeSet_sup .. ▸ Walk.edges_subset_edgeSet _ he' |>.elim id fun h' ↦ h ?_ |>.elim
871- exact .mono (sdiff_le_iff'.mpr <| refl _) <|
872- adj_and_reachable_delete_edges_iff_exists_cycle.mpr (by grind [edgeSet_fromEdgeSet]) |>.right
882+ exact .mono (sdiff_le_iff'.mpr le_rfl) <|
883+ adj_and_reachable_delete_edges_iff_exists_cycle.mpr ⟨_, p, by simp_all⟩ |>.right
884+
885+ @ [deprecated (since := "2026-03-18" )]
886+ alias IsBridge.sup_fromEdgeSet_of_not_reachable_of_isBridge :=
887+ IsBridge.sup_edge_of_not_reachable_of_isBridge
873888
874889end BridgeEdges
875890
0 commit comments