nat

-- Natural-number addition and multiplication (both recursing on the
-- second argument) and their basic equational theory. The operators
-- ARE the definitions' names (docs/NovaElaboration.txt).
infixl 6 +
def + :       λx. λy. ℕ-elim (n. _) x (n ih. S ih) y
infixl 7 *
def * :       λx. λy. ℕ-elim (n. _) Z (n ih. x + ih) y

def plusZeroId : (n : )  n + Z  n  _  λn. 
def plusSucId : (n : ) (m : )  n + S m  S (n + m)  _  λn. λm. 
def zeroPlusId : (n : )  Z + n  n    λn. ℕ-elim (k. Z + k  k  _)  (k ih. ) n
def sucPlus : (n : ) (m : )  S n + m  S (n + m)    λn. λm. ℕ-elim (k. S n + k  S (n + k)  _)  (k ih. ) m
def plusComm : (n : ) (m : )  m + n  n + m    λn. λm. ℕ-elim (k. k + n  n + k  _)  (k ih. ) m
def plusAssoc : (n : ) (m : ) (k : )  n + m + k  n + (m + k)  _ 
  λn. λm. λk. ℕ-elim (j. n + m + j  n + (m + j)  _)  (j ih. ) k

-- a + (b + c) ≡ b + (a + c) — permutative, used by whole-equation match
def swapLeft : (a : ) (b : ) (c : )  a + (b + c)  b + (a + c)  _ 
  λa. λb. λc. ℕ-elim (k. a + (b + k)  b + (a + k)  _)  (k ih. ) c

def multZeroId : (n : )  n * Z  Z  _  λn. 
def multSucId : (n : ) (m : )  n * S m  n + n * m  _  λn. λm. 
def zeroMult : (n : )  Z * n  Z    λn. ℕ-elim (k. Z * k  Z  _)  (k ih. ) n
def sucMult : (n : ) (m : )  S n * m  m + n * m  _ 
  λn. λm. ℕ-elim (k. S n * k  k + n * k  _)  (k ih. ) m
def multComm : (n : ) (m : )  m * n  n * m  _ 
  λn. λm. ℕ-elim (k. k * n  n * k  _)  (k ih. ) m
def multDistrib : (n : ) (m : ) (k : )  n * (m + k)  n * m + n * k  _ 
  λn. λm. λk. ℕ-elim (j. n * (m + j)  n * m + n * j  _)  (j ih. ) k
def multAssoc : (n : ) (m : ) (k : )  n * m * k  n * (m * k)  _ 
  λn. λm. λk. ℕ-elim (j. n * m * j  n * (m * j)  _)  (j ih. ) k