From 9d595c4ad37b58385908dc46b3413aacc4f2e4b7 Mon Sep 17 00:00:00 2001 From: Greg Brown Date: Fri, 30 Jun 2023 17:28:15 +0100 Subject: Define terms, renaming and substitution. --- src/Data/Term.idr | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/Data/Term.idr (limited to 'src/Data/Term.idr') diff --git a/src/Data/Term.idr b/src/Data/Term.idr new file mode 100644 index 0000000..95fd9f8 --- /dev/null +++ b/src/Data/Term.idr @@ -0,0 +1,74 @@ +module Data.Term + +import public Data.Vect +import Data.Vect.Properties.Map +import Syntax.PreorderReasoning + +%prefix_record_projections off + +-- Definition ------------------------------------------------------------------ + +public export +record Signature where + Operator : Nat -> Type + +%name Signature sig + +public export +data Term : Signature -> Nat -> Type where + Var : Fin n -> Term sig n + Op : sig.Operator k -> Vect k (Term sig n) -> Term sig n + +%name Term t, u, v + +-- Substitution ---------------------------------------------------------------- + +export +pure : (Fin k -> Fin n) -> Fin k -> Term sig n +pure r = Var . r + +export +(<$>) : (Fin k -> Term sig n) -> Term sig k -> Term sig n +f <$> Var i = f i +f <$> Op op ts = Op op (map (\t => f <$> assert_smaller ts t) ts) + +-- Extensional Equality -------------------------------------------------------- + +public export +0 (.=.) : Rel (Fin k -> Term sig n) +f .=. g = (i : Fin k) -> f i = g i + +-- Substitution is Monadic ----------------------------------------------------- + +export +(.) : (Fin k -> Term sig n) -> (Fin j -> Term sig k) -> Fin j -> Term sig n +f . g = (f <$>) . g + +-- Properties + +export +subUnit : (t : Term sig n) -> Var <$> t = t +subUnit (Var i) = Refl +subUnit (Op op ts) = cong (Op op) $ Calc $ + |~ map (Var <$>) ts + ~~ map id ts ...(mapExtensional (Var <$>) id (\t => subUnit (assert_smaller ts t)) ts) + ~~ ts ...(mapId ts) + +export +subAssoc : + (f : Fin k -> Term sig n) -> + (g : Fin j -> Term sig k) -> + (t : Term sig j) -> + (f . g) <$> t = f <$> g <$> t +subAssoc f g (Var i) = Refl +subAssoc f g (Op op ts) = cong (Op op) $ Calc $ + |~ map ((f . g) <$>) ts + ~~ map ((f <$>) . (g <$>)) ts ...(mapExtensional ((f . g) <$>) ((f <$>) . (g <$>)) (\t => subAssoc f g (assert_smaller ts t)) ts) + ~~ map (f <$>) (map (g <$>) ts) ..<(mapFusion (f <$>) (g <$>) ts) + +export +subComp : + (f : Fin k -> Term sig n) -> + (r : Fin j -> Fin k) -> + f . pure r .=. f . r +subComp f r i = Refl -- cgit v1.2.3