0 | module Data.Unique.Vect
3 | import Decidable.Equality
4 | import Decidable.Equality.Core
7 | %hide Misc.NotElem.NotElem
16 | data UniqueVect : (0 n : Nat) -> (0 a : Type) -> DecEq a => Type where
17 | Nil : {0 a : Type} -> DecEq a => UniqueVect 0 a
18 | (::) : {0 a : Type} -> DecEq a =>
20 | (xs : UniqueVect n a) ->
21 | {auto prf : NotElem x xs} ->
26 | data NotElem : DecEq a => (x : a) -> (xs : UniqueVect n a) -> Type where
27 | NotInEmptyVect : DecEq a => (x : a) -> NotElem {a=a} x []
28 | NotInNonEmptyVect : (de : DecEq a) =>
30 | (xs : UniqueVect n a) ->
31 | (ne : NotElem x xs) ->
32 | (neq : IsNo (decEq x y)) =>
33 | (prf : NotElem y xs) =>
38 | data Elem : DecEq a => (x : a) -> (xs : UniqueVect n a) -> Type where
41 | {xs : UniqueVect k a} ->
42 | (prf : NotElem x xs) =>
46 | {xs : UniqueVect k a} ->
47 | (prf : NotElem y xs) =>
48 | (later : Elem x xs) ->
54 | data All : DecEq a => (0 p : a -> Type) -> UniqueVect rank a -> Type where
55 | Nil : DecEq a => {0 p : a -> Type} -> All p []
56 | (::) : DecEq a => {0 p : a -> Type} ->
58 | {0 xs : UniqueVect k a} ->
67 | {x : a} -> DecEq a => Uninhabited (Elem x []) where
68 | uninhabited Here
impossible
69 | uninhabited (There later
) impossible
73 | decElemInUniqueVect : DecEq a =>
74 | (x : a) -> (xs : UniqueVect n a) -> Dec (Elem x xs)
75 | decElemInUniqueVect x [] = No absurd
76 | decElemInUniqueVect x (y :: ys) = case decEq x y of
77 | Yes Refl => Yes Here
78 | No neq => case decElemInUniqueVect x ys of
79 | Yes prf => Yes $
There prf
80 | No nprf => No $
\case
82 | (There later) => nprf later
85 | notElem : DecEq a =>
87 | {xs : UniqueVect n a} ->
88 | Not (Elem x xs) -> NotElem x xs
89 | notElem {xs = []} f = NotInEmptyVect x
90 | notElem {xs = (y :: ys)} f with (decEq x y)
91 | _ | (Yes Refl) = absurd (f Here)
92 | _ | (No neq) = NotInNonEmptyVect
93 | {neq=(proofIneqIsNo neq)} ys (notElem (\e => f ?bb
))
96 | toVect : DecEq a => UniqueVect n a -> Vect n a
98 | toVect (x :: xs) = x :: toVect xs
102 | fromVect : DecEq a => Vect n a -> (m : Nat ** UniqueVect m a)
103 | fromVect [] = (
0 ** [])
104 | fromVect (x :: xs) =
105 | let (
k ** t)
= fromVect xs
106 | in case decElemInUniqueVect x t of
107 | Yes prf => (
k ** t)
108 | No nprf => (
S k ** (::) x t {prf=notElem nprf})
112 | indexOf : DecEq a => {0 n : Nat} -> {0 xs : UniqueVect n a} ->
115 | indexOf (There later) = FS (indexOf later)
118 | length : DecEq a => UniqueVect n a -> Nat
120 | length (x :: xs) = 1 + length xs
125 | (xs : UniqueVect n a) ->
126 | (elem : Elem x xs) ->
127 | UniqueVect (n `minus` (finToNat (FS (indexOf elem)))) a
128 | drop {n=S k} (_ :: xs) Here = rewrite minusZeroRight k in xs
129 | drop (_ :: xs) (There later) = drop xs later
133 | Test1 : UniqueVect 5 String
134 | Test1 = ["a", "b", "c", "d", "e"]
137 | wher : Elem "c" Test1
138 | wher = There $
There $
Here
143 | removeIndex : DecEq a =>
145 | (xs : UniqueVect (S n) a) ->
148 | removeIndex (x :: xs) FZ = xs
149 | removeIndex {n = (S k)} (x :: xs) (FS i)
150 | = (::) x (removeIndex xs i) {prf=removingElemIsStillNotElem}
155 | removingElemIsStillNotElem : DecEq a =>
158 | {xs : UniqueVect (S n) a} ->
160 | (ne : NotElem x xs) =>
161 | NotElem x (removeIndex xs i)
162 | removingElemIsStillNotElem {xs = (_ :: _)} {ne = (NotInNonEmptyVect _ ne)} {i = FZ}
164 | removingElemIsStillNotElem {n = (S k)} {xs = (y :: ys)} {ne = (NotInNonEmptyVect ys ne)} {i = (FS j)}
165 | = NotInNonEmptyVect (removeIndex ys j) removingElemIsStillNotElem {prf=removingElemIsStillNotElem}
172 | notEqualNotElem : DecEq a =>
174 | (neq : IsNo (decEq x y)) ->
176 | notEqualNotElem _ = NotInNonEmptyVect [] (NotInEmptyVect x)
180 | notEqualNotElem2 : DecEq a =>
182 | (neq : IsNo (decEq x y)) ->
184 | notEqualNotElem2 neq = notEqualNotElem {x=y} {y=x} (isNoSym neq)
189 | numUnique : {n, m : Nat} -> DecEq a => UniqueVect n a -> UniqueVect m a -> Nat
191 | numUnique (x :: xs) ys = case decElemInUniqueVect x ys of
192 | Yes _ => numUnique xs ys
193 | No _ => 1 + numUnique xs ys
198 | numOverlap : {n, m : Nat} -> DecEq a =>
199 | UniqueVect n a -> UniqueVect m a -> Nat
200 | numOverlap [] ys = 0
201 | numOverlap (x :: xs) ys = case decElemInUniqueVect x ys of
202 | Yes _ => 1 + numOverlap xs ys
203 | No _ => numOverlap xs ys
208 | numSymmetricDifference : {n, m : Nat} -> DecEq a =>
209 | UniqueVect n a -> UniqueVect m a -> Nat
210 | numSymmetricDifference [] ys = m
211 | numSymmetricDifference (x :: xs) ys = case decElemInUniqueVect x ys of
213 | Yes Here => numSymmetricDifference xs (removeIndex ys FZ)
214 | Yes (There later) => numSymmetricDifference xs (removeIndex ys (FS (indexOf later)))
215 | No _ => 1 + numSymmetricDifference xs ys
218 | public export infixr 5 +++
223 | (xs : UniqueVect n a) ->
224 | (ys : UniqueVect m a) ->
225 | UniqueVect (numUnique xs ys) a
227 | (x :: xs) +++ ys with (decElemInUniqueVect x ys)
228 | _ | (Yes prf) = xs +++ ys
229 | _ | (No nprf) = (::) x (xs +++ ys) {prf=expandUnique {prfy=notElem nprf}}
233 | expandUnique : DecEq a =>
235 | {xs : UniqueVect n a} ->
236 | {ys : UniqueVect m a} ->
237 | (prfx : NotElem x xs) =>
238 | (prfy : NotElem x ys) =>
239 | NotElem x (xs +++ ys)
244 | intersect : DecEq a =>
245 | (xs : UniqueVect n a) ->
246 | (ys : UniqueVect m a) ->
247 | UniqueVect (numOverlap xs ys) a
248 | intersect [] ys = []
249 | intersect (x :: xs) ys with (decElemInUniqueVect x ys)
250 | _ | (Yes prf) = (::) x (intersect xs ys) {prf=notElemIntersect}
251 | _ | (No nprf) = intersect xs ys
256 | notElemIntersect : DecEq a =>
258 | {xs : UniqueVect n a} ->
259 | {ys : UniqueVect m a} ->
260 | (prfx : NotElem x xs) =>
261 | (prfy : Elem x ys) =>
262 | NotElem x (intersect xs ys)
268 | allElemIntersectFst : DecEq a =>
269 | (xs : UniqueVect n a) ->
270 | (ys : UniqueVect m a) ->
271 | All (\x => Elem x xs) (intersect xs ys)
272 | allElemIntersectFst = ?allElemIntersect_rhs
277 | allElemIntersectSnd : DecEq a =>
278 | (xs : UniqueVect n a) ->
279 | (ys : UniqueVect m a) ->
280 | All (\x => Elem x ys) (intersect xs ys)
281 | allElemIntersectSnd = ?allElemIntersect_rhs2
285 | symmetricDifference : DecEq a => {n, m : Nat} ->
286 | (xs : UniqueVect n a) ->
287 | (ys : UniqueVect m a) ->
288 | UniqueVect (numSymmetricDifference xs ys) a
289 | symmetricDifference [] ys = ys
290 | symmetricDifference (x :: xs) ys = ?aaa
300 | l1 : UniqueVect 3 String
301 | l1 = ["a", "b", "c"]
304 | l2 : UniqueVect 3 String
305 | l2 = ["c", "d", "e"]
308 | l3 : UniqueVect 5 String
312 | l4 : UniqueVect 1 String
313 | l4 = intersect l1 l2