Quivers #
This module defines quivers. A quiver on a type V
of vertices assigns to every
pair a b : V
of vertices a type a ⟶ b
of arrows from a
to b
. This
is a very permissive notion of directed graph.
Implementation notes #
Currently Quiver
is defined with Hom : V → V → Sort v
.
This is different from the category theory setup,
where we insist that morphisms live in some Type
.
There's some balance here: it's nice to allow Prop
to ensure there are no multiple arrows,
but it is also results in error-prone universe signatures when constraints require a Type
.
A quiver G
on a type V
of vertices assigns to every pair a b : V
of vertices
a type a ⟶ b
of arrows from a
to b
.
For graphs with no repeated edges, one can use Quiver.{0} V
, which ensures
a ⟶ b : Prop
. For multigraphs, one can use Quiver.{v+1} V
, which ensures
a ⟶ b : Type v
.
Because Category
will later extend this class, we call the field Hom
.
Except when constructing instances, you should rarely see this, and use the ⟶
notation instead.
- Hom : V → V → Sort v
The type of edges/arrows/morphisms between a given source and target.
Instances
Notation for the type of edges/arrows/morphisms between a given source and target in a quiver or category.
Equations
- «term_⟶_» = Lean.ParserDescr.trailingNode `«term_⟶_» 10 11 (Lean.ParserDescr.binary `andthen (Lean.ParserDescr.symbol " ⟶ ") (Lean.ParserDescr.cat `term 10))
Instances For
Vᵒᵖ
reverses the direction of all arrows of V
.
Equations
- Quiver.opposite = { Hom := fun (a b : Vᵒᵖ) => (Opposite.unop b ⟶ Opposite.unop a)ᵒᵖ }
Given an arrow in Vᵒᵖ
, we can take the "unopposite" back in V
.
Equations
- f.unop = Opposite.unop f
Instances For
The bijection (X ⟶ Y) ≃ (op Y ⟶ op X)
.
Equations
- Quiver.Hom.opEquiv = { toFun := Opposite.op, invFun := Opposite.unop, left_inv := ⋯, right_inv := ⋯ }
Instances For
Equations
- Quiver.emptyQuiver V = { Hom := fun (x x : Quiver.Empty V) => PEmpty.{?u.13} }
A quiver is thin if it has no parallel arrows.
Equations
- Quiver.IsThin V = ∀ (a b : V), Subsingleton (a ⟶ b)