[英]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.