证明列表L ++ []≡L的命题

时间:2017-04-22 06:28:45

标签: agda

使用agda标准库(v13)

如何填补下一个洞?

$ cat foo.aga
open import Data.List using
  ( List ; [] ; _∷_ ; _++_ ; [_] )
open import Relation.Binary.PropositionalEquality
  using ( _≡_; refl; cong; trans; sym)

p : ∀ {A : Set} {L : List A} → L ++ [] ≡ L
p = {!!}
宝贝的步骤:

p0 : (x : Prop) → ([ x ]) ++ [] ≡ [ x ]
p0 = λ x → refl

p1 : (x y : Prop) → (x ∷ y ∷ []) ++ [] ≡ x ∷ y ∷ []
p1 = λ x y → refl

在洞中,为什么不工作?它是由于∷第一个论证的结构递归所致?

我认为做一些递归我可以证明p看p0和p1,但此时此刻,我都没有看到它。

2 个答案:

答案 0 :(得分:2)

您需要了解export interface InsertOneWriteOpResult { insertedCount: number; ops: Array<any>; insertedId: ObjectID; connection: any; result: { ok: number, n: number } } 的定义方式。使用此处的定义:http://www.cse.chalmers.se/~nad/repos/lib/src/Data/List.agda Agda能够得出结论_++_适用于refl

对于p0,根据p0的定义[ x ] == x :: [][_]的{​​{1}}和(x :: []) ++ [] == x :: ([] ++ [])的{​​{1}}很容易看到_++_ {1}} [] ++ [] == []的第二种情况。

案例_++_已经需要通过归纳进行推理,因为最终你需要通过归纳证明,你不会通过单独证明p1来获得任何东西。

案例p1包含p构造函数List_::_的未知嵌套,以及来自[]的案例的非平凡应用。< / p>

为了通过归纳为此问题构建证据,您需要了解如何应用_++_来证明有关较短列表的语句中有关较长列表的陈述。

答案 1 :(得分:1)

你应该做的是隐式参数{L}上的模式匹配,这样你就可以为空和缺点列表逐个定义p

p : ∀ {A : Set} {L : List A} → L ++ [] ≡ L
p {L = []} = ?
p {L = x ∷ L} = ?

第一个洞的类型是

Goal: [] ≡ []

你应该能够轻松证明。

第二个洞的类型是

Goal: x ∷ L ++ [] ≡ x ∷ L

通过在现在较小的p上递归调用L,我们可以重写该目标(因为p {L = L}证明L ++ [] ≡ L,我们可以替换L ++ []在左侧只有L):

p : ∀ {A : Set} {L : List A} → L ++ [] ≡ L
p {L = []} = ?
p {L = x ∷ L} rewrite p {L = L} = ?

Goal: x ∷ L ≡ x ∷ L

如果您需要任何进一步的帮助,请在评论中告诉我。