diff options
author | Rutger Broekhoff | 2025-07-07 21:52:08 +0200 |
---|---|---|
committer | Rutger Broekhoff | 2025-07-07 21:52:08 +0200 |
commit | ba61dfd69504ec6263a9dee9931d93adeb6f3142 (patch) | |
tree | d6c9b78e50eeab24e0c1c09ab45909a6ae3fd5db /theories/evallang/operational.v | |
download | verified-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.v | 140 |
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 @@ | |||
1 | From Coq Require Import Ascii. | ||
2 | From mininix Require Export utils. | ||
3 | From stdpp Require Import options. | ||
4 | |||
5 | Module Import evallang. | ||
6 | |||
7 | Inductive 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 | |||
14 | Module 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 []. | ||
105 | End parser. | ||
106 | |||
107 | Definition parse := parser.parse. | ||
108 | |||
109 | Fixpoint 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 | |||
118 | Reserved Infix "-->" (right associativity, at level 55). | ||
119 | Inductive 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' | ||
126 | where "e1 --> e2" := (step e1 e2). | ||
127 | |||
128 | Infix "-->*" := (rtc step) (right associativity, at level 55). | ||
129 | |||
130 | Definition final (e : expr) : Prop := | ||
131 | match e with | ||
132 | | EString _ => True | ||
133 | | EAbs (EString _) _ => True | ||
134 | | _ => False | ||
135 | end. | ||
136 | |||
137 | Definition stuck (e : expr) : Prop := | ||
138 | nf step e ∧ ¬final e. | ||
139 | |||
140 | End evallang. | ||