What's the difference between `Set`

and `Type`

?

I mean, I see that `Set:Type`

and that there type universes (that's what it's called, right) like `Typeᵢ:Typeᵢ₊₁`

.

But can `Set`

do anything that `Type`

can't do?

Or is `Set`

a relic from older coq versions or something?

I was trying

```
Inductive nat': Type :=
| O' : nat'
| S' : nat' -> nat'.
```

and then upon doing

```
Check nat'.
(*
nat'
: Set
*)
```

Though I explicitly asked for `nat'`

to be of type `Type`

, it turned out to be of type `Set`

.

Why is this happening?

(This is probably which has been asked numerous time, but I couldn't find an answer.)

One way to look at it is to identify `Set`

with `Type_0`

. For readability and performance, writing `Set`

is better, but you lose some uniformity with respect to always writing `Type`

.

`Set`

is `Type_0`

it is not strictly necessary but it's more efficient than having bunches of floating universes for things like nat

(it is also used for -impredicative-set but most people don't care about that)

very confusingly `: ... -> Type`

(with possibly empty `... ->`

) for inductive types has the special meaning of "try to find the smallest universe this inductive fits in", so for instance `Inductive empty : Type := . Check empty. (* empty : Prop *)`

if you want to force an inductive to be in Type you can use either an explicit annotation or an indirection:

```
(* the + means you allow for there to be more universes used, in this case there are none
when there are some and you don't use + you get the "unbound universe" error *)
Inductive nat'@{i +} : Type@{i} :=
| O' : nat'
| S' : nat' -> nat'.
Check nat'.
(* nat' : Type *)
(* alternatively *)
Definition typ := Type.
Inductive nat' : typ :=
| O' : nat'
| S' : nat' -> nat'.
```

See also https://proofassistants.stackexchange.com/questions/1551/why-not-have-prop-set-in-coq/1552#1552 for a bit of historical background

My general approach is to always use `Set`

until I discover that moment when my development needs `Type`

, because it's helpful to see when that happens and why.

Last updated: Sep 28 2023 at 11:01 UTC