461 |
460 |
462 datatype ('a, 'b) int_ext = Int of 'a | Ext of 'b; |
461 datatype ('a, 'b) int_ext = Int of 'a | Ext of 'b; |
463 |
462 |
464 local |
463 local |
465 |
464 |
466 fun declare_int_elem i (ctxt, Fixes fixes) = |
465 fun declare_int_elem (ctxt, Fixes fixes) = |
467 (ctxt |> ProofContext.add_fixes (map (fn (x, T, mx) => |
466 (ctxt |> ProofContext.add_fixes (map (fn (x, T, mx) => |
468 (x, apsome (Term.map_type_tfree (Type.param i)) T, mx)) fixes), []) |
467 (x, apsome (Term.map_type_tfree (Type.param 0)) T, mx)) fixes), []) |
469 | declare_int_elem _ (ctxt, _) = (ctxt, []); |
468 | declare_int_elem (ctxt, _) = (ctxt, []); |
470 |
469 |
471 fun declare_ext_elem prep_fixes (ctxt, Fixes fixes) = |
470 fun declare_ext_elem prep_fixes (ctxt, Fixes fixes) = |
472 (ctxt |> ProofContext.add_fixes (prep_fixes ctxt fixes), []) |
471 (ctxt |> ProofContext.add_fixes (prep_fixes ctxt fixes), []) |
473 | declare_ext_elem _ (ctxt, Assumes asms) = (ctxt, map #2 asms) |
472 | declare_ext_elem _ (ctxt, Assumes asms) = (ctxt, map #2 asms) |
474 | declare_ext_elem _ (ctxt, Defines defs) = (ctxt, map (fn (_, (t, ps)) => [(t, (ps, []))]) defs) |
473 | declare_ext_elem _ (ctxt, Defines defs) = (ctxt, map (fn (_, (t, ps)) => [(t, (ps, []))]) defs) |
475 | declare_ext_elem _ (ctxt, Notes facts) = (ctxt, []); |
474 | declare_ext_elem _ (ctxt, Notes facts) = (ctxt, []); |
476 |
475 |
477 fun declare_elems prep_fixes ((ctxt, i), ((name, ps), elems)) = |
476 fun declare_elems prep_fixes (ctxt, ((name, ps), elems)) = |
478 let val (ctxt', propps) = |
477 let val (ctxt', propps) = |
479 (case elems of |
478 (case elems of |
480 Int es => foldl_map (declare_int_elem i) (ctxt, es) |
479 Int es => foldl_map declare_int_elem (ctxt, es) |
481 | Ext e => foldl_map (declare_ext_elem prep_fixes) (ctxt, [e])) |
480 | Ext e => foldl_map (declare_ext_elem prep_fixes) (ctxt, [e])) |
482 handle ProofContext.CONTEXT (msg, ctxt) => err_in_locale ctxt msg [(name, map fst ps)] |
481 handle ProofContext.CONTEXT (msg, ctxt) => err_in_locale ctxt msg [(name, map fst ps)] |
483 in ((ctxt', i + 1), propps) end; |
482 in (ctxt', propps) end; |
|
483 |
|
484 fun declare_elemss prep_fixes fixed_params raw_elemss ctxt = |
|
485 let |
|
486 val int_elemss = |
|
487 raw_elemss |
|
488 |> mapfilter (fn (id, Int es) => Some (id, es) | _ => None) |
|
489 |> unify_elemss ctxt fixed_params; |
|
490 val (_, raw_elemss') = |
|
491 foldl_map (fn ((_, es) :: elemss, (id, Int _)) => (elemss, (id, Int es)) | x => x) |
|
492 (int_elemss, raw_elemss); |
|
493 in foldl_map (declare_elems prep_fixes) (ctxt, raw_elemss') end; |
484 |
494 |
485 |
495 |
486 fun close_frees ctxt t = |
496 fun close_frees ctxt t = |
487 let val frees = rev (filter_out (ProofContext.is_fixed ctxt o #1) (Term.add_frees ([], t))) |
497 let val frees = rev (filter_out (ProofContext.is_fixed ctxt o #1) (Term.add_frees ([], t))) |
488 in Term.list_all_free (frees, t) end; |
498 in Term.list_all_free (frees, t) end; |
489 |
499 |
490 fun no_binds _ [] = [] |
500 fun no_binds _ [] = [] |
491 | no_binds ctxt _ = raise ProofContext.CONTEXT ("Illegal term bindings in locale element", ctxt); |
501 | no_binds ctxt (_ :: _) = |
|
502 raise ProofContext.CONTEXT ("Illegal term bindings in locale element", ctxt); |
492 |
503 |
493 fun closeup ctxt (Assumes asms) = Assumes (asms |> map (fn (a, propps) => |
504 fun closeup ctxt (Assumes asms) = Assumes (asms |> map (fn (a, propps) => |
494 (a, map (fn (t, (ps, qs)) => (close_frees ctxt t, |
505 (a, map (fn (t, (ps, qs)) => (close_frees ctxt t, |
495 (no_binds ctxt ps, no_binds ctxt qs))) propps))) |
506 (no_binds ctxt ps, no_binds ctxt qs))) propps))) |
496 | closeup ctxt (Defines defs) = Defines (defs |> map (fn (a, (t, ps)) => |
507 | closeup ctxt (Defines defs) = Defines (defs |> map (fn (a, (t, ps)) => |
497 (a, (close_frees ctxt (#2 (ProofContext.cert_def ctxt t)), no_binds ctxt ps)))) |
508 (a, (close_frees ctxt (#2 (ProofContext.cert_def ctxt t)), no_binds ctxt ps)))) |
498 | closeup ctxt elem = elem; |
509 | closeup ctxt elem = elem; |
499 |
510 |
500 fun finish_elem parms _ (Fixes fixes, _) = Ext (Fixes (map (fn (x, _, mx) => |
511 fun finish_elem parms _ (Fixes fixes, _) = Fixes (map (fn (x, _, mx) => |
501 (x, assoc_string (parms, x), mx)) fixes)) |
512 (x, assoc_string (parms, x), mx)) fixes) |
502 | finish_elem _ close (Assumes asms, propp) = Ext (close (Assumes (map #1 asms ~~ propp))) |
513 | finish_elem _ close (Assumes asms, propp) = close (Assumes (map #1 asms ~~ propp)) |
503 | finish_elem _ close (Defines defs, propp) = |
514 | finish_elem _ close (Defines defs, propp) = |
504 Ext (close (Defines (map #1 defs ~~ map (fn [(t, (ps, []))] => (t, ps)) propp))) |
515 close (Defines (map #1 defs ~~ map (fn [(t, (ps, []))] => (t, ps)) propp)) |
505 | finish_elem _ _ (Notes facts, _) = Ext (Notes facts); |
516 | finish_elem _ _ (Notes facts, _) = Notes facts; |
506 |
517 |
507 fun finish_elems ctxt parms close (((name, ps), elems), propps) = |
518 fun finish_elems ctxt parms close (((name, ps), elems), propps) = |
508 let |
519 let |
509 val elems' = |
520 val elems' = |
510 (case elems of |
521 (case elems of |
511 Int es => map Int (#2 (hd (unify_elemss ctxt parms [((name, ps), es)]))) |
522 Int es => map Int (#2 (hd (unify_elemss ctxt parms [((name, ps), es)]))) |
512 | Ext e => [finish_elem parms close (e, hd propps)]); |
523 | Ext e => [Ext (finish_elem parms close (e, hd propps))]); |
513 val ps' = map (fn (x, _) => (x, assoc (parms, x))) ps; |
524 val ps' = map (fn (x, _) => (x, assoc (parms, x))) ps; |
514 in ((name, ps'), elems') end; |
525 in ((name, ps'), elems') end; |
515 |
526 |
516 |
527 |
517 fun prep_elemss prep_fixes prepp do_close context fixed_params raw_elemss raw_concl = |
528 fun prep_elemss prep_fixes prepp do_close context fixed_params raw_elemss raw_concl = |
518 let |
529 let |
519 val ((raw_ctxt, maxidx), raw_proppss) = |
530 val (raw_ctxt, raw_proppss) = declare_elemss prep_fixes fixed_params raw_elemss context; |
520 foldl_map (declare_elems prep_fixes) ((context, 0), raw_elemss); |
|
521 val raw_propps = map flat raw_proppss; |
531 val raw_propps = map flat raw_proppss; |
522 val raw_propp = flat raw_propps; |
532 val raw_propp = flat raw_propps; |
523 val (ctxt, all_propp) = |
533 val (ctxt, all_propp) = |
524 prepp (ProofContext.declare_terms (map Free fixed_params) raw_ctxt, raw_concl @ raw_propp); |
534 prepp (ProofContext.declare_terms (map Free fixed_params) raw_ctxt, raw_concl @ raw_propp); |
525 val ctxt = ProofContext.declare_terms (flat (map (map fst) all_propp)) ctxt; |
535 val ctxt = ProofContext.declare_terms (flat (map (map fst) all_propp)) ctxt; |