module Basics where open import Data.Nat public open import Data.Vec public using (Vec; []; _∷_) open import Data.Fin public using (Fin; zero; suc) _!_ : ∀ {n A} → Vec A n → Fin n → A [] ! () (x ∷ xs) ! zero = x (x ∷ xs) ! suc i = xs ! i open import Data.Function using (_∘_) tabulate : ∀ {n A} → (Fin n → A) → Vec A n tabulate {zero} f = [] tabulate {suc n} f = f zero ∷ tabulate (f ∘ suc) open import Relation.Binary.PropositionalEquality lem-tabulate-! : ∀ {n A} (f : Fin n → A) (i : Fin n) → f i ≡ tabulate f ! i lem-tabulate-! f zero = refl lem-tabulate-! f (suc i) = lem-tabulate-! (f ∘ suc) i zipWith : ∀ {A B C n} → (A → B → C) → Vec A n → Vec B n → Vec C n zipWith f [] [] = [] zipWith f (x ∷ xs) (y ∷ ys) = f x y ∷ zipWith f xs ys