2.4 KiB
Dependent Types
In a 'place to do maths' we would like to be able to express and 'prove' the statement
There exists a natural that is even.
This requires the notion of a predicate.
In general a predicate on a type A : Type
is
a term of type A → Type
.
For example,
isEven : ℕ → Type
isEven n = ?
-
Do
C-c C-l
to load the file. -
Navigate to the hole.
-
Input
n
in the hole and doC-c C-c
. You should now seeisEven : ℕ → Type isEven zero = {!!} isEven (suc n) = {!!}
Explanation : 'to define a function on
ℕ
, it suffices to define the function on the _cases,zero
andsuc n
, since these are the only constructors given in the definition ofℕ
'. This has the following interpretations,- propositionally, this is the principle of mathematical induction.
- categorically, this is the universal property of a natural numbers object.
-
Navigate to the first hole and check the goal. You should see
Goal: Type ———————————
Fill the hole with
⊤
, since we wantzero
to be even. -
Navigate to the second hole.
-
Input
n
and doC-c C-c
again. You should now seeisEven : ℕ → Type isEven zero = ⊤ isEven (suc zero) = {!!} isEven (suc (suc n)) = {!!}
Explanation : we have just used induction again.
-
Navigate to the first hole and check the goal. Agda should be asking for a term of type
Type
, so fill the hole with⊥
, since we don't wantsuc zero
to be even. -
Navigate to the next hole and check the goal. You should see in the 'agda information' window,
Goal: Type —————————————— n : ℕ
Explanation : We are in the 'inductive step', so we have access to the previous natural number.
-
Fill the hole with
isEven n
, since we wantsuc (suc n)
to be even precisely whenn
is even.The reason we have access to the term
isEven n
is again because we are in the 'inductive step'. -
There should now be nothing in the 'agda info' window. Everything is working!
There are three interpretations of isEven : ℕ → Type
.
- Already mentioned,
isEven
is a predicate onℕ
. isEven
is a dependent construction. Specifically, it is either⊤
or⊥
depending onn : ℕ
.isEven
is a bundle overℕ
, i.e. an object in the over-categoryType↓ℕ
. Pictorially, it looks like (insert picture).