@@ -12,39 +12,39 @@ import Prelude.Uninhabited
12||| exceedingly inefficient at run time.
12||| exceedingly inefficient at run time.
13||| @ n the upper bound
13||| @ n the upper bound
14data Fin : (n : Nat) -> Type where
14data Fin : (n : Nat) -> Type where
15− fZ : Fin (S k)
15+ FZ : Fin (S k)
16− fS : Fin k -> Fin (S k)
16+ FS : Fin k -> Fin (S k)
18instance Uninhabited (Fin Z) where
18instance Uninhabited (Fin Z) where
19− uninhabited fZ impossible
19+ uninhabited FZ impossible
20− uninhabited (fS f) impossible
20+ uninhabited (FS f) impossible
22−fSInjective : (m : Fin k) -> (n : Fin k) -> fS m = fS n -> m = n
22+FSInjective : (m : Fin k) -> (n : Fin k) -> FS m = FS n -> m = n
23−fSInjective left _ Refl = Refl
23+FSInjective left _ Refl = Refl
25instance Eq (Fin n) where
25instance Eq (Fin n) where
26− (==) fZ fZ = True
26+ (==) FZ FZ = True
27− (==) (fS k) (fS k') = k == k'
27+ (==) (FS k) (FS k') = k == k'
28 (==) _ _ = False
28 (==) _ _ = False
30||| There are no elements of `Fin Z`
30||| There are no elements of `Fin Z`
31FinZAbsurd : Fin Z -> _|_
31FinZAbsurd : Fin Z -> _|_
32−FinZAbsurd fZ impossible
32+FinZAbsurd FZ impossible
34FinZElim : Fin Z -> a
34FinZElim : Fin Z -> a
35FinZElim x = FalseElim (FinZAbsurd x)
35FinZElim x = FalseElim (FinZAbsurd x)
37||| Convert a Fin to a Nat
37||| Convert a Fin to a Nat
38finToNat : Fin n -> Nat
38finToNat : Fin n -> Nat
39−finToNat fZ = Z
39+finToNat FZ = Z
40−finToNat (fS k) = S (finToNat k)
40+finToNat (FS k) = S (finToNat k)
42||| `finToNat` is injective
42||| `finToNat` is injective
43finToNatInjective : (fm : Fin k) -> (fn : Fin k) -> (finToNat fm) = (finToNat fn) -> fm = fn
43finToNatInjective : (fm : Fin k) -> (fn : Fin k) -> (finToNat fm) = (finToNat fn) -> fm = fn
44−finToNatInjective fZ fZ Refl = Refl
44+finToNatInjective FZ FZ Refl = Refl
45−finToNatInjective (fS m) fZ Refl impossible
45+finToNatInjective (FS m) FZ Refl impossible
46−finToNatInjective fZ (fS n) Refl impossible
46+finToNatInjective FZ (FS n) Refl impossible
47−finToNatInjective (fS m) (fS n) prf =
47+finToNatInjective (FS m) (FS n) prf =
48 cong (finToNatInjective m n (succInjective (finToNat m) (finToNat n) prf))
48 cong (finToNatInjective m n (succInjective (finToNat m) (finToNat n) prf))
50instance Cast (Fin n) Nat where
50instance Cast (Fin n) Nat where
@@ -52,29 +52,29 @@ instance Cast (Fin n) Nat where
53||| Convert a Fin to an Integer
53||| Convert a Fin to an Integer
54finToInteger : Fin n -> Integer
54finToInteger : Fin n -> Integer
55−finToInteger fZ = 0
55+finToInteger FZ = 0
56−finToInteger (fS k) = 1 + finToInteger k
56+finToInteger (FS k) = 1 + finToInteger k
58instance Cast (Fin n) Integer where
58instance Cast (Fin n) Integer where
59 cast x = finToInteger x
59 cast x = finToInteger x
61||| Weaken the bound on a Fin by 1
61||| Weaken the bound on a Fin by 1
62weaken : Fin n -> Fin (S n)
62weaken : Fin n -> Fin (S n)
63−weaken fZ = fZ
63+weaken FZ = FZ
64−weaken (fS k) = fS (weaken k)
64+weaken (FS k) = FS (weaken k)
66||| Weaken the bound on a Fin by some amount
66||| Weaken the bound on a Fin by some amount
67weakenN : (n : Nat) -> Fin m -> Fin (m + n)
67weakenN : (n : Nat) -> Fin m -> Fin (m + n)
68−weakenN n fZ = fZ
68+weakenN n FZ = FZ
69−weakenN n (fS f) = fS (weakenN n f)
69+weakenN n (FS f) = FS (weakenN n f)
71||| Attempt to tighten the bound on a Fin.
71||| Attempt to tighten the bound on a Fin.
72||| Return `Left` if the bound could not be tightened, or `Right` if it could.
72||| Return `Left` if the bound could not be tightened, or `Right` if it could.
73strengthen : Fin (S n) -> Either (Fin (S n)) (Fin n)
73strengthen : Fin (S n) -> Either (Fin (S n)) (Fin n)
74−strengthen {n = S k} fZ = Right fZ
74+strengthen {n = S k} FZ = Right FZ
75−strengthen {n = S k} (fS i) with (strengthen i)
75+strengthen {n = S k} (FS i) with (strengthen i)
76− strengthen (fS k) | Left x = Left (fS x)
76+ strengthen (FS k) | Left x = Left (FS x)
77− strengthen (fS k) | Right x = Right (fS x)
77+ strengthen (FS k) | Right x = Right (FS x)
78strengthen f = Left f
78strengthen f = Left f
80||| Add some natural number to a Fin, extending the bound accordingly
80||| Add some natural number to a Fin, extending the bound accordingly
@@ -82,24 +82,24 @@ strengthen f = Left f
82||| @ m the number to increase the Fin by
82||| @ m the number to increase the Fin by
83shift : (m : Nat) -> Fin n -> Fin (m + n)
83shift : (m : Nat) -> Fin n -> Fin (m + n)
84shift Z f = f
84shift Z f = f
85−shift {n=n} (S m) f = fS {k = (m + n)} (shift m f)
85+shift {n=n} (S m) f = FS {k = (m + n)} (shift m f)
87||| The largest element of some Fin type
87||| The largest element of some Fin type
88last : Fin (S n)
88last : Fin (S n)
89−last {n=Z} = fZ
89+last {n=Z} = FZ
90−last {n=S _} = fS last
90+last {n=S _} = FS last
92−total fSinjective : {f : Fin n} -> {f' : Fin n} -> (fS f = fS f') -> f = f'
92+total FSinjective : {f : Fin n} -> {f' : Fin n} -> (FS f = FS f') -> f = f'
93−fSinjective Refl = Refl
93+FSinjective Refl = Refl
95instance Ord (Fin n) where
95instance Ord (Fin n) where
96− compare fZ fZ = EQ
96+ compare FZ FZ = EQ
97− compare fZ (fS _) = LT
97+ compare FZ (FS _) = LT
98− compare (fS _) fZ = GT
98+ compare (FS _) FZ = GT
99− compare (fS x) (fS y) = compare x y
99+ compare (FS x) (FS y) = compare x y
101instance MinBound (Fin (S n)) where
101instance MinBound (Fin (S n)) where
102− minBound = fZ
102+ minBound = FZ
104instance MaxBound (Fin (S n)) where
104instance MaxBound (Fin (S n)) where
105 maxBound = last
105 maxBound = last
@@ -107,28 +107,28 @@ instance MaxBound (Fin (S n)) where
108||| Add two Fins, extending the bound
108||| Add two Fins, extending the bound
109(+) : Fin n -> Fin m -> Fin (n + m)
109(+) : Fin n -> Fin m -> Fin (n + m)
110−(+) {n=S n} {m=m} fZ f' = rewrite plusCommutative n m in weaken (weakenN n f')
110+(+) {n=S n} {m=m} FZ f' = rewrite plusCommutative n m in weaken (weakenN n f')
111−(+) (fS f) f' = fS (f + f')
111+(+) (FS f) f' = FS (f + f')
113||| Substract two Fins, keeping the bound of the minuend
113||| Substract two Fins, keeping the bound of the minuend
114(-) : Fin n -> Fin m -> Fin n
114(-) : Fin n -> Fin m -> Fin n
115−fZ - _ = fZ
115+FZ - _ = FZ
116−f - fZ = f
116+f - FZ = f
117−(fS f) - (fS f') = weaken $ f - f'
117+(FS f) - (FS f') = weaken $ f - f'
119||| Multiply two Fins, extending the bound
119||| Multiply two Fins, extending the bound
120(*) : Fin n -> Fin m -> Fin (n * m)
120(*) : Fin n -> Fin m -> Fin (n * m)
121(*) {n=Z} f f' = FinZElim f
121(*) {n=Z} f f' = FinZElim f
122(*) {m=Z} f f' = FinZElim f'
122(*) {m=Z} f f' = FinZElim f'
123−(*) {n=S n} {m=S m} fZ f' = fZ
123+(*) {n=S n} {m=S m} FZ f' = FZ
124−(*) {n=S n} {m=S m} (fS f) f' = f' + (f * f')
124+(*) {n=S n} {m=S m} (FS f) f' = f' + (f * f')
126-- Construct a Fin from an integer literal which must fit in the given Fin
126-- Construct a Fin from an integer literal which must fit in the given Fin
128natToFin : Nat -> (n : Nat) -> Maybe (Fin n)
128natToFin : Nat -> (n : Nat) -> Maybe (Fin n)
129−natToFin Z (S j) = Just fZ
129+natToFin Z (S j) = Just FZ
130natToFin (S k) (S j) with (natToFin k j)
130natToFin (S k) (S j) with (natToFin k j)
131− | Just k' = Just (fS k')
131+ | Just k' = Just (FS k')
132 | Nothing = Nothing
132 | Nothing = Nothing
133natToFin _ _ = Nothing
133natToFin _ _ = Nothing