src/Pure/Isar/locale.ML
changeset 12727 330cb92aaea3
parent 12711 6a9412dd7d24
child 12730 fd0f8fa2b6bd
equal deleted inserted replaced
12726:5ae4034883d5 12727:330cb92aaea3
    60 end;
    60 end;
    61 
    61 
    62 structure Locale: LOCALE =
    62 structure Locale: LOCALE =
    63 struct
    63 struct
    64 
    64 
    65 
       
    66 (** locale elements and expressions **)
    65 (** locale elements and expressions **)
    67 
    66 
    68 type context = ProofContext.context;
    67 type context = ProofContext.context;
    69 
    68 
    70 datatype ('typ, 'term, 'fact, 'att) elem =
    69 datatype ('typ, 'term, 'fact, 'att) elem =
   268       | unify (env, _) = env;
   267       | unify (env, _) = env;
   269     fun paramify (i, None) = (i, None)
   268     fun paramify (i, None) = (i, None)
   270       | paramify (i, Some T) = apsnd Some (Type.paramify_dummies (i, T));
   269       | paramify (i, Some T) = apsnd Some (Type.paramify_dummies (i, T));
   271 
   270 
   272     val (maxidx', Ts') = foldl_map paramify (maxidx, Ts);
   271     val (maxidx', Ts') = foldl_map paramify (maxidx, Ts);
   273     val (maxidx'', Us') = foldl_map paramify (maxidx, Us);
   272     val (maxidx'', Us') = foldl_map paramify (maxidx', Us);
   274     val (unifier, _) = foldl unify ((Vartab.empty, maxidx''), Ts' ~~ Us');
   273     val (unifier, _) = foldl unify ((Vartab.empty, maxidx''), Ts' ~~ Us');
   275     val Vs = map (apsome (Envir.norm_type unifier)) Us';
   274     val Vs = map (apsome (Envir.norm_type unifier)) Us';
   276     val unifier' = Vartab.extend (unifier, frozen_tvars ctxt (mapfilter I Vs));
   275     val unifier' = Vartab.extend (unifier, frozen_tvars ctxt (mapfilter I Vs));
   277   in map (apsome (Envir.norm_type unifier')) Vs end;
   276   in map (apsome (Envir.norm_type unifier')) Vs end;
   278 
   277 
   330   | unify_elemss ctxt fixed_parms elemss =
   329   | unify_elemss ctxt fixed_parms elemss =
   331       let
   330       let
   332         val envs = unify_parms ctxt fixed_parms (map (#2 o #1) elemss);
   331         val envs = unify_parms ctxt fixed_parms (map (#2 o #1) elemss);
   333         fun inst (((name, ps), elems), env) =
   332         fun inst (((name, ps), elems), env) =
   334           ((name, map (apsnd (apsome (inst_type env))) ps), map (inst_elem env) elems);
   333           ((name, map (apsnd (apsome (inst_type env))) ps), map (inst_elem env) elems);
   335       in map inst (elemss ~~ envs) end;
   334       in map2 inst (elemss, envs) end;
   336 
   335 
   337 fun flatten_expr ctxt (prev_idents, expr) =
   336 fun flatten_expr ctxt (prev_idents, expr) =
   338   let
   337   let
   339     val thy = ProofContext.theory_of ctxt;
   338     val thy = ProofContext.theory_of ctxt;
   340 
   339 
   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;
   531     val propp = drop (n, all_propp');
   541     val propp = drop (n, all_propp');
   532     val propps = unflat raw_propps propp;
   542     val propps = unflat raw_propps propp;
   533     val proppss = map2 (uncurry unflat) (raw_proppss, propps);
   543     val proppss = map2 (uncurry unflat) (raw_proppss, propps);
   534 
   544 
   535     val xs = map #1 (params_of raw_elemss);
   545     val xs = map #1 (params_of raw_elemss);
   536     val typing = unify_frozen ctxt maxidx
   546     val typing = unify_frozen ctxt 0
   537       (map (ProofContext.default_type raw_ctxt) xs)
   547       (map (ProofContext.default_type raw_ctxt) xs)
   538       (map (ProofContext.default_type ctxt) xs);
   548       (map (ProofContext.default_type ctxt) xs);
   539     val parms = param_types (xs ~~ typing);
   549     val parms = param_types (xs ~~ typing);
   540 
   550 
   541     val close = if do_close then closeup ctxt else I;
   551     val close = if do_close then closeup ctxt else I;