[英]Interacting in agda-mode with agda?
和 agda 交互感觉超级别扭。
考虑证明状态:
_ = begin
5 ∸ 3
≡⟨⟩
4 ∸ 2 ≡⟨⟩
3 ∸ 1 ≡⟨⟩
2 ∸ 0 ≡⟨⟩ { 2 <cursor-goes-here> }0
当我输入Cc Cl
( type-check
) 时,它说
?0 : 2 ∸ 0 ≡ _y_131
_y_131 : ℕ [ at /home/bollu/work/plfa/src/plfa/part1/Naturals.lagda.md:586,5-10 ]
这似乎不是一个很大的错误? refine
( Cc Cr
)也没有给我一个很好的错误信息:它只告诉我:
cannot refine
你已经完成了证明,除了缺少
\\qed
您的帖子以以下假设开始:
和 agda 交互感觉超级别扭。
可以解释你的感觉的原因是你似乎假设 Agda 可以推断出一个术语和它的类型,换句话说,你想要证明的属性和它的证明。 Agda 通常可以做到其中之一,但要求两者都没有多大意义。 作为比较,想象一下在公园的长凳上,当一个完全陌生的人走过来坐在你旁边,一言不发。 你可以看到他很乐意问你一些事情,但是,尽管你努力让他说话,他仍然保持沉默。 几分钟后,陌生人对你大喊大叫,尽管他口渴了,但你没有给他带来预期的饮料。 在这个比喻中,陌生人就是你,而你就是阿格达。 你不可能知道他渴了,更别提给他端酒了。
您提供了以下代码:
_ = begin
5 ∸ 3 ≡⟨⟩
4 ∸ 2 ≡⟨⟩
3 ∸ 1 ≡⟨⟩
2 ∸ 0 ≡⟨⟩ { 2 <cursor-goes-here> }0
这段代码缺少类型签名,可以让 Agda 为您提供更多帮助。 Agda 通过为您提供目标的推断类型来告诉您,当您键入 check 时:
?0 : 2 ∸ 0 ≡ _y_131
_y_131 : ℕ [ at /home/bollu/work/plfa/src/plfa/part1/Naturals.lagda.md:586,5-10 ]
这里 Agda 说你的证明目标是2 ∸ 0
等于某个未知的自然数y
。 这个数字是未知的,Agda 几乎没有机会帮助您进一步进行证明工作,因为它甚至不知道您想要证明什么。 据它所知,你的目标可能是5 ∸ 3 ≡ 3
因为希望不存在证明项。
回到我们的比喻,你缺少“我口渴”这句话。 如果陌生人提供了这条信息,您可能会做出反应,这意味着 Agda 可以尝试提供帮助。
我假设您希望证明减法的结果是 2,在这种情况下,代码如下:
test : 5 ∸ 3 ≡ 2
test = begin
5 ∸ 3 ≡⟨⟩
4 ∸ 2 ≡⟨⟩
3 ∸ 1 ≡⟨⟩
2 ∸ 0 ≡⟨⟩ {!!}
在这种情况下,您可以通过多种方式与 Agda 进行交互,所有这些都导致 Agda 为您提供了一个隔音术语:
您可以调用 Agsy 为您解决问题(CTRL-c CTRL-a),这会导致:
test : 5 ∸ 3 ≡ 2
test = begin
5 ∸ 3 ≡⟨⟩
4 ∸ 2 ≡⟨⟩
3 ∸ 1 ≡⟨⟩
2 ∸ 0 ≡⟨⟩ refl
您可以尝试直接优化目标(CTRL-c CTRL-r),询问 Agda 是否存在任何具有正确类型的唯一构造函数,这会导致相同的结果:
test : 5 ∸ 3 ≡ 2
test = begin
5 ∸ 3 ≡⟨⟩
4 ∸ 2 ≡⟨⟩
3 ∸ 1 ≡⟨⟩
2 ∸ 0 ≡⟨⟩ refl
如果您想使用 \\qed 结束您的证明,您可以尝试将_∎
输入到孔中,然后精炼 (CTRL-c CTRL-r) 给出:
test : 5 ∸ 3 ≡ 2
test = begin
5 ∸ 3 ≡⟨⟩
4 ∸ 2 ≡⟨⟩
3 ∸ 1 ≡⟨⟩
2 ∸ 0 ≡⟨⟩ {!!} ∎
在结果目标中调用 Agsy 自然会给出:
test : 5 ∸ 3 ≡ 2
test = begin
5 ∸ 3 ≡⟨⟩
4 ∸ 2 ≡⟨⟩
3 ∸ 1 ≡⟨⟩
2 ∸ 0 ≡⟨⟩ 2 ∎
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.