I have a 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
and a function DeleteNat:
DeleteNat : (List ℕ) → ℕ → (List ℕ)
DeleteNat nats id = filter' (λ n → not (n ≡ᵇ id)) nats
where _≡ᵇ_ is:
open import Agda.Builtin.Nat public
using () renaming (_==_ to _≡ᵇ_)
and would like to show that after applying DeleteNat, there remains no natural number equal to the id in the List:
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 = {! !}
I'm unsure how to continue at {! !}. I get a hunch that it should be done using cong.
Using C-c C-. I see that I need to satisfy this type:
(filter' (λ n → n ≡ᵇ id) (x List.∷ filter' (λ n → not (n ≡ᵇ id)) xs) | x ≡ᵇ id) ≡ List.[]
I guess I need a way to somehow get the x List.∷ into the second argument of the first filter'.
Could I get a hint as to how to advance here? Is my assumption about using cong wrong?
filter' ... (x ∷ filter' ... xs) | x ≡ᵇ id)means that the evaluation of this function is stuck on the testx ≡ᵇ id.To have it reduce, you would typically use
with x ≡ᵇ id. But you've already done that! Yes, but thewithyou used targeted the innerfilterthat was stuck at the time. Once it got unstuck, it computed enough to emitx ∷ _and that got the outerfilterstuck on the second test (that happens to be equal to the first one).The idiomatic way to deal with this is via the
inspectidiom that will allow you to, in a singlewith, get your hands on not only the result ofx ≡ᵇ idbut also a proof that the result was computed from this expression. Once you reach the point where the outerfilteris stuck, you can simplyrewriteby this equation and you should then be able to see the function compute just enough that it will be possible to call the induction hypothesis.