Agda Vec如何过滤掉元素

Agda Vec how to filter out elements

嗨,我想我不太了解如何使用 Data/Vec.agda 中的 Vec.filter

我知道如何“过滤”(保留)向量中的元素

filterProof : v.filter (λ e → e ≟ 2) (2 v.∷ v.[]) ≡ (2 vb.∷ vb.[])
filterProof = refl

但是我不确定如何“过滤掉”元素。

filterProof : v.filter (λ e → e ? 2) (2 v.∷ v.[]) ≡ vb.[]
filterProof = refl

我不确定 ? 在哪里。 我知道类型需要是 Relation.Nullary.Dec 但不确定如何使用 Relation.Nullary.Dec.

中可用的内容来表达 e ≠ 2

另外我想知道为什么 Vec.filter 不像 List.filter 那样使用 Bool 而不是 Relation.Nullary.Dec 进行过滤。

谢谢!

您可以将谓词的决策过程转变为其否定的决策过程:

open import Relation.Nullary

dec-¬ : ∀ {a} {P : Set a} → Dec P → Dec (¬ P)
dec-¬ (yes p) = no λ prf → prf p
dec-¬ (no ¬p) = yes ¬p

这当然意味着您也可以否定可判定关系:

open import Relation.Binary

module _ {a} {A B : Set a} {ℓ} where
  neg : REL A B ℓ → REL A B ℓ
  neg R x y = ¬ (R x y)

  decidable-neg : ∀ {R : REL A B ℓ} → Decidable R → Decidable (neg R)
  decidable-neg dec x y = dec-¬ (dec x y)