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