Functional Programming, Formal Methods.
is no term of type: ∀ (P : Nat -> Set) -> ∀ (S : (n : Nat) -> P n -> P (Succ n)) -> ∀ (Z : P Zero) -> ∀ (n : Nat) -> P n (I’m using Morte's Church-style syntax because it is familiar.) In other words, no matter what “smart” encoding of Nat, Succ, Zero you develop, you’ll never have a term of that