feat(builtin/num): define fact and exp

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
Leonardo de Moura 2014-02-12 09:38:58 -08:00
parent 368fcb5ff9
commit 45a0dbcc34
2 changed files with 28 additions and 3 deletions

View file

@ -175,7 +175,12 @@ theorem not_lt_zero (n : num) : ¬ (n < zero)
add_rewrite not_lt_zero
theorem zero_lt_succ_zero : zero < succ zero
definition one := succ zero
theorem one_eq_succ_zero : one = succ zero
:= refl one
theorem zero_lt_one : zero < one
:= let P : num → Bool := λ x, x = zero
in have Ppred : ∀ i, P (succ i) → P i,
from take i, assume Ps : P (succ i),
@ -232,7 +237,7 @@ theorem lt_to_lt_succ {m n : num} : m < n → m < succ n
theorem n_lt_succ_n (n : num) : n < succ n
:= induction_on n
zero_lt_succ_zero
(show zero < succ zero, from zero_lt_one)
(λ (n : num) (iH : n < succ n),
succ_mono_lt iH)
@ -252,7 +257,7 @@ theorem eq_to_not_lt {m n : num} : m = n → ¬ (m < n)
theorem zero_lt_succ_n {n : num} : zero < succ n
:= induction_on n
zero_lt_succ_zero
(show zero < succ zero, from zero_lt_one)
(λ (n : num) (iH : zero < succ n),
lt_to_lt_succ iH)
@ -681,6 +686,26 @@ theorem strong_induction {P : num → Bool} (H : ∀ n, (∀ m, m < n → P m)
show P a,
from and_eliml stronger
definition fact (a : num) : num
:= prim_rec one (λ x n, n * x) a
theorem fact_zero : fact zero = one
:= prim_rec_zero one (λ x n : num, n * x)
theorem fact_succ (n : num) : fact (succ n) = n * fact n
:= prim_rec_succ one (λ x n : num, n * x) n
definition exp (a b : num) : num
:= prim_rec one (λ x n, a * x) b
theorem exp_zero (a : num) : exp a zero = one
:= prim_rec_zero one (λ x n, a * x)
theorem exp_succ (a b : num) : exp a (succ b) = a * (exp a b)
:= prim_rec_succ one (λ x n, a * x) b
set_opaque fact true
set_opaque exp true
end
definition num := num::num

Binary file not shown.