123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- module Data.Vec where
- open import Prelude
- open import Data.Nat
- open import Data.Fin hiding (_==_; _<_)
- open import Logic.Structure.Applicative
- open import Logic.Identity
- open import Logic.Base
- infixl 90 _#_
- infixr 50 _::_
- infixl 45 _!_ _[!]_
- data Vec (A : Set) : Nat -> Set where
- [] : Vec A zero
- _::_ : {n : Nat} -> A -> Vec A n -> Vec A (suc n)
- -- Indexing
- _!_ : {n : Nat}{A : Set} -> Vec A n -> Fin n -> A
- [] ! ()
- x :: xs ! fzero = x
- x :: xs ! fsuc i = xs ! i
- -- Insertion
- insert : {n : Nat}{A : Set} -> Fin (suc n) -> A -> Vec A n -> Vec A (suc n)
- insert fzero y xs = y :: xs
- insert (fsuc i) y (x :: xs) = x :: insert i y xs
- insert (fsuc ()) y []
- -- Index view
- data IndexView {A : Set} : {n : Nat}(i : Fin n) -> Vec A n -> Set where
- ixV : {n : Nat}{i : Fin (suc n)}(x : A)(xs : Vec A n) ->
- IndexView i (insert i x xs)
- _[!]_ : {A : Set}{n : Nat}(xs : Vec A n)(i : Fin n) -> IndexView i xs
- [] [!] ()
- x :: xs [!] fzero = ixV x xs
- x :: xs [!] fsuc i = aux xs i (xs [!] i)
- where
- aux : {n : Nat}(xs : Vec _ n)(i : Fin n) ->
- IndexView i xs -> IndexView (fsuc i) (x :: xs)
- aux .(insert i y xs) i (ixV y xs) = ixV y (x :: xs)
- -- Build a vector from an indexing function (inverse of _!_)
- build : {n : Nat}{A : Set} -> (Fin n -> A) -> Vec A n
- build {zero } f = []
- build {suc _} f = f fzero :: build (f ∘ fsuc)
- -- Constant vectors
- vec : {n : Nat}{A : Set} -> A -> Vec A n
- vec {zero } _ = []
- vec {suc m} x = x :: vec x
- -- Vector application
- _#_ : {n : Nat}{A B : Set} -> Vec (A -> B) n -> Vec A n -> Vec B n
- [] # [] = []
- (f :: fs) # (x :: xs) = f x :: fs # xs
- -- Vectors of length n form an applicative structure
- ApplicativeVec : {n : Nat} -> Applicative (\A -> Vec A n)
- ApplicativeVec {n} = applicative (vec {n}) (_#_ {n})
- -- Map
- map : {n : Nat}{A B : Set} -> (A -> B) -> Vec A n -> Vec B n
- map f xs = vec f # xs
- -- Zip
- zip : {n : Nat}{A B C : Set} -> (A -> B -> C) -> Vec A n -> Vec B n -> Vec C n
- zip f xs ys = vec f # xs # ys
- module Elem where
- infix 40 _∈_ _∉_
- data _∈_ {A : Set}(x : A) : {n : Nat}(xs : Vec A n) -> Set where
- hd : {n : Nat} {xs : Vec A n} -> x ∈ x :: xs
- tl : {n : Nat}{y : A}{xs : Vec A n} -> x ∈ xs -> x ∈ y :: xs
- data _∉_ {A : Set}(x : A) : {n : Nat}(xs : Vec A n) -> Set where
- nl : x ∉ []
- cns : {n : Nat}{y : A}{xs : Vec A n} -> x ≢ y -> x ∉ xs -> x ∉ y :: xs
- ∉=¬∈ : {A : Set}{x : A}{n : Nat}{xs : Vec A n} -> x ∉ xs -> ¬ (x ∈ xs)
- ∉=¬∈ nl ()
- ∉=¬∈ {A} (cns x≠x _) hd = elim-False (x≠x refl)
- ∉=¬∈ {A} (cns _ ne) (tl e) = ∉=¬∈ ne e
- ∈=¬∉ : {A : Set}{x : A}{n : Nat}{xs : Vec A n} -> x ∈ xs -> ¬ (x ∉ xs)
- ∈=¬∉ e ne = ∉=¬∈ ne e
- find : {A : Set}{n : Nat} -> ((x y : A) -> (x ≡ y) \/ (x ≢ y)) ->
- (x : A)(xs : Vec A n) -> x ∈ xs \/ x ∉ xs
- find _ _ [] = \/-IR nl
- find eq y (x :: xs) = aux x y (eq y x) (find eq y xs) where
- aux : forall x y -> (y ≡ x) \/ (y ≢ x) -> y ∈ xs \/ y ∉ xs -> y ∈ x :: xs \/ y ∉ x :: xs
- aux x .x (\/-IL refl) _ = \/-IL hd
- aux x y (\/-IR y≠x) (\/-IR y∉xs) = \/-IR (cns y≠x y∉xs)
- aux x y (\/-IR _) (\/-IL y∈xs) = \/-IL (tl y∈xs)
- delete : {A : Set}{n : Nat}(x : A)(xs : Vec A (suc n)) -> x ∈ xs -> Vec A n
- delete .x (x :: xs) hd = xs
- delete {A}{zero } _ ._ (tl ())
- delete {A}{suc _} y (x :: xs) (tl p) = x :: delete y xs p
|