equal
deleted
inserted
replaced
22 val empty = Symtab.empty; |
22 val empty = Symtab.empty; |
23 val copy = I |
23 val copy = I |
24 val extend = I |
24 val extend = I |
25 fun merge _ = Symtab.merge (K true); |
25 fun merge _ = Symtab.merge (K true); |
26 ); |
26 ); |
27 |
|
28 fun specify_consts args thy = |
|
29 let |
|
30 val specs = map (fn (c, T, mx) => |
|
31 Const (Sign.full_name thy (Syntax.const_name c mx), T)) args; |
|
32 in |
|
33 thy |
|
34 |> Sign.add_consts_authentic [] args |
|
35 |> Theory.add_finals_i false specs |
|
36 end; |
|
37 |
27 |
38 fun add_axioms label ts atts thy = |
28 fun add_axioms label ts atts thy = |
39 thy |
29 thy |
40 |> PureThy.add_axiomss_i [((label, ts), atts)]; |
30 |> PureThy.add_axiomss_i [((label, ts), atts)]; |
41 |
31 |
163 val used = map fst (fold Term.add_tfreesT recTs []); |
153 val used = map fst (fold Term.add_tfreesT recTs []); |
164 |
154 |
165 val size_names = DatatypeProp.indexify_names |
155 val size_names = DatatypeProp.indexify_names |
166 (map (fn T => name_of_typ T ^ size_suffix) (Library.drop (head_len, recTs))); |
156 (map (fn T => name_of_typ T ^ size_suffix) (Library.drop (head_len, recTs))); |
167 |
157 |
168 val thy' = thy |
158 val thy' = thy |> fold (fn (s, T) => |
169 |> specify_consts (map (fn (s, T) => |
159 snd o Theory.specify_const [] (Sign.base_name s, T --> HOLogic.natT, NoSyn)) |
170 (Sign.base_name s, T --> HOLogic.natT, NoSyn)) |
160 (size_names ~~ Library.drop (head_len, recTs)) |
171 (size_names ~~ Library.drop (head_len, recTs))) |
|
172 val size_axs = make_size head_len descr' sorts recTs thy'; |
161 val size_axs = make_size head_len descr' sorts recTs thy'; |
173 in |
162 in |
174 thy' |
163 thy' |
175 |> add_axioms size_name_base size_axs [] |
164 |> add_axioms size_name_base size_axs [] |
176 ||> fold (fn (_, (name, _, _)) => instance_size_class name) descr' |
165 ||> fold (fn (_, (name, _, _)) => instance_size_class name) descr' |