implemented Z3 skolemization
authorblanchet
Sun, 15 Dec 2013 18:01:38 +0100
changeset 560939b93f9117f8b
parent 56092 f50693bab67c
child 56094 dad9e5393524
implemented Z3 skolemization
src/HOL/Tools/Sledgehammer/sledgehammer_reconstruct.ML
     1.1 --- a/src/HOL/Tools/Sledgehammer/sledgehammer_reconstruct.ML	Sun Dec 15 18:01:38 2013 +0100
     1.2 +++ b/src/HOL/Tools/Sledgehammer/sledgehammer_reconstruct.ML	Sun Dec 15 18:01:38 2013 +0100
     1.3 @@ -22,7 +22,7 @@
     1.4      Proof.context -> bool option -> (unit -> isar_params) -> int -> one_line_params -> string
     1.5  end;
     1.6  
     1.7 -structure Sledgehammer_Reconstruct (* ### : SLEDGEHAMMER_RECONSTRUCT *) =
     1.8 +structure Sledgehammer_Reconstruct : SLEDGEHAMMER_RECONSTRUCT =
     1.9  struct
    1.10  
    1.11  open ATP_Util
    1.12 @@ -53,7 +53,7 @@
    1.13  val e_skolemize_rule = "skolemize"
    1.14  val vampire_skolemisation_rule = "skolemisation"
    1.15  (* TODO: Use "Z3_Proof.string_of_rule" once it is moved to Isabelle *)
    1.16 -val z3_skolemize_rule = "skolemize"
    1.17 +val z3_skolemize_rule = "sk"
    1.18  val z3_hypothesis_rule = "hypothesis"
    1.19  val z3_lemma_rule = "lemma"
    1.20  val z3_intro_def_rule = "intro-def"
    1.21 @@ -253,8 +253,11 @@
    1.22      val one_line_proof = one_line_proof_text 0 one_line_params
    1.23      val do_preplay = preplay_timeout <> SOME Time.zeroTime
    1.24  
    1.25 -    fun get_role keep_role ((num, _), role, t, _, _) =
    1.26 -      if keep_role role then SOME (raw_label_of_num num, t) else NONE
    1.27 +    val is_fixed = Variable.is_declared ctxt orf can Name.dest_skolem
    1.28 +    fun skolems_of t = Term.add_frees t [] |> filter_out (is_fixed o fst) |> rev
    1.29 +
    1.30 +    fun get_role keep_role ((num, _), role, t, rule, _) =
    1.31 +      if keep_role role then SOME ((raw_label_of_num num, t), rule) else NONE
    1.32  
    1.33      fun isar_proof_of () =
    1.34        let
    1.35 @@ -270,10 +273,14 @@
    1.36            map_filter (fn (name, role, _, _, _) =>
    1.37                if member (op =) [Conjecture, Negated_Conjecture] role then SOME name else NONE)
    1.38              atp_proof
    1.39 -        val assms = map_filter (get_role (curry (op =) Hypothesis)) atp_proof
    1.40 +        val assms = map_filter (Option.map fst o get_role (curry (op =) Hypothesis)) atp_proof
    1.41          val lems =
    1.42            map_filter (get_role (curry (op =) Lemma)) atp_proof
    1.43 -          |> map (fn (l, t) => Prove ([], [], l, maybe_mk_Trueprop t, [], (([], []), ArithM)))
    1.44 +          |> map (fn ((l, t), rule) =>
    1.45 +            if is_skolemize_rule rule then
    1.46 +              Prove ([], skolems_of t, l, maybe_mk_Trueprop t, [], (([], []), MetisM))
    1.47 +            else
    1.48 +              Prove ([], [], l, maybe_mk_Trueprop t, [], (([], []), ArithM)))
    1.49  
    1.50          val bot = atp_proof |> List.last |> #1
    1.51  
    1.52 @@ -318,9 +325,6 @@
    1.53              end
    1.54              |> HOLogic.mk_Trueprop |> close_form
    1.55  
    1.56 -        val is_fixed = Variable.is_declared ctxt orf can Name.dest_skolem
    1.57 -        fun skolems_of t = Term.add_frees t [] |> filter_out (is_fixed o fst) |> rev
    1.58 -
    1.59          fun maybe_show outer c =
    1.60            (outer andalso length c = 1 andalso subset (op =) (c, conjs)) ? cons Show
    1.61  
    1.62 @@ -344,19 +348,16 @@
    1.63                  (case gamma of
    1.64                    [g] =>
    1.65                    if is_clause_skolemize_rule g andalso is_clause_tainted g then
    1.66 -                    let
    1.67 -                      val subproof = Proof (skolems_of (prop_of_clause g), [], rev accum)
    1.68 -                    in
    1.69 +                    let val subproof = Proof (skolems_of (prop_of_clause g), [], rev accum) in
    1.70                        isar_steps outer (SOME l) [prove [subproof] (no_facts, MetisM)] []
    1.71                      end
    1.72                    else
    1.73                      do_rest l (prove [] by)
    1.74                  | _ => do_rest l (prove [] by))
    1.75                else
    1.76 -                if is_clause_skolemize_rule c then
    1.77 -                  do_rest l (Prove ([], skolems_of t, l, t, [], by))
    1.78 -                else
    1.79 -                  do_rest l (prove [] by)
    1.80 +                (if is_clause_skolemize_rule c then Prove ([], skolems_of t, l, t, [], by)
    1.81 +                 else prove [] by)
    1.82 +                |> do_rest l
    1.83              end
    1.84            | isar_steps outer predecessor accum (Cases cases :: infs) =
    1.85              let
    1.86 @@ -386,11 +387,11 @@
    1.87          val (preplay_interface as {overall_preplay_stats, ...}, isar_proof) =
    1.88            refute_graph
    1.89  (*
    1.90 -          |> tap (tracing o prefix "REFUTE GRAPH: " o string_of_refute_graph)
    1.91 +          |> tap (tracing o prefix "Refute graph: " o string_of_refute_graph)
    1.92  *)
    1.93            |> redirect_graph axioms tainted bot
    1.94  (*
    1.95 -          |> tap (tracing o prefix "DIRECT PROOF: " o string_of_direct_proof)
    1.96 +          |> tap (tracing o prefix "Direct proof: " o string_of_direct_proof)
    1.97  *)
    1.98            |> isar_proof_of_direct_proof
    1.99            |> postprocess_remove_unreferenced_steps I