Bool
setConsider the definition of Bool
with two elements, true
and false
:
data Bool : Set where true : Bool false : Bool
Interpretation:
Bool
is a Set
.true
is a Bool
.false
is a Bool
.Bool
.true
and false
are different values.It is due to last two points that the syntax of the definition does not look like that:
Bool : Set
true : Bool
false : Bool
Note that:
The data
and the where
are keywords.
The Set
is the set of sets (a constant).
The ':' is pronounced "is a" or "type of", it has similar rule as '∈' in set theory. We do not use the '∈' symbol because ':' and '∈' have different meanings which will be discussed in details later.
Indentation matters.
Spaces matter.
We call true
and false
constructors of the data type Bool
(more explanation on constructors will come later).
Define a set named Answer
with only three elements: yes
, no
, and maybe
.
Define a set named Direction
with only four elements: east
, west
, north
, and south
.
Consider the following definition of Bool'
:
data Bool' : Set where true' : Bool' false' : Bool'
Are Bool
and Bool'
the same sets?
If not, which one is the "real" set of Booleans?
Bool
and Bool'
are definitionally different but they are isomorphic.
Interpretation (or meaning) is the opposite relation to representation.
Bool
is the set of Boolean values.Bool
.Bool'
.We can define finite sets with elements.
The special case with is the empty set:
data ⊥ : Set where -- Note that there is no constructor at all.
The special case with is the singleton set (a set with one element):
data ⊤ : Set where tt : ⊤
⊥
and ⊤
have interesting interpretations as we will see.
Basic differences between types and sets:
The type of an element is unique ↔ an element can be member of different sets. E.g. true
cannot be the element of two different types at the same time.
A type is not just the collection of its elements ↔ a set is characterized by its elements. E.g. there are different empty types.
Thus data
defines types, not sets.
We prefer types over sets for several reasons.
From now on, we use both terms "type" and "set" for types. We use the term "element" for types too.
Set
is the type of types, so it should be called Type
. However, Agda 2.3.2 and before (and probably after too) calls it Set
.
Agda makes it possible to give the same name to the constructors of different types -- but only if each constructor application remains unambiguous that way.
If we have multiple elements of the same type, it is possible to define them in one line:
data name : Set where elem₁ elem₂ : name