Functional Programming, Formal Methods.
rough way, it can be seen as a dependent intersection compressed to avoid code replication. Then, each number gets an unique type; for example, Zero : Nat Zero, Succ Zero : Nat (Succ Zero), and so on. But that is fine, because we can accept all of them in a λ (n : Nat n) -> ... function, so, those