假设以下定义:
def app {α : Type} : Π{m n : ℕ}, vector α m → vector α n → vector α (n + m)
| 0 _ [] v := by simp [add_zero]; assumption
| (nat.succ _) _ (h :: t) v' := begin apply vector.cons,
exact h,
apply app t v'
end
请注意(n + m)
在定义中翻转,以免插入add_symm
定义。另外,请记住,这add / +
是在精益中的 rhs 上定义的。vector
是一个手工滚动的 nil / cons 定义的长度索引列表。
所以无论如何,首先我们有一个引理,它从定义中得出:
theorem nil_app_v {α : Type} : ∀{n : ℕ} (v : vector α n),
v = [] ++ v := assume n v, rfl
现在我们有一个不符合定义的引理,因此我用eq.rec
它来制定它。
theorem app_nil_v {α : Type} : ∀{n : ℕ} (v : vector α n),
v = eq.rec (v ++ []) (zero_add n)
请注意,这eq.rec
只是C y → Π {a : X}, y = a → C a
.
通过对 的归纳,证明的想法是微不足道的v
。基本案例紧随定义,递归案例应紧随归纳假设和定义,但我无法说服 Lean 相信这一点。
begin
intros n v,
induction v,
-- base case
refl,
-- inductive case
end
我从 Lean 得到的归纳假设是a_1 = eq.rec (a_1 ++ vector.nil) (zero_add n_1)
.
我如何将它与结论一起使用a :: a_1 = eq.rec (a :: a_1 ++ vector.nil) (zero_add (nat.succ n_1))
?我可以unfold app
将术语减少a :: a_1 ++ vector.nil
到a :: (a_1 ++ vector.nil)
,现在我被卡住了。