summaryrefslogtreecommitdiff
path: root/src/Data/Fin/Occurs.idr
diff options
context:
space:
mode:
authorGreg Brown <greg.brown01@ed.ac.uk>2023-07-25 16:32:51 +0100
committerGreg Brown <greg.brown01@ed.ac.uk>2023-07-25 16:32:51 +0100
commitc305e99c3f0866d2aa4fb0431b06fc398663bd94 (patch)
treec1dcc5321816c953b11f04b27b438c3de788970c /src/Data/Fin/Occurs.idr
parentbb4e7c82b7ecd93b7241be5fcc547cfd282a8908 (diff)
Remove SFin.
Delete unused modules. Restructure some proofs to reduce the number of lemmas.
Diffstat (limited to 'src/Data/Fin/Occurs.idr')
-rw-r--r--src/Data/Fin/Occurs.idr99
1 files changed, 41 insertions, 58 deletions
diff --git a/src/Data/Fin/Occurs.idr b/src/Data/Fin/Occurs.idr
index dead052..bbf6dd6 100644
--- a/src/Data/Fin/Occurs.idr
+++ b/src/Data/Fin/Occurs.idr
@@ -1,9 +1,8 @@
module Data.Fin.Occurs
import Data.DPair
-import Data.Fin.Strong
+import Data.Fin
import Data.Maybe
-import Data.Maybe.Properties
import Data.Nat
import Syntax.PreorderReasoning
@@ -11,83 +10,67 @@ import Syntax.PreorderReasoning
-- Thinning --------------------------------------------------------------------
export
-thin : SFin n -> SFin (pred n) -> SFin n
-thin FZ y = FS' y
+thin : Fin (S n) -> Fin n -> Fin (S n)
+thin FZ y = FS y
thin (FS x) FZ = FZ
thin (FS x) (FS y) = FS (thin x y)
-- Properties
export
-thinInjective : (x : SFin n) -> {y, z : SFin (pred n)} -> thin x y = thin x z -> y = z
-thinInjective FZ prf = injective {f = FS'} prf
+thinInjective : (x : Fin (S n)) -> {y, z : Fin n} -> thin x y = thin x z -> y = z
+thinInjective FZ prf = injective prf
thinInjective (FS x) {y = FZ, z = FZ} prf = Refl
thinInjective (FS x) {y = FS y, z = FS z} prf = cong FS $ thinInjective x $ injective prf
export
-thinSkips : (x : SFin n) -> (y : SFin (pred n)) -> Not (thin x y = x)
-thinSkips FZ y prf = sucNonZero y prf
+thinSkips : (x : Fin (S n)) -> (y : Fin n) -> Not (thin x y = x)
+thinSkips FZ y prf = absurd prf
thinSkips (FS x) (FS y) prf = thinSkips x y (injective prf)
-thinSuc : {n : Nat} -> (x : SFin (S n)) -> (y : SFin n) -> thin (FS x) (FS' y) = FS (thin x y)
-thinSuc {n = S n} x y = rewrite sucIsFS y in Refl
-
-export
-thinInverse : (x, y : SFin n) -> (0 _ : Not (x = y)) -> (z ** thin x z = y)
-thinInverse FZ FZ neq = void (neq Refl)
-thinInverse FZ (FS y) neq = (y ** sucIsFS y)
-thinInverse (FS x) FZ neq = (FZ ** Refl)
-thinInverse (FS x) (FS y) neq =
- let (z ** prf) = thinInverse x y (\prf => neq $ cong FS prf) in
- (FS' z ** trans (thinSuc x z) (cong FS $ prf))
-
-- Thickening ------------------------------------------------------------------
export
-thick : SFin n -> SFin n -> Maybe (SFin (pred n))
+thick : {n : Nat} -> Fin (S n) -> Fin (S n) -> Maybe (Fin n)
thick FZ FZ = Nothing
thick FZ (FS y) = Just y
-thick (FS x) FZ = Just FZ
-thick (FS x) (FS y) = FS' <$> thick x y
+thick {n = S n} (FS x) FZ = Just FZ
+thick {n = S n} (FS x) (FS y) = FS <$> thick x y
-export
-thickRefl : (x : SFin n) -> IsNothing (thick x x)
-thickRefl FZ = ItIsNothing
-thickRefl (FS x) = mapNothing FS' (thickRefl x)
+public export
+data ThickProof : Fin (S n) -> Fin (S n) -> Maybe (Fin n) -> Type where
+ Equal : res = Nothing -> ThickProof x x res
+ Thinned : (y : Fin n) -> res = Just y -> ThickProof x (thin x y) res
-export
-thickNeq : (x, y : SFin n) -> (0 _ : Not (x = y)) -> IsJust (thick x y)
-thickNeq FZ FZ neq = void (neq Refl)
-thickNeq FZ (FS y) neq = ItIsJust
-thickNeq (FS x) FZ neq = ItIsJust
-thickNeq (FS x) (FS y) neq = mapIsJust FS' (thickNeq x y (\prf => neq $ cong FS prf))
+%name ThickProof prf
export
-thickNothing : (x, y : SFin n) -> (0 _ : IsNothing (thick x y)) -> x = y
-thickNothing FZ FZ prf = Refl
-thickNothing (FS x) (FS y) prf =
- cong FS (thickNothing x y (mapNothingInverse FS' (thick x y) prf))
+thickProof : {n : Nat} -> (x, y : Fin (S n)) -> ThickProof x y (thick x y)
+thickProof FZ FZ = Equal Refl
+thickProof FZ (FS y) = Thinned y Refl
+thickProof {n = S n} (FS x) FZ = Thinned FZ Refl
+thickProof {n = S n} (FS x) (FS y) with (thickProof x y)
+ thickProof (FS x) (FS x) | Equal prf = Equal (cong (map FS) prf)
+ thickProof (FS x) (FS _) | Thinned y prf = Thinned (FS y) (cong (map FS) prf)
+
+thickRefl' :
+ (x, y : Fin (S n)) ->
+ (0 _ : x = y) ->
+ ThickProof x y (thick x y) ->
+ thick x y = Nothing
+thickRefl' x x _ (Equal prf) = prf
+thickRefl' x (thin x z) prf (Thinned z _) = absurd $ thinSkips x z (sym prf)
-export thickJust : (x : SFin n) -> (y : SFin n) -> (0 _ : thick x y = Just z) -> thin x z = y
-thickJust FZ (FS y) Refl = sucIsFS y
-thickJust (FS x) FZ Refl = Refl
-thickJust (FS x) (FS y) prf =
- let invertJust = mapJustInverse FS' (thick x y) prf in
- Calc $
- |~ thin (FS x) z
- ~~ thin (FS x) (FS' invertJust.fst) ...(cong (thin (FS x)) $ snd invertJust.snd)
- ~~ FS (thin x invertJust.fst) ...(thinSuc x invertJust.fst)
- ~~ FS y ...(cong FS $ thickJust x y (fst invertJust.snd))
+export
+thickRefl : {n : Nat} -> (x : Fin (S n)) -> thick x x = Nothing
+thickRefl x = thickRefl' x x Refl (thickProof x x)
export
-thickThin : (x : SFin n) -> (y : SFin (pred n)) -> thick x (thin x y) = Just y
-thickThin x y =
- let
- fromJust =
- extractIsJust $
- thickNeq x (thin x y) (\prf => thinSkips x y $ sym prf)
- in
- Calc $
- |~ thick x (thin x y)
- ~~ Just fromJust.fst ...(fromJust.snd)
- ~~ Just y ...(cong Just $ thinInjective x $ thickJust x (thin x y) fromJust.snd)
+thickThin : {n : Nat} -> (x : Fin (S n)) -> (y : Fin n) -> thick x (thin x y) = Just y
+thickThin x y with (thin x y) proof prf
+ _ | z with (thickProof x z)
+ thickThin x y | x | Equal prf' = absurd $ thinSkips x y prf
+ thickThin x y | _ | Thinned z prf' = Calc $
+ |~ thick x (thin x z)
+ ~~ Just z ...(prf')
+ ~~ Just y ..<(cong Just $ thinInjective x prf)