Symmetric quivers and arrow reversal #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
This file contains constructions related to symmetric quivers:
symmetrify V
adds formal inverses to each arrow ofV
.has_reverse
is the class of quivers where each arrow has an assigned formal inverse.has_involutive_reverse
extendshas_reverse
by requiring that the reverse of the reverse is equal to the original arrow.prefunctor.preserve_reverse
is the class of prefunctors mapping reverses to reverses.symmetrify.of
,symmetrify.lift
, and the associated lemmas witness the universal property ofsymmetrify
.
A type synonym for the symmetrized quiver (with an arrow both ways for each original arrow).
NB: this does not work for Prop
-valued quivers. It requires [quiver.{v+1} V]
.
Equations
- quiver.symmetrify V = V
Instances for quiver.symmetrify
A quiver has_reverse
if we can reverse an arrow p
from a
to b
to get an arrow
p.reverse
from b
to a
.
Instances of this typeclass
Instances of other typeclasses for quiver.has_reverse
- quiver.has_reverse.has_sizeof_inst
Reverse the direction of an arrow.
Equations
- to_has_reverse : quiver.has_reverse V
- inv' : ∀ {a b : V} (f : a ⟶ b), quiver.reverse (quiver.reverse f) = f
A quiver has_involutive_reverse
if reversing twice is the identity.`
Instances of this typeclass
Instances of other typeclasses for quiver.has_involutive_reverse
- quiver.has_involutive_reverse.has_sizeof_inst
- map_reverse' : ∀ {u v : U} (e : u ⟶ v), φ.map (quiver.reverse e) = quiver.reverse (φ.map e)
A prefunctor preserving reversal of arrows
Instances of this typeclass
Instances of other typeclasses for prefunctor.map_reverse
- prefunctor.map_reverse.has_sizeof_inst
Equations
- φ.map_reverse_comp ψ = {map_reverse' := _}
Equations
Equations
- quiver.symmetrify.has_reverse = {reverse' := λ (a b : quiver.symmetrify V) (e : a ⟶ b), sum.swap e}
Equations
- quiver.symmetrify.has_involutive_reverse = {to_has_reverse := {reverse' := λ (_x _x_1 : quiver.symmetrify V) (e : _x ⟶ _x_1), sum.swap e}, inv' := _}
Reverse the direction of a path.
Equations
- (p.cons e).reverse = (quiver.reverse e).to_path.comp p.reverse
- quiver.path.nil.reverse = quiver.path.nil
The inclusion of a quiver in its symmetrification
Given a quiver V'
with reversible arrows, a prefunctor to V'
can be lifted to one from
symmetrify V
to V'
Equations
- quiver.symmetrify.lift φ = {obj := φ.obj, map := λ (X Y : quiver.symmetrify V) (f : X ⟶ Y), sum.rec (λ (fwd : X ⟶ Y), φ.map fwd) (λ (bwd : Y ⟶ X), quiver.reverse (φ.map bwd)) f}
lift φ
is the only prefunctor extending φ
and preserving reverses.
Equations
- φ.symmetrify_map_reverse = {map_reverse' := _}
Equations
- quiver.push.quiver.has_reverse σ = {reverse' := λ (a b : quiver.push σ) (F : a ⟶ b), quiver.push_quiver.cases_on F (λ {F_X F_Y : V} (F_f : F_X ⟶ F_Y) (H_1 : a = σ F_X), eq.rec (λ (F : σ F_X ⟶ b) (H_2 : b = σ F_Y), eq.rec (λ (F : σ F_X ⟶ σ F_Y) (H_3 : F == quiver.push_quiver.arrow F_f), eq.rec (quiver.push_quiver.arrow (quiver.reverse F_f)) _) _ F) _ F) _ _ _}
Equations
- quiver.push.quiver.has_involutive_reverse σ = {to_has_reverse := {reverse' := λ (a b : quiver.push σ) (F : a ⟶ b), quiver.push_quiver.cases_on F (λ {F_X F_Y : V} (F_f : F_X ⟶ F_Y) (H_1 : a = σ F_X), eq.rec (λ (F : σ F_X ⟶ b) (H_2 : b = σ F_Y), eq.rec (λ (F : σ F_X ⟶ σ F_Y) (H_3 : F == quiver.push_quiver.arrow F_f), eq.rec (quiver.push_quiver.arrow (quiver.reverse F_f)) _) _ F) _ F) _ _ _}, inv' := _}
Equations
- quiver.push.of_map_reverse σ = {map_reverse' := _}
A quiver is preconnected iff there exists a path between any pair of
vertices.
Note that if V
doesn't has_reverse
, then the definition is stronger than
simply having a preconnected underlying simple_graph
, since a path in one
direction doesn't induce one in the other.
Equations
- quiver.is_preconnected V = ∀ (X Y : V), nonempty (quiver.path X Y)