author | blanchet |
Thu, 24 Jul 2014 00:24:00 +0200 | |
changeset 57635 | 97adb86619a4 |
parent 57270 | 0260171a51ef |
child 57699 | a6cf197c1f1e |
permissions | -rw-r--r-- |
57262 | 1 |
(* Title: HOL/Tools/ATP/atp_waldmeister.ML |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
2 |
Author: Albert Steckermeier, TU Muenchen |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
3 |
Author: Jasmin Blanchette, TU Muenchen |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
4 |
|
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
5 |
General-purpose functions used by the Sledgehammer modules. |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
6 |
*) |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
7 |
|
57262 | 8 |
signature ATP_WALDMEISTER = |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
9 |
sig |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
10 |
type 'a atp_problem = 'a ATP_Problem.atp_problem |
57267
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
11 |
type ('a, 'b) atp_step = ('a, 'b) ATP_Proof.atp_step |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
12 |
type 'a atp_proof = 'a ATP_Proof.atp_proof |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
13 |
type stature = ATP_Problem_Generate.stature |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
14 |
|
57267
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
15 |
val generate_waldmeister_problem: Proof.context -> term list -> term -> |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
16 |
((string * stature) * term) list -> |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
17 |
string atp_problem * string Symtab.table * (string * term) list * int Symtab.table |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
18 |
val termify_waldmeister_proof : Proof.context -> string Symtab.table -> string atp_proof -> |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
19 |
(term, string) atp_step list |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
20 |
end; |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
21 |
|
57262 | 22 |
structure ATP_Waldmeister : ATP_WALDMEISTER = |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
23 |
struct |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
24 |
|
57267
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
25 |
open ATP_Util |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
26 |
open ATP_Problem |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
27 |
open ATP_Problem_Generate |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
28 |
open ATP_Proof |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
29 |
open ATP_Proof_Reconstruct |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
30 |
|
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
31 |
type ('a, 'b) atp_term = ('a, 'b) ATP_Problem.atp_term |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
32 |
type atp_connective = ATP_Problem.atp_connective |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
33 |
type ('a, 'b, 'c, 'd) atp_formula = ('a, 'b, 'c, 'd) ATP_Problem.atp_formula |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
34 |
type atp_format = ATP_Problem.atp_format |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
35 |
type atp_formula_role = ATP_Problem.atp_formula_role |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
36 |
type 'a atp_problem = 'a ATP_Problem.atp_problem |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
37 |
|
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
38 |
val const_prefix = #"c" |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
39 |
val var_prefix = #"V" |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
40 |
val free_prefix = #"f" |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
41 |
val conjecture_condition_name = "condition" |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
42 |
|
57267
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
43 |
val factsN = "Relevant facts" |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
44 |
val helpersN = "Helper facts" |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
45 |
val conjN = "Conjecture" |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
46 |
|
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
47 |
exception Failure |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
48 |
exception FailureMessage of string |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
49 |
|
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
50 |
(* |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
51 |
Some utilitary functions for translation. |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
52 |
*) |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
53 |
|
57217 | 54 |
fun is_eq (Const (@{const_name "HOL.eq"}, _) $ _ $ _) = true |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
55 |
| is_eq _ = false |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
56 |
|
57217 | 57 |
fun gen_ascii_tuple str = (str, ascii_of str) |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
58 |
|
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
59 |
(* |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
60 |
Translation from Isabelle theorms and terms to ATP terms. |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
61 |
*) |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
62 |
|
57217 | 63 |
fun trm_to_atp'' (Const (x, _)) args = [ATerm ((gen_ascii_tuple (String.str const_prefix ^ x), []), args)] |
64 |
| trm_to_atp'' (Free (x, _)) args = ATerm ((gen_ascii_tuple (String.str free_prefix ^ x), []), [])::args |
|
65 |
| trm_to_atp'' (Var ((x, _), _)) args = ATerm ((gen_ascii_tuple (String.str var_prefix ^ x), []), [])::args |
|
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
66 |
| trm_to_atp'' (trm1 $ trm2) args = trm_to_atp'' trm1 (trm_to_atp'' trm2 [] @ args) |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
67 |
| trm_to_atp'' _ args = args |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
68 |
|
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
69 |
fun trm_to_atp' trm = trm_to_atp'' trm [] |> hd |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
70 |
|
57217 | 71 |
fun eq_trm_to_atp (Const (@{const_name HOL.eq}, _) $ lhs $ rhs) = |
57267
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
72 |
ATerm ((("equal", "equal"), []), [trm_to_atp' lhs, trm_to_atp' rhs]) |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
73 |
| eq_trm_to_atp _ = raise Failure |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
74 |
|
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
75 |
fun trm_to_atp trm = |
57267
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
76 |
if is_eq trm then eq_trm_to_atp trm |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
77 |
else HOLogic.mk_eq (trm, @{term True}) |> eq_trm_to_atp |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
78 |
|
57267
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
79 |
fun thm_to_atps split_conj prop_term = |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
80 |
if split_conj then map trm_to_atp (prop_term |> HOLogic.dest_conj) |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
81 |
else [prop_term |> trm_to_atp] |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
82 |
|
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
83 |
fun prepare_conjecture conj_term = |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
84 |
let |
57267
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
85 |
fun split_conj_trm (Const (@{const_name Pure.imp}, _) $ condition $ consequence) = |
57217 | 86 |
(SOME condition, consequence) |
87 |
| split_conj_trm conj = (NONE, conj) |
|
88 |
val (condition, consequence) = split_conj_trm conj_term |
|
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
89 |
in |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
90 |
(case condition of SOME x => HOLogic.dest_conj x |> map trm_to_atp | NONE => [] |
57217 | 91 |
, trm_to_atp consequence) |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
92 |
end |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
93 |
|
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
94 |
(* Translation from ATP terms to Isabelle terms. *) |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
95 |
|
57217 | 96 |
fun construct_term (ATerm ((name, _), _)) = |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
97 |
let |
57217 | 98 |
val prefix = String.sub (name, 0) |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
99 |
in |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
100 |
if prefix = const_prefix then |
57217 | 101 |
Const (String.extract (name, 1, NONE), Type ("", [])) |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
102 |
else if prefix = free_prefix then |
57217 | 103 |
Free (String.extract (name, 1, NONE), TFree ("", [])) |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
104 |
else if Char.isUpper prefix then |
57217 | 105 |
Var ((name, 0), TVar (("", 0), [])) |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
106 |
else |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
107 |
raise Failure |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
108 |
end |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
109 |
| construct_term _ = raise Failure |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
110 |
|
57217 | 111 |
fun atp_to_trm' (ATerm (descr, args)) = |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
112 |
(case args of |
57217 | 113 |
[] => construct_term (ATerm (descr, args)) |
114 |
| _ => Term.list_comb (construct_term (ATerm (descr, args)), map atp_to_trm' args)) |
|
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
115 |
| atp_to_trm' _ = raise Failure |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
116 |
|
57267
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
117 |
fun atp_to_trm (ATerm (("equal", _), [lhs, rhs])) = |
57217 | 118 |
Const (@{const_name HOL.eq}, Type ("", [])) $ atp_to_trm' lhs $ atp_to_trm' rhs |
119 |
| atp_to_trm (ATerm (("$true", _), _)) = Const ("HOL.True", Type ("", [])) |
|
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
120 |
| atp_to_trm _ = raise Failure |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
121 |
|
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
122 |
fun formula_to_trm (AAtom aterm) = atp_to_trm aterm |
57217 | 123 |
| formula_to_trm (AConn (ANot, [aterm])) = |
124 |
Const (@{const_name HOL.Not}, @{typ "bool \<Rightarrow> bool"}) $ formula_to_trm aterm |
|
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
125 |
| formula_to_trm _ = raise Failure |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
126 |
|
57267
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
127 |
(* Abstract translation *) |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
128 |
|
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
129 |
fun mk_formula prefix_name name atype aterm = |
57267
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
130 |
Formula ((prefix_name ^ ascii_of name, name), atype, AAtom aterm, NONE, []) |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
131 |
|
57267
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
132 |
fun problem_lines_of_fact prefix ((s, _), t) = |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
133 |
map (mk_formula prefix s Axiom) (thm_to_atps false t) |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
134 |
|
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
135 |
fun make_nice problem = nice_atp_problem true CNF problem |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
136 |
|
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
137 |
fun mk_conjecture aterm = |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
138 |
let |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
139 |
val formula = mk_anot (AAtom aterm) |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
140 |
in |
57267
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
141 |
Formula ((conjecture_prefix ^ "0", ""), Hypothesis, formula, NONE, []) |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
142 |
end |
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
143 |
|
57217 | 144 |
fun atp_proof_step_to_term (name, role, formula, formula_name, step_names) = |
145 |
(name, role, formula_to_trm formula, formula_name, step_names) |
|
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
146 |
|
57267
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
147 |
fun generate_waldmeister_problem ctxt hyp_ts0 concl_t0 facts0 = |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
148 |
let |
57270 | 149 |
val thy = Proof_Context.theory_of ctxt |
150 |
||
151 |
val preproc = Object_Logic.atomize_term thy |
|
152 |
||
153 |
val hyp_ts = map preproc hyp_ts0 |
|
154 |
val concl_t = preproc concl_t0 |
|
155 |
val facts = map (apsnd preproc) facts0 |
|
57267
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
156 |
|
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
157 |
val (conditions, consequence) = prepare_conjecture concl_t |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
158 |
val fact_lines = maps (problem_lines_of_fact (fact_prefix ^ "0_" (* FIXME *))) facts |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
159 |
val condition_lines = |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
160 |
map (mk_formula fact_prefix conjecture_condition_name Hypothesis) conditions |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
161 |
val axiom_lines = fact_lines @ condition_lines |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
162 |
val conj_line = mk_conjecture consequence |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
163 |
|
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
164 |
val helper_lines = |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
165 |
if List.exists (is_eq o snd) facts orelse not (is_eq concl_t) then |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
166 |
[(helpersN, |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
167 |
@{thms waldmeister_fol} |
57270 | 168 |
|> map (fn th => (("", (Global, General)), preproc (prop_of th))) |
57267
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
169 |
|> maps (problem_lines_of_fact helper_prefix))] |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
170 |
else |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
171 |
[] |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
172 |
val problem = (factsN, axiom_lines) :: helper_lines @ [(conjN, [conj_line])] |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
173 |
|
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
174 |
val (nice_problem, symtabs) = make_nice problem |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
175 |
in |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
176 |
(nice_problem, Symtab.empty, [], Symtab.empty) |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
177 |
end |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
178 |
|
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
179 |
fun termify_line ctxt (name, role, AAtom u, rule, deps) = |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
180 |
let |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
181 |
val thy = Proof_Context.theory_of ctxt |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
182 |
val t = u |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
183 |
|> atp_to_trm |
57635
97adb86619a4
more robust handling of types for skolems (modeled as Frees)
blanchet
parents:
57270
diff
changeset
|
184 |
|> singleton (infer_formula_types ctxt) |
57267
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
185 |
|> HOLogic.mk_Trueprop |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
186 |
in |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
187 |
(name, role, t, rule, deps) |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
188 |
end |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
189 |
|
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
190 |
fun termify_waldmeister_proof ctxt pool = |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
191 |
nasty_atp_proof pool |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
192 |
#> map (termify_line ctxt) |
8b87114357bd
integrated new Waldmeister code with 'sledgehammer' command
blanchet
parents:
57262
diff
changeset
|
193 |
#> repair_waldmeister_endgame |
57215
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
194 |
|
6fc0e3d4e1e5
moved new highly experimental Waldmeister-specific code (authored by Albert Steckermeier) into Isabelle
blanchet
parents:
diff
changeset
|
195 |
end; |