252 problem |
252 problem |
253 end |
253 end |
254 |
254 |
255 val bad_types = [@{type_name prop}, @{type_name bool}, @{type_name fun}] |
255 val bad_types = [@{type_name prop}, @{type_name bool}, @{type_name fun}] |
256 |
256 |
|
257 val logical_consts = |
|
258 [@{const_name prop}, @{const_name Pure.conjunction}] @ atp_logical_consts |
|
259 |
257 fun interesting_terms_types_and_classes ctxt prover term_max_depth |
260 fun interesting_terms_types_and_classes ctxt prover term_max_depth |
258 type_max_depth ts = |
261 type_max_depth ts = |
259 let |
262 let |
260 fun is_bad_const (x as (s, _)) args = |
263 fun is_bad_const (x as (s, _)) args = |
261 member (op =) atp_logical_consts s orelse |
264 member (op =) logical_consts s orelse |
262 fst (is_built_in_const_for_prover ctxt prover x args) |
265 fst (is_built_in_const_for_prover ctxt prover x args) |
263 fun add_classes @{sort type} = I |
266 fun add_classes @{sort type} = I |
264 | add_classes S = union (op =) (map class_name_of S) |
267 | add_classes S = union (op =) (map class_name_of S) |
265 fun do_add_type (Type (s, Ts)) = |
268 fun do_add_type (Type (s, Ts)) = |
266 (not (member (op =) bad_types s) ? insert (op =) (type_name_of s)) |
269 (not (member (op =) bad_types s) ? insert (op =) (type_name_of s)) |
272 if member (op <>) args "" then s ^ "(" ^ space_implode "," args ^ ")" |
275 if member (op <>) args "" then s ^ "(" ^ space_implode "," args ^ ")" |
273 else s |
276 else s |
274 fun patternify ~1 _ = "" |
277 fun patternify ~1 _ = "" |
275 | patternify depth t = |
278 | patternify depth t = |
276 case strip_comb t of |
279 case strip_comb t of |
277 (Const (s, _), args) => |
280 (Const (x as (s, _)), args) => |
278 mk_app (const_name_of s) (map (patternify (depth - 1)) args) |
281 if is_bad_const x args then "" |
|
282 else mk_app (const_name_of s) (map (patternify (depth - 1)) args) |
279 | _ => "" |
283 | _ => "" |
280 fun add_term_patterns ~1 _ = I |
284 fun add_term_patterns ~1 _ = I |
281 | add_term_patterns depth t = |
285 | add_term_patterns depth t = |
282 insert (op =) (patternify depth t) |
286 insert (op =) (patternify depth t) |
283 #> add_term_patterns (depth - 1) t |
287 #> add_term_patterns (depth - 1) t |
284 val add_term = add_term_patterns term_max_depth |
288 val add_term = add_term_patterns term_max_depth |
285 fun add_patterns t = |
289 fun add_patterns t = |
286 let val (head, args) = strip_comb t in |
290 let val (head, args) = strip_comb t in |
287 (case head of |
291 (case head of |
288 Const (x as (_, T)) => |
292 Const (_, T) => add_term t #> add_type T |
289 not (is_bad_const x args) ? (add_term t #> add_type T) |
|
290 | Free (_, T) => add_type T |
293 | Free (_, T) => add_type T |
291 | Var (_, T) => add_type T |
294 | Var (_, T) => add_type T |
292 | Abs (_, T, body) => add_type T #> add_patterns body |
295 | Abs (_, T, body) => add_type T #> add_patterns body |
293 | _ => I) |
296 | _ => I) |
294 #> fold add_patterns args |
297 #> fold add_patterns args |