Built with
doc-gen4 , running Lean4.
Bubbles (
) indicate interactive fragments: hover for details, tap to reveal contents.
Use
Ctrl+β Ctrl+β to navigate,
Ctrl+π±οΈ to focus.
On Mac, use
Cmd instead of
Ctrl .
/-
Copyright (c) 2021 David WΓ€rn. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: David WΓ€rn, Scott Morrison
Ported by: Scott Morrison
! This file was ported from Lean 3 source module combinatorics.quiver.basic
! leanprover-community/mathlib commit 56adee5b5eef9e734d82272918300fca4f3e7cef
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Data.Opposite
/-!
# 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 `arrow : 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`.
-/
open Opposite
-- We use the same universe order as in category theory.
-- See note [CategoryTheory universes]
universe v vβ vβ u uβ uβ
/-- 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.
-/
class Quiver ( V : Type u ) where
/-- The type of edges/arrows/morphisms between a given source and target. -/
Hom : V β V β Sort v
#align quiver Quiver
#align quiver.hom Quiver.Hom
/--
Notation for the type of edges/arrows/morphisms between a given source and target
in a quiver or category.
-/
infixr :10 " βΆ " => Quiver.Hom
/-- A morphism of quivers. As we will later have categorical functors extend this structure,
we call it a `Prefunctor`. -/
structure Prefunctor : {V : Type uβ} β
[inst : Quiver V ] β
{W : Type uβ} β [inst_1 : Quiver W ] β (obj : V β W ) β ({X Y : V } β (X βΆ Y ) β (obj X βΆ obj Y ) ) β Prefunctor V W Prefunctor ( V : Type uβ ) [ Quiver : Type ?u.7832 β Type (max?u.7832vβ) Quiver.{vβ} V ] ( W : Type uβ ) [ Quiver : Type ?u.7837 β Type (max?u.7837vβ) Quiver.{vβ} W ] where
/-- The action of a (pre)functor on vertices/objects. -/
obj : V β W
/-- The action of a (pre)functor on edges/arrows/morphisms. -/
map : β { X Y : V }, ( X βΆ Y ) β ( obj X βΆ obj Y )
#align prefunctor Prefunctor : (V : Type uβ) β [inst : Quiver V ] β (W : Type uβ) β [inst : Quiver W ] β Sort (max(max(max(uβ+1)(uβ+1))vβ)vβ) Prefunctor
pp_extended_field_notation Prefunctor.obj
pp_extended_field_notation Prefunctor.map : {V : Type uβ} β
[inst : Quiver V ] β
{W : Type uβ} β [inst_1 : Quiver W ] β (self : Prefunctor V W ) β {X Y : V } β (X βΆ Y ) β (self .obj X βΆ self .obj Y ) Prefunctor.map
namespace Prefunctor
@[ ext ]
theorem ext { V : Type u } [ Quiver : Type ?u.22889 β Type (max?u.22889vβ) Quiver.{vβ} V ] { W : Type uβ } [ Quiver : Type ?u.22894 β Type (max?u.22894vβ) Quiver.{vβ} W ] { F G : Prefunctor : (V : Type ?u.22914) β
[inst : Quiver V ] β
(W : Type ?u.22913) β [inst : Quiver W ] β Sort (max(max(max(?u.22914+1)(?u.22913+1))?u.22916)?u.22915) Prefunctor V W }
( h_obj : β (X : V ), F .obj X = G .obj X h_obj : β X , F . obj X = G . obj X )
( h_map : β (X Y : V ) (f : X βΆ Y ), F .map f = Eq.recOn (_ : G .obj Y = F .obj Y ) (Eq.recOn (_ : G .obj X = F .obj X ) (G .map f ) ) h_map : β ( X Y : V ) ( f : X βΆ Y ),
F . map : {V : Type ?u.22981} β
[inst : Quiver V ] β
{W : Type ?u.22980} β
[inst_1 : Quiver W ] β (self : Prefunctor V W ) β {X Y : V } β (X βΆ Y ) β (self .obj X βΆ self .obj Y ) map f = Eq.recOn : {Ξ± : Sort ?u.23032} β
{a : Ξ± } β
{motive : (a_1 : Ξ± ) β a = a_1 β Sort ?u.23033 } β {a_1 : Ξ± } β (t : a = a_1 ) β motive a (_ : a = a ) β motive a_1 t Eq.recOn ( h_obj : β (X : V ), F .obj X = G .obj X h_obj Y ). symm : β {Ξ± : Sort ?u.23058} {a b : Ξ± }, a = b β b = a symm ( Eq.recOn : {Ξ± : Sort ?u.23078} β
{a : Ξ± } β
{motive : (a_1 : Ξ± ) β a = a_1 β Sort ?u.23079 } β {a_1 : Ξ± } β (t : a = a_1 ) β motive a (_ : a = a ) β motive a_1 t Eq.recOn ( h_obj : β (X : V ), F .obj X = G .obj X h_obj X ). symm : β {Ξ± : Sort ?u.23104} {a b : Ξ± }, a = b β b = a symm ( G . map : {V : Type ?u.23121} β
[inst : Quiver V ] β
{W : Type ?u.23120} β
[inst_1 : Quiver W ] β (self : Prefunctor V W ) β {X Y : V } β (X βΆ Y ) β (self .obj X βΆ self .obj Y ) map f ))) : F = G := by
cases' F with F_obj : ?m.23192 β ?m.23194
F_obj _ V : Type uinstβΒΉ : Quiver V W : Type uβinstβ : Quiver W G : Prefunctor V W F_obj : V β W mapβ : {X Y : V } β (X βΆ Y ) β (F_obj X βΆ F_obj Y ) h_obj : β (X : V ), { obj := F_obj , map := mapβ } .obj X = G .obj X h_map : β (X Y : V ) (f : X βΆ Y ),
{ obj := F_obj , map := mapβ } .map f = Eq.recOn (_ : G .obj Y = { obj := F_obj , map := mapβ } .obj Y )
(Eq.recOn (_ : G .obj X = { obj := F_obj , map := mapβ } .obj X ) (G .map f ) ) mk { obj := F_obj , map := mapβ } = G
cases' G with G_obj : ?m.23275 β ?m.23277
G_obj _ V : Type uinstβΒΉ : Quiver V W : Type uβinstβ : Quiver W F_obj : V β W mapβΒΉ : {X Y : V } β (X βΆ Y ) β (F_obj X βΆ F_obj Y ) G_obj : V β W mapβ : {X Y : V } β (X βΆ Y ) β (G_obj X βΆ G_obj Y ) h_obj : β (X : V ), { obj := F_obj , map := mapβΒΉ } .obj X = { obj := G_obj , map := mapβ } .obj X h_map : β (X Y : V ) (f : X βΆ Y ),
{ obj := F_obj , map := mapβΒΉ } .map f = Eq.recOn (_ : { obj := G_obj , map := mapβ } .obj Y = { obj := F_obj , map := mapβΒΉ } .obj Y )
(Eq.recOn (_ : { obj := G_obj , map := mapβ } .obj X = { obj := F_obj , map := mapβΒΉ } .obj X )
({ obj := G_obj , map := mapβ } .map f ) ) mk.mk { obj := F_obj , map := mapβΒΉ } = { obj := G_obj , map := mapβ }
obtain rfl : F_obj : ?m.23192 β ?m.23194
F_obj = G_obj : ?m.23275 β ?m.23277
G_obj := V : Type uinstβΒΉ : Quiver V W : Type uβinstβ : Quiver W F_obj : V β W mapβΒΉ : {X Y : V } β (X βΆ Y ) β (F_obj X βΆ F_obj Y ) G_obj : V β W mapβ : {X Y : V } β (X βΆ Y ) β (G_obj X βΆ G_obj Y ) h_obj : β (X : V ), { obj := F_obj , map := mapβΒΉ } .obj X = { obj := G_obj , map := mapβ } .obj X h_map : β (X Y : V ) (f : X βΆ Y ),
{ obj := F_obj , map := mapβΒΉ } .map f = Eq.recOn (_ : { obj := G_obj , map := mapβ } .obj Y = { obj := F_obj , map := mapβΒΉ } .obj Y )
(Eq.recOn (_ : { obj := G_obj , map := mapβ } .obj X = { obj := F_obj , map := mapβΒΉ } .obj X )
({ obj := G_obj , map := mapβ } .map f ) ) mk.mk { obj := F_obj , map := mapβΒΉ } = { obj := G_obj , map := mapβ } by
V : Type uinstβΒΉ : Quiver V W : Type uβinstβ : Quiver W F_obj : V β W mapβΒΉ : {X Y : V } β (X βΆ Y ) β (F_obj X βΆ F_obj Y ) G_obj : V β W mapβ : {X Y : V } β (X βΆ Y ) β (G_obj X βΆ G_obj Y ) h_obj : β (X : V ), { obj := F_obj , map := mapβΒΉ } .obj X = { obj := G_obj , map := mapβ } .obj X h_map : β (X Y : V ) (f : X βΆ Y ),
{ obj := F_obj , map := mapβΒΉ } .map f = Eq.recOn (_ : { obj := G_obj , map := mapβ } .obj Y = { obj := F_obj , map := mapβΒΉ } .obj Y )
(Eq.recOn (_ : { obj := G_obj , map := mapβ } .obj X = { obj := F_obj , map := mapβΒΉ } .obj X )
({ obj := G_obj , map := mapβ } .map f ) ) ext X V : Type uinstβΒΉ : Quiver V W : Type uβinstβ : Quiver W F_obj : V β W mapβΒΉ : {X Y : V } β (X βΆ Y ) β (F_obj X βΆ F_obj Y ) G_obj : V β W mapβ : {X Y : V } β (X βΆ Y ) β (G_obj X βΆ G_obj Y ) h_obj : β (X : V ), { obj := F_obj , map := mapβΒΉ } .obj X = { obj := G_obj , map := mapβ } .obj X h_map : β (X Y : V ) (f : X βΆ Y ),
{ obj := F_obj , map := mapβΒΉ } .map f = Eq.recOn (_ : { obj := G_obj , map := mapβ } .obj Y = { obj := F_obj , map := mapβΒΉ } .obj Y )
(Eq.recOn (_ : { obj := G_obj , map := mapβ } .obj X = { obj := F_obj , map := mapβΒΉ } .obj X )
({ obj := G_obj , map := mapβ } .map f ) ) X : V h
V : Type uinstβΒΉ : Quiver V W : Type uβinstβ : Quiver W F_obj : V β W mapβΒΉ : {X Y : V } β (X βΆ Y ) β (F_obj X βΆ F_obj Y ) G_obj : V β W mapβ : {X Y : V } β (X βΆ Y ) β (G_obj X βΆ G_obj Y ) h_obj : β (X : V ), { obj := F_obj , map := mapβΒΉ } .obj X = { obj := G_obj , map := mapβ } .obj X h_map : β (X Y : V ) (f : X βΆ Y ),
{ obj := F_obj , map := mapβΒΉ } .map f = Eq.recOn (_ : { obj := G_obj , map := mapβ } .obj Y = { obj := F_obj , map := mapβΒΉ } .obj Y )
(Eq.recOn (_ : { obj := G_obj , map := mapβ } .obj X = { obj := F_obj , map := mapβΒΉ } .obj X )
({ obj := G_obj , map := mapβ } .map f ) ) apply h_obj : β (X : V ), { obj := F_obj , map := mapβΒΉ } .obj X = { obj := G_obj , map := mapβ } .obj X h_obj
congr V : Type uinstβΒΉ : Quiver V W : Type uβinstβ : Quiver W F_obj : V β W mapβΒΉ, mapβ : {X Y : V } β (X βΆ Y ) β (F_obj X βΆ F_obj Y ) h_obj : β (X : V ), { obj := F_obj , map := mapβΒΉ } .obj X = { obj := F_obj , map := mapβ } .obj X h_map : β (X Y : V ) (f : X βΆ Y ),
{ obj := F_obj , map := mapβΒΉ } .map f = Eq.recOn (_ : { obj := F_obj , map := mapβ } .obj Y = { obj := F_obj , map := mapβΒΉ } .obj Y )
(Eq.recOn (_ : { obj := F_obj , map := mapβ } .obj X = { obj := F_obj , map := mapβΒΉ } .obj X )
({ obj := F_obj , map := mapβ } .map f ) ) mk.mk.e_map
funext X Y f V : Type uinstβΒΉ : Quiver V W : Type uβinstβ : Quiver W F_obj : V β W mapβΒΉ, mapβ : {X Y : V } β (X βΆ Y ) β (F_obj X βΆ F_obj Y ) h_obj : β (X : V ), { obj := F_obj , map := mapβΒΉ } .obj X = { obj := F_obj , map := mapβ } .obj X h_map : β (X Y : V ) (f : X βΆ Y ),
{ obj := F_obj , map := mapβΒΉ } .map f = Eq.recOn (_ : { obj := F_obj , map := mapβ } .obj Y = { obj := F_obj , map := mapβΒΉ } .obj Y )
(Eq.recOn (_ : { obj := F_obj , map := mapβ } .obj X = { obj := F_obj , map := mapβΒΉ } .obj X )
({ obj := F_obj , map := mapβ } .map f ) ) X, Y : V f : X βΆ Y mk.mk.e_map.h.h.h
simpa using h_map : β (X Y : V ) (f : X βΆ Y ),
{ obj := F_obj , map := mapβΒΉ } .map f = Eq.recOn (_ : { obj := F_obj , map := mapβ } .obj Y = { obj := F_obj , map := mapβΒΉ } .obj Y )
(Eq.recOn (_ : { obj := F_obj , map := mapβ } .obj X = { obj := F_obj , map := mapβΒΉ } .obj X )
({ obj := F_obj , map := mapβ } .map f ) ) h_map X Y f
#align prefunctor.ext Prefunctor.ext : β {V : Type u} [inst : Quiver V ] {W : Type uβ} [inst_1 : Quiver W ] {F G : Prefunctor V W }
(h_obj : β (X : V ), F .obj X = G .obj X ),
(β (X Y : V ) (f : X βΆ Y ), F .map f = Eq.recOn (_ : G .obj Y = F .obj Y ) (Eq.recOn (_ : G .obj X = F .obj X ) (G .map f ) ) ) β
F = G Prefunctor.ext
/-- The identity morphism between quivers. -/
@[ simps : β (V : Type u_1) [inst : Quiver V ] {X Y : V } (f : X βΆ Y ), (id V ).map f = f simps ]
def id ( V : Type _ : Type (?u.23954+1) Type _) [ Quiver : Type ?u.23957 β Type (max?u.23957?u.23958) Quiver V ] : Prefunctor : (V : Type ?u.23962) β
[inst : Quiver V ] β
(W : Type ?u.23961) β [inst : Quiver W ] β Sort (max(max(max(?u.23962+1)(?u.23961+1))?u.23964)?u.23963) Prefunctor V V where
obj := fun X => X
map f := f
#align prefunctor.id Prefunctor.id
#align prefunctor.id_obj Prefunctor.id_obj : β (V : Type u_1) [inst : Quiver V ] (X : V ), (id V ).obj X = X Prefunctor.id_obj
#align prefunctor.id_map Prefunctor.id_map : β (V : Type u_1) [inst : Quiver V ] {X Y : V } (f : X βΆ Y ), (id V ).map f = f Prefunctor.id_map
instance ( V : Type _ : Type (?u.24133+1) Type _) [ Quiver : Type ?u.24136 β Type (max?u.24136?u.24137) Quiver V ] : Inhabited : Sort ?u.24140 β Sort (max1?u.24140) Inhabited ( Prefunctor : (V : Type ?u.24142) β
[inst : Quiver V ] β
(W : Type ?u.24141) β [inst : Quiver W ] β Sort (max(max(max(?u.24142+1)(?u.24141+1))?u.24144)?u.24143) Prefunctor V V ) :=
β¨ id V β©
/-- Composition of morphisms between quivers. -/
@[ simps ]
def comp { U : Type _ : Type (?u.24207+1) Type _} [ Quiver : Type ?u.24210 β Type (max?u.24210?u.24211) Quiver U ] { V : Type _ : Type (?u.24214+1) Type _} [ Quiver : Type ?u.24217 β Type (max?u.24217?u.24218) Quiver V ] { W : Type _ : Type (?u.24221+1) Type _} [ Quiver : Type ?u.24224 β Type (max?u.24224?u.24225) Quiver W ]
( F : Prefunctor : (V : Type ?u.24229) β
[inst : Quiver V ] β
(W : Type ?u.24228) β [inst : Quiver W ] β Sort (max(max(max(?u.24229+1)(?u.24228+1))?u.24231)?u.24230) Prefunctor U V ) ( G : Prefunctor : (V : Type ?u.24245) β
[inst : Quiver V ] β
(W : Type ?u.24244) β [inst : Quiver W ] β Sort (max(max(max(?u.24245+1)(?u.24244+1))?u.24247)?u.24246) Prefunctor V W ) : Prefunctor : (V : Type ?u.24260) β
[inst : Quiver V ] β
(W : Type ?u.24259) β [inst : Quiver W ] β Sort (max(max(max(?u.24260+1)(?u.24259+1))?u.24262)?u.24261) Prefunctor U W where
obj X := G . obj ( F . obj X )
map f := G . map : {V : Type ?u.24338} β
[inst : Quiver V ] β
{W : Type ?u.24337} β
[inst_1 : Quiver W ] β (self : Prefunctor V W ) β {X Y : V } β (X βΆ Y ) β (self .obj X βΆ self .obj Y ) map ( F . map : {V : Type ?u.24362} β
[inst : Quiver V ] β
{W : Type ?u.24361} β
[inst_1 : Quiver W ] β (self : Prefunctor V W ) β {X Y : V } β (X βΆ Y ) β (self .obj X βΆ self .obj Y ) map f )
#align prefunctor.comp Prefunctor.comp
#align prefunctor.comp_obj Prefunctor.comp_obj
#align prefunctor.comp_map Prefunctor.comp_map
pp_extended_field_notation Prefunctor.comp
@[ simp ]
theorem comp_id { U V : Type _ : Type (?u.31806+1) Type _} [ Quiver : Type ?u.31809 β Type (max?u.31809?u.31810) Quiver U ] [ Quiver : Type ?u.31813 β Type (max?u.31813?u.31814) Quiver V ] ( F : Prefunctor : (V : Type ?u.31818) β
[inst : Quiver V ] β
(W : Type ?u.31817) β [inst : Quiver W ] β Sort (max(max(max(?u.31818+1)(?u.31817+1))?u.31820)?u.31819) Prefunctor U V ) :
F . comp ( id _ ) = F := rfl : β {Ξ± : Sort ?u.31887} {a : Ξ± }, a = a rfl
#align prefunctor.comp_id Prefunctor.comp_id
@[ simp ]
theorem id_comp { U V : Type _ : Type (?u.31930+1) Type _} [ Quiver : Type ?u.31933 β Type (max?u.31933?u.31934) Quiver U ] [ Quiver : Type ?u.31937 β Type (max?u.31937?u.31938) Quiver V ] ( F : Prefunctor : (V : Type ?u.31942) β
[inst : Quiver V ] β
(W : Type ?u.31941) β [inst : Quiver W ] β Sort (max(max(max(?u.31942+1)(?u.31941+1))?u.31944)?u.31943) Prefunctor U V ) :
( id _ ). comp F = F := rfl : β {Ξ± : Sort ?u.32011} {a : Ξ± }, a = a rfl
#align prefunctor.id_comp Prefunctor.id_comp
@[ simp ]
theorem comp_assoc { U V W Z : Type _ : Type (?u.32055+1) Type _} [ Quiver : Type ?u.32067 β Type (max?u.32067?u.32068) Quiver U ] [ Quiver : Type ?u.32071 β Type (max?u.32071?u.32072) Quiver V ] [ Quiver : Type ?u.32075 β Type (max?u.32075?u.32076) Quiver W ] [ Quiver : Type ?u.32079 β Type (max?u.32079?u.32080) Quiver Z ]
( F : Prefunctor : (V : Type ?u.32084) β
[inst : Quiver V ] β
(W : Type ?u.32083) β [inst : Quiver W ] β Sort (max(max(max(?u.32084+1)(?u.32083+1))?u.32086)?u.32085) Prefunctor U V ) ( G : Prefunctor : (V : Type ?u.32100) β
[inst : Quiver V ] β
(W : Type ?u.32099) β [inst : Quiver W ] β Sort (max(max(max(?u.32100+1)(?u.32099+1))?u.32102)?u.32101) Prefunctor V W ) ( H : Prefunctor : (V : Type ?u.32115) β
[inst : Quiver V ] β
(W : Type ?u.32114) β [inst : Quiver W ] β Sort (max(max(max(?u.32115+1)(?u.32114+1))?u.32117)?u.32116) Prefunctor W Z ) :
( F . comp G ). comp H = F . comp ( G . comp H ) :=
rfl : β {Ξ± : Sort ?u.32285} {a : Ξ± }, a = a rfl
#align prefunctor.comp_assoc Prefunctor.comp_assoc
/-- Notation for a prefunctor between quivers. -/
infixl :50 " β₯€q " => Prefunctor : (V : Type uβ) β [inst : Quiver V ] β (W : Type uβ) β [inst : Quiver W ] β Sort (max(max(max(uβ+1)(uβ+1))vβ)vβ) Prefunctor
/-- Notation for composition of prefunctors. -/
infixl :60 " βq " => Prefunctor.comp
/-- Notation for the identity prefunctor on a quiver. -/
notation "πq" => id
end Prefunctor
namespace Quiver
/-- `Vα΅α΅` reverses the direction of all arrows of `V`. -/
instance opposite { V } [ Quiver : Type ?u.54166 β Type (max?u.54166?u.54167) Quiver V ] : Quiver : Type ?u.54170 β Type (max?u.54170?u.54171) Quiver V α΅α΅ :=
β¨ fun a b => ( unop b βΆ unop a )α΅α΅β©
#align quiver.opposite Quiver.opposite
/-- The opposite of an arrow in `V`.
-/
def Hom.op { V } [ Quiver : Type ?u.54258 β Type (max?u.54258?u.54259) Quiver V ] { X Y : V } ( f : X βΆ Y ) : op Y βΆ op X := β¨ f β©
#align quiver.hom.op Quiver.Hom.op
pp_extended_field_notation Quiver.Hom.op
/-- Given an arrow in `Vα΅α΅`, we can take the "unopposite" back in `V`.
-/
def Hom.unop { V } [ Quiver : Type ?u.57904 β Type (max?u.57904?u.57905) Quiver V ] { X Y : V α΅α΅} ( f : X βΆ Y ) : unop Y βΆ unop X := Opposite.unop : {Ξ± : Sort ?u.57965} β Ξ± α΅α΅ β Ξ± Opposite.unop f
#align quiver.hom.unop Quiver.Hom.unop : {V : Type u_1} β [inst : Quiver V ] β {X Y : V α΅α΅ } β (X βΆ Y ) β (Y .unop βΆ X .unop ) Quiver.Hom.unop
pp_extended_field_notation Quiver.Hom.unop : {V : Type u_1} β [inst : Quiver V ] β {X Y : V α΅α΅ } β (X βΆ Y ) β (Y .unop βΆ X .unop ) Quiver.Hom.unop
/-- A type synonym for a quiver with no arrows. -/
-- Porting note: no has_nonempty_instance linter yet
-- @[nolint has_nonempty_instance]
def Empty ( V : Type u ) : Type u := V
#align quiver.empty Quiver.Empty
instance emptyQuiver ( V : Type u ) : Quiver : Type ?u.61563 β Type (max?u.61563u) Quiver.{u} ( Empty V ) := β¨ fun _ _ => PEmpty β©
#align quiver.empty_quiver Quiver.emptyQuiver
@[ simp ]
theorem empty_arrow { V : Type u } ( a b : Empty V ) : ( a βΆ b ) = PEmpty := rfl : β {Ξ± : Sort ?u.61670} {a : Ξ± }, a = a rfl
#align quiver.empty_arrow Quiver.empty_arrow
/-- A quiver is thin if it has no parallel arrows. -/
@[reducible]
def IsThin ( V : Type u ) [ Quiver : Type ?u.61693 β Type (max?u.61693?u.61694) Quiver V ] : Prop := β a b : V , Subsingleton ( a βΆ b )
#align quiver.is_thin Quiver.IsThin
end Quiver