簡體   English   中英

Agda:std-lib:列表:除了最后一個元素之外的所有元素與 snoc

[英]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 技能,所以這里有一些建議,從長遠來看,這些建議比以不正確的方式定義和證明隨機概念和屬性更有用:

  • 從你的定義和證明中退后一步
  • 如果它足夠簡單可以理解,請花一些時間來弄清楚證明可能是什么。
  • 嘗試理解 Agda 的基本機制,如大小寫,而不是更高級的機制,如相等推理。
  • 確保您不能通過對其輸入的簡單遞歸而不是更復雜/耗時的方式來證明您的引理。
  • 遵循一些您可以在網上找到的教程,其中大部分在以下 wiki 頁面中重新分組 https://agda.readthedocs.io/en/v2.6.0.1/getting-started/tutorial-list.html
  • 嘗試並理解(並可能自己復制)作為您在此處提出的問題的答案的證據,因為您的許多新問題實際上可以以類似的方式得到回答/解決。
  • 在定義數量時,嘗試盡可能簡單地定義它們,例如查看我的allButLast定義,而不是你的定義,它使用其他復雜的 function 而不是僅僅在其輸入上遞歸定義。
  • 通過編寫一些簡單的測試用例並使用CTRL-C CTRL-N評估它們,或者通過例如示例證明它們的一些非常簡單的屬性,確保您的定義確實符合您的意圖。 您之前對allButLast的定義(可以在您之前的問題中找到)實際上是列表上的身份 function ,因為您總是准確地返回輸入,通過一些測試和后退一步可以很容易地看到這一點。

總而言之,花點時間試着真正理解你在做什么,因為如果你不這樣做,你將無法在 Agda 中開發任何重要的東西。 我希望這些建議對您有所幫助,並且您不會誤以為是。 可能還有更多,但這是我可以直接想到的那些的簡要概述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM