@@ -174,13 +174,23 @@ total
174vectInjective2 : {xs, ys : Vect n a} -> {x, y : a} -> x :: xs = y :: ys -> xs = ys
174vectInjective2 : {xs, ys : Vect n a} -> {x, y : a} -> x :: xs = y :: ys -> xs = ys
175vectInjective2 {x=x} {y=x} {xs=xs} {ys=xs} refl = refl
175vectInjective2 {x=x} {y=x} {xs=xs} {ys=xs} refl = refl
177+instance DecEq a => DecEq (Vect n a) where
178+ decEq [] [] = Yes refl
179+ decEq (x :: xs) (y :: ys) with (decEq x y)
180+ decEq (x :: xs) (x :: ys) | Yes refl with (decEq xs ys)
181+ decEq (x :: xs) (x :: xs) | Yes refl | Yes refl = Yes refl
182+ decEq (x :: xs) (x :: ys) | Yes refl | No neq = No (neq . vectInjective2)
183+ decEq (x :: xs) (y :: ys) | No neq = No (neq . vectInjective1)
185+{- The following definition is elaborated in a wrong case-tree. Examination pending.
177instance DecEq a => DecEq (Vect n a) where
187instance DecEq a => DecEq (Vect n a) where
178 decEq [] [] = Yes refl
188 decEq [] [] = Yes refl
179 decEq (x :: xs) (y :: ys) with (decEq x y, decEq xs ys)
189 decEq (x :: xs) (y :: ys) with (decEq x y, decEq xs ys)
180 decEq (x :: xs) (x :: xs) | (Yes refl, Yes refl) = Yes refl
190 decEq (x :: xs) (x :: xs) | (Yes refl, Yes refl) = Yes refl
181 decEq (x :: xs) (y :: ys) | (_, No nEqTl) = No (\p => nEqTl (vectInjective2 p))
191 decEq (x :: xs) (y :: ys) | (_, No nEqTl) = No (\p => nEqTl (vectInjective2 p))
182 decEq (x :: xs) (y :: ys) | (No nEqHd, _) = No (\p => nEqHd (vectInjective1 p))
192 decEq (x :: xs) (y :: ys) | (No nEqHd, _) = No (\p => nEqHd (vectInjective1 p))
185-- For the primitives, we have to cheat because we don't have access to their
195-- For the primitives, we have to cheat because we don't have access to their
186-- internal implementations.
196-- internal implementations.