21 | module Data.List.HasLength
34 | data HasLength : Nat -> List a -> Type where
36 | S : HasLength n xs -> HasLength (S n) (x :: xs)
40 | hasLength : (xs : List a) -> HasLength (length xs) xs
42 | hasLength (_ :: xs) = S (hasLength xs)
45 | take : (n : Nat) -> (xs : Stream a) -> HasLength n (take n xs)
47 | take (S n) (x :: xs) = S (take n xs)
54 | hasLengthUnique : HasLength m xs -> HasLength n xs -> m === n
55 | hasLengthUnique Z Z = Refl
56 | hasLengthUnique (S p) (S q) = cong S (hasLengthUnique p q)
59 | hasLengthAppend : HasLength m xs -> HasLength n ys -> HasLength (m + n) (xs ++ ys)
60 | hasLengthAppend Z ys = ys
61 | hasLengthAppend (S xs) ys = S (hasLengthAppend xs ys)
63 | hasLengthReverseOnto : HasLength m acc -> HasLength n xs -> HasLength (m + n) (reverseOnto acc xs)
64 | hasLengthReverseOnto p Z = rewrite plusZeroRightNeutral m in p
65 | hasLengthReverseOnto {n = S n} p (S q) = rewrite sym (plusSuccRightSucc m n) in hasLengthReverseOnto (S p) q
68 | hasLengthReverse : HasLength m acc -> HasLength m (reverse acc)
69 | hasLengthReverse = hasLengthReverseOnto Z
72 | map : (f : a -> b) -> HasLength n xs -> HasLength n (map f xs)
74 | map f (S n) = S (map f n)
80 | sucR : HasLength n xs -> HasLength (S n) (snoc xs x)
82 | sucR (S n) = S (sucR n)
87 | namespace SubsetView
94 | data View : (xs : List a) -> Subset Nat (flip HasLength xs) -> Type where
95 | Z : View [] (Element Z Z)
96 | S : (p : Subset Nat (flip HasLength xs)) -> View (x :: xs) (Element (S (fst p)) (S (snd p)))
100 | viewZ : (0 p : HasLength Z xs) -> View xs (Element Z p)
105 | viewS : (n : Nat) -> (0 p : HasLength (S n) xs) -> View xs (Element (S n) p)
106 | viewS n (S p) = S (Element n p)
110 | view : (p : Subset Nat (flip HasLength xs)) -> View xs p
111 | view (Element Z p) = viewZ p
112 | view (Element (S n) p) = viewS n p
114 | namespace CurriedView
123 | data View : (xs : List a) -> (n : Nat) -> HasLength n xs -> Type where
125 | S : (n : Nat) -> (0 p : HasLength n xs) -> View (x :: xs) (S n) (S p)
129 | view : (n : Nat) -> (0 p : HasLength n xs) -> View xs n p
131 | view (S n) (S p) = S n p
138 | listTerminating : (p : Subset Nat (flip HasLength xs)) -> HasLength (S (fst p)) (xs ++ [x])
139 | listTerminating p with (view p)
140 | listTerminating (Element 0 Z) | Z = S Z
141 | listTerminating (Element (S (fst y)) (S (snd y))) | (S y) = S (listTerminating y)
143 | data P : List Nat -> Type where
145 | PCon : P (map f xs) -> P (x :: xs)
148 | notListTerminating : (p : Subset Nat (flip HasLength xs)) -> P xs
149 | notListTerminating p with (view p)
150 | notListTerminating (Element 0 Z) | Z = PNil
151 | notListTerminating (Element (S (fst y)) (S (snd y))) | (S y) =
152 | PCon (notListTerminating {xs = map id (tail xs)} ({ snd $= map id } y))
154 | natTerminating : (n : Nat) -> (0 p : HasLength n xs ) -> P xs
155 | natTerminating n p = case view n p of
157 | S n p => PCon (natTerminating n (map id p))