diff options
Diffstat (limited to 'src/Term')
-rw-r--r-- | src/Term/Semantics.idr | 38 | ||||
-rw-r--r-- | src/Term/Syntax.idr | 47 |
2 files changed, 85 insertions, 0 deletions
diff --git a/src/Term/Semantics.idr b/src/Term/Semantics.idr new file mode 100644 index 0000000..eeb2210 --- /dev/null +++ b/src/Term/Semantics.idr @@ -0,0 +1,38 @@ +module Term.Semantics + +import Term +import public Data.SnocList.Quantifiers + +public export +TypeOf : Ty -> Type +TypeOf N = Nat +TypeOf (ty ~> ty') = TypeOf ty -> TypeOf ty' + +rec : Nat -> a -> (a -> a) -> a +rec 0 x f = x +rec (S k) x f = f (rec k x f) + +fullSem : FullTerm ty ctx -> ctx `Thins` ctx' -> All TypeOf ctx' -> TypeOf ty +fullSem Var thin ctx = indexAll (index thin Here) ctx +fullSem (Const t) thin ctx = const (fullSem t thin ctx) +fullSem (Abs t) thin ctx = \v => fullSem t (Keep thin) (ctx :< v) +fullSem (App (MakePair (t `Over` thin1) (u `Over` thin2) _)) thin ctx = + fullSem t (thin . thin1) ctx (fullSem u (thin . thin2) ctx) +fullSem Zero thin ctx = 0 +fullSem (Suc t) thin ctx = S (fullSem t thin ctx) +fullSem + (Rec (MakePair + (t `Over` thin1) + (MakePair (u `Over` thin2) (v `Over` thin3) _ `Over` thin') + _)) + thin + ctx = + let thin' = thin . thin' in + rec + (fullSem t (thin . thin1) ctx) + (fullSem u (thin' . thin2) ctx) + (fullSem v (thin' . thin3) ctx) + +export +sem : Term ty ctx -> All TypeOf ctx -> TypeOf ty +sem (t `Over` thin) ctx = fullSem t thin ctx diff --git a/src/Term/Syntax.idr b/src/Term/Syntax.idr new file mode 100644 index 0000000..a990600 --- /dev/null +++ b/src/Term/Syntax.idr @@ -0,0 +1,47 @@ +module Term.Syntax + +import public Data.SnocList +import public Term + +-- Combinators + +export +Id : Term (ty ~> ty) ctx +Id = Abs (Var Here) + +export +Arb : {ty : Ty} -> Term ty ctx +Arb {ty = N} = Zero +Arb {ty = ty ~> ty'} = Const Arb + +export +Lit : Nat -> Term N ctx +Lit 0 = Zero +Lit (S k) = Suc (Lit k) + +-- HOAS + +infix 4 ~>* + +public export +(~>*) : SnocList Ty -> Ty -> Ty +sty ~>* ty = foldr (~>) ty sty + +export +Abs' : (Term ty (ctx :< ty) -> Term ty' (ctx :< ty)) -> Term (ty ~> ty') ctx +Abs' f = Abs (f $ Var Here) + +export +App' : {ty : Ty} -> Term (ty ~> ty') ctx -> Term ty ctx -> Term ty' ctx +App' (Const t `Over` thin) u = t `Over` thin +App' (Abs t `Over` thin) u = subst (t `Over` Keep thin) (Base Id :< u) +App' t u = App t u + +export +App : {sty : SnocList Ty} -> Term (sty ~>* ty) ctx -> All (flip Term ctx) sty -> Term ty ctx +App t [<] = t +App t (us :< u) = App' (App t us) u + +export +(.) : {ty, ty' : Ty} -> Term (ty' ~> ty'') ctx -> Term (ty ~> ty') ctx -> Term (ty ~> ty'') ctx +t . u = Abs (App (shift t) [<App (shift u) [<Var Here]]) |