module Cat.Functor.Reasoning
{o β o' β'}
{π : Precategory o β} {π : Precategory o' β'}
(F : Functor π π)
where
private
module π = Cat.Reasoning π
module π = Cat.Reasoning π
open Functor F public
open F-iso F publicprivate variable
A B C : π.Ob
a a' b b' c c' d : π.Hom A B
X Y Z : π.Ob
f g h i : π.Hom X YReasoning combinators for functorsπ
The combinators exposed in category reasoning abstract out a lot of common algebraic manipulations, and make proofs much more concise. However, once functors get involved, those combinators start to get unwieldy! Therefore, we have to write some new combinators for working with functors specifically. This module is meant to be imported qualified.
Identity morphismsπ
module _ (aβ‘id : a β‘ π.id) where
elim : Fβ a β‘ π.id
elim = ap Fβ aβ‘id β F-id
eliml : Fβ a π.β f β‘ f
eliml = π.eliml elim
elimr : f π.β Fβ a β‘ f
elimr = π.elimr elim
intro : π.id β‘ Fβ a
intro = sym F-id β ap Fβ (sym aβ‘id)
introl : f β‘ Fβ a π.β f
introl = π.introl elim
intror : f β‘ f π.β Fβ a
intror = π.intror elim
module _ {X : π.Ob} {f : π.Hom (Fβ X) (Fβ X)} where
id-equivr : (f β‘ Fβ π.id) β (f β‘ π.id)
id-equivr = β-post-equiv F-id
id-equivl : (Fβ π.id β‘ f) β (π.id β‘ f)
id-equivl = β-pre-equiv (sym F-id)
module id-equivr = Equiv id-equivr
module id-equivl = Equiv id-equivlReassociationsπ
module _ (abβ‘c : a π.β b β‘ c) where
collapse : Fβ a π.β Fβ b β‘ Fβ c
collapse = sym (F-β a b) β ap Fβ abβ‘c
pulll : Fβ a π.β (Fβ b π.β f) β‘ Fβ c π.β f
pulll = π.pulll collapse
pullr : (f π.β Fβ a) π.β Fβ b β‘ f π.β Fβ c
pullr = π.pullr collapse
module _ (abcβ‘d : a π.β b π.β c β‘ d) where
collapse3 : Fβ a π.β Fβ b π.β Fβ c β‘ Fβ d
collapse3 = ap (Fβ a π.β_) (sym (F-β b c)) β collapse abcβ‘d
pulll3 : Fβ a π.β (Fβ b π.β (Fβ c π.β f)) β‘ Fβ d π.β f
pulll3 = π.pulll3 collapse3
pullr3 : ((f π.β Fβ a) π.β Fβ b) π.β Fβ c β‘ f π.β Fβ d
pullr3 = π.pullr3 collapse3
module _ (cβ‘ab : c β‘ a π.β b) where
expand : Fβ c β‘ Fβ a π.β Fβ b
expand = sym (collapse (sym cβ‘ab))
pushl : Fβ c π.β f β‘ Fβ a π.β (Fβ b π.β f)
pushl = π.pushl expand
pushr : f π.β Fβ c β‘ (f π.β Fβ a) π.β Fβ b
pushr = π.pushr expand
module _ (p : a π.β c β‘ b π.β d) where
weave : Fβ a π.β Fβ c β‘ Fβ b π.β Fβ d
weave = sym (F-β a c) ββ ap Fβ p ββ F-β b d
extendl : Fβ a π.β (Fβ c π.β f) β‘ Fβ b π.β (Fβ d π.β f)
extendl = π.extendl weave
extendr : (f π.β Fβ a) π.β Fβ c β‘ (f π.β Fβ b) π.β Fβ d
extendr = π.extendr weave
extend-inner :
f π.β Fβ a π.β Fβ c π.β g β‘ f π.β Fβ b π.β Fβ d π.β g
extend-inner = π.extend-inner weave
module _ (p : a π.β b π.β c β‘ a' π.β b' π.β c') where
weave3 : Fβ a π.β Fβ b π.β Fβ c β‘ Fβ a' π.β Fβ b' π.β Fβ c'
weave3 = ap (_ π.β_) (sym (F-β b c)) ββ weave p ββ ap (_ π.β_) (F-β b' c')
extendl3 : Fβ a π.β (Fβ b π.β (Fβ c π.β f)) β‘ Fβ a' π.β (Fβ b' π.β (Fβ c' π.β f))
extendl3 = π.extendl3 weave3
extendr3 : ((f π.β Fβ a) π.β Fβ b) π.β Fβ c β‘ ((f π.β Fβ a') π.β Fβ b') π.β Fβ c'
extendr3 = π.extendr3 weave3
module _ (p : Fβ a π.β Fβ c β‘ Fβ b π.β Fβ d) where
swap : Fβ (a π.β c) β‘ Fβ (b π.β d)
swap = F-β a c ββ p ββ sym (F-β b d)
popl : f π.β Fβ a β‘ g β f π.β Fβ (a π.β b) β‘ g π.β Fβ b
popl p = π.pushr (F-β _ _) β apβ π._β_ p refl
popr : Fβ b π.β f β‘ g β Fβ (a π.β b) π.β f β‘ Fβ a π.β g
popr p = π.pushl (F-β _ _) β apβ π._β_ refl p
pokel : g β‘ f π.β Fβ a β g π.β Fβ b β‘ f π.β Fβ (a π.β b)
pokel p = apβ π._β_ p refl β π.pullr (sym (F-β _ _))
poker : g β‘ Fβ b π.β f β Fβ a π.β g β‘ Fβ (a π.β b) π.β f
poker p = apβ π._β_ refl p β π.pulll (sym (F-β _ _))
shufflel : f π.β Fβ a β‘ g π.β h β f π.β Fβ (a π.β b) β‘ g π.β h π.β Fβ b
shufflel p = popl p β sym (π.assoc _ _ _)
shuffler : Fβ b π.β f β‘ g π.β h β Fβ (a π.β b) π.β f β‘ (Fβ a π.β g) π.β h
shuffler p = popr p β (π.assoc _ _ _)
remover : Fβ b π.β f β‘ π.id β Fβ (a π.β b) π.β f β‘ Fβ a
remover p = popr p β π.idr _
removel : f π.β Fβ a β‘ π.id β f π.β Fβ (a π.β b) β‘ Fβ b
removel p = popl p β π.idl _Cancellationπ
module _ (inv : a π.β b β‘ π.id) where
annihilate : Fβ a π.β Fβ b β‘ π.id
annihilate = collapse inv β F-id
cancell : Fβ a π.β (Fβ b π.β f) β‘ f
cancell = π.cancell annihilate
cancelr : (f π.β Fβ a) π.β Fβ b β‘ f
cancelr = π.cancelr annihilate
insertl : f β‘ Fβ a π.β (Fβ b π.β f)
insertl = π.insertl annihilate
insertr : f β‘ (f π.β Fβ a) π.β Fβ b
insertr = π.insertr annihilate
cancel-inner : (f π.β Fβ a) π.β (Fβ b π.β g) β‘ f π.β g
cancel-inner = π.cancel-inner annihilate
module _ (inv : a π.β b π.β c β‘ π.id) where
annihilate3 : Fβ a π.β Fβ b π.β Fβ c β‘ π.id
annihilate3 = collapse3 inv β F-id
cancell3 : Fβ a π.β (Fβ b π.β (Fβ c π.β f)) β‘ f
cancell3 = π.cancell3 annihilate3
cancelr3 : ((f π.β Fβ a) π.β Fβ b) π.β Fβ c β‘ f
cancelr3 = π.cancelr3 annihilate3
insertl3 : f β‘ Fβ a π.β (Fβ b π.β (Fβ c π.β f))
insertl3 = π.insertl3 annihilate3
insertr3 : f β‘ ((f π.β Fβ a) π.β Fβ b) π.β Fβ c
insertr3 = π.insertr3 annihilate3Lensesπ
unpackl
: Fβ a π.β Fβ b β‘ f
β Fβ (a π.β b) β‘ f
unpackl p = F-β _ _ β p
packl
: Fβ (a π.β b) β‘ f
β Fβ a π.β Fβ b β‘ f
packl p = sym (F-β _ _) β p
unpackr
: f β‘ Fβ a π.β Fβ b
β f β‘ Fβ (a π.β b)
unpackr p = p β sym (F-β _ _)
packr
: f β‘ Fβ (a π.β b)
β f β‘ Fβ a π.β Fβ b
packr p = p β F-β _ _Notationπ
Writing ap Fβ p is somewhat clunky, so we define a bit
of notation to make it somewhat cleaner.
β¨_β© : a β‘ b β Fβ a β‘ Fβ b
β¨_β© = ap Fβ