src/HOL/Tools/Sledgehammer/sledgehammer.ML
changeset 62219 dbac573b27e7
parent 61330 20af2ad9261e
child 62505 9e2a65912111
equal deleted inserted replaced
62218:42202671777c 62219:dbac573b27e7
    61   |> the_default unknownN
    61   |> the_default unknownN
    62 
    62 
    63 fun is_metis_method (Metis_Method _) = true
    63 fun is_metis_method (Metis_Method _) = true
    64   | is_metis_method _ = false
    64   | is_metis_method _ = false
    65 
    65 
    66 fun add_chained [] t = t
       
    67   | add_chained chained ((t as Const (@{const_name Pure.all}, _)) $ Abs (s, T, u)) =
       
    68     t $ Abs (s, T, add_chained chained u)
       
    69   | add_chained chained t = Logic.list_implies (chained, t)
       
    70 
       
    71 fun play_one_line_proof minimize timeout used_facts0 state i (preferred_meth, methss) =
    66 fun play_one_line_proof minimize timeout used_facts0 state i (preferred_meth, methss) =
    72   let val used_facts = filter_out (fn (_, (sc, _)) => sc = Chained) used_facts0 in
    67   let val used_facts = filter_out (fn (_, (sc, _)) => sc = Chained) used_facts0 in
    73     if timeout = Time.zeroTime then
    68     if timeout = Time.zeroTime then
    74       (used_facts, (preferred_meth, Play_Timed_Out Time.zeroTime))
    69       (used_facts, (preferred_meth, Play_Timed_Out Time.zeroTime))
    75     else
    70     else
    77         val ctxt = Proof.context_of state
    72         val ctxt = Proof.context_of state
    78 
    73 
    79         val fact_names = map fst used_facts
    74         val fact_names = map fst used_facts
    80         val {facts = chained, goal, ...} = Proof.goal state
    75         val {facts = chained, goal, ...} = Proof.goal state
    81         val goal_t = Logic.get_goal (Thm.prop_of goal) i
    76         val goal_t = Logic.get_goal (Thm.prop_of goal) i
    82           |> add_chained (map (Thm.prop_of o forall_intr_vars) chained)
       
    83 
    77 
    84         fun try_methss [] [] = (used_facts, (preferred_meth, Play_Timed_Out Time.zeroTime))
    78         fun try_methss [] [] = (used_facts, (preferred_meth, Play_Timed_Out Time.zeroTime))
    85           | try_methss ress [] =
    79           | try_methss ress [] =
    86             (used_facts,
    80             (used_facts,
    87              (case AList.lookup (op =) ress preferred_meth of
    81              (case AList.lookup (op =) ress preferred_meth of
    90           | try_methss ress (meths :: methss) =
    84           | try_methss ress (meths :: methss) =
    91             let
    85             let
    92               fun mk_step fact_names meths =
    86               fun mk_step fact_names meths =
    93                 Prove ([], [], ("", 0), goal_t, [], ([], fact_names), meths, "")
    87                 Prove ([], [], ("", 0), goal_t, [], ([], fact_names), meths, "")
    94             in
    88             in
    95               (case preplay_isar_step ctxt timeout [] (mk_step fact_names meths) of
    89               (case preplay_isar_step ctxt chained timeout [] (mk_step fact_names meths) of
    96                 (res as (meth, Played time)) :: _ =>
    90                 (res as (meth, Played time)) :: _ =>
    97                 (* if a fact is needed by an ATP, it will be needed by "metis" *)
    91                 (* if a fact is needed by an ATP, it will be needed by "metis" *)
    98                 if not minimize orelse is_metis_method meth then
    92                 if not minimize orelse is_metis_method meth then
    99                   (used_facts, res)
    93                   (used_facts, res)
   100                 else
    94                 else