src/Pure/Isar/expression.ML
changeset 49818 db42a1147986
parent 49817 85b37aece3b3
child 49819 97b572c10fe9
equal deleted inserted replaced
49817:85b37aece3b3 49818:db42a1147986
   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