src/HOL/Tools/Mirabelle/Tools/mirabelle_sledgehammer.ML
changeset 32455 c71414177792
parent 32454 a1a5589207ad
child 32460 ba0cf920a39c
     1.1 --- a/src/HOL/Tools/Mirabelle/Tools/mirabelle_sledgehammer.ML	Mon Aug 31 09:28:50 2009 +0200
     1.2 +++ b/src/HOL/Tools/Mirabelle/Tools/mirabelle_sledgehammer.ML	Mon Aug 31 12:22:15 2009 +0200
     1.3 @@ -18,10 +18,21 @@
     1.4      |> Source.exhaust
     1.5    end
     1.6  
     1.7 +fun safe init done f x =
     1.8 +  let
     1.9 +    val y = init x
    1.10 +    val z = Exn.capture f y
    1.11 +    val _ = done y
    1.12 +  in Exn.release z end
    1.13 +
    1.14 +val proverK = "prover"
    1.15 +val keepK = "keep"
    1.16 +val metisK = "metis"
    1.17 +
    1.18  fun sledgehammer_action args {pre=st, ...} =
    1.19    let
    1.20      val prover_name =
    1.21 -      AList.lookup (op =) args "prover"
    1.22 +      AList.lookup (op =) args proverK
    1.23        |> the_default (hd (space_explode " " (AtpManager.get_atps ())))
    1.24  
    1.25      val thy = Proof.theory_of st
    1.26 @@ -30,13 +41,23 @@
    1.27      val timeout = AtpManager.get_timeout () 
    1.28  
    1.29      (* run sledgehammer *)
    1.30 -    val (success, message, thm_names) =
    1.31 +    fun init NONE = !AtpWrapper.destdir
    1.32 +      | init (SOME path) =
    1.33 +          let
    1.34 +            (* Warning: we implicitly assume single-threaded execution here! *)
    1.35 +            val old = !AtpWrapper.destdir
    1.36 +            val _ = AtpWrapper.destdir := path
    1.37 +          in old end
    1.38 +    fun done path = AtpWrapper.destdir := path
    1.39 +    fun sh _ =
    1.40        let
    1.41          val (success, (message, thm_names), _, _, _) =
    1.42            prover timeout NONE NONE prover_name 1 (Proof.get_goal st)
    1.43        in (success, message, SOME thm_names) end
    1.44        handle ResHolClause.TOO_TRIVIAL => (true, "trivial", SOME [])
    1.45             | ERROR msg => (false, "error: " ^ msg, NONE)
    1.46 +    val (success, message, thm_names) = safe init done sh
    1.47 +      (AList.lookup (op =) args keepK)
    1.48  
    1.49      (* try metis *)
    1.50      fun get_thms ctxt = maps (thms_of_name ctxt)
    1.51 @@ -45,7 +66,8 @@
    1.52       (if try (Mirabelle.can_apply (metis thms)) st = SOME true
    1.53        then "success"
    1.54        else "failure")
    1.55 -    val msg = apply_metis (get_thms (Proof.context_of st) (these thm_names))
    1.56 +    val msg = if not (AList.defined (op =) args metisK) then ""
    1.57 +      else apply_metis (get_thms (Proof.context_of st) (these thm_names))
    1.58    in
    1.59      if success
    1.60      then SOME ("success (" ^ prover_name ^ ": " ^ message ^ ")" ^ msg)