95 features_of ctxt prover (theory_of_thm th) stature [prop_of th] |
95 features_of ctxt prover (theory_of_thm th) stature [prop_of th] |
96 val s = escape_meta name ^ ": " ^ encode_features feats ^ "\n" |
96 val s = escape_meta name ^ ": " ^ encode_features feats ^ "\n" |
97 in File.append path s end |
97 in File.append path s end |
98 in List.app do_fact facts end |
98 in List.app do_fact facts end |
99 |
99 |
100 fun isar_or_prover_dependencies_of ctxt params_opt facts all_names th = |
100 fun isar_or_prover_dependencies_of ctxt params_opt facts all_names th |
|
101 isar_deps_opt = |
101 (case params_opt of |
102 (case params_opt of |
102 SOME (params as {provers = prover :: _, ...}) => |
103 SOME (params as {provers = prover :: _, ...}) => |
103 prover_dependencies_of ctxt params prover 0 facts all_names th |> snd |
104 prover_dependencies_of ctxt params prover 0 facts all_names th |> snd |
104 | NONE => isar_dependencies_of all_names th) |
105 | NONE => |
|
106 case isar_deps_opt of |
|
107 SOME deps => deps |
|
108 | NONE => isar_dependencies_of all_names th) |
105 |> these |
109 |> these |
106 |
110 |
107 fun generate_isar_or_prover_dependencies ctxt params_opt thys include_thys |
111 fun generate_isar_or_prover_dependencies ctxt params_opt thys include_thys |
108 file_name = |
112 file_name = |
109 let |
113 let |
114 val all_names = build_all_names nickname_of facts |
118 val all_names = build_all_names nickname_of facts |
115 fun do_fact (_, th) = |
119 fun do_fact (_, th) = |
116 let |
120 let |
117 val name = nickname_of th |
121 val name = nickname_of th |
118 val deps = |
122 val deps = |
119 isar_or_prover_dependencies_of ctxt params_opt facts all_names th |
123 isar_or_prover_dependencies_of ctxt params_opt facts all_names th NONE |
120 val s = escape_meta name ^ ": " ^ escape_metas deps ^ "\n" |
124 val s = escape_meta name ^ ": " ^ escape_metas deps ^ "\n" |
121 in File.append path s end |
125 in File.append path s end |
122 in List.app do_fact facts end |
126 in List.app do_fact facts end |
123 |
127 |
124 fun generate_isar_dependencies ctxt = |
128 fun generate_isar_dependencies ctxt = |
125 generate_isar_or_prover_dependencies ctxt NONE |
129 generate_isar_or_prover_dependencies ctxt NONE |
126 |
130 |
127 fun generate_prover_dependencies ctxt params = |
131 fun generate_prover_dependencies ctxt params = |
128 generate_isar_or_prover_dependencies ctxt (SOME params) |
132 generate_isar_or_prover_dependencies ctxt (SOME params) |
|
133 |
|
134 fun is_bad_query ctxt ho_atp th isar_deps = |
|
135 Thm.legacy_get_kind th = "" orelse null isar_deps orelse |
|
136 is_blacklisted_or_something ctxt ho_atp (Thm.get_name_hint th) orelse |
|
137 Sledgehammer_Fact.is_bad_for_atps ho_atp th |
129 |
138 |
130 fun generate_isar_or_prover_commands ctxt prover params_opt thys file_name = |
139 fun generate_isar_or_prover_commands ctxt prover params_opt thys file_name = |
131 let |
140 let |
132 val ho_atp = Sledgehammer_Provers.is_ho_atp ctxt prover |
141 val ho_atp = Sledgehammer_Provers.is_ho_atp ctxt prover |
133 val path = file_name |> Path.explode |
142 val path = file_name |> Path.explode |
138 fun do_fact ((_, stature), th) prevs = |
147 fun do_fact ((_, stature), th) prevs = |
139 let |
148 let |
140 val name = nickname_of th |
149 val name = nickname_of th |
141 val feats = |
150 val feats = |
142 features_of ctxt prover (theory_of_thm th) stature [prop_of th] |
151 features_of ctxt prover (theory_of_thm th) stature [prop_of th] |
|
152 val isar_deps = isar_dependencies_of all_names th |
143 val deps = |
153 val deps = |
144 isar_or_prover_dependencies_of ctxt params_opt facts all_names th |
154 isar_or_prover_dependencies_of ctxt params_opt facts all_names th |
145 val kind = Thm.legacy_get_kind th |
155 (SOME isar_deps) |
146 val core = |
156 val core = |
147 escape_meta name ^ ": " ^ escape_metas prevs ^ "; " ^ |
157 escape_meta name ^ ": " ^ escape_metas prevs ^ "; " ^ |
148 encode_features feats |
158 encode_features feats |
149 val query = |
159 val query = |
150 if kind = "" orelse null deps orelse |
160 if is_bad_query ctxt ho_atp th (these isar_deps) then "" |
151 is_blacklisted_or_something ctxt ho_atp name orelse |
161 else "? " ^ core ^ "\n" |
152 Sledgehammer_Fact.is_bad_for_atps ho_atp th then |
|
153 "" |
|
154 else |
|
155 "? " ^ core ^ "\n" |
|
156 val update = "! " ^ core ^ "; " ^ escape_metas deps ^ "\n" |
162 val update = "! " ^ core ^ "; " ^ escape_metas deps ^ "\n" |
157 val _ = File.append path (query ^ update) |
163 val _ = File.append path (query ^ update) |
158 in [name] end |
164 in [name] end |
159 val thy_map = old_facts |> thy_map_from_facts |
165 val thy_map = old_facts |> thy_map_from_facts |
160 val parents = fold (add_thy_parent_facts thy_map) thys [] |
166 val parents = fold (add_thy_parent_facts thy_map) thys [] |
164 generate_isar_or_prover_commands ctxt prover NONE |
170 generate_isar_or_prover_commands ctxt prover NONE |
165 |
171 |
166 fun generate_prover_commands ctxt (params as {provers = prover :: _, ...}) = |
172 fun generate_prover_commands ctxt (params as {provers = prover :: _, ...}) = |
167 generate_isar_or_prover_commands ctxt prover (SOME params) |
173 generate_isar_or_prover_commands ctxt prover (SOME params) |
168 |
174 |
169 fun generate_mepo_suggestions ctxt (params as {provers, ...}) thys max_relevant |
175 fun generate_mepo_suggestions ctxt (params as {provers = prover :: _, ...}) thys |
170 file_name = |
176 max_facts file_name = |
171 let |
177 let |
172 val path = file_name |> Path.explode |
178 val ho_atp = Sledgehammer_Provers.is_ho_atp ctxt prover |
173 val _ = File.write path "" |
179 val path = file_name |> Path.explode |
174 val prover = hd provers |
180 val _ = File.write path "" |
175 val facts = all_facts ctxt |
181 val facts = all_facts ctxt |
176 val (new_facts, old_facts) = facts |> List.partition (has_thys thys o snd) |
182 val (new_facts, old_facts) = facts |> List.partition (has_thys thys o snd) |
|
183 val all_names = build_all_names nickname_of facts |
177 fun do_fact (fact as (_, th)) old_facts = |
184 fun do_fact (fact as (_, th)) old_facts = |
178 let |
185 let |
179 val name = nickname_of th |
186 val name = nickname_of th |
180 val goal = goal_of_thm (Proof_Context.theory_of ctxt) th |
187 val goal = goal_of_thm (Proof_Context.theory_of ctxt) th |
181 val (_, hyp_ts, concl_t) = ATP_Util.strip_subgoal ctxt goal 1 |
188 val (_, hyp_ts, concl_t) = ATP_Util.strip_subgoal ctxt goal 1 |
182 val kind = Thm.legacy_get_kind th |
189 val isar_deps = isar_dependencies_of all_names th |
183 val _ = |
190 val _ = |
184 if kind <> "" then |
191 if is_bad_query ctxt ho_atp th (these isar_deps) then |
|
192 () |
|
193 else |
185 let |
194 let |
186 val suggs = |
195 val suggs = |
187 old_facts |
196 old_facts |
188 |> Sledgehammer_MePo.mepo_suggested_facts ctxt params prover |
197 |> Sledgehammer_MePo.mepo_suggested_facts ctxt params prover |
189 max_relevant NONE hyp_ts concl_t |
198 max_facts NONE hyp_ts concl_t |
190 |> map (nickname_of o snd) |
199 |> map (nickname_of o snd) |
191 val s = escape_meta name ^ ": " ^ escape_metas suggs ^ "\n" |
200 val s = escape_meta name ^ ": " ^ escape_metas suggs ^ "\n" |
192 in File.append path s end |
201 in File.append path s end |
193 else |
|
194 () |
|
195 in fact :: old_facts end |
202 in fact :: old_facts end |
196 in fold do_fact new_facts old_facts; () end |
203 in fold do_fact new_facts old_facts; () end |
197 |
204 |
198 end; |
205 end; |