16 | BVar of int * Univ list |
16 | BVar of int * Univ list |
17 | Abs of (int * (Univ list -> Univ)) * Univ list |
17 | Abs of (int * (Univ list -> Univ)) * Univ list |
18 val apps: Univ -> Univ list -> Univ (*explicit applications*) |
18 val apps: Univ -> Univ list -> Univ (*explicit applications*) |
19 val abss: int -> (Univ list -> Univ) -> Univ |
19 val abss: int -> (Univ list -> Univ) -> Univ |
20 (*abstractions as closures*) |
20 (*abstractions as closures*) |
21 val eq_Univ: Univ * Univ -> bool |
21 val same: Univ * Univ -> bool |
22 |
22 |
23 val put_result: (unit -> Univ list -> Univ list) -> Proof.context -> Proof.context |
23 val put_result: (unit -> Univ list -> Univ list) -> Proof.context -> Proof.context |
24 val trace: bool Unsynchronized.ref |
24 val trace: bool Unsynchronized.ref |
25 |
25 |
26 val setup: theory -> theory |
26 val setup: theory -> theory |
181 | GREATER => Abs ((k, f), ys @ xs) (*note: reverse convention also for apps!*) |
181 | GREATER => Abs ((k, f), ys @ xs) (*note: reverse convention also for apps!*) |
182 end |
182 end |
183 | apps (Const (name, xs)) ys = Const (name, ys @ xs) |
183 | apps (Const (name, xs)) ys = Const (name, ys @ xs) |
184 | apps (BVar (n, xs)) ys = BVar (n, ys @ xs); |
184 | apps (BVar (n, xs)) ys = BVar (n, ys @ xs); |
185 |
185 |
186 fun satisfy_abs (abs as ((n, f), xs)) some_k = |
186 fun same (Const (k, xs), Const (l, ys)) = k = l andalso eq_list same (xs, ys) |
187 let |
187 | same (DFree (s, k), DFree (t, l)) = s = t andalso k = l |
188 val ys = case some_k |
188 | same (BVar (k, xs), BVar (l, ys)) = k = l andalso eq_list same (xs, ys) |
189 of NONE => replicate n (BVar (0, [])) |
189 | same _ = false; |
190 | SOME k => map_range (fn l => BVar (k + l, [])) n; |
|
191 in (apps (Abs abs) ys, ys) end; |
|
192 |
|
193 fun maxidx (Const (_, xs)) = fold maxidx xs |
|
194 | maxidx (DFree _) = I |
|
195 | maxidx (BVar (l, xs)) = fold maxidx xs #> Integer.max (l + 1) |
|
196 | maxidx (Abs abs) = maxidx (fst (satisfy_abs abs NONE)); |
|
197 |
|
198 fun eq_Univ (Const (k, xs), Const (l, ys)) = k = l andalso eq_list eq_Univ (xs, ys) |
|
199 | eq_Univ (DFree (s, k), DFree (t, l)) = s = t andalso k = l |
|
200 | eq_Univ (BVar (k, xs), BVar (l, ys)) = k = l andalso eq_list eq_Univ (xs, ys) |
|
201 | eq_Univ (x as Abs abs, y) = |
|
202 let |
|
203 val (x, ys) = satisfy_abs abs ((SOME o maxidx x o maxidx y) 0) |
|
204 in eq_Univ (x, apps y ys) end |
|
205 | eq_Univ (x, y as Abs _) = eq_Univ (y, x) |
|
206 | eq_Univ _ = false; |
|
207 |
190 |
208 |
191 |
209 (** assembling and compiling ML code from terms **) |
192 (** assembling and compiling ML code from terms **) |
210 |
193 |
211 (* abstract ML syntax *) |
194 (* abstract ML syntax *) |
256 val name_put = prefix ^ "put_result"; |
239 val name_put = prefix ^ "put_result"; |
257 val name_ref = prefix ^ "univs_ref"; |
240 val name_ref = prefix ^ "univs_ref"; |
258 val name_const = prefix ^ "Const"; |
241 val name_const = prefix ^ "Const"; |
259 val name_abss = prefix ^ "abss"; |
242 val name_abss = prefix ^ "abss"; |
260 val name_apps = prefix ^ "apps"; |
243 val name_apps = prefix ^ "apps"; |
261 val name_eq = prefix ^ "eq_Univ"; |
244 val name_same = prefix ^ "same"; |
262 in |
245 in |
263 |
246 |
264 val univs_cookie = (Univs.get, put_result, name_put); |
247 val univs_cookie = (Univs.get, put_result, name_put); |
265 |
248 |
266 fun nbe_fun 0 "" = "nbe_value" |
249 fun nbe_fun 0 "" = "nbe_value" |
282 in name_const `$` ("(" ^ c' ^ ", " ^ ml_list (rev ts) ^ ")") end; |
265 in name_const `$` ("(" ^ c' ^ ", " ^ ml_list (rev ts) ^ ")") end; |
283 |
266 |
284 fun nbe_abss 0 f = f `$` ml_list [] |
267 fun nbe_abss 0 f = f `$` ml_list [] |
285 | nbe_abss n f = name_abss `$$` [string_of_int n, f]; |
268 | nbe_abss n f = name_abss `$$` [string_of_int n, f]; |
286 |
269 |
287 fun nbe_eq (v1, v2) = "(" ^ name_eq ^ " (" ^ nbe_bound v1 ^ ", " ^ nbe_bound v2 ^ "))"; |
270 fun nbe_same (v1, v2) = "(" ^ name_same ^ " (" ^ nbe_bound v1 ^ ", " ^ nbe_bound v2 ^ "))"; |
288 |
271 |
289 end; |
272 end; |
290 |
273 |
291 open Basic_Code_Thingol; |
274 open Basic_Code_Thingol; |
292 |
275 |
368 (fn c => fn _ => fn ts => nbe_apps_constr idx_of c ts) NONE; |
351 (fn c => fn _ => fn ts => nbe_apps_constr idx_of c ts) NONE; |
369 val assemble_rhs = assemble_iterm assemble_constapp match_cont; |
352 val assemble_rhs = assemble_iterm assemble_constapp match_cont; |
370 val (samepairs, args') = subst_nonlin_vars args; |
353 val (samepairs, args') = subst_nonlin_vars args; |
371 val s_args = map assemble_arg args'; |
354 val s_args = map assemble_arg args'; |
372 val s_rhs = if null samepairs then assemble_rhs rhs |
355 val s_rhs = if null samepairs then assemble_rhs rhs |
373 else ml_if (ml_and (map nbe_eq samepairs)) |
356 else ml_if (ml_and (map nbe_same samepairs)) |
374 (assemble_rhs rhs) default_rhs; |
357 (assemble_rhs rhs) default_rhs; |
375 val eqns = if is_eval then |
358 val eqns = if is_eval then |
376 [([ml_list (rev (dicts @ s_args))], s_rhs)] |
359 [([ml_list (rev (dicts @ s_args))], s_rhs)] |
377 else |
360 else |
378 [([ml_list (rev (dicts @ map2 ml_as default_args s_args))], s_rhs), |
361 [([ml_list (rev (dicts @ map2 ml_as default_args s_args))], s_rhs), |