From 82783476f330801b54402bdcc4723add44a963dc Mon Sep 17 00:00:00 2001 From: Greg Brown Date: Tue, 29 Oct 2024 18:58:45 +0000 Subject: Write a fuelled reducer for System T. --- program/reducer.prim | 123 ++++++++++++++++++++++++++++++++++++++++++ program/reducer.pty | 17 ++++++ program/syst-to-primrose.prim | 77 -------------------------- program/syst-to-primrose.pty | 41 -------------- 4 files changed, 140 insertions(+), 118 deletions(-) create mode 100644 program/reducer.prim create mode 100644 program/reducer.pty delete mode 100644 program/syst-to-primrose.prim delete mode 100644 program/syst-to-primrose.pty (limited to 'program') diff --git a/program/reducer.prim b/program/reducer.prim new file mode 100644 index 0000000..ead7fbc --- /dev/null +++ b/program/reducer.prim @@ -0,0 +1,123 @@ +let Bool = [T: <>, F: <>] in +let or (x : Bool) (y : Bool) : Bool = case x of {T u => T <>; F u => y} in +let SysT = + (\T => + [ Var: Nat + , Zero: <> + , Suc: T + , Primrec: + , Abs: T + , App: + ]) +in +let Stepped = in +let lift (f : Nat -> Nat) (n : Nat) : Nat = + case !n of {Z u => 0; S k => suc (f k)} +in +let rename (t : SysT) : (Nat -> Nat) -> SysT = + foldcase t by + { Var n => \f => ~(Var (f n)) + ; Zero u => \f => ~(Zero <>) + ; Suc r => \f => ~(Suc (r f)) + ; Primrec p => \f => + ~(Primrec ) + ; Abs r => \f => ~(Abs (r f)) + ; App p => \f => ~(App ) + } +in +let index (xs : List SysT) : Nat -> SysT = + foldcase xs by + { N u => \k => ~(Var k) + ; C p => \k => case !k of {Z u => p.H; S k => p.T k} + } +in +let shift = map (\X => List X) SysT SysT (\t => rename t suc) in +let sub (t : SysT) : List SysT -> SysT = + foldcase t by + { Var n => \env => index env n + ; Zero u => \env => ~(Zero <>) + ; Suc f => \env => ~(Suc (f env)) + ; Primrec p => \env => + ~(Primrec + < Zero: p.Zero env + , Suc: p.Suc ~(C ) + , Target: p.Target env + >) + ; Abs f => \env => ~(Abs (f ~(C ))) + ; App p => \env => ~(App ) + } +in +let app (fun : SysT) (arg : SysT) (smaller : Bool) : Stepped = + let default : Stepped = ), Smaller: smaller> + in + case !fun of + { Var n => default + ; Zero u => default + ; Suc t => default + ; Primrec p => default + ; Abs t => )>), Smaller: T <>> + ; App t => default + } +in +let rec (z : SysT) (s : SysT) (target : SysT) (smaller : Bool) : Stepped = + let default : Stepped = + ), Smaller: smaller> + in + case !target of + { Var n => default + ; Zero u => > + ; Suc t => + < Term: + sub s ~(C ), T: ~(N <>)>) + , Smaller: T <> + > + ; Primrec p => default + ; Abs t => default + ; App t => default + } +in +let step (t : SysT) : Stepped = + foldcase t by + { Var n => > + ; Zero u => ), Smaller: F <>> + ; Suc t => + ; Primrec t => + case t.Target.Smaller of + { F u => + rec + t.Zero.Term + t.Suc.Term + t.Target.Term + (or t.Zero.Smaller t.Suc.Smaller) + ; T u => + < Term: + ~(Primrec + (map + (\X => ) + Stepped + SysT + (\p => p.Term) + t)) + , Smaller: T <> + > + } + ; Abs t => + ; App t => + case t.Arg.Smaller of + { F u => app t.Fun.Term t.Arg.Term t.Fun.Smaller + ; T u => + < Term: + ~(App + (map (\X => ) Stepped SysT (\p => p.Term) t)) + , Smaller: T <> + > + } + } +in +\n => + foldcase n by + { Z u => \t => t + ; S f => \t => + let stepped = step t in + case stepped.Smaller of {F u => stepped.Term; T u => f stepped.Term} + } diff --git a/program/reducer.pty b/program/reducer.pty new file mode 100644 index 0000000..996541b --- /dev/null +++ b/program/reducer.pty @@ -0,0 +1,17 @@ +Nat -> +(\T => + [ Var: Nat + , Zero: <> + , Suc: T + , Primrec: + , Abs: T + , App: + ]) -> +(\T => + [ Var: Nat + , Zero: <> + , Suc: T + , Primrec: + , Abs: T + , App: + ]) diff --git a/program/syst-to-primrose.prim b/program/syst-to-primrose.prim deleted file mode 100644 index 8ba1e6a..0000000 --- a/program/syst-to-primrose.prim +++ /dev/null @@ -1,77 +0,0 @@ -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 deleted file mode 100644 index 4030642..0000000 --- a/program/syst-to-primrose.pty +++ /dev/null @@ -1,41 +0,0 @@ -(\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