使用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,但此时此刻,我都没有看到它。
答案 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
如果您需要任何进一步的帮助,请在评论中告诉我。