module Chapter2.Equality where open import Data.Product hiding (map) open import Relation.Binary.PropositionalEquality hiding (subst₂) subst₂ : ∀{A : Set} {B : A → Set} (P : (a : A) → B a → Set) {x₁ x₂ y₁} → (q : x₁ ≡ x₂) → P x₁ y₁ → P x₂ (subst B q y₁) subst₂ P refl p = p cong₃ : ∀{A : Set}{B : A → Set}{C : (a : A) → B a → Set}{D : Set} (f : (a : A)(b : B a) → C a b → D ) {x y : A}{u : B x}{s : C x u} → (qa : x ≡ y) → f x u s ≡ f y (subst B qa u) (subst₂ C qa s) cong₃ f refl = refl {- module Groupoid {A : Set} where infix 10 _∘_ id : {a : A} → a ≡ a id = refl _⁻¹ : {a b : A} → a ≡ b → b ≡ a q ⁻¹ = sym q _∘_ : {a b c : A} → b ≡ c → a ≡ b → a ≡ c q₁ ∘ q₂ = trans q₂ q₁ open Groupoid public module Functor {A B : Set}{f : A → B} where map : ∀{x y} → x ≡ y → f x ≡ f y map = cong f open Functor public module Product {A : Set}{B : A → Set} where _,≡_ : ∀{a c : A}{b d : B a} → (q : a ≡ c) → b ≡ d → (a , b) ≡ (c , subst B q d) refl ,≡ refl = refl open Product public {- module Weak2-1Category {A : Set} where open Groupoid {A} infix 4 _≡₂_ _≡₂_ : {a b : A} → (q₁ q₂ : a ≡ b) → Set q₁ ≡₂ q₂ = q₁ ≡ q₂ idR : ∀{a b} → (q : a ≡ b) → q ∘ id ≡₂ q idR q = refl idL : ∀{a b} → (q : a ≡ b) → id ∘ q ≡ q idL refl = refl assoc : ∀{x y z w} → (q₁ : x ≡ y)(q₂ : y ≡ z)(q₃ : z ≡ w) → q₃ ∘ (q₂ ∘ q₁) ≡₂ (q₃ ∘ q₂) ∘ q₁ assoc refl refl refl = refl comp : ∀{x y z}{q q' : x ≡ y}{p p' : y ≡ z} → q ≡₂ q' → p ≡₂ p' → p ∘ q ≡₂ p' ∘ q' comp refl refl = refl module Weak2Groupoid {A : Set} where open Groupoid {A} open Weak2-1Category {A} invR : ∀{x y} → (q : x ≡ y) → q ∘ (q ⁻¹) ≡₂ id invR refl = refl invL : ∀{x y} → (q : x ≡ y) → (q ⁻¹) ∘ q ≡₂ id invL refl = refl inv : ∀{x y}{q q' : x ≡ y} → q ≡₂ q' → q ⁻¹ ≡₂ q' ⁻¹ inv refl = refl module Functor {A B : Set}{f : A → B} where open Groupoid open Weak2-1Category open Weak2Groupoid map : ∀{x y} → x ≡ y → f x ≡ f y map = cong f map2 : ∀{x y} {q q' : x ≡ y} → q ≡₂ q' → map q ≡₂ map q' map2 refl = refl map∘ : ∀{x y z} (q : x ≡ y)(q' : y ≡ z) → map (q' ∘ q) ≡₂ map q' ∘ map q map∘ refl refl = refl -- Derivable: mapId : ∀{x} → map {x} id ≡₂ id mapId = refl mapInv : ∀{x y} (q : x ≡ y) → map (q ⁻¹) ≡₂ (map q) ⁻¹ mapInv refl = refl module Naturality {A B : Set}{f g : A → B} (α : (a : A) → f a ≡ g a) where open Groupoid open Weak2-1Category open Weak2Groupoid open Functor nat : ∀{a b} → (q : a ≡ b) → α b ∘ map q ≡₂ map q ∘ α a nat {a} refl rewrite α a = refl -- nat2 : ∀{a} (β : (a : A) → f a ≡ g a) → -- α a ≡₂ β a -- nat2 {a} β = {!!} -} -}