4.0 KiB
There are three ways of looking at A : Type u
.
- proof theoretically, '
A
is a proposition' - type theoretically, '
A
is a construction' - categorically, '
A
is an object in categoryType u
'
We will explain what u : Level and Type u is at the end.
A first example of a type construction is the function type.
Given types A
and B
, we have another type A → B
which can be seen as
- the proposition '
A
impliesB
' - the construction 'ways to convert
A
recipes toB
recipes' - internal hom of the category
Type u
To give examples of this, let's make some types first!
-- Here is how we define 'true'
data ⊤ : Type u where
trivial : ⊤
It reads '⊤
is an inductive type with a constructor trivial
',
with three interpretations
⊤
is a proposition and there is a proof of it, calledtrivial
.⊤
is a construction with a recipe calledtrivial
⊤
is a terminal object: every object has a morphism into⊤
given by· ↦ trivial
The above tells you how we make a term of type ⊤
,
let's see an example of using a term of type ⊤
:
TrueToTrue : ⊤ → ⊤
TrueToTrue = {!!}
- press
C-c C-l
(this meansCtrl-c Ctrl-l
) to load the document, and now you can fill the holes - navigate to the hole
{ }
usingC-c C-f
(forward) orC-c C-b
(backward) - press
C-c C-r
and agda will try to help you (r for refine) - you should see
λ x → { }
- navigate to the new hole
C-c C-,
to check the goal (C-c C-comma
)- the Goal area should look like
Goal: ⊤
—————————————————————————
x : ⊤
- you have a proof/recipe/generalized element
x : ⊤
and you need to give a p/r/g.e. of⊤
- you can give it a p/r/g.e. of
⊤
and pressC-c C-SPC
to fill the hole
There is more than one proof (see solutions) - are they the same? Here is an important one:
TrueToTrue' : ⊤ → ⊤
TrueToTrue' x = {!!}
- Naviagate to the hole and check the goal.
- Note
x
is already taken out for you. - You can try type
x
in the hole andC-c C-c
c
stands for 'cases onx
' and the only case istrivial
.
Built into the definition of ⊤
is agda's way of making a map out of ⊤
into another type A, which we have just used.
It says to map out of ⊤ it suffices to do the case when x
is trivial
, or
- the only proof of
⊤
istrivial
- the only recipe for
⊤
istrivial
- the only one generalized element
trivial
in⊤
-- Here is how we define 'false'
data ⊥ : Type u where
It reads '⊥
is an inductive type with no constructors',
with three interepretations
⊥
is a proposition with no proofs⊥
is a construction with no recipes- There are no generalized elements of
⊥
(it is a strict initial object)
Let's try mapping out of ⊥
.
explosion : ⊥ → ⊤
explosion x = {!!}
- Navigate to the hole and do cases on
x
.
Agda knows that there are no cases so there is nothing to do! This has three interpretations:
- false implies anything (principle of explosion)
- ?
⊥
is initial in the categoryType u
We can also encode "natural numbers" as a type.
data ℕ : Type where
zero : ℕ
suc : ℕ → ℕ
As a construction, this reads '
ℕ
is a type of constructionzero
is a recipe forℕ
suc
takes an existing recipe forℕ
and gives another recipe forℕ
. '
We can see ℕ
as a categorical notion:
ℕ is a natural numbers object in the category Type u
,
with zero : ⊤ → ℕ
and suc : ℕ → ℕ
such that
given any ⊤ → A → A
there exist a unique morphism ℕ → A
such that the diagram commutes:
This has no interpretation as a proposition since there are too many terms, since mathematicians classically didn't distinguish between proofs of the same thing. (ZFC doesn't even mention logic internally, unlike Type Theory!)
-}