関数で再生することで、Σ
タイプの周りを頭で囲んでいます。これは、リストで利用できるfilter
の機能と同じです。以下の私の実装を参照してください:製品内の値(Σ)を調べる方法は?
-- Some imports we will need later
open import Data.Bool
open import Data.Nat
open import Data.Product
open import Data.Vec
-- The filterVec function
filterVec : {n : ℕ} -> (ℕ -> Bool) -> Vec ℕ n -> Σ ℕ (λ length → Vec ℕ length)
filterVec _ [] = 0 , []
filterVec f (x ∷ xs) with filterVec f xs
... | length , filtered = if f x then (suc length , x ∷ filtered) else (length , filtered)
私の機能で満足し、私はいくつかの理由で
dummyVec : Vec ℕ 5
dummyVec = 1 ∷ 2 ∷ 3 ∷ 4 ∷ 5 ∷ []
dummyFn : Vec ℕ 5
dummyFn with filterVec (λ _ → true) dummyVec
dummyFn | length , xs = {!!} -- I would like to return xs here, but Agda throws a type error
をテストすることを決め、Agdaはlength
が5
であることを伝えることができないので、それは私を許可していません返信するxs
。ただし、以下のコードは動作します。
open import Relation.Binary.PropositionalEquality
dummyProof : proj₁ (filterVec (λ _ → true) dummyVec) ≡ 5
dummyProof = refl
私はこの動作によってまったく混乱します。 dummyFn
の場合、Agdaは長さが5であることを知ることはできませんが、dummyProof
の場合、Agdaは問題なしにそれを証明します。
私には何が欠けていますか? dummyFn
を動作させるにはどうすればよいですか?