285 | declare_elem _ (Notes _) ctxt = ctxt; |
285 | declare_elem _ (Notes _) ctxt = ctxt; |
286 |
286 |
287 |
287 |
288 (** Finish locale elements **) |
288 (** Finish locale elements **) |
289 |
289 |
290 fun finish_primitive parms _ (Fixes fixes) = Fixes (map (fn (binding, _, mx) => |
290 fun finish_fixes (parms: (string * typ) list) = map (fn (binding, _, mx) => |
291 let val x = Binding.name_of binding |
291 let val x = Binding.name_of binding |
292 in (binding, AList.lookup (op =) parms x, mx) end) fixes) |
292 in (binding, AList.lookup (op =) parms x, mx) end); |
293 | finish_primitive _ _ (Constrains _) = Constrains [] |
|
294 | finish_primitive _ close (Assumes asms) = close (Assumes asms) |
|
295 | finish_primitive _ close (Defines defs) = close (Defines defs) |
|
296 | finish_primitive _ _ (Notes facts) = Notes facts; |
|
297 |
293 |
298 local |
294 local |
299 |
295 |
300 fun closeup _ _ false elem = elem |
296 fun closeup _ _ false elem = elem |
301 | closeup ctxt parms true elem = |
297 | closeup ctxt parms true elem = |
318 let val ((c, _), t') = Local_Defs.cert_def ctxt (close_frees t) |
314 let val ((c, _), t') = Local_Defs.cert_def ctxt (close_frees t) |
319 in ((Thm.def_binding_optional (Binding.name c) name, atts), (t', no_binds ps)) end)) |
315 in ((Thm.def_binding_optional (Binding.name c) name, atts), (t', no_binds ps)) end)) |
320 | e => e) |
316 | e => e) |
321 end; |
317 end; |
322 |
318 |
323 fun finish_elem ctxt parms do_close elem = |
319 fun finish_elem _ parms _ (Fixes fixes) = Fixes (finish_fixes parms fixes) |
324 finish_primitive parms (closeup ctxt parms do_close) elem; |
320 | finish_elem _ _ _ (Constrains _) = Constrains [] |
|
321 | finish_elem ctxt parms do_close (Assumes asms) = closeup ctxt parms do_close (Assumes asms) |
|
322 | finish_elem ctxt parms do_close (Defines defs) = closeup ctxt parms do_close (Defines defs) |
|
323 | finish_elem _ _ _ (Notes facts) = Notes facts; |
325 |
324 |
326 fun finish_inst ctxt (loc, (prfx, inst)) = |
325 fun finish_inst ctxt (loc, (prfx, inst)) = |
327 let |
326 let |
328 val thy = Proof_Context.theory_of ctxt; |
327 val thy = Proof_Context.theory_of ctxt; |
329 val (parm_names, parm_types) = Locale.params_of thy loc |> map #1 |> split_list; |
328 val (parm_names, parm_types) = Locale.params_of thy loc |> map #1 |> split_list; |
404 val xs = fold (fn Fixes fixes => (fn ps => ps @ map (Variable.check_name o #1) fixes) |
403 val xs = fold (fn Fixes fixes => (fn ps => ps @ map (Variable.check_name o #1) fixes) |
405 | _ => fn ps => ps) (Fixes fors :: elems') []; |
404 | _ => fn ps => ps) (Fixes fors :: elems') []; |
406 val (Ts, ctxt7) = fold_map Proof_Context.inferred_param xs ctxt6; |
405 val (Ts, ctxt7) = fold_map Proof_Context.inferred_param xs ctxt6; |
407 val parms = xs ~~ Ts; (* params from expression and elements *) |
406 val parms = xs ~~ Ts; (* params from expression and elements *) |
408 |
407 |
409 val Fixes fors' = finish_primitive parms I (Fixes fors); |
408 val fors' = finish_fixes parms fors; |
410 val fixed = map (fn (b, SOME T, mx) => ((Binding.name_of b, T), mx)) fors'; |
409 val fixed = map (fn (b, SOME T, mx) => ((Binding.name_of b, T), mx)) fors'; |
411 val (deps, elems'') = finish ctxt6 parms do_close insts elems'; |
410 val (deps, elems'') = finish ctxt6 parms do_close insts elems'; |
412 |
411 |
413 in ((fixed, deps, elems'', concl), (parms, ctxt7)) end |
412 in ((fixed, deps, elems'', concl), (parms, ctxt7)) end |
414 |
413 |