Martin-Löf type theory
We present the intensional version of Martin-Löf type theory from 1986, see Nordström, Petersson, and Smith 1989. (It is not exactly the same theory since Agda has A -> B : Set provided A, B : Set, whereas this is not the case in Martin-Löf's logical framework.) Identifiers are similar to those in Martin-Löf's Bibliopolis book.
The empty set and the unit set:
module MLTT.Sets where
data N₀ : Set where
R₀ : {C : N₀ -> Set} -> (c : N₀) -> C c
R₀ ()
data N₁ : Set where
0₁ : N₁
R₁ : {C : N₁ -> Set} -> C 0₁ -> (c : N₁) -> C c
R₁ d 0₁ = d
In Martin-Löf's presentation there is a countable family of finite sets, but each of these can be defined as disjoint unions of unit sets.
The disjoint union (sum) of two sets:
data _+_ (A B : Set) : Set where
i : A -> A + B
j : B -> A + B
D : {A B : Set} -> {C : A + B -> Set}
-> ((a : A) -> C (i a)) -> ((b : B) -> C (j b)) -> (c : A + B) -> C c
D d e (i a) = d a
D d e (j b) = e b
The disjoint union of a family of sets:
data Σ (A : Set) (B : A -> Set) : Set where
_,_ : (a : A) -> B a -> Σ A B
E : {A : Set} -> {B : A -> Set} -> {C : Σ A B -> Set}
-> ((x : A) -> (y : B x) -> C (x , y))
-> (z : Σ A B) -> C z
E d (x , y) = d x y
In intensional type theory E (split) is not derivable from the projections, hence it is taken as a primitive.
data Π (A : Set) (B : A -> Set) : Set where
Λ : ((a : A) -> B a) -> Π A B
F : {A : Set} -> {B : A -> Set} -> {C : Π A B -> Set}
-> ((b : (x : A) -> B x) -> C (Λ b))
-> (z : Π A B) -> C z
F d (Λ b) = d b
In intensional type theory F (funsplit) is more general than application and hence taken as a primitive
In the Agda version of Martin-Löf type theory, the framework function space (x : A) -> B x more or less replaces Π A B.
The natural numbers:
data N : Set where
O : N
s : N -> N
R : {C : N -> Set} -> C O -> ((n : N) -> C n -> C (s n)) -> (c : N) -> C c
R d e O = d
R d e (s n) = e n (R d e n)
The well-orderings:
data W (A : Set) (B : A -> Set) : Set where
sup : (a : A) -> (b : B a -> W A B) -> W A B
wrec : {A : Set} -> {B : A -> Set} -> {C : W A B -> Set}
-> ((a : A) -> (b : B a -> W A B) -> ((x : B a) -> C (b x)) -> C (sup a b))
-> (c : W A B) -> C c
wrec {C = C} d (sup a b) = d a b (\x -> wrec {C = C} d (b x))
The identity set:
data I (A : Set) : A -> A -> Set where
r : {a : A} -> I A a a
J : {A : Set} -> {a b : A} -> {C : (x y : A) -> (z : I A x y) -> Set}
-> ({x : A} -> C x x r)
-> (c : I A a b) -> C a b c
J d r = d
The first universe a la Tarski:
mutual
data U : Set where
n₀ : U
n₁ : U
_⊕_ : U -> U -> U
σ : (a : U) -> (T a -> U) -> U
π : (a : U) -> (T a -> U) -> U
n : U
w : (a : U) -> (T a -> U) -> U
i : (a : U) -> T a -> T a -> U
T : U -> Set
T n₀ = N₀
T n₁ = N₁
T (a ⊕ b) = T a + T b
T (σ a b) = Σ (T a) (\x -> T (b x))
T (π a b) = Π (T a) (\x -> T (b x))
T n = N
T (w a b) = W (T a) (\x -> T (b x))
T (i a b c) = I (T a) b c
Note that this is a mutual inductive-recursive definition of U and T which is included in a mutual block.