在 agda 模式下与 agda 交互?

Interacting in agda-mode with agda?

和agda交互感觉超级尴尬

考虑证明状态:

_ = begin
  5 ∸ 3
  ≡⟨⟩
   4 ∸ 2 ≡⟨⟩
   3 ∸ 1 ≡⟨⟩
   2 ∸ 0 ≡⟨⟩  { 2 <cursor-goes-here> }0

当我输入 C-c C-l (type-check) 时,它显示

?0 : 2 ∸ 0 ≡ _y_131
_y_131 : ℕ  [ at /home/bollu/work/plfa/src/plfa/part1/Naturals.lagda.md:586,5-10 ]

哪个看起来不是很大的错误? refine (C-c C-r) 也没有给我一个很好的错误信息:它只告诉我:

cannot refine
  1. 如何让 adga 告诉我:

You've finished the proof, except for a missing \qed

  1. 一般来说,构建证明时“首选交互模式”是什么?

整体问题

您的 post 由以下假设开始:

It feels super awkward to interact with agda.

可以解释你的感觉的原因是你似乎假设 Agda 可以推断出一个术语 它的类型,换句话说, 属性你想证明并证明它。 Agda 通常可以做到其中之一,但要求两者都没有多大意义。作为比较,想象一下在公园的长椅上,一个完全陌生的人走过来坐在你旁边,一言不发。你可以看出他很乐意问你一些事情,但是,尽管你努力让他说话,他仍然保持沉默。几分钟后,陌生人对你大喊大叫,尽管他口渴,但你没有给他带来他期望的饮料。在这个比喻中,陌生人就是你,而你就是 Agda。你不可能知道他口渴,更不会给他送水。

具体

您提供了以下代码:

_ = begin
  5 ∸ 3 ≡⟨⟩
  4 ∸ 2 ≡⟨⟩
  3 ∸ 1 ≡⟨⟩
  2 ∸ 0 ≡⟨⟩  { 2 <cursor-goes-here> }0

这段代码缺少类型签名,这将允许 Agda 为您提供更多帮助。当你输入 check 时,Agda 通过为你提供目标的推断类型来告诉你:

?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 可以尝试提供帮助。

解决方案

我假设你想证明减法的结果是二,在这种情况下代码如下:

test : 5 ∸ 3 ≡ 2
test = begin
  5 ∸ 3 ≡⟨⟩
  4 ∸ 2 ≡⟨⟩
  3 ∸ 1 ≡⟨⟩
  2 ∸ 0 ≡⟨⟩ {!!}

在这种情况下,您可以通过多种方式与 Agda 进行交互,这都会导致 Agda 为您提供一个可靠的术语:

您可以致电Agsy为您解决问题(CTRL-cCTRL-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 ∎