diff options
author | Greg Brown <greg.brown01@ed.ac.uk> | 2023-07-25 16:32:51 +0100 |
---|---|---|
committer | Greg Brown <greg.brown01@ed.ac.uk> | 2023-07-25 16:32:51 +0100 |
commit | c305e99c3f0866d2aa4fb0431b06fc398663bd94 (patch) | |
tree | c1dcc5321816c953b11f04b27b438c3de788970c /src/Data/Fin/Occurs.idr | |
parent | bb4e7c82b7ecd93b7241be5fcc547cfd282a8908 (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.idr | 99 |
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) |