aboutsummaryrefslogtreecommitdiffstats
path: root/theories/evallang/operational.v
diff options
context:
space:
mode:
authorRutger Broekhoff2025-07-07 21:52:08 +0200
committerRutger Broekhoff2025-07-07 21:52:08 +0200
commitba61dfd69504ec6263a9dee9931d93adeb6f3142 (patch)
treed6c9b78e50eeab24e0c1c09ab45909a6ae3fd5db /theories/evallang/operational.v
downloadverified-dyn-lang-interp-ba61dfd69504ec6263a9dee9931d93adeb6f3142.tar.gz
verified-dyn-lang-interp-ba61dfd69504ec6263a9dee9931d93adeb6f3142.zip
Initialize repository
Diffstat (limited to 'theories/evallang/operational.v')
-rw-r--r--theories/evallang/operational.v140
1 files changed, 140 insertions, 0 deletions
diff --git a/theories/evallang/operational.v b/theories/evallang/operational.v
new file mode 100644
index 0000000..79174dd
--- /dev/null
+++ b/theories/evallang/operational.v
@@ -0,0 +1,140 @@
1From Coq Require Import Ascii.
2From mininix Require Export utils.
3From stdpp Require Import options.
4
5Module Import evallang.
6
7Inductive expr :=
8 | EString (s : string)
9 | EId (ds : option expr) (x : string)
10 | EEval (ds : gmap string expr) (ee : expr)
11 | EAbs (ex e : expr)
12 | EApp (e1 e2 : expr).
13
14Module parser.
15 Inductive token :=
16 | TId (s : string)
17 | TString (s : string)
18 | TColon
19 | TExclamation
20 | TParenL
21 | TParenR.
22
23 Inductive token_state :=
24 TSString (s : string) | TSId (s : string) | TSOther.
25
26 Definition token_state_push (st : token_state) (k : list token) : list token :=
27 match st with
28 | TSId s => TId (String.rev s) :: k
29 | _ => k
30 end.
31
32 Fixpoint tokenize_go (sin : string) (st : token_state)
33 (k : list token) : option (list token) :=
34 match sin, st with
35 | "", TSString _ => None (* no closing "" *)
36 | "", _ => Some (reverse (token_state_push st k))
37 | String "\" (String """" sin), TSString s =>
38 tokenize_go sin (TSString (String """" s)) k
39 | String """" sin, TSString s =>
40 tokenize_go sin TSOther (TString (String.rev s) :: k)
41 | String a sin, TSString s => tokenize_go sin (TSString (String a s)) k
42 | String ":" sin, _ => tokenize_go sin TSOther (TColon :: token_state_push st k)
43 | String "!" sin, _ => tokenize_go sin TSOther (TExclamation :: token_state_push st k)
44 | String "(" sin, _ => tokenize_go sin TSOther (TParenL :: token_state_push st k)
45 | String ")" sin, _ => tokenize_go sin TSOther (TParenR :: token_state_push st k)
46 | String """" sin, _ => tokenize_go sin (TSString "") k
47 | String a sin, TSOther =>
48 if Ascii.is_space a then tokenize_go sin TSOther k
49 else tokenize_go sin (TSId (String a EmptyString)) k
50 | String a sin, TSId s =>
51 if Ascii.is_space a then tokenize_go sin TSOther (TId (String.rev s) :: k)
52 else tokenize_go sin (TSId (String a s)) k
53 end.
54 Definition tokenize (sin : string) : option (list token) :=
55 tokenize_go sin TSOther [].
56
57 Inductive stack_item :=
58 | SExpr (e : expr)
59 | SAbsR (e : expr)
60 | SEval
61 | SParenL.
62
63 Definition stack_push (e : expr) (k : list stack_item) : list stack_item :=
64 match k with
65 | SExpr e1 :: k => SExpr (EApp e1 e) :: k
66 | SEval :: k => SExpr (EEval ∅ e) :: k
67 | _ => SExpr e :: k
68 end.
69
70 Fixpoint stack_pop_go (e : expr)
71 (k : list stack_item) : option (expr * list stack_item) :=
72 match k with
73 | SAbsR e1 :: k => stack_pop_go (EAbs e1 e) k
74 | _ => Some (e, k)
75 end.
76
77 Definition stack_pop (k : list stack_item) : option (expr * list stack_item) :=
78 match k with
79 | SExpr e :: k => stack_pop_go e k
80 | _ => None
81 end.
82
83 Fixpoint parse_go (ts : list token) (k : list stack_item) : option expr :=
84 match ts with
85 | [] => '(e, k) ← stack_pop k; guard (k = []);; Some e
86 | TString x :: ts => parse_go ts (stack_push (EString x) k)
87 | TId "eval" :: TExclamation :: ts => parse_go ts (SEval :: k)
88 | TId x :: TColon :: ts => parse_go ts (SAbsR (EString x) :: k)
89 | TId x :: ts => parse_go ts (stack_push (EId None x) k)
90 | TColon :: ts =>
91 '(e, k) ← stack_pop k;
92 parse_go ts (SAbsR e :: k)
93 | TParenL :: ts => parse_go ts (SParenL :: k)
94 | TParenR :: ts =>
95 '(e, k) ← stack_pop k;
96 match k with
97 | SParenL :: k => parse_go ts (stack_push e k)
98 | _ => None
99 end
100 | _ => None
101 end.
102
103 Definition parse (sin : string) : option expr :=
104 ts ← tokenize sin; parse_go ts [].
105End parser.
106
107Definition parse := parser.parse.
108
109Fixpoint subst (ds : gmap string expr) (e : expr) : expr :=
110 match e with
111 | EString s => EString s
112 | EId ds' x => EId (ds !! x ∪ ds') x
113 | EEval ds' ee => EEval (ds ∪ ds') (subst ds ee)
114 | EAbs ex e => EAbs (subst ds ex) (subst ds e)
115 | EApp e1 e2 => EApp (subst ds e1) (subst ds e2)
116 end.
117
118Reserved Infix "-->" (right associativity, at level 55).
119Inductive step : expr → expr → Prop :=
120 | Sβ x e1 e2 : EApp (EAbs (EString x) e1) e2 --> subst {[x:=e2]} e1
121 | SId e x : EId (Some e) x --> e
122 | SEvalString ds s e : parse s = Some e → EEval ds (EString s) --> subst ds e
123 | SAbsL ex1 ex1' e : ex1 --> ex1' → EAbs ex1 e --> EAbs ex1' e
124 | SAppL e1 e1' e2 : e1 --> e1' → EApp e1 e2 --> EApp e1' e2
125 | SEval ds e1 e1' : e1 --> e1' → EEval ds e1 --> EEval ds e1'
126where "e1 --> e2" := (step e1 e2).
127
128Infix "-->*" := (rtc step) (right associativity, at level 55).
129
130Definition final (e : expr) : Prop :=
131 match e with
132 | EString _ => True
133 | EAbs (EString _) _ => True
134 | _ => False
135 end.
136
137Definition stuck (e : expr) : Prop :=
138 nf step e ∧ ¬final e.
139
140End evallang.