[英]Agda: std-lib: List: all but last element with snoc
我以這種方式定義allButLast
:
allButLast : ∀ {a} {A : Set a} → List A → List A
allButLast l.[] = l.[]
allButLast list = l.reverse (tail' (l.reverse list))
並想證明以下陳述:
allButLast-∷ʳ :
∀ {a} {A : Set a} →
(list : List A) →
(y : A) →
allButLast (list ∷ʳ y) ≡ list
allButLast-∷ʳ [] y = refl
allButLast-∷ʳ (x ∷ []) y = refl
allButLast-∷ʳ (x ∷ xs) y =
begin
allButLast ((x ∷ xs) ++ [ y ])
≡⟨⟩
reverse (tail' (reverse ((x ∷ xs) ∷ʳ y)))
≡⟨ ? ⟩
reverse (tail' (y ∷ reverse (x ∷ xs)))
≡⟨⟩
reverse (reverse (x ∷ xs))
≡⟨ reverse-involutive (x ∷ xs) ⟩
(x ∷ xs)
∎
我需要在哪里找到要替換的東西?
和。
我定義:
reverse-∷ʳ :
∀ {a} {A : Set a} →
(list : List A) →
(n : A) →
reverse (list ∷ʳ n) ≡ n ∷ reverse list
我能夠證明這一點。
我想用它作為reverse-∷ʳ (x ∷ xs) y
來替換?
但是,我收到以下錯誤:
x ∷ [] != [] of type List A
when checking that the expression reverse-∷ʳ (x ∷ xs) y has type
reverse (tail' (reverse ((x ∷ xs) ∷ʳ y))) ≡
reverse (tail' (y ∷ reverse (x ∷ xs)))
我不確定如何解釋它。 這是因為我在應用reverse-∷ʳ (x ∷ xs) y
時沒有涵蓋案例x ∷ []
嗎?
我建議以下解決方案:
allButLast : ∀ {a} {A : Set a} → List A → List A
allButLast [] = []
allButLast (_ ∷ []) = []
allButLast (x ∷ x₁ ∷ l) = x ∷ (allButLast (x₁ ∷ l))
allButLast-∷ʳ : ∀ {a} {A : Set a} {l : List A} {x} → allButLast (l ∷ʳ x) ≡ l
allButLast-∷ʳ {l = []} = refl
allButLast-∷ʳ {l = _ ∷ []} = refl
allButLast-∷ʳ {l = x ∷ x₁ ∷ l} = cong (x ∷_) (allButLast-∷ʳ {l = x₁ ∷ l})
一段時間以來,您在#Agda 中問了很多問題,這完全沒問題。 但是,不要采取錯誤的方式,您絕對應該嘗試了解您在做什么,而不是一次又一次地問類似的問題。 在我看來,您似乎不太了解如何在 Agda 中編寫定義或證明,僅僅是因為您沒有花足夠的時間來嘗試了解所有這些是如何工作的。 例如,您的先例問題表明您還不太了解函數和構造函數之間的區別,以及模式匹配。 此外,您總是嘗試使用鏈式等式來證明您的目標,即使在大多數情況下,對您正在處理的數據(主要是列表和向量)進行簡單的案例拆分就足以解決您的問題。 你傾向於把事情復雜化,相信我,這不是你在 Agda 或其他證明助手中開發時想要做的,因為證明本身很快就會變得非常復雜。 我可以看到您渴望學習和提高您的 Agda 技能,所以這里有一些建議,從長遠來看,這些建議比以不正確的方式定義和證明隨機概念和屬性更有用:
allButLast
定義,而不是你的定義,它使用其他復雜的 function 而不是僅僅在其輸入上遞歸定義。CTRL-C CTRL-N
評估它們,或者通過例如示例證明它們的一些非常簡單的屬性,確保您的定義確實符合您的意圖。 您之前對allButLast
的定義(可以在您之前的問題中找到)實際上是列表上的身份 function ,因為您總是准確地返回輸入,通過一些測試和后退一步可以很容易地看到這一點。總而言之,花點時間試着真正理解你在做什么,因為如果你不這樣做,你將無法在 Agda 中開發任何重要的東西。 我希望這些建議對您有所幫助,並且您不會誤以為是。 可能還有更多,但這是我可以直接想到的那些的簡要概述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.