簡體   English   中英

Agda: std-lib: List: 檢查過濾后的列表是否為空

[英]Agda: std-lib: List: check that a filtered list is empty

我有一個 function filter'

filter' : {A : Set} → (A → Bool) → List A → List A
filter' p []               = l.[]
filter' p (x ∷ xs) with (p x)
...                | true  = x l.∷ filter' p xs
...                | false = filter' p xs

和一個 function DeleteNat

DeleteNat : (List ℕ) → ℕ → (List ℕ)
DeleteNat nats id = filter' (λ n → not (n ≡ᵇ id)) nats

其中_≡ᵇ_是:

open import Agda.Builtin.Nat public
  using () renaming (_==_ to _≡ᵇ_)

並想表明在應用DeleteNat后,沒有自然數等於List中的 id :

DeleteNatRemoveNatWithId :
  (nats : List ℕ) (id : ℕ) →
    filter' (λ n → n ≡ᵇ id) (DeleteNat nats id) ≡ l.[]
DeleteNatRemoveNatWithId []       id         = refl
DeleteNatRemoveNatWithId (x ∷ xs) id with x ≡ᵇ id
...                                  | true  = DeleteNatRemoveNatWithId xs id
...                                  | false = {!  !}

我不確定如何在{! !} {! !} . 我有一種預感,應該使用cong來完成。

使用Cc C-. 我看到我需要滿足這種類型:

(filter' (λ n → n ≡ᵇ id) (x List.∷ filter' (λ n → not (n ≡ᵇ id)) xs) | x ≡ᵇ id) ≡ List.[]

我想我需要一種方法來以某種方式將x List.∷放入第一個filter'的第二個參數中。

我能得到關於如何在這里推進的提示嗎? 我關於使用cong的假設是錯誤的嗎?

filter'... (x ∷ filter'... xs) | x ≡ᵇ id) filter'... (x ∷ filter'... xs) | x ≡ᵇ id)表示這個 function 的評估卡在測試x ≡ᵇ id上。

要減少它,您通常會使用with x ≡ᵇ id 但是您已經這樣做了,是的,但是您with的目標是當時卡住的內部filter 一旦它解開,它的計算量足以發出x ∷ _並且外部filter卡在第二個測試上(恰好等於第一個)。

處理這個問題的慣用方法是通過inspect習語,它允許你在一個單一with中,不僅得到x ≡ᵇ id的結果,而且得到結果是從這個表達式計算的證明。 一旦到達外部filter卡住的點,您可以簡單地用這個方程rewrite ,然后您應該能夠看到 function 的計算剛好足以調用歸納假設。

暫無
暫無

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

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