wenzelm@18620: (* Title: Pure/Isar/specification.ML wenzelm@18620: ID: $Id$ wenzelm@18620: Author: Makarius wenzelm@18620: wenzelm@18620: Theory specifications --- with type-inference, but no internal wenzelm@18620: polymorphism. wenzelm@18620: *) wenzelm@18620: wenzelm@18620: signature SPECIFICATION = wenzelm@18620: sig wenzelm@18620: val pretty_consts: theory -> (string * typ) list -> Pretty.T wenzelm@18620: val read_specification: wenzelm@18620: (string * string option * mixfix) list * ((string * Attrib.src list) * string list) list -> wenzelm@18620: Proof.context -> wenzelm@18620: ((string * typ * mixfix) list * ((string * theory attribute list) * term list) list) * wenzelm@18620: Proof.context wenzelm@18620: val cert_specification: wenzelm@18620: (string * typ option * mixfix) list * ((string * theory attribute list) * term list) list -> wenzelm@18620: Proof.context -> wenzelm@18620: ((string * typ * mixfix) list * ((string * theory attribute list) * term list) list) * wenzelm@18620: Proof.context wenzelm@18620: val axiomatize: wenzelm@18620: (string * string option * mixfix) list * ((bstring * Attrib.src list) * string list) list -> wenzelm@18620: theory -> thm list list * theory wenzelm@18620: val axiomatize_i: wenzelm@18620: (string * typ option * mixfix) list * ((bstring * theory attribute list) * term list) list -> wenzelm@18620: theory -> thm list list * theory wenzelm@18620: end; wenzelm@18620: wenzelm@18620: structure Specification: SPECIFICATION = wenzelm@18620: struct wenzelm@18620: wenzelm@18620: (* pretty_consts *) wenzelm@18620: wenzelm@18620: fun pretty_const thy (c, T) = wenzelm@18620: Pretty.block [Pretty.str c, Pretty.str " ::", Pretty.brk 1, wenzelm@18620: Pretty.quote (Sign.pretty_typ thy T)]; wenzelm@18620: wenzelm@18620: fun pretty_consts thy decls = wenzelm@18620: Pretty.big_list "constants" (map (pretty_const thy) decls); wenzelm@18620: wenzelm@18620: wenzelm@18620: (* prepare specification *) wenzelm@18620: wenzelm@18620: fun prep_specification prep_typ prep_propp prep_att wenzelm@18620: (raw_params, raw_specs) context = wenzelm@18620: let wenzelm@18620: fun prep_param (x, raw_T, mx) ctxt = wenzelm@18620: let wenzelm@18620: val x' = Syntax.const_name x mx and mx' = Syntax.fix_mixfix x mx; wenzelm@18620: val T = Option.map (prep_typ ctxt) raw_T; wenzelm@18620: in ((x', mx'), ProofContext.add_fixes [(x', T, SOME mx')] ctxt) end; wenzelm@18620: wenzelm@18620: val ((xs, mxs), params_ctxt) = wenzelm@18620: context |> fold_map prep_param raw_params |>> split_list; wenzelm@18620: val ((specs, vars), specs_ctxt) = wenzelm@18620: prep_propp (params_ctxt, map (map (rpair ([], [])) o snd) raw_specs) wenzelm@18620: |> swap |>> map (map fst) wenzelm@18620: ||>> fold_map ProofContext.declared_type xs; wenzelm@18620: wenzelm@18620: val params = map2 (fn (x, T) => fn mx => (x, T, mx)) vars mxs; wenzelm@18620: val names = map (fst o fst) raw_specs; wenzelm@18620: val atts = map (map (prep_att (ProofContext.theory_of context)) o snd o fst) raw_specs; wenzelm@18620: in ((params, (names ~~ atts) ~~ specs), specs_ctxt) end; wenzelm@18620: wenzelm@18620: fun read_specification x = wenzelm@18620: prep_specification ProofContext.read_typ ProofContext.read_propp Attrib.global_attribute x; wenzelm@18620: fun cert_specification x = wenzelm@18620: prep_specification ProofContext.cert_typ ProofContext.cert_propp (K I) x; wenzelm@18620: wenzelm@18620: wenzelm@18620: (* axiomatize *) wenzelm@18620: wenzelm@18620: fun gen_axiomatize prep args thy = wenzelm@18620: let wenzelm@18620: val ((consts, specs), ctxt) = prep args (ProofContext.init thy); wenzelm@18620: val subst = map (fn (x, T, _) => (Free (x, T), Const (Sign.full_name thy x, T))) consts; wenzelm@18620: val axioms = wenzelm@18620: map (fn ((name, att), ts) => ((name, map (Term.subst_atomic subst) ts), att)) specs; wenzelm@18620: val (thms, thy') = wenzelm@18620: thy wenzelm@18620: |> Theory.add_consts_i consts wenzelm@18620: |> PureThy.add_axiomss_i axioms wenzelm@18620: ||> Theory.add_finals_i false (map snd subst); wenzelm@18620: in Pretty.writeln (pretty_consts thy' (map (dest_Free o fst) subst)); (thms, thy') end; wenzelm@18620: wenzelm@18620: val axiomatize = gen_axiomatize read_specification; wenzelm@18620: val axiomatize_i = gen_axiomatize cert_specification; wenzelm@18620: wenzelm@18620: end;