summaryrefslogtreecommitdiff
path: root/src/Data/Term/Zipper.idr
diff options
context:
space:
mode:
authorGreg Brown <greg.brown01@ed.ac.uk>2023-07-11 13:54:54 +0100
committerGreg Brown <greg.brown01@ed.ac.uk>2023-07-11 13:54:54 +0100
commit60d5896ab7939ae42cf7744f93e8eaefa0675854 (patch)
tree17ea29b716e0dc9848f6b3bc28b25dec48e8492d /src/Data/Term/Zipper.idr
parentce546fe96974cb7aa3b09c729f33ac6ba5169299 (diff)
Use new notion of Fin to reduce casts.
Diffstat (limited to 'src/Data/Term/Zipper.idr')
-rw-r--r--src/Data/Term/Zipper.idr98
1 files changed, 66 insertions, 32 deletions
diff --git a/src/Data/Term/Zipper.idr b/src/Data/Term/Zipper.idr
index 3f6668a..608e86c 100644
--- a/src/Data/Term/Zipper.idr
+++ b/src/Data/Term/Zipper.idr
@@ -2,17 +2,53 @@ module Data.Term.Zipper
import Data.DPair
import Data.Fin.Occurs
-import Data.Vect.Properties.Insert
+import Data.Fin.Strong
import Data.Vect.Properties.Map
import Data.Term
import Syntax.PreorderReasoning
+-- Utilities -------------------------------------------------------------------
+
+public export
+insertAt' : SFin k -> a -> Vect (pred k) a -> Vect k a
+insertAt' FZ x xs = x :: xs
+insertAt' (FS i) x (y :: xs) = y :: insertAt' i x xs
+
+public export
+deleteAt' : SFin k -> Vect k a -> Vect (pred k) a
+deleteAt' FZ (x :: xs) = xs
+deleteAt' (FS i) (x :: xs) = x :: deleteAt' i xs
+
+mapInsertAt :
+ (0 f : a -> b) ->
+ (i : SFin k) ->
+ (x : a) ->
+ (xs : Vect (pred k) a) ->
+ map f (insertAt' i x xs) = insertAt' i (f x) (map f xs)
+mapInsertAt f FZ x xs = Refl
+mapInsertAt f (FS i) x (y :: xs) = cong (f y ::) $ mapInsertAt f i x xs
+
+insertAtDeleteAt :
+ (i : SFin k) ->
+ (xs : Vect k a) ->
+ insertAt' i (index (strongToFin i) xs) (deleteAt' i xs) = xs
+insertAtDeleteAt FZ (x :: xs) = Refl
+insertAtDeleteAt (FS i) (x :: xs) = cong (x ::) $ insertAtDeleteAt i xs
+
+indexInsertAt :
+ (i : SFin k) ->
+ (x : a) ->
+ (xs : Vect (pred k) a) ->
+ index (strongToFin i) (insertAt' i x xs) = x
+indexInsertAt FZ x xs = Refl
+indexInsertAt (FS i) x (y :: xs) = indexInsertAt i x xs
+
-- Definition ------------------------------------------------------------------
public export
data Zipper : Signature -> Nat -> Type where
Top : Zipper sig n
- Op : sig.Operator (S k) -> Fin (S k) -> Vect k (Term sig n) -> Zipper sig n -> Zipper sig n
+ Op : sig.Operator k -> SFin k -> Vect (pred k) (Term sig n) -> Zipper sig n -> Zipper sig n
%name Zipper zip
@@ -45,7 +81,7 @@ assoc (Op op i ts zip1) zip2 zip3 = cong (Op op i ts) (assoc zip1 zip2 zip3)
public export
(+) : Zipper sig n -> Term sig n -> Term sig n
Top + t = t
-Op op i ts zip + t = Op op (insertAt i (zip + t) ts)
+Op op i ts zip + t = Op op (insertAt' i (zip + t) ts)
-- Properties
@@ -56,12 +92,12 @@ actionAssoc :
(zip1 ++ zip2) + t = zip1 + (zip2 + t)
actionAssoc Top zip2 t = Refl
actionAssoc (Op op i ts zip1) zip2 t =
- cong (\t => Op op (insertAt i t ts)) $ actionAssoc zip1 zip2 t
+ cong (\t => Op op (insertAt' i t ts)) $ actionAssoc zip1 zip2 t
-- Substitution ----------------------------------------------------------------
export
-(<$>) : (Fin k -> Term sig n) -> Zipper sig k -> Zipper sig n
+(<$>) : (SFin k -> Term sig n) -> Zipper sig k -> Zipper sig n
f <$> Top = Top
f <$> Op op i ts zip = Op op i (map (f <$>) ts) (f <$> zip)
@@ -69,35 +105,27 @@ f <$> Op op i ts zip = Op op i (map (f <$>) ts) (f <$> zip)
export
actionHomo :
- (0 f : Fin k -> Term sig n) ->
+ (0 f : SFin k -> Term sig n) ->
(zip : Zipper sig k) ->
(0 t : Term sig k) ->
f <$> zip + t = (f <$> zip) + (f <$> t)
actionHomo f Top t = Refl
actionHomo f (Op op i ts zip) t = cong (Op op) $ Calc $
- |~ map (f <$>) (insertAt i (zip + t) ts)
- ~~ insertAt i (f <$> zip + t) (map (f <$>) ts) ...(mapInsertAt (f <$>) i (zip + t) ts)
- ~~ insertAt i ((f <$> zip) + (f <$> t)) (map (f <$>) ts) ...(cong (\t => insertAt i t (map (f <$>) ts)) $ actionHomo f zip t)
+ |~ map (f <$>) (insertAt' i (zip + t) ts)
+ ~~ insertAt' i (f <$> zip + t) (map (f <$>) ts) ...(mapInsertAt (f <$>) i (zip + t) ts)
+ ~~ insertAt' i ((f <$> zip) + (f <$> t)) (map (f <$>) ts) ...(cong (\t => insertAt' i t (map (f <$>) ts)) $ actionHomo f zip t)
-- Cycles ----------------------------------------------------------------------
-pivotAt : sig.Operator k -> Fin k -> Vect k (Term sig n) -> Zipper sig n
-pivotAt op i ts =
- let op' = replace {p = sig.Operator} (snd prf) op in
- let i' = replace {p = Fin} (snd prf) i in
- let ts' = replace {p = flip Vect (Term sig n)} (snd prf) ts in
- Op op' i' (deleteAt i' ts') Top
- where
- prf : Exists (\j => k = S j)
- prf = indexIsSuc i
+pivotAt : sig.Operator k -> SFin k -> Vect k (Term sig n) -> Zipper sig n
+pivotAt op i ts = Op op i (deleteAt' i ts) Top
actionPivotAt :
(op : sig.Operator k) ->
- (i : Fin k) ->
+ (i : SFin k) ->
(ts : Vect k (Term sig n)) ->
- pivotAt op i ts + index i ts = Op op ts
-actionPivotAt op i@FZ ts = cong (Op op) $ insertAtIndex i ts
-actionPivotAt op i@(FS _) ts = cong (Op op) $ insertAtIndex i ts
+ pivotAt op i ts + index (strongToFin i) ts = Op op ts
+actionPivotAt op i ts = cong (Op op) $ insertAtDeleteAt i ts
pivotNotTop : (zip : Zipper sig k) -> Not (zip ++ pivotAt op i ts = Top)
pivotNotTop (Op op' j us zip) prf impossible
@@ -108,17 +136,23 @@ noCycles Top t prf = Refl
noCycles (Op {k} op i ts zip') t@(Op {k = j} op' us) prf =
void $ pivotNotTop zip' prf''
where
- I : Fin j
- I = replace {p = Fin} (opInjectiveLen prf) i
+ i' : Fin k
+ i' = strongToFin i
+
+ I : SFin j
+ I = replace {p = SFin} (opInjectiveLen prf) i
+
+ I' : Fin j
+ I' = strongToFin I
- prf' : ((zip' ++ pivotAt op' I us) + index I us = index I us)
+ prf' : ((zip' ++ pivotAt op' I us) + index I' us = index I' us)
prf' = Calc $
- |~ (zip' ++ pivotAt op' I us) + index I us
- ~~ zip' + (pivotAt op' I us + index I us) ...(actionAssoc zip' (pivotAt op' I us) (index I us))
- ~~ zip' + Op op' us ...(cong (zip' +) $ actionPivotAt op' I us)
- ~~ index i (insertAt i (zip' + Op op' us) ts) ..<(indexInsertAt i (zip' + Op op' us) ts)
- ~~ index i (rewrite opInjectiveLen prf in us) ...(cong (index i) $ opInjectiveTs prf)
- ~~ index I us ...(rewrite opInjectiveLen prf in Refl)
+ |~ (zip' ++ pivotAt op' I us) + index I' us
+ ~~ zip' + (pivotAt op' I us + index I' us) ...(actionAssoc zip' (pivotAt op' I us) (index I' us))
+ ~~ zip' + Op op' us ...(cong (zip' +) $ actionPivotAt op' I us)
+ ~~ index i' (insertAt' i (zip' + Op op' us) ts) ..<(indexInsertAt i (zip' + Op op' us) ts)
+ ~~ index i' (rewrite opInjectiveLen prf in us) ...(cong (index i') $ opInjectiveTs prf)
+ ~~ index I' us ...(rewrite opInjectiveLen prf in Refl)
prf'' : zip' ++ pivotAt op' I us = Top
- prf'' = noCycles (zip' ++ pivotAt op' I us) (assert_smaller t (index I us)) prf'
+ prf'' = noCycles (zip' ++ pivotAt op' I us) (assert_smaller t (index I' us)) prf'