src/HOL/Tools/Sledgehammer/sledgehammer_isar_try0.ML
changeset 55202 824c48a539c9
parent 54828 b2271ad695db
child 55212 5832470d956e
equal deleted inserted replaced
55201:1ee776da8da7 55202:824c48a539c9
       
     1 (*  Title:      HOL/Tools/Sledgehammer/sledgehammer_isar_try0.ML
       
     2     Author:     Steffen Juilf Smolka, TU Muenchen
       
     3     Author:     Jasmin Blanchette, TU Muenchen
       
     4 
       
     5 Try replacing calls to "metis" with calls to other proof methods to speed up proofs, eliminate
       
     6 dependencies, and repair broken proof steps.
       
     7 *)
       
     8 
       
     9 signature SLEDGEHAMMER_ISAR_TRY0 =
       
    10 sig
       
    11   type isar_proof = Sledgehammer_Isar_Proof.isar_proof
       
    12   type preplay_interface = Sledgehammer_Isar_Preplay.preplay_interface
       
    13 
       
    14   val try0 : Time.time -> preplay_interface -> isar_proof -> isar_proof
       
    15 end;
       
    16 
       
    17 structure Sledgehammer_Isar_Try0 : SLEDGEHAMMER_ISAR_TRY0 =
       
    18 struct
       
    19 
       
    20 open Sledgehammer_Util
       
    21 open Sledgehammer_Reconstructor
       
    22 open Sledgehammer_Isar_Proof
       
    23 open Sledgehammer_Isar_Preplay
       
    24 
       
    25 fun variants_of_step (Prove (qs, xs, l, t, subproofs, (facts, methss))) =
       
    26     map (fn meth => Prove (qs, xs, l, t, subproofs, (facts, [[meth]]))) (tl (flat methss))
       
    27   | variants_of_step _ = raise Fail "Sledgehammer_Isar_Try0: variants_of_step"
       
    28 
       
    29 val slack = seconds 0.05
       
    30 
       
    31 fun try0_step _ _ (step as Let _) = step
       
    32   | try0_step preplay_timeout
       
    33       ({get_preplay_outcome, set_preplay_outcome, preplay_quietly, ...} : preplay_interface)
       
    34       (step as Prove (_, _, l, _, _, _)) =
       
    35     let
       
    36       val timeout =
       
    37         (case get_preplay_outcome l of
       
    38           Played time => Time.+ (time, slack)
       
    39         | _ => preplay_timeout)
       
    40 
       
    41       fun try_variant variant =
       
    42         (case preplay_quietly timeout variant of
       
    43           result as Played _ => SOME (variant, result)
       
    44         | _ => NONE)
       
    45     in
       
    46       (case Par_List.get_some try_variant (variants_of_step step) of
       
    47         SOME (step', result) => (set_preplay_outcome l result; step')
       
    48       | NONE => step)
       
    49     end
       
    50 
       
    51 val try0 = map_isar_steps oo try0_step
       
    52 
       
    53 end;