test(tests/lean/run): fibonacci using below_rec_on (aka brec_on)
This commit is contained in:
parent
1b6e40d3d6
commit
aef1dd9a04
1 changed files with 42 additions and 0 deletions
42
tests/lean/run/fib_brec.lean
Normal file
42
tests/lean/run/fib_brec.lean
Normal file
|
@ -0,0 +1,42 @@
|
|||
import data.nat.basic data.prod
|
||||
open prod
|
||||
|
||||
namespace nat
|
||||
definition below.{l} {C : nat → Type.{l}} (n : nat) :=
|
||||
rec_on n unit.{max 1 l} (λ (n₁ : nat) (r₁ : Type.{max 1 l}), C n₁ × r₁)
|
||||
|
||||
definition brec_on {C : nat → Type} (n : nat) (F : Π (n : nat), @below C n → C n) : C n :=
|
||||
have general : C n × @below C n, from
|
||||
rec_on n
|
||||
(pair (F zero unit.star) unit.star)
|
||||
(λ (n₁ : nat) (r₁ : C n₁ × @below C n₁),
|
||||
have b : @below C (succ n₁), from
|
||||
r₁,
|
||||
have c : C (succ n₁), from
|
||||
F (succ n₁) b,
|
||||
pair c b),
|
||||
pr₁ general
|
||||
|
||||
definition fib (n : nat) :=
|
||||
brec_on n (λ (n : nat),
|
||||
cases_on n
|
||||
(λ (b₀ : below zero), succ zero)
|
||||
(λ (n₁ : nat), cases_on n₁
|
||||
(λ b₁ : below (succ zero), succ zero)
|
||||
(λ (n₂ : nat) (b₂ : below (succ (succ n₂))), pr₁ b₂ + pr₁ (pr₂ b₂))))
|
||||
|
||||
theorem fib_0 : fib 0 = 1 :=
|
||||
rfl
|
||||
|
||||
theorem fib_1 : fib 1 = 1 :=
|
||||
rfl
|
||||
|
||||
theorem fib_s_s (n : nat) : fib (succ (succ n)) = fib (succ n) + fib n :=
|
||||
rfl
|
||||
|
||||
example : fib 5 = 8 :=
|
||||
rfl
|
||||
|
||||
example : fib 9 = 55 :=
|
||||
rfl
|
||||
end nat
|
Loading…
Reference in a new issue