Eliminators in Agda and in general, by Mathijs Swint and Tom - - PowerPoint PPT Presentation

eliminators in agda and in general
SMART_READER_LITE
LIVE PREVIEW

Eliminators in Agda and in general, by Mathijs Swint and Tom - - PowerPoint PPT Presentation

Eliminators in Agda and in general, by Mathijs Swint and Tom Lokhorst on the 2nd of October 2008 for the course Dependently Typed Programming. Eliminators are like folds, but cooler. foldList : forall {A} {B : Set} -> B -> (A -> B


slide-1
SLIDE 1

Eliminators in Agda and in general,

by Mathijs Swint and Tom Lokhorst

  • n the 2nd of October 2008 for the

course Dependently Typed Programming.

slide-2
SLIDE 2

Eliminators are like folds, but cooler.

slide-3
SLIDE 3

foldList : forall {A} {B : Set}

  • > B
  • > (A -> B -> B)
  • > List A
  • > B

foldList n c [] = n foldList n c (x ∷ xs) = c x (foldList n c xs)

slide-4
SLIDE 4

elimVec : {A : Set} {n : ℕ}

  • > (m : {n : ℕ} -> Vec A n -> Set)
  • > m []
  • > (forall {n} {xs : Vec A n}
  • > (x : A)
  • > m xs
  • > m (x ∷ xs))
  • > (v : Vec A n)
  • > m v

elimVec m n c [] = n elimVec m n c (x ∷ xs) = c x (elimVec m n c xs)

slide-5
SLIDE 5

Why would we want them?

  • For the same reasons you’d want folds.
  • But eliminators can work on

dependent types.

slide-6
SLIDE 6

When do we need them?

slide-7
SLIDE 7

When do we need them?

replicateList : {A : Set} -> A -> ℕ -> List A

slide-8
SLIDE 8

When do we need them?

replicateList : {A : Set} -> A -> ℕ -> List A replicateList x zero = []

slide-9
SLIDE 9

When do we need them?

replicateList : {A : Set} -> A -> ℕ -> List A replicateList x zero = [] replicateList x (suc n) = x ∷ replicateList x n

slide-10
SLIDE 10

When do we need them?

replicateList : {A : Set} -> A -> ℕ -> List A replicateList x zero = [] replicateList x (suc n) = x ∷ replicateList x n replicateList' : {A : Set} -> A -> ℕ -> List A

slide-11
SLIDE 11

When do we need them?

replicateList : {A : Set} -> A -> ℕ -> List A replicateList x zero = [] replicateList x (suc n) = x ∷ replicateList x n replicateList' : {A : Set} -> A -> ℕ -> List A replicateList' x n = foldℕ [] (\ys -> x ∷ ys) n

slide-12
SLIDE 12

When do we need them?

replicateList : {A : Set} -> A -> ℕ -> List A replicateList x zero = [] replicateList x (suc n) = x ∷ replicateList x n replicateList' : {A : Set} -> A -> ℕ -> List A replicateList' x n = foldℕ [] (\ys -> x ∷ ys) n replicateVec : {A : Set} -> A -> (n : ℕ) -> Vec A n

slide-13
SLIDE 13

When do we need them?

replicateList : {A : Set} -> A -> ℕ -> List A replicateList x zero = [] replicateList x (suc n) = x ∷ replicateList x n replicateList' : {A : Set} -> A -> ℕ -> List A replicateList' x n = foldℕ [] (\ys -> x ∷ ys) n replicateVec : {A : Set} -> A -> (n : ℕ) -> Vec A n replicateVec {A} x n = ?

slide-14
SLIDE 14

foldℕ : forall {A : Set}

  • > A
  • > (A -> A)
  • > ℕ
  • > A

foldℕ z s zero = z foldℕ z s (suc n) = s (foldℕ z s n)

slide-15
SLIDE 15

foldℕ : forall {A : Set}

  • > A
  • > (A -> A)
  • > ℕ
  • > A

foldℕ z s zero = z foldℕ z s (suc n) = s (foldℕ z s n) data Parity : Set where flip : Parity -> Parity

  • dd : Parity flip even = odd

even : Parity flip odd = even parity : ℕ -> Parity parity = foldℕ even flip

slide-16
SLIDE 16

foldℕ : forall {A : Set}

  • > A
  • > (A -> A)
  • > ℕ
  • > A

foldℕ z s zero = z foldℕ z s (suc n) = s (foldℕ z s n)

slide-17
SLIDE 17

foldℕ : forall {A : Set}

  • > A
  • > (A -> A)
  • > ℕ
  • > A

foldℕ z s zero = z foldℕ z s (suc n) = s (foldℕ z s n) elimℕ : (m : ℕ -> Set)

  • > m zero
  • > (forall {k} -> m k -> m (suc k))
  • > (n : ℕ)
  • > m n

elimℕ m z s zero = z elimℕ m z s (suc n) = s (elimℕ m z s n)

slide-18
SLIDE 18

parity' : ℕ -> Parity parity' = elimℕ (\_ -> Parity) even flip elimℕ : (m : ℕ -> Set)

  • > m zero
  • > (forall {k} -> m k -> m (suc k))
  • > (n : ℕ)
  • > m n

elimℕ m z s zero = z elimℕ m z s (suc n) = s (elimℕ m z s n)

slide-19
SLIDE 19

replicateVec : {A : Set} -> A -> (n : ℕ) -> Vec A n replicateVec {A} x n = elimℕ (Vec A) [] (\ys -> x ∷ ys) n elimℕ : (m : ℕ -> Set)

  • > m zero
  • > (forall {k} -> m k -> m (suc k))
  • > (n : ℕ)
  • > m n

elimℕ m z s zero = z elimℕ m z s (suc n) = s (elimℕ m z s n)

slide-20
SLIDE 20

data Fin : ℕ -> Set where fzero : {n : ℕ} -> Fin (suc n) fsuc : {n : ℕ} -> Fin n -> Fin (suc n) elimFin : {n : ℕ}

  • > (m : forall {i} -> Fin i -> Set)
  • > (forall {i} -> m (fzero{i}))
  • > (forall {i} -> {f : Fin i}
  • > m f
  • > m (fsuc f))
  • > (f : Fin n)
  • > m f

elimFin m fz fs fzero = fz elimFin m fz fs (fsuc f) = fs (elimFin m fz fs f)

slide-21
SLIDE 21

lookup : forall {A n} -> Vec A n -> Fin n -> A lookup [] () lookup (x ∷ xs) fzero = x lookup (x ∷ xs) (fsuc f) = lookup xs f

slide-22
SLIDE 22

lookup : forall {A n} -> Vec A n -> Fin n -> A lookup {A} {zero} [] () lookup {A} {suc n} (x ∷ xs) fzero = x lookup {A} {suc n} (x ∷ xs) (fsuc f) = lookup xs f

slide-23
SLIDE 23

data Vec (A : Set) : ℕ -> Set where [] : Vec A zero _∷_ : {n : ℕ} -> A -> Vec A n -> Vec A (suc n)

slide-24
SLIDE 24

data Vec (A : Set) : ℕ -> Set where [] : Vec A zero _∷_ : {n : ℕ} -> A -> Vec A n -> Vec A (suc n) elimVec : {A : Set} {n : ℕ}

  • > (m : {n : ℕ} -> Vec A n -> Set)
  • > m []
  • > (forall {n} {xs : Vec A n}
  • > (x : A)
  • > m xs
  • > m (x ∷ xs))
  • > (v : Vec A n)
  • > m v

elimVec m n c [] = n elimVec m n c (x ∷ xs) = c x (elimVec m n c xs)

slide-25
SLIDE 25

lookup : forall {A n} -> Vec A n -> Fin n -> A lookup {A} {zero} [] () lookup {A} {suc n} (x ∷ xs) fzero = x lookup {A} {suc n} (x ∷ xs) (fsuc f) = lookup xs f lookup' : forall {A n} -> Vec A n -> Fin n -> A lookup' {A} v f = elimVec ? ? ? v

slide-26
SLIDE 26

lookup : forall {A n} -> Vec A n -> Fin n -> A lookup {A} {zero} [] () lookup {A} {suc n} (x ∷ xs) fzero = x lookup {A} {suc n} (x ∷ xs) (fsuc f) = lookup xs f lookup' : forall {A n} -> Vec A n -> Fin n -> A lookup' {A} v f = elimVec (\{n} _ -> Fin n -> A) ? ? v f

slide-27
SLIDE 27

lookup : forall {A n} -> Vec A n -> Fin n -> A lookup {A} {zero} [] () lookup {A} {suc n} (x ∷ xs) fzero = x lookup {A} {suc n} (x ∷ xs) (fsuc f) = lookup xs f lookup' : forall {A n} -> Vec A n -> Fin n -> A lookup' {A} v f = elimVec (\{n} _ -> Fin n -> A) (\f -> absurd f) ? v f

slide-28
SLIDE 28

absurd : {A : Set} -> Fin 0 -> A absurd f = ?

slide-29
SLIDE 29

absurd : {A : Set} -> Fin 0 -> A absurd f = ? type : forall {n} -> Fin n -> Set type {zero} _ = ⊥ type {suc n} _ = ⊤

slide-30
SLIDE 30

absurd : {A : Set} -> Fin 0 -> A absurd f = ? type : forall {n} -> Fin n -> Set type {zero} _ = ⊥ type {suc n} _ = ⊤ type' : forall {n} -> Fin n -> Set type' {n} = elimℕ1 (\n -> Fin n -> Set) (\fz -> ⊥) (\_ -> \fs -> ⊤) n

slide-31
SLIDE 31

absurd : {A : Set} -> Fin 0 -> A absurd f = ? type : forall {n} -> Fin n -> Set type {zero} _ = ⊥ type {suc n} _ = ⊤ type' : forall {n} -> Fin n -> Set type' {n} = elimℕ1 (\n -> Fin n -> Set) (\fz -> ⊥) (\_ -> \fs -> ⊤) n elimℕ : (m : ℕ -> Set)

  • > m zero
  • > (forall {k} -> m k -> m (suc k))
  • > (n : ℕ)
  • > m n
slide-32
SLIDE 32

absurd : {A : Set} -> Fin 0 -> A absurd f = ? type : forall {n} -> Fin n -> Set type {zero} _ = ⊥ type {suc n} _ = ⊤ type' : forall {n} -> Fin n -> Set type' {n} = elimℕ1 (\n -> Fin n -> Set) (\fz -> ⊥) (\_ -> \fs -> ⊤) n elimℕ1 : (m : ℕ -> Set1)

  • > m zero
  • > (forall {k} -> m k -> m (suc k))
  • > (n : ℕ)
  • > m n
slide-33
SLIDE 33

absurd : {A : Set} -> Fin 0 -> A absurd f = ? type : forall {n} -> Fin n -> Set type {zero} _ = ⊥ type {suc n} _ = ⊤

slide-34
SLIDE 34

absurd : {A : Set} -> Fin 0 -> A absurd f = ? fin0 : Fin 0 -> ⊥ fin0 = ? type : forall {n} -> Fin n -> Set type {zero} _ = ⊥ type {suc n} _ = ⊤

slide-35
SLIDE 35

absurd : {A : Set} -> Fin 0 -> A absurd f = ? fin0 : Fin 0 -> ⊥ fin0 = elimFin (\f -> type f) tt (\_ -> tt) type : forall {n} -> Fin n -> Set type {zero} _ = ⊥ type {suc n} _ = ⊤

slide-36
SLIDE 36

absurd : {A : Set} -> Fin 0 -> A absurd f = ? fin0 : Fin 0 -> ⊥ fin0 = elimFin (\f -> type f) tt (\_ -> tt) type : forall {n} -> Fin n -> Set type {zero} _ = ⊥ type {suc n} _ = ⊤ botA : {A : Set} -> ⊥ -> A botA {A} b = elim⊥ (\_ -> A) b

slide-37
SLIDE 37

absurd : {A : Set} -> Fin 0 -> A absurd f = botA (fin0 f) fin0 : Fin 0 -> ⊥ fin0 = elimFin (\f -> type f) tt (\_ -> tt) type : forall {n} -> Fin n -> Set type {zero} _ = ⊥ type {suc n} _ = ⊤ botA : {A : Set} -> ⊥ -> A botA {A} b = elim⊥ (\_ -> A) b

slide-38
SLIDE 38

lookup : forall {A n} -> Vec A n -> Fin n -> A lookup {A} {zero} [] () lookup {A} {suc n} (x ∷ xs) fzero = x lookup {A} {suc n} (x ∷ xs) (fsuc f) = lookup xs f lookup' : forall {A n} -> Vec A n -> Fin n -> A lookup' {A} v f = elimVec (\{n} _ -> Fin n -> A) (\f -> absurd f) ? v f

slide-39
SLIDE 39

lookup : forall {A n} -> Vec A n -> Fin n -> A lookup {A} {zero} [] () lookup {A} {suc n} (x ∷ xs) fzero = x lookup {A} {suc n} (x ∷ xs) (fsuc f) = lookup xs f lookup' : forall {A n} -> Vec A n -> Fin n -> A lookup' {A} v f = elimVec (\{n} _ -> Fin n -> A) (\f -> absurd f) (\x fc -> (\f -> ?)) v f

slide-40
SLIDE 40

fin : forall {n} {A : Set}

  • > Fin (suc n)
  • > A
  • > (Fin n -> A)
  • > A

fin fzero x fc = x fin (fsuc f) x fc = fc f lookup' : forall {A n} -> Vec A n -> Fin n -> A lookup' {A} v f = elimVec (\{n} _ -> Fin n -> A) (\f -> absurd f) (\x fc -> (\f -> fin f x fc)) v f

slide-41
SLIDE 41

Done.

slide-42
SLIDE 42

elim⊤ : (m : ⊤ -> Set)

  • > m tt
  • > (t : ⊤)
  • > m t

elim⊤ m t tt = t elim⊥ : (m : ⊥ -> Set)

  • > (b : ⊥)
  • > m b

elim⊥ m () elim≡ : {A : Set} {x y : A}

  • > (m : {z : A} -> x ≡ z -> Set)
  • > m refl
  • > (e : x ≡ y)
  • > m e

elim≡ m r refl = r