6 |
6 |
7 signature FUNCTION_DATA = |
7 signature FUNCTION_DATA = |
8 sig |
8 sig |
9 type info = |
9 type info = |
10 {is_partial : bool, |
10 {is_partial : bool, |
11 defname : string, |
11 defname : binding, |
12 (*contains no logical entities: invariant under morphisms:*) |
12 (*contains no logical entities: invariant under morphisms:*) |
13 add_simps : (binding -> binding) -> string -> (binding -> binding) -> |
13 add_simps : (binding -> binding) -> string -> (binding -> binding) -> |
14 Token.src list -> thm list -> local_theory -> thm list * local_theory, |
14 Token.src list -> thm list -> local_theory -> thm list * local_theory, |
15 fnames : string list, |
15 fnames : binding list, |
16 case_names : string list, |
16 case_names : string list, |
17 fs : term list, |
17 fs : term list, |
18 R : term, |
18 R : term, |
19 dom: term, |
19 dom: term, |
20 psimps: thm list, |
20 psimps: thm list, |
30 structure Function_Data : FUNCTION_DATA = |
30 structure Function_Data : FUNCTION_DATA = |
31 struct |
31 struct |
32 |
32 |
33 type info = |
33 type info = |
34 {is_partial : bool, |
34 {is_partial : bool, |
35 defname : string, |
35 defname : binding, |
36 (*contains no logical entities: invariant under morphisms:*) |
36 (*contains no logical entities: invariant under morphisms:*) |
37 add_simps : (binding -> binding) -> string -> (binding -> binding) -> |
37 add_simps : (binding -> binding) -> string -> (binding -> binding) -> |
38 Token.src list -> thm list -> local_theory -> thm list * local_theory, |
38 Token.src list -> thm list -> local_theory -> thm list * local_theory, |
39 fnames : string list, |
39 fnames : binding list, |
40 case_names : string list, |
40 case_names : string list, |
41 fs : term list, |
41 fs : term list, |
42 R : term, |
42 R : term, |
43 dom: term, |
43 dom: term, |
44 psimps: thm list, |
44 psimps: thm list, |
96 simple_pinducts : thm list, |
96 simple_pinducts : thm list, |
97 cases : thm list, |
97 cases : thm list, |
98 pelims : thm list list, |
98 pelims : thm list list, |
99 termination : thm, |
99 termination : thm, |
100 domintros : thm list option} |
100 domintros : thm list option} |
101 val transform_function_data : info -> morphism -> info |
101 val transform_function_data : morphism -> info -> info |
102 val import_function_data : term -> Proof.context -> info option |
102 val import_function_data : term -> Proof.context -> info option |
103 val import_last_function : Proof.context -> info option |
103 val import_last_function : Proof.context -> info option |
104 val default_config : function_config |
104 val default_config : function_config |
105 val function_parser : function_config -> |
105 val function_parser : function_config -> |
106 ((function_config * (binding * string option * mixfix) list) * |
106 ((function_config * (binding * string option * mixfix) list) * |
298 cases : thm list, |
298 cases : thm list, |
299 pelims : thm list list, |
299 pelims : thm list list, |
300 termination : thm, |
300 termination : thm, |
301 domintros : thm list option} |
301 domintros : thm list option} |
302 |
302 |
303 fun transform_function_data ({add_simps, case_names, fnames, fs, R, dom, psimps, pinducts, |
303 fun transform_function_data phi ({add_simps, case_names, fnames, fs, R, dom, psimps, pinducts, |
304 simps, inducts, termination, defname, is_partial, cases, pelims, elims} : info) phi = |
304 simps, inducts, termination, defname, is_partial, cases, pelims, elims} : info) = |
305 let |
305 let |
306 val term = Morphism.term phi |
306 val term = Morphism.term phi |
307 val thm = Morphism.thm phi |
307 val thm = Morphism.thm phi |
308 val fact = Morphism.fact phi |
308 val fact = Morphism.fact phi |
309 val name = Binding.name_of o Morphism.binding phi o Binding.name |
|
310 in |
309 in |
311 { add_simps = add_simps, case_names = case_names, fnames = fnames, |
310 { add_simps = add_simps, case_names = case_names, fnames = fnames, |
312 fs = map term fs, R = term R, dom = term dom, psimps = fact psimps, |
311 fs = map term fs, R = term R, dom = term dom, psimps = fact psimps, |
313 pinducts = fact pinducts, simps = Option.map fact simps, |
312 pinducts = fact pinducts, simps = Option.map fact simps, |
314 inducts = Option.map fact inducts, termination = thm termination, |
313 inducts = Option.map fact inducts, termination = thm termination, |
315 defname = name defname, is_partial=is_partial, cases = fact cases, |
314 defname = Morphism.binding phi defname, is_partial=is_partial, cases = fact cases, |
316 elims = Option.map (map fact) elims, pelims = map fact pelims } |
315 elims = Option.map (map fact) elims, pelims = map fact pelims } |
317 end |
316 end |
318 |
317 |
319 fun lift_morphism ctxt f = |
318 fun lift_morphism ctxt f = |
320 let |
319 let |
331 let |
330 let |
332 val ct = Thm.cterm_of ctxt t |
331 val ct = Thm.cterm_of ctxt t |
333 val inst_morph = lift_morphism ctxt o Thm.instantiate |
332 val inst_morph = lift_morphism ctxt o Thm.instantiate |
334 |
333 |
335 fun match (trm, data) = |
334 fun match (trm, data) = |
336 SOME (transform_function_data data (inst_morph (Thm.match (Thm.cterm_of ctxt trm, ct)))) |
335 SOME (transform_function_data (inst_morph (Thm.match (Thm.cterm_of ctxt trm, ct))) data) |
337 handle Pattern.MATCH => NONE |
336 handle Pattern.MATCH => NONE |
338 in |
337 in |
339 get_first match (Item_Net.retrieve (get_functions ctxt) t) |
338 get_first match (Item_Net.retrieve (get_functions ctxt) t) |
340 end |
339 end |
341 |
340 |