src/HOL/Tools/Sledgehammer/sledgehammer_mash.ML
changeset 48398 b86450f5b5cb
parent 48396 dd82d190c2af
child 48399 4bacc8983b3d
equal deleted inserted replaced
48397:9fe826095a02 48398:b86450f5b5cb
   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