open import Cat.Prelude hiding (ap ; ap₂) import Cat.Functor.Reasoning as Func import Cat.Reasoning as Cat module Cat.Functor.Reasoning.Presheaf {o ℓ s} {C : Precategory o ℓ} (P : Functor C (Sets s)) where private module C = Cat C module Pf = Func P open Precategory C open Functor P using (F₀ ; F₁ ; ₀ ; ₁) public private variable U V W : ⌞ C ⌟ f g h i f' g' h' i' : C.Hom U V x y z : ∣ F₀ U ∣ F-id : ∀ {U : ⌞ C ⌟} {x} → F₁ {U} id x ≡ x F-id = happly Pf.F-id _ F-∘ : ∀ {U V W} (f : Hom V U) (g : Hom W V) {x} → F₁ (f ∘ g) x ≡ F₁ f (F₁ g x) F-∘ f g = happly (Pf.F-∘ f g) _ elim : f ≡ id → F₁ f x ≡ x elim p = happly (Pf.elim p) _ intro : id ≡ f → x ≡ F₁ f x intro p = sym (elim (sym p)) collapse : f ∘ g ≡ h → F₁ f (F₁ g x) ≡ F₁ h x collapse p = happly (Pf.collapse p) _ expand : h ≡ f ∘ g → F₁ h x ≡ F₁ f (F₁ g x) expand p = happly (Pf.expand p) _ weave : f ∘ g ≡ h ∘ i → F₁ f (F₁ g x) ≡ F₁ h (F₁ i x) weave p = happly (Pf.weave p) _ annihilate : f ∘ g ≡ id → F₁ f (F₁ g x) ≡ x annihilate p = happly (Pf.annihilate p) _ conjure : id ≡ f ∘ g → x ≡ F₁ f (F₁ g x) conjure p = sym (annihilate (sym p)) ap : x ≡ y → F₁ f x ≡ F₁ f y ap {f = f} p i = F₁ f (p i) ap₂ : f ≡ g → x ≡ y → F₁ f x ≡ F₁ g y ap₂ p q i = F₁ (p i) (q i)