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)
嗨,我想我不太了解如何使用 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)