7 | module Data.List.AtIndex
10 | import Data.List.HasLength
12 | import Decidable.Equality
20 | data AtIndex : a -> List a -> Nat -> Type where
21 | Z : AtIndex a (a :: as) Z
22 | S : AtIndex a as n -> AtIndex a (b :: as) (S n)
26 | inverseZ : AtIndex x (y :: xs) Z -> x === y
31 | inverseS : AtIndex x (y :: xs) (S n) -> AtIndex x xs n
36 | Uninhabited (AtIndex a [] n) where
37 | uninhabited Z
impossible
38 | uninhabited (S
_) impossible
43 | atIndexUnique : AtIndex a as n -> AtIndex b as n -> a === b
44 | atIndexUnique Z Z = Refl
45 | atIndexUnique (S p) (S q) = atIndexUnique p q
50 | find : DecEq a => (x : a) -> (xs : List a) -> Dec (Subset Nat (AtIndex x xs))
51 | find x [] = No (\ p => void (absurd (snd p)))
52 | find x (y :: xs) with (decEq x y)
53 | find x (x :: xs) | Yes Refl = Yes (Element Z Z)
54 | find x (y :: xs) | No neqxy = case find x xs of
55 | Yes (Element n prf) => Yes (Element (S n) (S prf))
56 | No notInxs => No $
\case
57 | (Element Z p) => void (neqxy (inverseZ p))
58 | (Element (S n) prf) => absurd (notInxs (Element n (inverseS prf)))
62 | lookup : (n : Nat) -> (xs : List a) -> Dec (Subset a (\ x => AtIndex x xs n))
63 | lookup n [] = No (\ p => void (absurd (snd p)))
64 | lookup Z (x :: xs) = Yes (Element x Z)
65 | lookup (S n) (x :: xs) = case lookup n xs of
66 | Yes (Element x p) => Yes (Element x (S p))
67 | No notInxs => No (\ (Element x p) => void (notInxs (Element x (inverseS p))))
71 | inRange : (n : Nat) -> (xs : List a) -> (0 _ : AtIndex x xs n) -> LTE n (length xs)
72 | inRange n [] p = void (absurd p)
73 | inRange Z (x :: xs) p = LTEZero
74 | inRange (S n) (x :: xs) p = LTESucc (inRange n xs (inverseS p))
78 | weakenR : AtIndex x xs n -> AtIndex x (xs ++ ys) n
80 | weakenR (S p) = S (weakenR p)
85 | weakenL : (p : Subset Nat (flip HasLength ws)) -> AtIndex x xs n -> AtIndex x (ws ++ xs) (fst p + n)
86 | weakenL m p with (view m)
87 | weakenL (Element 0 Z) p | Z = p
88 | weakenL (Element (S (fst m)) (S (snd m))) p | (S m) = S (weakenL m p)
93 | strengthenL : (p : Subset Nat (flip HasLength xs)) ->
94 | lt n (fst p) === True ->
95 | AtIndex x (xs ++ ys) n -> AtIndex x xs n
96 | strengthenL m lt idx with (view m)
97 | strengthenL (Element (S (fst m)) (S (snd m))) lt Z | (S m) = Z
98 | strengthenL (Element (S (fst m)) (S (snd m))) lt (S k) | (S m) = S (strengthenL m lt k)
103 | strengthenR : (p : Subset Nat (flip HasLength ws)) ->
104 | lte (fst p) n === True ->
105 | AtIndex x (ws ++ xs) n -> AtIndex x xs (minus n (fst p))
106 | strengthenR m lt idx with (view m)
107 | strengthenR (Element 0 Z) lt idx | Z = rewrite minusZeroRight n in idx
108 | strengthenR (Element (S (fst m)) (S (snd m))) lt (S k) | (S m) = strengthenR m lt k