diff options
author | Greg Brown <greg.brown01@ed.ac.uk> | 2023-07-11 13:54:54 +0100 |
---|---|---|
committer | Greg Brown <greg.brown01@ed.ac.uk> | 2023-07-11 13:54:54 +0100 |
commit | 60d5896ab7939ae42cf7744f93e8eaefa0675854 (patch) | |
tree | 17ea29b716e0dc9848f6b3bc28b25dec48e8492d /src/Data/Term/Zipper.idr | |
parent | ce546fe96974cb7aa3b09c729f33ac6ba5169299 (diff) |
Use new notion of Fin to reduce casts.
Diffstat (limited to 'src/Data/Term/Zipper.idr')
-rw-r--r-- | src/Data/Term/Zipper.idr | 98 |
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' |