summaryrefslogtreecommitdiff
path: root/src/Data/Fin/Occurs.idr
diff options
context:
space:
mode:
authorGreg Brown <greg.brown01@ed.ac.uk>2023-07-07 17:40:03 +0100
committerGreg Brown <greg.brown01@ed.ac.uk>2023-07-07 17:40:03 +0100
commitd42c29c3ded0e48021b24295c925b88232df6b75 (patch)
treeca4a7551e46c4e813cff464ea6acbd74b90d9c99 /src/Data/Fin/Occurs.idr
parent6b637a6d2954e77985e24bbd17f3697eb6f8238a (diff)
Add occurs check for terms.
Diffstat (limited to 'src/Data/Fin/Occurs.idr')
-rw-r--r--src/Data/Fin/Occurs.idr62
1 files changed, 32 insertions, 30 deletions
diff --git a/src/Data/Fin/Occurs.idr b/src/Data/Fin/Occurs.idr
index 899e2a1..58c8faa 100644
--- a/src/Data/Fin/Occurs.idr
+++ b/src/Data/Fin/Occurs.idr
@@ -45,23 +45,24 @@ export
thinSkips : (x : Fin n) -> (y : Fin (pred n)) -> Not (thin x y = x)
thinSkips (FS x) (FS y) prf = thinSkips x y (injective prf)
+%inline
thinSucZero : (x : Fin n) -> thin (FS x) (zero x) = FZ
-thinSucZero FZ = Refl
-thinSucZero (FS x) = Refl
+thinSucZero x = rewrite snd (indexIsSuc x) in Refl
+%inline
thinSucSuc : (x : Fin n) -> (z : Fin (pred n)) -> thin (FS x) (suc z) = FS (thin x z)
thinSucSuc FZ FZ = Refl
-thinSucSuc FZ (FS x) = Refl
+thinSucSuc FZ (FS z) = Refl
thinSucSuc (FS x) FZ = Refl
-thinSucSuc (FS x) (FS y) = Refl
+thinSucSuc (FS x) (FS z) = Refl
export
-thinInverse : (x, y : Fin n) -> Not (x = y) -> (z ** thin x z = y)
+thinInverse : (x, y : Fin n) -> (0 _ : Not (x = y)) -> (z ** thin x z = y)
thinInverse FZ FZ neq = void (neq Refl)
thinInverse FZ (FS y) neq = (y ** Refl)
thinInverse (FS x) FZ neq = (zero x ** thinSucZero x)
thinInverse (FS x) (FS y) neq =
- let (z ** prf) = thinInverse x y (\eq => neq $ cong FS eq) in
+ let (z ** prf) = thinInverse x y (neq . cong FS) in
(suc z ** trans (thinSucSuc x z) (cong FS prf))
-- Thickening ------------------------------------------------------------------
@@ -71,31 +72,32 @@ thick : Fin n -> Fin n -> Maybe (Fin (pred n))
thick FZ FZ = Nothing
thick FZ (FS y) = Just y
thick (FS x) FZ = Just (zero x)
-thick (FS x) (FS y) = [| suc (thick x y) |]
+thick (FS x) (FS y) = suc <$> thick x y
export
-thickIsNothing : (x, y : Fin n) -> (x = y) <=> (thick x y = Nothing)
-thickIsNothing FZ FZ = MkEquivalence (const Refl) (const Refl)
-thickIsNothing FZ (FS y) = MkEquivalence absurd absurd
-thickIsNothing (FS x) FZ = MkEquivalence absurd absurd
-thickIsNothing (FS x) (FS y) =
- let rec = thickIsNothing x y in
- MkEquivalence
- (cong (Just suc <*>) . rec.leftToRight . injective)
- (cong FS . rec.rightToLeft . appNothingRight suc (thick x y))
+thickRefl : (x : Fin n) -> IsNothing (thick x x)
+thickRefl FZ = ItIsNothing
+thickRefl (FS x) = mapNothing suc (thickRefl x)
export
-thickIsJust : (x, y : Fin n) -> Not (x = y) <=> (z ** (thick x y = Just z, thin x z = y))
-thickIsJust FZ FZ = MkEquivalence (\f => absurd $ f Refl) (\p => absurd $ fst $ snd p)
-thickIsJust FZ (FS y) = MkEquivalence (const (y ** (Refl, Refl))) (const absurd)
-thickIsJust (FS x) FZ =
- MkEquivalence
- (const (zero x ** (Refl, thinSucZero x)))
- (const absurd)
-thickIsJust (FS x) (FS y) =
- let rec = thickIsJust x y in
- MkEquivalence
- (\neq =>
- let (z ** (prf1, prf2)) = rec.leftToRight (neq . cong FS) in
- (suc z ** (rewrite prf1 in Refl, trans (thinSucSuc x z) (cong FS prf2))))
- (\(z ** (prf1, prf2)), prf => thinSkips (FS x) z $ trans prf2 (sym prf))
+thickNeq : (x, y : Fin 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 suc (thickNeq x y (neq . cong FS))
+
+export
+thickNothing : (x, y : Fin n) -> (0 _ : IsNothing (thick x y)) -> x = y
+thickNothing FZ FZ prf = Refl
+thickNothing (FS x) (FS y) prf =
+ rewrite thickNothing x y (mapNothingInverse suc (thick x y) prf) in
+ Refl
+
+export
+thickJust : (x, y : Fin n) -> (0 _ : thick x y = Just z) -> thin x z = y
+thickJust FZ (FS y) Refl = Refl
+thickJust (FS x) FZ Refl = thinSucZero x
+thickJust (FS x) (FS y) prf =
+ let 0 z = mapJustInverse suc (thick x y) prf in
+ rewrite snd $ z.snd in
+ trans (thinSucSuc x z.fst) (cong FS $ thickJust x y (fst $ z.snd))