0 | module Data.Unique.Vect
3 | import Decidable.Equality
4 | import Decidable.Equality.Core
11 | namespace UniqueVect
18 | data UniqueVect : (0 n : Nat) -> (0 a : Type) -> DecEq a => Type where
19 | Nil : {0 a : Type} -> DecEq a => UniqueVect 0 a
20 | (::) : {0 a : Type} -> DecEq a =>
22 | (xs : UniqueVect n a) ->
23 | {auto prf : NotElem x xs} ->
28 | data NotElem : DecEq a =>
29 | (x : a) -> (xs : UniqueVect n a) -> Type where
30 | NotInEmptyVect : {0 a : Type} -> DecEq a => (x : a)
31 | -> NotElem {a=a} x []
32 | NotInNonEmptyVect : {0 a : Type} -> (de : DecEq a) =>
34 | (xs : UniqueVect n a) ->
35 | (ne : NotElem x xs) ->
36 | (neq : IsNo (decEq x y)) =>
37 | (prf : NotElem y xs) =>
43 | data All : DecEq a => (0 p : a -> Type) -> UniqueVect rank a -> Type where
44 | Nil : DecEq a => {0 p : a -> Type} -> All p []
45 | (::) : DecEq a => {0 p : a -> Type} ->
47 | {0 xs : UniqueVect k a} ->
56 | data Elem : DecEq a => (x : a) -> (xs : UniqueVect n a) -> Type where
59 | {xs : UniqueVect k a} ->
60 | (prf : NotElem x xs) =>
64 | {xs : UniqueVect k a} ->
65 | (prf : NotElem y xs) =>
66 | (later : Elem x xs) ->
71 | {x : a} -> DecEq a => Uninhabited (Elem x []) where
72 | uninhabited Here
impossible
73 | uninhabited (There later
) impossible
77 | decElemInUniqueVect : DecEq a =>
78 | (x : a) -> (xs : UniqueVect n a) -> Dec (Elem x xs)
79 | decElemInUniqueVect x [] = No absurd
80 | decElemInUniqueVect x (y :: ys) = case decEq x y of
81 | Yes Refl => Yes Here
82 | No neq => case decElemInUniqueVect x ys of
83 | Yes prf => Yes $
There prf
84 | No nprf => No $
\case
86 | (There later) => nprf later
89 | notElem : DecEq a =>
91 | {xs : UniqueVect n a} ->
92 | Not (Elem x xs) -> NotElem x xs
93 | notElem {xs = []} f = NotInEmptyVect x
94 | notElem {xs = (y :: ys)} f with (decEq x y)
95 | _ | (Yes Refl) = absurd (f Here)
96 | _ | (No neq) = NotInNonEmptyVect
97 | {neq=(proofIneqIsNo neq)} ys (notElem (\e => f ?bb
))
100 | toVect : DecEq a => UniqueVect n a -> Vect n a
102 | toVect (x :: xs) = x :: toVect xs
106 | fromVect : DecEq a => Vect n a -> (m : Nat ** UniqueVect m a)
107 | fromVect [] = (
0 ** [])
108 | fromVect (x :: xs) =
109 | let (
k ** t)
= fromVect xs
110 | in case decElemInUniqueVect x t of
111 | Yes prf => (
k ** t)
112 | No nprf => (
S k ** (::) x t {prf=notElem nprf})
117 | indexOf : DecEq a => {0 n : Nat} -> {0 xs : UniqueVect n a} ->
120 | indexOf (There later) = FS (indexOf later)
123 | length : DecEq a => UniqueVect n a -> Nat
125 | length (x :: xs) = 1 + length xs
130 | (xs : UniqueVect n a) ->
131 | (elem : Elem x xs) ->
132 | UniqueVect (n `minus` (finToNat (FS (indexOf elem)))) a
133 | drop {n=S k} (_ :: xs) Here = rewrite minusZeroRight k in xs
134 | drop (_ :: xs) (There later) = drop xs later
138 | Test1 : UniqueVect 5 String
139 | Test1 = ["a", "b", "c", "d", "e"]
142 | wher : Elem "c" Test1
143 | wher = There $
There $
Here
148 | removeIndex : DecEq a =>
150 | (xs : UniqueVect (S n) a) ->
153 | removeIndex (x :: xs) FZ = xs
154 | removeIndex {n = (S k)} (x :: xs) (FS i)
155 | = (::) x (removeIndex xs i) {prf=removingElemIsStillNotElem}
160 | removingElemIsStillNotElem : DecEq a =>
163 | {xs : UniqueVect (S n) a} ->
165 | (ne : NotElem x xs) =>
166 | NotElem x (removeIndex xs i)
167 | removingElemIsStillNotElem {xs = (_ :: _)} {ne = (NotInNonEmptyVect _ ne)} {i = FZ}
169 | removingElemIsStillNotElem {n = (S k)} {xs = (y :: ys)} {ne = (NotInNonEmptyVect ys ne)} {i = (FS j)}
170 | = NotInNonEmptyVect (removeIndex ys j) removingElemIsStillNotElem {prf=removingElemIsStillNotElem}
179 | notEqualNotElem : DecEq a =>
181 | (neq : IsNo (decEq x y)) ->
183 | notEqualNotElem _ = NotInNonEmptyVect [] (NotInEmptyVect x)
187 | notEqualNotElem2 : DecEq a =>
189 | (neq : IsNo (decEq x y)) ->
191 | notEqualNotElem2 neq = notEqualNotElem {x=y} {y=x} (isNoSym neq)
196 | numUnique : {n, m : Nat} -> DecEq a => UniqueVect n a -> UniqueVect m a -> Nat
198 | numUnique (x :: xs) ys = case decElemInUniqueVect x ys of
199 | Yes _ => numUnique xs ys
200 | No _ => 1 + numUnique xs ys
205 | numOverlap : {n, m : Nat} -> DecEq a =>
206 | UniqueVect n a -> UniqueVect m a -> Nat
207 | numOverlap [] ys = 0
208 | numOverlap (x :: xs) ys = case decElemInUniqueVect x ys of
209 | Yes _ => 1 + numOverlap xs ys
210 | No _ => numOverlap xs ys
215 | numSymmetricDifference : {n, m : Nat} -> DecEq a =>
216 | UniqueVect n a -> UniqueVect m a -> Nat
217 | numSymmetricDifference [] ys = m
218 | numSymmetricDifference (x :: xs) ys = case decElemInUniqueVect x ys of
220 | Yes Here => numSymmetricDifference xs (removeIndex ys FZ)
221 | Yes (There later) => numSymmetricDifference xs (removeIndex ys (FS (indexOf later)))
222 | No _ => 1 + numSymmetricDifference xs ys
227 | public export infixr 5 +++
232 | (xs : UniqueVect n a) ->
233 | (ys : UniqueVect m a) ->
234 | UniqueVect (numUnique xs ys) a
236 | (x :: xs) +++ ys with (decElemInUniqueVect x ys)
237 | _ | (Yes prf) = xs +++ ys
238 | _ | (No nprf) = (::) x (xs +++ ys) {prf=expandUnique {prfy=notElem nprf}}
242 | expandUnique : DecEq a =>
244 | {xs : UniqueVect n a} ->
245 | {ys : UniqueVect m a} ->
246 | (prfx : NotElem x xs) =>
247 | (prfy : NotElem x ys) =>
248 | NotElem x (xs +++ ys)
253 | intersect : DecEq a =>
254 | (xs : UniqueVect n a) ->
255 | (ys : UniqueVect m a) ->
256 | UniqueVect (numOverlap xs ys) a
257 | intersect [] ys = []
258 | intersect (x :: xs) ys with (decElemInUniqueVect x ys)
259 | _ | (Yes prf) = (::) x (intersect xs ys) {prf=notElemIntersect}
260 | _ | (No nprf) = intersect xs ys
265 | notElemIntersect : DecEq a =>
267 | {xs : UniqueVect n a} ->
268 | {ys : UniqueVect m a} ->
269 | (prfx : NotElem x xs) =>
270 | (prfy : Elem x ys) =>
271 | NotElem x (intersect xs ys)
277 | allElemIntersectFst : DecEq a =>
278 | (xs : UniqueVect n a) ->
279 | (ys : UniqueVect m a) ->
280 | All (\x => Elem x xs) (intersect xs ys)
281 | allElemIntersectFst = ?allElemIntersect_rhs
286 | allElemIntersectSnd : DecEq a =>
287 | (xs : UniqueVect n a) ->
288 | (ys : UniqueVect m a) ->
289 | All (\x => Elem x ys) (intersect xs ys)
290 | allElemIntersectSnd = ?allElemIntersect_rhs2
294 | symmetricDifference : DecEq a => {n, m : Nat} ->
295 | (xs : UniqueVect n a) ->
296 | (ys : UniqueVect m a) ->
297 | UniqueVect (numSymmetricDifference xs ys) a
298 | symmetricDifference [] ys = ys
299 | symmetricDifference (x :: xs) ys = ?aaa
309 | l1 : UniqueVect 3 String
310 | l1 = ["a", "b", "c"]
313 | l2 : UniqueVect 3 String
314 | l2 = ["c", "d", "e"]
317 | l3 : UniqueVect 5 String
321 | l4 : UniqueVect 1 String
322 | l4 = intersect l1 l2