[英]Agda - Building proofs interactively - How to use the hole syntax?
对不起,奇怪的标题,我不知道这些概念实际上是如何命名的。
我正在关注Agda
教程,其中有一节解释了如何以归纳方式构建证明:https://plfa.github.io/Induction/#building-proofs-interactively
您可以逐步扩展您的证明并让孔(此{ }0
)更新其内容以告诉您发生了什么,这非常酷。 但是,仅说明了在使用rewrite
语法时如何执行此操作。
当我想“手动”在begin
块中进行证明时,这是如何工作的,例如:
+-assoc : ∀ (m n p : ℕ) → (m + n) + p ≡ m + (n + p)
+-assoc zero n p =
begin
(zero + n) + p
≡⟨⟩ n + p
≡⟨⟩ zero + (n + p)
∎
+-assoc (suc m) n p =
begin
(suc m + n) + p
≡⟨⟩ suc (m + n) + p
≡⟨⟩ suc ((m + n) + p)
≡⟨ cong suc (+-assoc m n p) ⟩
suc (m + (n + p))
≡⟨⟩ suc m + (n + p)
∎
问题如下。 让我们从命题和证据开始:
+-assoc : ∀ (m n p : ℕ) → (m + n) + p ≡ m + (n + p)
+-assoc m n p = ?
这评估为:
+-assoc : ∀ (m n p : ℕ) → (m + n) + p ≡ m + (n + p)
+-assoc m n p = { }0
在这种情况下,我想通过归纳来证明,所以我使用Cc Cc
使用变量m
拆分这些:
+-assoc : ∀ (m n p : ℕ) → (m + n) + p ≡ m + (n + p)
+-assoc zero n p = { }0
+-assoc (suc m) n p = { }1
基本情况是微不足道的,在使用Cc Cr
解决后被refl
替换。 但是,感应案例(孔 1)需要一些工作。 我怎样才能把这个{ }1
洞变成下面的结构来做证明:
begin
-- my proof
∎
我的编辑器(spacemacs)说{ }1
是只读的。 我不能删除它,只能在大括号之间插入东西。 我可以强制删除它,但这显然不是故意的。
你应该怎么做才能把洞扩大成一个begin
块? 像这样的东西
{ begin }1
不起作用并导致错误消息
谢谢!
编辑:
好的,所以以下似乎有效:
{ begin ? }1
这变成了这样:
+-assoc : ∀ (m n p : ℕ) → (m + n) + p ≡ m + (n + p)
+-assoc zero n p = refl
+-assoc (suc m) n p = begin { }0
这是一个进步:D。 但现在我不知道在哪里放置证明的实际步骤:
...
+-assoc (suc m) n p = begin (suc m + n) + p { }0
-- or
+-assoc (suc m) n p = begin { (suc m + n) + p }0
似乎都没有工作
{ }1
是只读的
此消息在两种情况下显示:
一条经验法则是,您始终使用Cc C-SPC
用等于目标类型的表达式来细化一个洞。 在您的情况下,这意味着从begin?
,然后给出(suc m + n) + p ≡⟨⟩?
等等。
有两种方法可以细化孔:
Cc Cr
:当给定 function 时为您创建新孔。 例如,使用此设置:
test: Bool test = {!!}
如果你not
洞里打字
test: Bool test = {!not!}
并精炼,你会得到
test: Bool test = not {!!}
即为参数自动创建新孔。
通过这种方式或改进一个洞,Agda 也会按照它喜欢的方式重新格式化你的代码,我不喜欢这种方式,所以我通常不使用它。
Cc C-SPC
:不会为 arguments 创建新的孔,也不会重新格式化您的代码
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.