\documentclass{article} \usepackage{agda} \usepackage{tikz} \usepackage{bbm} \usepackage{animate} \usepackage{hyperref} \usepackage{graphicx} \usepackage{longtable} \usepackage{amsmath} \usepackage{mdwlist} \usepackage{txfonts} \usepackage{xspace} \usepackage{amstext} \usepackage{amssymb} \usepackage{stmaryrd} \usepackage{proof} \usepackage{multicol} \usepackage[nodayofweek]{datetime} \usepackage{etex} \usepackage{textgreek} \usepackage[all, cmtip]{xy} \DeclareUnicodeCharacter{9675}{$\bigcirc$} \begin{document} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Preliminaries} We begin with a few abbreviations: \begin{code} {-# OPTIONS --without-K #-} module circle where open import Level open import Data.Product open import Function renaming (_∘_ to _○_) \end{code} \begin{code} infixr 8 _∘_ infix 4 _≡_ infix 2 _∎ infixr 2 _≡⟨_⟩_ \end{code} Our own version of refl that makes 'a' explicit: \begin{code} data _≡_ {ℓ} {A : Set ℓ} : (a b : A) → Set ℓ where refl : (a : A) → (a ≡ a) pathInd : ∀ {ℓ ℓ'} → {A : Set ℓ} → (C : {x y : A} → (x ≡ y) → Set ℓ') → (c : (x : A) → C (refl x)) → ({x y : A} (p : x ≡ y) → C p) pathInd C c (refl x) = c x -- Lemma 2.1.1 ! : ∀ {ℓ} → {A : Set ℓ} {x y : A} → (x ≡ y) → (y ≡ x) ! = pathInd (λ {x} {y} _ → y ≡ x) refl -- Lemma 2.1.2 _∘_ : ∀ {ℓ} → {A : Set ℓ} → {x y z : A} → (x ≡ y) → (y ≡ z) → (x ≡ z) _∘_ {ℓ} {A} {x} {y} {z} p q = pathInd (λ {x} {y} p → ((z : A) → (q : y ≡ z) → (x ≡ z))) (λ x z q → pathInd (λ {x} {z} _ → x ≡ z) refl {x} {z} q) {x} {y} p z q -- Lemma 2.1.4 -- p ≡ p ∘ refl unitTransR : {A : Set} {x y : A} → (p : x ≡ y) → (p ≡ p ∘ refl y) unitTransR {A} {x} {y} p = pathInd (λ {x} {y} p → p ≡ p ∘ (refl y)) (λ x → refl (refl x)) {x} {y} p -- p ≡ refl ∘ p unitTransL : {A : Set} {x y : A} → (p : x ≡ y) → (p ≡ refl x ∘ p) unitTransL {A} {x} {y} p = pathInd (λ {x} {y} p → p ≡ (refl x) ∘ p) (λ x → refl (refl x)) {x} {y} p -- ! p ∘ p ≡ refl invTransL : {A : Set} {x y : A} → (p : x ≡ y) → (! p ∘ p ≡ refl y) invTransL {A} {x} {y} p = pathInd (λ {x} {y} p → ! p ∘ p ≡ refl y) (λ x → refl (refl x)) {x} {y} p -- ! (! p) ≡ p invId : {A : Set} {x y : A} → (p : x ≡ y) → (! (! p) ≡ p) invId {A} {x} {y} p = pathInd (λ {x} {y} p → ! (! p) ≡ p) (λ x → refl (refl x)) {x} {y} p -- p ∘ (q ∘ r) ≡ (p ∘ q) ∘ r assocP : {A : Set} {x y z w : A} → (p : x ≡ y) → (q : y ≡ z) → (r : z ≡ w) → (p ∘ (q ∘ r) ≡ (p ∘ q) ∘ r) assocP {A} {x} {y} {z} {w} p q r = pathInd (λ {x} {y} p → (z : A) → (w : A) → (q : y ≡ z) → (r : z ≡ w) → p ∘ (q ∘ r) ≡ (p ∘ q) ∘ r) (λ x z w q r → pathInd (λ {x} {z} q → (w : A) → (r : z ≡ w) → (refl x) ∘ (q ∘ r) ≡ ((refl x) ∘ q) ∘ r) (λ x w r → pathInd (λ {x} {w} r → (refl x) ∘ ((refl x) ∘ r) ≡ ((refl x) ∘ (refl x)) ∘ r) (λ x → (refl (refl x))) {x} {w} r) {x} {z} q w r) {x} {y} p z w q r -- ! (p ∘ q) ≡ ! q ∘ ! p invComp : {A : Set} {x y z : A} → (p : x ≡ y) → (q : y ≡ z) → ! (p ∘ q) ≡ ! q ∘ ! p invComp {A} {x} {y} {z} p q = pathInd (λ {x} {y} p → (z : A) → (q : y ≡ z) → ! (p ∘ q) ≡ ! q ∘ ! p) (λ x z q → pathInd (λ {x} {z} q → ! (refl x ∘ q) ≡ ! q ∘ ! (refl x)) (λ x → refl (refl x)) {x} {z} q) {x} {y} p z q \end{code} Introduce equational reasoning syntax to simplify proofs: \begin{code} _≡⟨_⟩_ : ∀ {ℓ} → {A : Set ℓ} (x : A) {y z : A} → (x ≡ y) → (y ≡ z) → (x ≡ z) _ ≡⟨ p ⟩ q = p ∘ q bydef : ∀ {ℓ} → {A : Set ℓ} {x : A} → (x ≡ x) bydef {ℓ} {A} {x} = refl x _∎ : ∀ {ℓ} → {A : Set ℓ} (x : A) → (x ≡ x) _∎ x = refl x \end{code} \begin{code} -- Lemma 2.2.1 -- computation rule: ap f (refl x) = refl (f x) ap : ∀ {ℓ ℓ'} → {A : Set ℓ} {B : Set ℓ'} {x y : A} → (f : A → B) → (x ≡ y) → (f x ≡ f y) ap {ℓ} {ℓ'} {A} {B} {x} {y} f p = pathInd (λ {x} {y} p → f x ≡ f y) (λ x → refl (f x)) {x} {y} p -- Lemma 2.2.2 -- f (p ∘ q) ≡ f p ∘ f q apfTrans : ∀ {ℓ} → {A B : Set ℓ} {x y z : A} → (f : A → B) → (p : x ≡ y) → (q : y ≡ z) → ap f (p ∘ q) ≡ (ap f p) ∘ (ap f q) apfTrans {ℓ} {A} {B} {x} {y} {z} f p q = pathInd {ℓ} (λ {x} {y} p → (z : A) → (q : y ≡ z) → ap f (p ∘ q) ≡ (ap f p) ∘ (ap f q)) (λ x z q → pathInd {ℓ} (λ {x} {z} q → ap f (refl x ∘ q) ≡ (ap f (refl x)) ∘ (ap f q)) (λ x → refl (refl (f x))) {x} {z} q) {x} {y} p z q -- f (! p) ≡ ! (f p) apfInv : ∀ {ℓ} → {A B : Set ℓ} {x y : A} → (f : A → B) → (p : x ≡ y) → ap f (! p) ≡ ! (ap f p) apfInv {ℓ} {A} {B} {x} {y} f p = pathInd {ℓ} (λ {x} {y} p → ap f (! p) ≡ ! (ap f p)) (λ x → refl (ap f (refl x))) {x} {y} p -- g (f p) ≡ (g ○ f) p apfComp : {A B C : Set} {x y : A} → (f : A → B) → (g : B → C) → (p : x ≡ y) → ap g (ap f p) ≡ ap (g ○ f) p apfComp {A} {B} {C} {x} {y} f g p = pathInd (λ {x} {y} p → ap g (ap f p) ≡ ap (g ○ f) p) (λ x → refl (ap g (ap f (refl x)))) {x} {y} p \end{code} \end{document}