From d926ce9f2d1144f329598a30b3ed2e48899519b2 Mon Sep 17 00:00:00 2001 From: Greg Brown Date: Wed, 9 Oct 2024 16:57:47 +0100 Subject: Write a System T to Primrose program. --- program/syst-to-primrose.prim | 77 +++++++++++++++++++++++++++++++++++++++++++ program/syst-to-primrose.pty | 41 +++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 program/syst-to-primrose.prim create mode 100644 program/syst-to-primrose.pty (limited to 'program') diff --git a/program/syst-to-primrose.prim b/program/syst-to-primrose.prim new file mode 100644 index 0000000..8ba1e6a --- /dev/null +++ b/program/syst-to-primrose.prim @@ -0,0 +1,77 @@ +let Prim = +(\X => + [ Var: Nat + , Lit: Nat + , Suc: X + , Abs: X + , App: + , Unit: <> + , Pair: + , Fst: X + , Snd: X + , Absurd: + , Inl: X + , Inr: X + , Case: + , Expand: X + , Contract: X + , Fold: + , Let: + , Annot: + < Term: X + , Type: (\Y => + [ Var: Nat + , N: <> + , Arrow: + , Unit: <> + , Pair: + , Bottom: <> + , Sum: + , Fix: Y + ]) + > + ]) +in +let lift (f : Nat -> Nat) (x : Nat) : Nat = + case !x of + { Z u => 0 + ; S n => suc (f n) + } +in +let rename (t : Prim) : (Nat -> Nat) -> Prim = + foldcase t by + { Var n => \f => ~(Var (f n)) + ; Lit n => \f => ~(Lit n) + ; Suc t => \f => ~(Suc (t f)) + ; Abs t => \f => ~(Abs (t (lift f))) + ; App p => \f => ~(App ) + ; Unit u => \f => ~(Unit u) + ; Pair p => \f => ~(Pair ) + ; Fst t => \f => ~(Fst (t f)) + ; Snd t => \f => ~(Snd (t f)) + ; Absurd p => \f => ~(Absurd ) + ; Inl t => \f => ~(Inl (t f)) + ; Inr t => \f => ~(Inr (t f)) + ; Case p => \f => ~(Case ) + ; Expand t => \f => ~(Expand (t f)) + ; Contract t => \f => ~(Contract (t f)) + ; Fold p => \f => ~(Fold ) + ; Let p => \f => ~(Let ) + ; Annot p => \f => ~(Annot ) + } +in +\p => foldcase p by + { Var n => ~(Var n) + ; Zero u => ~(Lit 0) + ; Suc e => ~(Suc e) + ; Abs e => ~(Abs e) + ; App p => ~(App p) + ; Rec p => ~(Fold + < Target: p.Target + , Body: ~(Case + < Target: ~(Var 0) + , Left: rename p.Zero (\x => suc (suc x)) + , Right: rename p.Suc (lift suc) + >) + >) + } diff --git a/program/syst-to-primrose.pty b/program/syst-to-primrose.pty new file mode 100644 index 0000000..4030642 --- /dev/null +++ b/program/syst-to-primrose.pty @@ -0,0 +1,41 @@ +(\X => + [ Var: Nat + , Zero: <> + , Suc: X + , Rec: + , Abs: X + , App: + ]) +-> +(\X => + [ Var: Nat + , Lit: Nat + , Suc: X + , Abs: X + , App: + , Unit: <> + , Pair: + , Fst: X + , Snd: X + , Absurd: + , Inl: X + , Inr: X + , Case: + , Expand: X + , Contract: X + , Fold: + , Let: + , Annot: + < Term: X + , Type: (\Y => + [ Var: Nat + , N: <> + , Arrow: + , Unit: <> + , Pair: + , Bottom: <> + , Sum: + , Fix: Y + ]) + > + ]) -- cgit v1.2.3