1 (* Title: Pure/Isar/constdefs.ML
3 Author: Makarius, Hagia Maria Sion Abbey (Jerusalem)
5 Standard constant definitions, with type-inference and optional
6 structure context; specifications need to observe strictly sequential
7 dependencies; no support for overloading.
12 val add_constdefs: (string list * string option) list *
13 ((bstring * string option * Syntax.mixfix) option *
14 ((bstring * Attrib.src list) * string)) list
16 val add_constdefs_i: (string list * typ option) list *
17 ((bstring * typ option * Syntax.mixfix) option *
18 ((bstring * theory attribute list) * term)) list
22 structure Constdefs: CONSTDEFS =
25 (** add_constdefs(_i) **)
27 fun pretty_const sg (c, T) =
28 Pretty.block [Pretty.str c, Pretty.str " ::", Pretty.brk 1,
29 Pretty.quote (Sign.pretty_typ sg T)];
31 fun pretty_constdefs sg decls =
32 Pretty.big_list "constants" (map (pretty_const sg) decls);
34 fun gen_constdef prep_typ prep_term prep_att
35 structs (thy, (decl, ((raw_name, raw_atts), raw_prop))) =
37 val sign = Theory.sign_of thy;
39 error (cat_lines (msg :: map (Sign.string_of_term sign) ts));
42 ProofContext.init thy |> ProofContext.add_fixes
43 (List.concat (map (fn (As, T) => map (fn A => (A, T, NONE)) As) structs));
45 (case decl of NONE => (ctxt, NONE, Syntax.NoSyn) | SOME (x, raw_T, mx) =>
47 val x' = Syntax.const_name x mx and mx' = Syntax.fix_mixfix x mx;
48 val T = Option.map (prep_typ ctxt) raw_T;
49 in (ProofContext.add_fixes_liberal [(x', T, SOME mx')] ctxt, SOME x', mx') end);
51 val prop = prep_term ctxt' raw_prop;
52 val concl = Logic.strip_imp_concl prop;
53 val (lhs, _) = Logic.dest_equals concl handle TERM _ =>
54 err "Not a meta-equality (==):" [concl];
55 val head = Term.head_of lhs;
56 val (c, T) = Term.dest_Free head handle TERM _ =>
57 err "Locally fixed variable required as head of definition:" [head];
58 val _ = (case d of NONE => () | SOME c' =>
60 err ("Head of definition " ^ quote c ^ " differs from declaration " ^ quote c') []
63 val def = Term.subst_atomic [(Free (c, T), Const (Sign.full_name sign c, T))] prop;
64 val name = if raw_name = "" then Thm.def_name c else raw_name;
65 val atts = map (prep_att thy) raw_atts;
69 |> Theory.add_consts_i [(c, T, mx)]
70 |> PureThy.add_defs_i false [((name, def), atts)] |> #1;
71 in (thy', (c, T)) end;
73 fun gen_constdefs prep_vars prep_typ prep_term prep_att (raw_structs, specs) thy =
75 val structs = #2 (foldl_map prep_vars (ProofContext.init thy, raw_structs));
76 val (thy', decls) = (thy, specs)
77 |> foldl_map (gen_constdef prep_typ prep_term prep_att structs);
78 in Pretty.writeln (pretty_constdefs (Theory.sign_of thy') decls); thy' end;
80 val add_constdefs = gen_constdefs ProofContext.read_vars_liberal
81 ProofContext.read_typ ProofContext.read_term_liberal Attrib.global_attribute;
82 val add_constdefs_i = gen_constdefs ProofContext.cert_vars_liberal
83 ProofContext.cert_typ ProofContext.cert_term (K I);