假设以下定义:
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
插入定义中。另外,请记住,精益中的rhs定义了add / +
。 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
的归纳,证据的概念是微不足道的。基本情况紧接着定义,递归情况应该立即从归纳假设和定义开始,但我不能说服精益。
begin
intros n v,
induction v,
-- base case
refl,
-- inductive case
end
我从精益中获得的归纳假设是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)
,现在我被卡住了。