陶哲轩也在用的数学证明验证工具lean,来一探究竟
还有视频讲解哦:https://www.bilibili.com/medialist/detail/ml93640165?type=1&spm_id_from=333.999.0.0
import Mathlib.Data.Real.Sqrt
-- 十八世纪六十年代 2016 2022年11月30日 lean4
-- 斐波拉契数列通项公式
open Real -- 把前缀省略
-- #check (sqrt 2:ℝ )
-- 数学归纳法:二步归纳
namespace Nat
open Lean Elab Term Meta
def two_step_induction -- 名称
{P : ℕ → Sort*} --条件若干
(zero : P 0)
(one : P 1)
(step : ∀ (k : ℕ), (IH0 : P k) → (IH1 : P (k + 1)) → P (k + 2))
(n : ℕ)
: P n -- 命题具体描述(或理解成 :意思是属于某一个集合)
:= by --证明过程(策略模式:给出大boss,goal,给一些策略作用到它上面,直到他粉碎为止)
induction n using Nat.strongRec with
| ind n ih =>
rcases n with _|n
· exact zero
rcases n with _|n
· exact one
apply step
· apply ih; linarith
· apply ih; linarith
done --命题得证
end Nat
noncomputable section
def fib : ℕ → ℕ --(理解成映射;数列;函数)
| 0 => 0
| 1 => 1 -- 1,1,2,3,5,8,13...
| n + 2 => (fib (n+1)) + (fib n)
#eval (fib 7) --13
def ϕ : ℝ := (1 + sqrt 5)/2
def ψ : ℝ := (1 - sqrt 5)/2
@[simp]
lemma ϕ_sub_ψ_ne_zero : ϕ - ψ ≠ 0
:= by
rw [ϕ]
rw [ψ]
simp only [ne_eq]
simp [sub_eq_zero]
rw [sub_eq_add_neg]
field_simp --通分
simp only [eq_neg_self_iff]
norm_num -- 不等号的简单证明
done
@[simp]
lemma ϕ_sq : ϕ ^ 2 = ϕ + 1 := by
simp [ϕ]
simp [add_sq]
field_simp
ring -- 等号的简单证明
done
@[simp]
lemma ψ_sq : ψ ^ 2 = ψ + 1 := by
simp [ψ]
simp [sub_sq]
field_simp
ring
done
lemma coe_fib_eq (n : ℕ)
: ((fib n) : ℝ) = (ϕ ^ n - ψ ^ n) / (ϕ - ψ)
:= by
induction n using Nat.two_step_induction
case zero =>
simp only [pow_zero]
simp only [sub_self]
simp only [zero_div]
simp [fib]
done
-- simp only [Nat.cast_eq_zero]
case one =>
simp only [pow_one]
simp [fib]
done
case step k ih1 ih2 =>
simp [fib]
rw [ih1]
rw [ih2]
field_simp
simp [pow_add]
set a₁ := ψ ^ k
set a₂ := ϕ ^ k
rw [add_sub,mul_add,mul_add]
rw[← sub_sub]
repeat rw [mul_one]
rw [sub_left_inj]
have aaa1 := (sub_add_eq_add_sub (a₂ * ϕ) (a₁ * ψ) a₂)
-- exact (sub_add_eq_add_sub (a₂ * ϕ) (a₁ * ψ) a₂)
exact aaa1
done
-- 基于有限的几个公理,可以推出高深的数学。
end