将nil附加到精益

时间:2017-07-20 11:13:40

标签: proof dependent-type lean

假设以下定义:

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),现在我被卡住了。

0 个答案:

没有答案