1 (* Title: Pure/assumption.ML |
1 (* Title: Pure/assumption.ML |
2 Author: Makarius |
2 Author: Makarius |
3 |
3 |
4 Local assumptions, parameterized by export rules. |
4 Context assumptions, parameterized by export rules. |
5 *) |
5 *) |
6 |
6 |
7 signature ASSUMPTION = |
7 signature ASSUMPTION = |
8 sig |
8 sig |
9 type export |
9 type export |
10 val assume_export: export |
10 val assume_export: export |
11 val presume_export: export |
11 val presume_export: export |
12 val assume: cterm -> thm |
12 val assume: cterm -> thm |
13 val assms_of: Proof.context -> cterm list |
13 val all_assms_of: Proof.context -> cterm list |
14 val prems_of: Proof.context -> thm list |
14 val all_prems_of: Proof.context -> thm list |
15 val extra_hyps: Proof.context -> thm -> term list |
15 val extra_hyps: Proof.context -> thm -> term list |
|
16 val local_assms_of: Proof.context -> Proof.context -> cterm list |
|
17 val local_prems_of: Proof.context -> Proof.context -> thm list |
16 val add_assms: export -> cterm list -> Proof.context -> thm list * Proof.context |
18 val add_assms: export -> cterm list -> Proof.context -> thm list * Proof.context |
17 val add_assumes: cterm list -> Proof.context -> thm list * Proof.context |
19 val add_assumes: cterm list -> Proof.context -> thm list * Proof.context |
18 val add_view: Proof.context -> cterm list -> Proof.context -> Proof.context |
|
19 val export: bool -> Proof.context -> Proof.context -> thm -> thm |
20 val export: bool -> Proof.context -> Proof.context -> thm -> thm |
20 val export_term: Proof.context -> Proof.context -> term -> term |
21 val export_term: Proof.context -> Proof.context -> term -> term |
21 val export_morphism: Proof.context -> Proof.context -> morphism |
22 val export_morphism: Proof.context -> Proof.context -> morphism |
22 end; |
23 end; |
23 |
24 |
66 ); |
67 ); |
67 |
68 |
68 fun map_data f = Data.map (fn Data {assms, prems} => make_data (f (assms, prems))); |
69 fun map_data f = Data.map (fn Data {assms, prems} => make_data (f (assms, prems))); |
69 fun rep_data ctxt = Data.get ctxt |> (fn Data args => args); |
70 fun rep_data ctxt = Data.get ctxt |> (fn Data args => args); |
70 |
71 |
71 val assumptions_of = #assms o rep_data; |
|
72 val assms_of = maps #2 o assumptions_of; |
|
73 val prems_of = #prems o rep_data; |
|
74 |
72 |
75 fun extra_hyps ctxt th = subtract (op aconv) (map Thm.term_of (assms_of ctxt)) (Thm.hyps_of th); |
73 (* all assumptions *) |
|
74 |
|
75 val all_assumptions_of = #assms o rep_data; |
|
76 val all_assms_of = maps #2 o all_assumptions_of; |
|
77 val all_prems_of = #prems o rep_data; |
|
78 |
|
79 fun extra_hyps ctxt th = |
|
80 subtract (op aconv) (map Thm.term_of (all_assms_of ctxt)) (Thm.hyps_of th); |
|
81 |
|
82 (*named prems -- legacy feature*) |
|
83 val _ = Context.>> |
|
84 (Context.map_theory (PureThy.add_thms_dynamic (Binding.name "prems", |
|
85 fn Context.Theory _ => [] | Context.Proof ctxt => all_prems_of ctxt))); |
76 |
86 |
77 |
87 |
78 (* named prems -- legacy feature *) |
88 (* local assumptions *) |
79 |
89 |
80 val _ = Context.>> |
90 fun local_assumptions_of inner outer = |
81 (Context.map_theory (PureThy.add_thms_dynamic (Binding.name "prems", |
91 Library.drop (length (all_assumptions_of outer), all_assumptions_of inner); |
82 fn Context.Theory _ => [] | Context.Proof ctxt => prems_of ctxt))); |
92 |
|
93 val local_assms_of = maps #2 oo local_assumptions_of; |
|
94 |
|
95 fun local_prems_of inner outer = |
|
96 Library.drop (length (all_prems_of outer), all_prems_of inner); |
83 |
97 |
84 |
98 |
85 (* add assumptions *) |
99 (* add assumptions *) |
86 |
100 |
87 fun add_assms export new_asms = |
101 fun add_assms export new_asms = |
90 pair new_prems |
104 pair new_prems |
91 end; |
105 end; |
92 |
106 |
93 val add_assumes = add_assms assume_export; |
107 val add_assumes = add_assms assume_export; |
94 |
108 |
95 fun add_view outer view = map_data (fn (asms, prems) => |
|
96 let |
|
97 val (asms1, asms2) = chop (length (assumptions_of outer)) asms; |
|
98 val asms' = asms1 @ [(assume_export, view)] @ asms2; |
|
99 in (asms', prems) end); |
|
100 |
|
101 |
109 |
102 (* export *) |
110 (* export *) |
103 |
111 |
104 fun diff_assms inner outer = |
|
105 Library.drop (length (assumptions_of outer), assumptions_of inner); |
|
106 |
|
107 fun export is_goal inner outer = |
112 fun export is_goal inner outer = |
108 let val asms = diff_assms inner outer in |
113 let val asms = local_assumptions_of inner outer in |
109 MetaSimplifier.norm_hhf_protect |
114 MetaSimplifier.norm_hhf_protect |
110 #> fold_rev (fn (e, As) => #1 (e is_goal As)) asms |
115 #> fold_rev (fn (e, As) => #1 (e is_goal As)) asms |
111 #> MetaSimplifier.norm_hhf_protect |
116 #> MetaSimplifier.norm_hhf_protect |
112 end; |
117 end; |
113 |
118 |
114 fun export_term inner outer = |
119 fun export_term inner outer = |
115 fold_rev (fn (e, As) => #2 (e false As)) (diff_assms inner outer); |
120 fold_rev (fn (e, As) => #2 (e false As)) (local_assumptions_of inner outer); |
116 |
121 |
117 fun export_morphism inner outer = |
122 fun export_morphism inner outer = |
118 let |
123 let |
119 val thm = export false inner outer; |
124 val thm = export false inner outer; |
120 val term = export_term inner outer; |
125 val term = export_term inner outer; |