Functional Programming, Formal Methods.
Nat type, by using dependent intersections. Then induction is derived for that type. Here is more or less how it goes: -- Simple Nats CNat : Set CNat = ∀ (P : *) -> ∀ (S : P -> P) -> ∀ (Z : P) -> P CSucc : CNat -> CNat CSucc = λn -> λP -> λS -> λZ -> S (n P S Z) CZero : CNat CZero = λP -> λS -> λZ