on master help sign in
Add more Vect proofs

Add VerifiedFunctor and VerifiedApplicative instances. Add an Uninhabited instance, and several proofs related to take and drop.

commita6f98200043b849868c85a6145b87ea221ce18ed authorhowtonotwin <rasheeqhere@gmail.com> dateThu 29 Mar 2018, 12:48 (9 years ago) parent4d69b3f
2 files changed+69
libs/base/Data/Vect.idr+46 libs/contrib/Interfaces/Verified.idr+23
libs/base/Data/Vect.idr+46
@@ -104,12 +104,36 @@ take : (n : Nat) -> Vect (n + m) elem -> Vect n elem
104104take Z xs = []
105105take (S k) (x :: xs) = x :: take k xs
106106
107+takeTake : (n : Nat) -> (m : Nat) -> (xs : Vect (n + m + l) a) -> take n (take (n + m) xs) = take n {m = m + l} (rewrite plusAssociative n m l in xs)
108+takeTake Z m xs = Refl
109+takeTake {l} (S k) m (x :: xs) = rewrite aux (plusAssociative k m l) x xs in cong { f = (x ::) } $ takeTake k m xs
110+ where aux : {n : Nat} -> {m : Nat} -> (prf : n = m) ->
111+ (x : a) -> (xs : Vect m a) ->
112+ rewrite__impl (\rep => Vect rep a) (rewrite__impl (\rep => S rep = S m) prf Refl) (x :: xs) = x :: rewrite__impl (\rep => Vect rep a) prf xs
113+ aux Refl x xs = Refl
114+
107115||| Remove the first n elements of a Vect
108116||| @ n the number of elements to remove
109117drop : (n : Nat) -> Vect (n + m) elem -> Vect m elem
110118drop Z xs = xs
111119drop (S k) (x :: xs) = drop k xs
112120
121+dropDrop : (n : Nat) -> (m : Nat) -> (xs : Vect (m + n + l) a) -> drop n (drop m {m = n + l} (rewrite plusAssociative m n l in xs)) = drop (m + n) xs
122+dropDrop n Z xs = Refl
123+dropDrop {l} n (S k) (x :: xs) = rewrite aux (plusAssociative k n l) x xs in dropDrop n k xs
124+ where aux : {n : Nat} -> {m : Nat} -> (prf : n = m) ->
125+ (x : a) -> (xs : Vect m a) ->
126+ rewrite__impl (\rep => Vect rep a) (rewrite__impl (\rep => S rep = S m) prf Refl) (x :: xs) = x :: rewrite__impl (\rep => Vect rep a) prf xs
127+ aux Refl x xs = Refl
128+
129+takeDropDropTake : (n : Nat) -> (m : Nat) -> (xs : Vect (m + n + l) a) -> take n (drop m {m = n + l} (rewrite plusAssociative m n l in xs)) = drop m (take (m + n) xs)
130+takeDropDropTake n Z xs = Refl
131+takeDropDropTake {l} n (S k) (x :: xs) = rewrite aux (plusAssociative k n l) x xs in takeDropDropTake n k xs
132+ where aux : {n : Nat} -> {m : Nat} -> (prf : n = m) ->
133+ (x : a) -> (xs : Vect m a) ->
134+ rewrite__impl (\rep => Vect rep a) (rewrite__impl (\rep => S rep = S m) prf Refl) (x :: xs) = x :: rewrite__impl (\rep => Vect rep a) prf xs
135+ aux Refl x xs = Refl
136+
113137||| Take the longest prefix of a Vect such that all elements satisfy some
114138||| Boolean predicate.
115139|||
@@ -188,6 +212,18 @@ fromList l =
188212(++) [] ys = ys
189213(++) (x::xs) ys = x :: xs ++ ys
190214
215+takePrefix : (ns : Vect n a) -> (ms : Vect m a) -> take n (ns ++ ms) = ns
216+takePrefix [] _ = Refl
217+takePrefix (n :: ns) ms = cong $ takePrefix ns ms
218+
219+dropPrefix : (ns : Vect n a) -> (ms : Vect m a) -> drop n (ns ++ ms) = ms
220+dropPrefix [] ms = Refl
221+dropPrefix (_ :: ns) ms = dropPrefix ns ms
222+
223+takeDropConcat : (n : Nat) -> (xs : Vect (n + m) a) -> take n xs ++ drop n xs = xs
224+takeDropConcat Z xs = Refl
225+takeDropConcat (S k) (x :: xs) = cong $ takeDropConcat k xs
226+
191227||| Repeate some value some number of times.
192228|||
193229||| @ len the number of times to repeat it
@@ -567,6 +603,13 @@ implementation Traversable (Vect n) where
567603implementation Show elem => Show (Vect len elem) where
568604 show = show . toList
569605
606+--------------------------------------------------------------------------------
607+-- Uninhabited
608+--------------------------------------------------------------------------------
609+
610+Uninhabited a => Uninhabited (Vect (S n) a) where
611+ uninhabited (x :: _) = uninhabited x
612+
570613--------------------------------------------------------------------------------
571614-- Properties
572615--------------------------------------------------------------------------------
@@ -574,6 +617,9 @@ implementation Show elem => Show (Vect len elem) where
574617vectConsCong : (x : elem) -> (xs : Vect len elem) -> (ys : Vect m elem) -> (xs = ys) -> (x :: xs = x :: ys)
575618vectConsCong x xs xs Refl = Refl
576619
620+vectMustBeNil : (xs : Vect Z a) -> xs = []
621+vectMustBeNil [] = Refl
622+
577623vectNilRightNeutral : (xs : Vect n a) -> xs ++ [] = xs
578624vectNilRightNeutral [] = Refl
579625vectNilRightNeutral (x :: xs) =
libs/contrib/Interfaces/Verified.idr+23
@@ -4,8 +4,10 @@ import Control.Algebra
44import Control.Algebra.Lattice
55import Control.Algebra.NumericImplementations
66import Control.Algebra.VectorSpace
7+import Data.Vect
78import Data.ZZ
89
10+%default total
911%access public export
1012
1113-- Due to these being basically unused and difficult to implement,
@@ -27,6 +29,12 @@ VerifiedFunctor Maybe where
2729 functorComposition Nothing g1 g2 = Refl
2830 functorComposition (Just x) g1 g2 = Refl
2931
32+VerifiedFunctor (Vect n) where
33+ functorIdentity [] = Refl
34+ functorIdentity (x :: xs) = rewrite functorIdentity xs in Refl
35+ functorComposition [] _ _ = Refl
36+ functorComposition (x :: xs) f g = rewrite functorComposition xs f g in Refl
37+
3038interface (Applicative f, VerifiedFunctor f) => VerifiedApplicative (f : Type -> Type) where
3139 applicativeMap : (x : f a) -> (g : a -> b) ->
3240 map g x = pure g <*> x
@@ -38,6 +46,21 @@ interface (Applicative f, VerifiedFunctor f) => VerifiedApplicative (f : Type ->
3846 applicativeInterchange : (x : a) -> (g : f (a -> b)) ->
3947 g <*> pure x = pure (\g' : (a -> b) => g' x) <*> g
4048
49+VerifiedApplicative (Vect n) where
50+ applicativeMap [] f = Refl
51+ applicativeMap (x :: xs) f = rewrite applicativeMap xs f in Refl
52+ applicativeIdentity xs = rewrite sym $ applicativeMap xs id in functorIdentity xs
53+ applicativeComposition [] [] [] = Refl
54+ applicativeComposition (x :: xs) (f :: fs) (g :: gs) = rewrite applicativeComposition xs fs gs in Refl
55+ applicativeHomomorphism = prf
56+ where prf : with Vect ((x : a) -> (f : a -> b) -> zipWith Basics.apply (replicate m f) (replicate m x) = replicate m (f x))
57+ prf {m = Z} x f = Refl
58+ prf {m = S k} x f = rewrite prf {m = k} x f in Refl
59+ applicativeInterchange = prf
60+ where prf : with Vect ((x : a) -> (f : Vect m (a -> b)) -> zipWith Basics.apply f (replicate m x) = zipWith Basics.apply (replicate m (\f' => f' x)) f)
61+ prf {m = Z} x [] = Refl
62+ prf {m = S k} x (f :: fs) = rewrite prf x fs in Refl
63+
4164VerifiedApplicative Maybe where
4265 applicativeMap Nothing g = Refl
4366 applicativeMap (Just x) g = Refl