vector-sizesが 暗黙的なままでapplyPrefix
ある長いベクトルの最初の部分に固定サイズのベクトル関数を適用するAgda 関数を作成しました。ヘルパー関数と一緒の定義は次のとおりです。m
n
k
split
split : ∀ {A m n} → Vec A (n + m) → (Vec A n) × (Vec A m)
split {_} {_} {zero} xs = ( [] , xs )
split {_} {_} {suc _} (x ∷ xs) with split xs
... | ( ys , zs ) = ( (x ∷ ys) , zs )
applyPrefix : ∀ {A n m k} → (Vec A n → Vec A m) → Vec A (n + k) → Vec A (m + k)
applyPrefix f xs with split xs
... | ( ys , zs ) = f ys ++ zs
applyPostfix
固定サイズのベクトル関数を長いベクトルの末尾部分に適用する対称関数が必要です。
applyPostfix ∀ {A n m k} → (Vec A n → Vec A m) → Vec A (k + n) → Vec A (k + m)
applyPostfix {k = k} f xs with split {_} {_} {k} xs
... | ( ys , zs ) = ys ++ (f zs)
の定義がapplyPrefix
既に示しているように、k
-ArgumentapplyPostfix
は使用時に暗黙のままにすることはできません。例えば:
change2 : {A : Set} → Vec A 2 → Vec A 2
change2 ( x ∷ y ∷ [] ) = (y ∷ x ∷ [] )
changeNpre : {A : Set}{n : ℕ} → Vec A (2 + n) → Vec A (2 + n)
changeNpre = applyPrefix change2
changeNpost : {A : Set}{n : ℕ} → Vec A (n + 2) → Vec A (n + 2)
changeNpost = applyPost change2 -- does not work; n has to be provided
を使用するときに -argument が暗黙的なままにapplyPostfix
なるように実装する方法を知っている人はいますか?k
applyPostfix
私がしたことは、校正/プログラミングです:
lem-plus-comm : (n m : ℕ) → (n + m) ≡ (m + n)
を定義するときにその補題を使用しますapplyPostfix
。
postfixApp2 : ∀ {A}{n m k : ℕ} → (Vec A n → Vec A m) → Vec A (k + n) → Vec A (k + m)
postfixApp2 {A} {n} {m} {k} f xs rewrite lem-plus-comm n k | lem-plus-comm k n | lem-plus-comm k m | lem-plus-comm m k = reverse (drop {n = n} (reverse xs)) ++ f (reverse (take {n = n} (reverse xs)))
残念ながら、k
補題を呼び出すために -Parameter を使用しているため、これは役に立ちませんでした:-(
k
明示的であることを避けるためのより良いアイデアはありますか? 多分私はベクトルでsnoc-Viewを使用する必要がありますか?