summaryrefslogtreecommitdiff
path: root/src/Data/Term.idr
diff options
context:
space:
mode:
Diffstat (limited to 'src/Data/Term.idr')
-rw-r--r--src/Data/Term.idr62
1 files changed, 60 insertions, 2 deletions
diff --git a/src/Data/Term.idr b/src/Data/Term.idr
index 973ff3d..bfeb360 100644
--- a/src/Data/Term.idr
+++ b/src/Data/Term.idr
@@ -2,7 +2,10 @@ module Data.Term
import public Data.DPair
import public Data.Vect
+
+import Data.Fin.Extra
import Data.Vect.Properties.Map
+
import Syntax.PreorderReasoning
%prefix_record_projections off
@@ -88,12 +91,20 @@ subAssoc f g (Op op ts) = cong (Op op) $ Calc $
export
subComp :
- (f : Fin k -> Term sig n) ->
- (r : Fin j -> Fin k) ->
+ (0 f : Fin k -> Term sig n) ->
+ (0 r : Fin j -> Fin k) ->
f . pure r .=. f . r
subComp f r i = Refl
export
+subAssoc' :
+ (f : Fin k -> Term sig n) ->
+ (g : Fin j -> Fin k) ->
+ (t : Term sig j) ->
+ (f . g) <$> t = f <$> pure g <$> t
+subAssoc' f g = subAssoc f (Var . g)
+
+export
compCong2 :
{0 f1, f2 : Fin k -> Term sig n} ->
{0 g1, g2 : Fin j -> Term sig k} ->
@@ -119,6 +130,53 @@ compCongR :
f . g1 .=. f . g2
compCongR f prf = compCong2 (\_ => Refl) prf
+-- Substitution is a Semigroupoid ----------------------------------------------
+
+export
+(++) :
+ {j : Nat} ->
+ (Fin j -> Term sig n) ->
+ (Fin k -> Term sig n) ->
+ Fin (j + k) -> Term sig n
+f ++ g = either f g . splitSum
+
+export
+appendWeakenN :
+ {j : Nat} ->
+ (0 f : Fin j -> Term sig n) ->
+ (0 g : Fin k -> Term sig n) ->
+ (f ++ g) . weakenN k .=. f
+appendWeakenN f g i = cong (either f g) $ splitSumOfWeakenN i
+
+export
+appendShift :
+ {j : Nat} ->
+ (0 f : Fin j -> Term sig n) ->
+ (0 g : Fin k -> Term sig n) ->
+ (f ++ g) . shift j .=. g
+appendShift f g i = cong (either f g) $ splitSumOfShift i
+
+export
+appendCong2 :
+ {j : Nat} ->
+ {0 f : Fin j -> Term sig n} ->
+ {0 g : Fin k -> Term sig n} ->
+ {0 h : Fin (j + k) -> Term sig n} ->
+ h . weakenN k .=. f ->
+ h . shift j .=. g ->
+ h .=. f ++ g
+appendCong2 prf1 prf2 x with (splitSum x) proof prf
+ _ | Left i = Calc $
+ |~ h x
+ ~~ h (indexSum (splitSum x)) ..<(cong h (indexOfSplitSumInverse x))
+ ~~ h (weakenN k i) ...(cong (h . indexSum) prf)
+ ~~ f i ...(prf1 i)
+ _ | Right i = Calc $
+ |~ h x
+ ~~ h (indexSum (splitSum x)) ..<(cong h (indexOfSplitSumInverse x))
+ ~~ h (shift j i) ...(cong (h . indexSum) prf)
+ ~~ g i ...(prf2 i)
+
-- Injectivity -----------------------------------------------------------------
export