inductive nat : Type :=
| zero : nat
| succ : nat → nat

inductive list (A : Type) : Type :=
| nil {} : list A
| cons   : A → list A → list A

inductive int : Type :=
| of_nat : nat → int
| neg : nat → int

coercion of_nat

variables n m : nat
variables i j : int
variable l : list nat

check cons i (cons i nil)
check cons n (cons n nil)
check cons i (cons n nil)
check cons n (cons i nil)
check cons n (cons i (cons m (cons j nil)))