TheHoTTGame/Trinitarianism/Quest1.md
2021-07-24 13:43:27 +01:00

89 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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,
```agda
isEven : Type
isEven n = ?
```
- Do `C-c C-l` to load the file.
- Navigate to the hole.
- Input `n` in the hole and do `C-c C-c`.
You should now see
```agda
isEven : → Type
isEven zero = {!!}
isEven (suc n) = {!!}
```
Explanation : 'to define a function on ``,
it suffices to define the function on the __cases_,
`zero` and `suc 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 want `zero` to be even.
- Navigate to the second hole.
- Input `n` and do `C-c C-c` again.
You should now see
```agda
isEven : → 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 want `suc 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 want `suc (suc n)` to be even _precisely when_
`n` 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 on `n : `.
- `isEven` is a _bundle over ``_,
i.e. an object in the over-category `Type↓`.
Pictorially, it looks like (insert picture).