author | paulson |
Tue, 21 Nov 2006 12:50:15 +0100 | |
changeset 21430 | 77651b6d9d6c |
parent 21290 | 33b6bb5d6ab8 |
child 21470 | 7c1b59ddcd56 |
permissions | -rw-r--r-- |
15347 | 1 |
(* Author: Jia Meng, Cambridge University Computer Laboratory |
2 |
ID: $Id$ |
|
3 |
Copyright 2004 University of Cambridge |
|
4 |
||
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
5 |
Transformation of axiom rules (elim/intro/etc) into CNF forms. |
15347 | 6 |
*) |
7 |
||
20996 | 8 |
(*unused during debugging*) |
15997 | 9 |
signature RES_AXIOMS = |
10 |
sig |
|
11 |
val cnf_axiom : (string * thm) -> thm list |
|
21071 | 12 |
val cnf_name : string -> thm list |
15997 | 13 |
val meta_cnf_axiom : thm -> thm list |
14 |
val claset_rules_of_thy : theory -> (string * thm) list |
|
15 |
val simpset_rules_of_thy : theory -> (string * thm) list |
|
17484
f6a225f97f0a
simplification of the Isabelle-ATP code; hooks for batch generation of problems
paulson
parents:
17412
diff
changeset
|
16 |
val claset_rules_of_ctxt: Proof.context -> (string * thm) list |
f6a225f97f0a
simplification of the Isabelle-ATP code; hooks for batch generation of problems
paulson
parents:
17412
diff
changeset
|
17 |
val simpset_rules_of_ctxt : Proof.context -> (string * thm) list |
17905
1574533861b1
Added files in order to use external ATPs as oracles and invoke these ATPs by calling Isabelle methods (currently "vampire" and "eprover").
mengj
parents:
17829
diff
changeset
|
18 |
val pairname : thm -> (string * thm) |
18510
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
19 |
val skolem_thm : thm -> thm list |
20419 | 20 |
val to_nnf : thm -> thm |
19353 | 21 |
val cnf_rules_pairs : (string * Thm.thm) list -> (Thm.thm * (string * int)) list list; |
18708 | 22 |
val meson_method_setup : theory -> theory |
23 |
val setup : theory -> theory |
|
19196
62ee8c10d796
Added functions to retrieve local and global atpset rules.
mengj
parents:
19175
diff
changeset
|
24 |
|
62ee8c10d796
Added functions to retrieve local and global atpset rules.
mengj
parents:
19175
diff
changeset
|
25 |
val atpset_rules_of_thy : theory -> (string * thm) list |
62ee8c10d796
Added functions to retrieve local and global atpset rules.
mengj
parents:
19175
diff
changeset
|
26 |
val atpset_rules_of_ctxt : Proof.context -> (string * thm) list |
15997 | 27 |
end; |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
28 |
|
20419 | 29 |
structure ResAxioms = |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
30 |
|
15997 | 31 |
struct |
15347 | 32 |
|
20996 | 33 |
(*For running the comparison between combinators and abstractions. |
34 |
CANNOT be a ref, as the setting is used while Isabelle is built. |
|
35 |
Currently FALSE, i.e. all the "abstraction" code below is unused, but so far |
|
36 |
it seems to be inferior to combinators...*) |
|
37 |
val abstract_lambdas = false; |
|
20419 | 38 |
|
39 |
val trace_abs = ref false; |
|
18000
ac059afd6b86
Added several new functions that convert HOL Isabelle rules to FOL axiom clauses. The original functions that convert FOL rules to clauses stay with the same names; the new functions have "H" at the end of their names.
mengj
parents:
17959
diff
changeset
|
40 |
|
20902 | 41 |
(* FIXME legacy *) |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
42 |
fun freeze_thm th = #1 (Drule.freeze_thaw th); |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
43 |
|
20902 | 44 |
val lhs_of = #1 o Logic.dest_equals o Thm.prop_of; |
45 |
val rhs_of = #2 o Logic.dest_equals o Thm.prop_of; |
|
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
46 |
|
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
47 |
|
20445 | 48 |
(*Store definitions of abstraction functions, ensuring that identical right-hand |
49 |
sides are denoted by the same functions and thereby reducing the need for |
|
50 |
extensionality in proofs. |
|
51 |
FIXME! Store in theory data!!*) |
|
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
52 |
|
20867
e7b92a48e22b
Refinements to abstraction. Seeding with combinators K, I and B.
paulson
parents:
20863
diff
changeset
|
53 |
(*Populate the abstraction cache with common combinators.*) |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
54 |
fun seed th net = |
20902 | 55 |
let val (_,ct) = Thm.dest_abs NONE (Drule.rhs_of th) |
20867
e7b92a48e22b
Refinements to abstraction. Seeding with combinators K, I and B.
paulson
parents:
20863
diff
changeset
|
56 |
val t = Logic.legacy_varify (term_of ct) |
e7b92a48e22b
Refinements to abstraction. Seeding with combinators K, I and B.
paulson
parents:
20863
diff
changeset
|
57 |
in Net.insert_term eq_thm (t, th) net end; |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
58 |
|
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
59 |
val abstraction_cache = ref |
21254
d53f76357f41
incorporated former theories Reconstruction and ResAtpMethods into ATP_Linkup;
wenzelm
parents:
21102
diff
changeset
|
60 |
(seed (thm"ATP_Linkup.I_simp") |
d53f76357f41
incorporated former theories Reconstruction and ResAtpMethods into ATP_Linkup;
wenzelm
parents:
21102
diff
changeset
|
61 |
(seed (thm"ATP_Linkup.B_simp") |
d53f76357f41
incorporated former theories Reconstruction and ResAtpMethods into ATP_Linkup;
wenzelm
parents:
21102
diff
changeset
|
62 |
(seed (thm"ATP_Linkup.K_simp") Net.empty))); |
20867
e7b92a48e22b
Refinements to abstraction. Seeding with combinators K, I and B.
paulson
parents:
20863
diff
changeset
|
63 |
|
20445 | 64 |
|
15997 | 65 |
(**** Transformation of Elimination Rules into First-Order Formulas****) |
15347 | 66 |
|
21430
77651b6d9d6c
New transformation of eliminatino rules: we simply replace the final conclusion variable by False
paulson
parents:
21290
diff
changeset
|
67 |
val cfalse = cterm_of HOL.thy HOLogic.false_const; |
77651b6d9d6c
New transformation of eliminatino rules: we simply replace the final conclusion variable by False
paulson
parents:
21290
diff
changeset
|
68 |
val ctp_false = cterm_of HOL.thy (HOLogic.mk_Trueprop HOLogic.false_const); |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
69 |
|
21430
77651b6d9d6c
New transformation of eliminatino rules: we simply replace the final conclusion variable by False
paulson
parents:
21290
diff
changeset
|
70 |
(*Converts an elim-rule into an equivalent theorem that does not have the |
77651b6d9d6c
New transformation of eliminatino rules: we simply replace the final conclusion variable by False
paulson
parents:
21290
diff
changeset
|
71 |
predicate variable. Leaves other theorems unchanged. We simply instantiate the |
77651b6d9d6c
New transformation of eliminatino rules: we simply replace the final conclusion variable by False
paulson
parents:
21290
diff
changeset
|
72 |
conclusion variable to False.*) |
16009 | 73 |
fun transform_elim th = |
21430
77651b6d9d6c
New transformation of eliminatino rules: we simply replace the final conclusion variable by False
paulson
parents:
21290
diff
changeset
|
74 |
case concl_of th of (*conclusion variable*) |
77651b6d9d6c
New transformation of eliminatino rules: we simply replace the final conclusion variable by False
paulson
parents:
21290
diff
changeset
|
75 |
Const("Trueprop",_) $ (v as Var(_,Type("bool",[]))) => |
77651b6d9d6c
New transformation of eliminatino rules: we simply replace the final conclusion variable by False
paulson
parents:
21290
diff
changeset
|
76 |
Thm.instantiate ([], [(cterm_of HOL.thy v, cfalse)]) th |
77651b6d9d6c
New transformation of eliminatino rules: we simply replace the final conclusion variable by False
paulson
parents:
21290
diff
changeset
|
77 |
| v as Var(_, Type("prop",[])) => |
77651b6d9d6c
New transformation of eliminatino rules: we simply replace the final conclusion variable by False
paulson
parents:
21290
diff
changeset
|
78 |
Thm.instantiate ([], [(cterm_of HOL.thy v, ctp_false)]) th |
77651b6d9d6c
New transformation of eliminatino rules: we simply replace the final conclusion variable by False
paulson
parents:
21290
diff
changeset
|
79 |
| _ => th; |
15997 | 80 |
|
81 |
(**** Transformation of Clasets and Simpsets into First-Order Axioms ****) |
|
82 |
||
21254
d53f76357f41
incorporated former theories Reconstruction and ResAtpMethods into ATP_Linkup;
wenzelm
parents:
21102
diff
changeset
|
83 |
(*Transfer a theorem into theory ATP_Linkup.thy if it is not already |
15359
8bad1f42fec0
new CLAUSIFY attribute for proof reconstruction with lemmas
paulson
parents:
15347
diff
changeset
|
84 |
inside that theory -- because it's needed for Skolemization *) |
8bad1f42fec0
new CLAUSIFY attribute for proof reconstruction with lemmas
paulson
parents:
15347
diff
changeset
|
85 |
|
21254
d53f76357f41
incorporated former theories Reconstruction and ResAtpMethods into ATP_Linkup;
wenzelm
parents:
21102
diff
changeset
|
86 |
(*This will refer to the final version of theory ATP_Linkup.*) |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
87 |
val recon_thy_ref = Theory.self_ref (the_context ()); |
15359
8bad1f42fec0
new CLAUSIFY attribute for proof reconstruction with lemmas
paulson
parents:
15347
diff
changeset
|
88 |
|
21254
d53f76357f41
incorporated former theories Reconstruction and ResAtpMethods into ATP_Linkup;
wenzelm
parents:
21102
diff
changeset
|
89 |
(*If called while ATP_Linkup is being created, it will transfer to the |
16563 | 90 |
current version. If called afterward, it will transfer to the final version.*) |
21254
d53f76357f41
incorporated former theories Reconstruction and ResAtpMethods into ATP_Linkup;
wenzelm
parents:
21102
diff
changeset
|
91 |
fun transfer_to_ATP_Linkup th = |
16563 | 92 |
transfer (Theory.deref recon_thy_ref) th handle THM _ => th; |
15347 | 93 |
|
15955
87cf2ce8ede8
memoization of ResAxioms.cnf_axiom rather than of Reconstruction.clausify_rule
paulson
parents:
15872
diff
changeset
|
94 |
fun is_taut th = |
87cf2ce8ede8
memoization of ResAxioms.cnf_axiom rather than of Reconstruction.clausify_rule
paulson
parents:
15872
diff
changeset
|
95 |
case (prop_of th) of |
87cf2ce8ede8
memoization of ResAxioms.cnf_axiom rather than of Reconstruction.clausify_rule
paulson
parents:
15872
diff
changeset
|
96 |
(Const ("Trueprop", _) $ Const ("True", _)) => true |
87cf2ce8ede8
memoization of ResAxioms.cnf_axiom rather than of Reconstruction.clausify_rule
paulson
parents:
15872
diff
changeset
|
97 |
| _ => false; |
87cf2ce8ede8
memoization of ResAxioms.cnf_axiom rather than of Reconstruction.clausify_rule
paulson
parents:
15872
diff
changeset
|
98 |
|
87cf2ce8ede8
memoization of ResAxioms.cnf_axiom rather than of Reconstruction.clausify_rule
paulson
parents:
15872
diff
changeset
|
99 |
(* remove tautologous clauses *) |
87cf2ce8ede8
memoization of ResAxioms.cnf_axiom rather than of Reconstruction.clausify_rule
paulson
parents:
15872
diff
changeset
|
100 |
val rm_redundant_cls = List.filter (not o is_taut); |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
101 |
|
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
102 |
|
16009 | 103 |
(**** SKOLEMIZATION BY INFERENCE (lcp) ****) |
104 |
||
18141
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
105 |
(*Traverse a theorem, declaring Skolem function definitions. String s is the suggested |
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
106 |
prefix for the Skolem constant. Result is a new theory*) |
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
107 |
fun declare_skofuns s th thy = |
21071 | 108 |
let val nref = ref 0 |
109 |
fun dec_sko (Const ("Ex",_) $ (xtp as Abs(_,T,p))) (thy, axs) = |
|
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
110 |
(*Existential: declare a Skolem function, then insert into body and continue*) |
21071 | 111 |
let val cname = Name.internal (s ^ "_sko" ^ Int.toString (inc nref)) |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
112 |
val args = term_frees xtp (*get the formal parameter list*) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
113 |
val Ts = map type_of args |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
114 |
val cT = Ts ---> T |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
115 |
val c = Const (Sign.full_name thy cname, cT) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
116 |
val rhs = list_abs_free (map dest_Free args, HOLogic.choice_const T $ xtp) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
117 |
(*Forms a lambda-abstraction over the formal parameters*) |
20783 | 118 |
val thy' = Sign.add_consts_authentic [(cname, cT, NoSyn)] thy |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
119 |
(*Theory is augmented with the constant, then its def*) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
120 |
val cdef = cname ^ "_def" |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
121 |
val thy'' = Theory.add_defs_i false false [(cdef, equals cT $ c $ rhs)] thy' |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
122 |
in dec_sko (subst_bound (list_comb(c,args), p)) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
123 |
(thy'', get_axiom thy'' cdef :: axs) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
124 |
end |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
125 |
| dec_sko (Const ("All",_) $ (xtp as Abs(a,T,p))) thx = |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
126 |
(*Universal quant: insert a free variable into body and continue*) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
127 |
let val fname = Name.variant (add_term_names (p,[])) a |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
128 |
in dec_sko (subst_bound (Free(fname,T), p)) thx end |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
129 |
| dec_sko (Const ("op &", _) $ p $ q) thx = dec_sko q (dec_sko p thx) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
130 |
| dec_sko (Const ("op |", _) $ p $ q) thx = dec_sko q (dec_sko p thx) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
131 |
| dec_sko (Const ("Trueprop", _) $ p) thx = dec_sko p thx |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
132 |
| dec_sko t thx = thx (*Do nothing otherwise*) |
20419 | 133 |
in dec_sko (prop_of th) (thy,[]) end; |
18141
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
134 |
|
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
135 |
(*Traverse a theorem, accumulating Skolem function definitions.*) |
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
136 |
fun assume_skofuns th = |
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
137 |
let fun dec_sko (Const ("Ex",_) $ (xtp as Abs(_,T,p))) defs = |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
138 |
(*Existential: declare a Skolem function, then insert into body and continue*) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
139 |
let val skos = map (#1 o Logic.dest_equals) defs (*existing sko fns*) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
140 |
val args = term_frees xtp \\ skos (*the formal parameters*) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
141 |
val Ts = map type_of args |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
142 |
val cT = Ts ---> T |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
143 |
val c = Free (gensym "sko_", cT) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
144 |
val rhs = list_abs_free (map dest_Free args, |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
145 |
HOLogic.choice_const T $ xtp) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
146 |
(*Forms a lambda-abstraction over the formal parameters*) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
147 |
val def = equals cT $ c $ rhs |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
148 |
in dec_sko (subst_bound (list_comb(c,args), p)) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
149 |
(def :: defs) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
150 |
end |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
151 |
| dec_sko (Const ("All",_) $ (xtp as Abs(a,T,p))) defs = |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
152 |
(*Universal quant: insert a free variable into body and continue*) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
153 |
let val fname = Name.variant (add_term_names (p,[])) a |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
154 |
in dec_sko (subst_bound (Free(fname,T), p)) defs end |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
155 |
| dec_sko (Const ("op &", _) $ p $ q) defs = dec_sko q (dec_sko p defs) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
156 |
| dec_sko (Const ("op |", _) $ p $ q) defs = dec_sko q (dec_sko p defs) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
157 |
| dec_sko (Const ("Trueprop", _) $ p) defs = dec_sko p defs |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
158 |
| dec_sko t defs = defs (*Do nothing otherwise*) |
20419 | 159 |
in dec_sko (prop_of th) [] end; |
160 |
||
161 |
||
162 |
(**** REPLACING ABSTRACTIONS BY FUNCTION DEFINITIONS ****) |
|
163 |
||
164 |
(*Returns the vars of a theorem*) |
|
165 |
fun vars_of_thm th = |
|
20445 | 166 |
map (Thm.cterm_of (theory_of_thm th) o Var) (Drule.fold_terms Term.add_vars th []); |
20419 | 167 |
|
168 |
(*Make a version of fun_cong with a given variable name*) |
|
169 |
local |
|
170 |
val fun_cong' = fun_cong RS asm_rl; (*renumber f, g to prevent clashes with (a,0)*) |
|
171 |
val cx = hd (vars_of_thm fun_cong'); |
|
172 |
val ty = typ_of (ctyp_of_term cx); |
|
20445 | 173 |
val thy = theory_of_thm fun_cong; |
20419 | 174 |
fun mkvar a = cterm_of thy (Var((a,0),ty)); |
175 |
in |
|
176 |
fun xfun_cong x = Thm.instantiate ([], [(cx, mkvar x)]) fun_cong' |
|
177 |
end; |
|
178 |
||
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
179 |
(*Removes the lambdas from an equation of the form t = (%x. u). A non-negative n, |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
180 |
serves as an upper bound on how many to remove.*) |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
181 |
fun strip_lambdas 0 th = th |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
182 |
| strip_lambdas n th = |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
183 |
case prop_of th of |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
184 |
_ $ (Const ("op =", _) $ _ $ Abs (x,_,_)) => |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
185 |
strip_lambdas (n-1) (freeze_thm (th RS xfun_cong x)) |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
186 |
| _ => th; |
20419 | 187 |
|
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
188 |
(*Convert meta- to object-equality. Fails for theorems like split_comp_eq, |
20419 | 189 |
where some types have the empty sort.*) |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
190 |
fun mk_object_eq th = th RS def_imp_eq |
20419 | 191 |
handle THM _ => error ("Theorem contains empty sort: " ^ string_of_thm th); |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
192 |
|
20419 | 193 |
(*Apply a function definition to an argument, beta-reducing the result.*) |
194 |
fun beta_comb cf x = |
|
195 |
let val th1 = combination cf (reflexive x) |
|
20902 | 196 |
val th2 = beta_conversion false (Drule.rhs_of th1) |
20419 | 197 |
in transitive th1 th2 end; |
198 |
||
199 |
(*Apply a function definition to arguments, beta-reducing along the way.*) |
|
200 |
fun list_combination cf [] = cf |
|
201 |
| list_combination cf (x::xs) = list_combination (beta_comb cf x) xs; |
|
202 |
||
203 |
fun list_cabs ([] , t) = t |
|
204 |
| list_cabs (v::vars, t) = Thm.cabs v (list_cabs(vars,t)); |
|
205 |
||
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
206 |
fun assert_eta_free ct = |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
207 |
let val t = term_of ct |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
208 |
in if (t aconv Envir.eta_contract t) then () |
20419 | 209 |
else error ("Eta redex in term: " ^ string_of_cterm ct) |
210 |
end; |
|
211 |
||
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
212 |
fun eq_absdef (th1, th2) = |
20445 | 213 |
Context.joinable (theory_of_thm th1, theory_of_thm th2) andalso |
214 |
rhs_of th1 aconv rhs_of th2; |
|
215 |
||
216 |
fun lambda_free (Abs _) = false |
|
217 |
| lambda_free (t $ u) = lambda_free t andalso lambda_free u |
|
218 |
| lambda_free _ = true; |
|
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
219 |
|
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
220 |
fun monomorphic t = |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
221 |
Term.fold_types (Term.fold_atyps (fn TVar _ => K false | _ => I)) t true; |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
222 |
|
20710
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
223 |
fun dest_abs_list ct = |
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
224 |
let val (cv,ct') = Thm.dest_abs NONE ct |
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
225 |
val (cvs,cu) = dest_abs_list ct' |
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
226 |
in (cv::cvs, cu) end |
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
227 |
handle CTERM _ => ([],ct); |
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
228 |
|
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
229 |
fun lambda_list [] u = u |
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
230 |
| lambda_list (v::vs) u = lambda v (lambda_list vs u); |
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
231 |
|
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
232 |
fun abstract_rule_list [] [] th = th |
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
233 |
| abstract_rule_list (v::vs) (ct::cts) th = abstract_rule v ct (abstract_rule_list vs cts th) |
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
234 |
| abstract_rule_list _ _ th = raise THM ("abstract_rule_list", 0, [th]); |
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
235 |
|
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
236 |
|
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
237 |
val Envir.Envir {asol = tenv0, iTs = tyenv0, ...} = Envir.empty 0 |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
238 |
|
20969
341808e0b7f2
Abstraction re-use code now checks that the abstraction function can be used in the current
paulson
parents:
20902
diff
changeset
|
239 |
(*Does an existing abstraction definition have an RHS that matches the one we need now? |
341808e0b7f2
Abstraction re-use code now checks that the abstraction function can be used in the current
paulson
parents:
20902
diff
changeset
|
240 |
thy is the current theory, which must extend that of theorem th.*) |
341808e0b7f2
Abstraction re-use code now checks that the abstraction function can be used in the current
paulson
parents:
20902
diff
changeset
|
241 |
fun match_rhs thy t th = |
341808e0b7f2
Abstraction re-use code now checks that the abstraction function can be used in the current
paulson
parents:
20902
diff
changeset
|
242 |
let val _ = if !trace_abs then warning ("match_rhs: " ^ string_of_cterm (cterm_of thy t) ^ |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
243 |
" against\n" ^ string_of_thm th) else (); |
20867
e7b92a48e22b
Refinements to abstraction. Seeding with combinators K, I and B.
paulson
parents:
20863
diff
changeset
|
244 |
val (tyenv,tenv) = Pattern.first_order_match thy (rhs_of th, t) (tyenv0,tenv0) |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
245 |
val term_insts = map Meson.term_pair_of (Vartab.dest tenv) |
20969
341808e0b7f2
Abstraction re-use code now checks that the abstraction function can be used in the current
paulson
parents:
20902
diff
changeset
|
246 |
val ct_pairs = if subthy (theory_of_thm th, thy) andalso |
341808e0b7f2
Abstraction re-use code now checks that the abstraction function can be used in the current
paulson
parents:
20902
diff
changeset
|
247 |
forall lambda_free (map #2 term_insts) |
341808e0b7f2
Abstraction re-use code now checks that the abstraction function can be used in the current
paulson
parents:
20902
diff
changeset
|
248 |
then map (pairself (cterm_of thy)) term_insts |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
249 |
else raise Pattern.MATCH (*Cannot allow lambdas in the instantiation*) |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
250 |
fun ctyp2 (ixn, (S, T)) = (ctyp_of thy (TVar (ixn, S)), ctyp_of thy T) |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
251 |
val th' = cterm_instantiate ct_pairs th |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
252 |
in SOME (th, instantiate (map ctyp2 (Vartab.dest tyenv), []) th') end |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
253 |
handle _ => NONE; |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
254 |
|
20419 | 255 |
(*Traverse a theorem, declaring abstraction function definitions. String s is the suggested |
256 |
prefix for the constants. Resulting theory is returned in the first theorem. *) |
|
257 |
fun declare_absfuns th = |
|
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
258 |
let fun abstract thy ct = |
20445 | 259 |
if lambda_free (term_of ct) then (transfer thy (reflexive ct), []) |
260 |
else |
|
261 |
case term_of ct of |
|
20710
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
262 |
Abs _ => |
20624
ba081ac0ed7e
sko/abs: Name.internal prevents choking of print_theory;
wenzelm
parents:
20567
diff
changeset
|
263 |
let val cname = Name.internal (gensym "abs_"); |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
264 |
val _ = assert_eta_free ct; |
20710
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
265 |
val (cvs,cta) = dest_abs_list ct |
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
266 |
val (vs,Tvs) = ListPair.unzip (map (dest_Free o term_of) cvs) |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
267 |
val _ = if !trace_abs then warning ("Nested lambda: " ^ string_of_cterm cta) else (); |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
268 |
val (u'_th,defs) = abstract thy cta |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
269 |
val _ = if !trace_abs then warning ("Returned " ^ string_of_thm u'_th) else (); |
20902 | 270 |
val cu' = Drule.rhs_of u'_th |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
271 |
val u' = term_of cu' |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
272 |
val abs_v_u = lambda_list (map term_of cvs) u' |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
273 |
(*get the formal parameters: ALL variables free in the term*) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
274 |
val args = term_frees abs_v_u |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
275 |
val _ = if !trace_abs then warning (Int.toString (length args) ^ " arguments") else (); |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
276 |
val rhs = list_abs_free (map dest_Free args, abs_v_u) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
277 |
(*Forms a lambda-abstraction over the formal parameters*) |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
278 |
val _ = if !trace_abs then warning ("Looking up " ^ string_of_cterm cu') else (); |
20969
341808e0b7f2
Abstraction re-use code now checks that the abstraction function can be used in the current
paulson
parents:
20902
diff
changeset
|
279 |
val thy = theory_of_thm u'_th |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
280 |
val (ax,ax',thy) = |
20969
341808e0b7f2
Abstraction re-use code now checks that the abstraction function can be used in the current
paulson
parents:
20902
diff
changeset
|
281 |
case List.mapPartial (match_rhs thy abs_v_u) |
341808e0b7f2
Abstraction re-use code now checks that the abstraction function can be used in the current
paulson
parents:
20902
diff
changeset
|
282 |
(Net.match_term (!abstraction_cache) u') of |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
283 |
(ax,ax')::_ => |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
284 |
(if !trace_abs then warning ("Re-using axiom " ^ string_of_thm ax) else (); |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
285 |
(ax,ax',thy)) |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
286 |
| [] => |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
287 |
let val _ = if !trace_abs then warning "Lookup was empty" else (); |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
288 |
val Ts = map type_of args |
20710
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
289 |
val cT = Ts ---> (Tvs ---> typ_of (ctyp_of_term cu')) |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
290 |
val c = Const (Sign.full_name thy cname, cT) |
20783 | 291 |
val thy = Sign.add_consts_authentic [(cname, cT, NoSyn)] thy |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
292 |
(*Theory is augmented with the constant, |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
293 |
then its definition*) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
294 |
val cdef = cname ^ "_def" |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
295 |
val thy = Theory.add_defs_i false false |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
296 |
[(cdef, equals cT $ c $ rhs)] thy |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
297 |
val _ = if !trace_abs then (warning ("Definition is " ^ |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
298 |
string_of_thm (get_axiom thy cdef))) |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
299 |
else (); |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
300 |
val ax = get_axiom thy cdef |> freeze_thm |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
301 |
|> mk_object_eq |> strip_lambdas (length args) |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
302 |
|> mk_meta_eq |> Meson.generalize |
20969
341808e0b7f2
Abstraction re-use code now checks that the abstraction function can be used in the current
paulson
parents:
20902
diff
changeset
|
303 |
val (_,ax') = Option.valOf (match_rhs thy abs_v_u ax) |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
304 |
val _ = if !trace_abs then |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
305 |
(warning ("Declaring: " ^ string_of_thm ax); |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
306 |
warning ("Instance: " ^ string_of_thm ax')) |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
307 |
else (); |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
308 |
val _ = abstraction_cache := Net.insert_term eq_absdef |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
309 |
((Logic.varify u'), ax) (!abstraction_cache) |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
310 |
handle Net.INSERT => |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
311 |
raise THM ("declare_absfuns: INSERT", 0, [th,u'_th,ax]) |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
312 |
in (ax,ax',thy) end |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
313 |
in if !trace_abs then warning ("Lookup result: " ^ string_of_thm ax') else (); |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
314 |
(transitive (abstract_rule_list vs cvs u'_th) (symmetric ax'), ax::defs) end |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
315 |
| (t1$t2) => |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
316 |
let val (ct1,ct2) = Thm.dest_comb ct |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
317 |
val (th1,defs1) = abstract thy ct1 |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
318 |
val (th2,defs2) = abstract (theory_of_thm th1) ct2 |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
319 |
in (combination th1 th2, defs1@defs2) end |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
320 |
val _ = if !trace_abs then warning ("declare_absfuns, Abstracting: " ^ string_of_thm th) else (); |
20419 | 321 |
val (eqth,defs) = abstract (theory_of_thm th) (cprop_of th) |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
322 |
val ths = equal_elim eqth th :: map (strip_lambdas ~1 o mk_object_eq o freeze_thm) defs |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
323 |
val _ = if !trace_abs then warning ("declare_absfuns, Result: " ^ string_of_thm (hd ths)) else (); |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
324 |
in (theory_of_thm eqth, map Drule.eta_contraction_rule ths) end; |
20419 | 325 |
|
20902 | 326 |
fun name_of def = try (#1 o dest_Free o lhs_of) def; |
20567
93ae490fe02c
Bug fix to prevent exception dest_Free from escaping
paulson
parents:
20525
diff
changeset
|
327 |
|
20525
4b0fdb18ea9a
bug fix to abstractions: free variables in theorem can be abstracted over.
paulson
parents:
20473
diff
changeset
|
328 |
(*A name is valid provided it isn't the name of a defined abstraction.*) |
20567
93ae490fe02c
Bug fix to prevent exception dest_Free from escaping
paulson
parents:
20525
diff
changeset
|
329 |
fun valid_name defs (Free(x,T)) = not (x mem_string (List.mapPartial name_of defs)) |
20525
4b0fdb18ea9a
bug fix to abstractions: free variables in theorem can be abstracted over.
paulson
parents:
20473
diff
changeset
|
330 |
| valid_name defs _ = false; |
4b0fdb18ea9a
bug fix to abstractions: free variables in theorem can be abstracted over.
paulson
parents:
20473
diff
changeset
|
331 |
|
20419 | 332 |
fun assume_absfuns th = |
20445 | 333 |
let val thy = theory_of_thm th |
334 |
val cterm = cterm_of thy |
|
20525
4b0fdb18ea9a
bug fix to abstractions: free variables in theorem can be abstracted over.
paulson
parents:
20473
diff
changeset
|
335 |
fun abstract ct = |
20445 | 336 |
if lambda_free (term_of ct) then (reflexive ct, []) |
337 |
else |
|
338 |
case term_of ct of |
|
20419 | 339 |
Abs (_,T,u) => |
20710
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
340 |
let val _ = assert_eta_free ct; |
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
341 |
val (cvs,cta) = dest_abs_list ct |
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
342 |
val (vs,Tvs) = ListPair.unzip (map (dest_Free o term_of) cvs) |
20525
4b0fdb18ea9a
bug fix to abstractions: free variables in theorem can be abstracted over.
paulson
parents:
20473
diff
changeset
|
343 |
val (u'_th,defs) = abstract cta |
20902 | 344 |
val cu' = Drule.rhs_of u'_th |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
345 |
val u' = term_of cu' |
20710
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
346 |
(*Could use Thm.cabs instead of lambda to work at level of cterms*) |
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
347 |
val abs_v_u = lambda_list (map term_of cvs) (term_of cu') |
20525
4b0fdb18ea9a
bug fix to abstractions: free variables in theorem can be abstracted over.
paulson
parents:
20473
diff
changeset
|
348 |
(*get the formal parameters: free variables not present in the defs |
4b0fdb18ea9a
bug fix to abstractions: free variables in theorem can be abstracted over.
paulson
parents:
20473
diff
changeset
|
349 |
(to avoid taking abstraction function names as parameters) *) |
20710
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
350 |
val args = filter (valid_name defs) (term_frees abs_v_u) |
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
351 |
val crhs = list_cabs (map cterm args, cterm abs_v_u) |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
352 |
(*Forms a lambda-abstraction over the formal parameters*) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
353 |
val rhs = term_of crhs |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
354 |
val (ax,ax') = |
20969
341808e0b7f2
Abstraction re-use code now checks that the abstraction function can be used in the current
paulson
parents:
20902
diff
changeset
|
355 |
case List.mapPartial (match_rhs thy abs_v_u) |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
356 |
(Net.match_term (!abstraction_cache) u') of |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
357 |
(ax,ax')::_ => |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
358 |
(if !trace_abs then warning ("Re-using axiom " ^ string_of_thm ax) else (); |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
359 |
(ax,ax')) |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
360 |
| [] => |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
361 |
let val Ts = map type_of args |
20710
384bfce59254
Abstraction now handles equations where the RHS is a lambda-expression; also, strings of lambdas
paulson
parents:
20624
diff
changeset
|
362 |
val const_ty = Ts ---> (Tvs ---> typ_of (ctyp_of_term cu')) |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
363 |
val c = Free (gensym "abs_", const_ty) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
364 |
val ax = assume (Thm.capply (cterm (equals const_ty $ c)) crhs) |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
365 |
|> mk_object_eq |> strip_lambdas (length args) |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
366 |
|> mk_meta_eq |> Meson.generalize |
20969
341808e0b7f2
Abstraction re-use code now checks that the abstraction function can be used in the current
paulson
parents:
20902
diff
changeset
|
367 |
val (_,ax') = Option.valOf (match_rhs thy abs_v_u ax) |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
368 |
val _ = abstraction_cache := Net.insert_term eq_absdef (rhs,ax) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
369 |
(!abstraction_cache) |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
370 |
handle Net.INSERT => |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
371 |
raise THM ("assume_absfuns: INSERT", 0, [th,u'_th,ax]) |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
372 |
in (ax,ax') end |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
373 |
in if !trace_abs then warning ("Lookup result: " ^ string_of_thm ax') else (); |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
374 |
(transitive (abstract_rule_list vs cvs u'_th) (symmetric ax'), ax::defs) end |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
375 |
| (t1$t2) => |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
376 |
let val (ct1,ct2) = Thm.dest_comb ct |
20525
4b0fdb18ea9a
bug fix to abstractions: free variables in theorem can be abstracted over.
paulson
parents:
20473
diff
changeset
|
377 |
val (t1',defs1) = abstract ct1 |
4b0fdb18ea9a
bug fix to abstractions: free variables in theorem can be abstracted over.
paulson
parents:
20473
diff
changeset
|
378 |
val (t2',defs2) = abstract ct2 |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
379 |
in (combination t1' t2', defs1@defs2) end |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
380 |
val _ = if !trace_abs then warning ("assume_absfuns, Abstracting: " ^ string_of_thm th) else (); |
20525
4b0fdb18ea9a
bug fix to abstractions: free variables in theorem can be abstracted over.
paulson
parents:
20473
diff
changeset
|
381 |
val (eqth,defs) = abstract (cprop_of th) |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
382 |
val ths = equal_elim eqth th :: map (strip_lambdas ~1 o mk_object_eq o freeze_thm) defs |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
383 |
val _ = if !trace_abs then warning ("assume_absfuns, Result: " ^ string_of_thm (hd ths)) else (); |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
384 |
in map Drule.eta_contraction_rule ths end; |
20419 | 385 |
|
16009 | 386 |
|
387 |
(*cterms are used throughout for efficiency*) |
|
18141
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
388 |
val cTrueprop = Thm.cterm_of HOL.thy HOLogic.Trueprop; |
16009 | 389 |
|
390 |
(*cterm version of mk_cTrueprop*) |
|
391 |
fun c_mkTrueprop A = Thm.capply cTrueprop A; |
|
392 |
||
393 |
(*Given an abstraction over n variables, replace the bound variables by free |
|
394 |
ones. Return the body, along with the list of free variables.*) |
|
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
395 |
fun c_variant_abs_multi (ct0, vars) = |
16009 | 396 |
let val (cv,ct) = Thm.dest_abs NONE ct0 |
397 |
in c_variant_abs_multi (ct, cv::vars) end |
|
398 |
handle CTERM _ => (ct0, rev vars); |
|
399 |
||
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
400 |
(*Given the definition of a Skolem function, return a theorem to replace |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
401 |
an existential formula by a use of that function. |
18141
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
402 |
Example: "EX x. x : A & x ~: B ==> sko A B : A & sko A B ~: B" [.] *) |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
403 |
fun skolem_of_def def = |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
404 |
let val (c,rhs) = Drule.dest_equals (cprop_of (freeze_thm def)) |
16009 | 405 |
val (ch, frees) = c_variant_abs_multi (rhs, []) |
18141
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
406 |
val (chilbert,cabs) = Thm.dest_comb ch |
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
407 |
val {sign,t, ...} = rep_cterm chilbert |
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
408 |
val T = case t of Const ("Hilbert_Choice.Eps", Type("fun",[_,T])) => T |
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
409 |
| _ => raise THM ("skolem_of_def: expected Eps", 0, [def]) |
16009 | 410 |
val cex = Thm.cterm_of sign (HOLogic.exists_const T) |
411 |
val ex_tm = c_mkTrueprop (Thm.capply cex cabs) |
|
412 |
and conc = c_mkTrueprop (Drule.beta_conv cabs (Drule.list_comb(c,frees))); |
|
18141
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
413 |
fun tacf [prem] = rewrite_goals_tac [def] THEN rtac (prem RS someI_ex) 1 |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
414 |
in Goal.prove_raw [ex_tm] conc tacf |
18141
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
415 |
|> forall_intr_list frees |
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
416 |
|> forall_elim_vars 0 (*Introduce Vars, but don't discharge defs.*) |
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
417 |
|> Thm.varifyT |
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
418 |
end; |
16009 | 419 |
|
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
420 |
(*Converts an Isabelle theorem (intro, elim or simp format, even higher-order) into NNF.*) |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
421 |
fun to_nnf th = |
21254
d53f76357f41
incorporated former theories Reconstruction and ResAtpMethods into ATP_Linkup;
wenzelm
parents:
21102
diff
changeset
|
422 |
th |> transfer_to_ATP_Linkup |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
423 |
|> transform_elim |> zero_var_indexes |> freeze_thm |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
424 |
|> ObjectLogic.atomize_thm |> make_nnf |> strip_lambdas ~1; |
16009 | 425 |
|
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
426 |
(*The cache prevents repeated clausification of a theorem, |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
427 |
and also repeated declaration of Skolem functions*) |
18510
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
428 |
(* FIXME better use Termtab!? No, we MUST use theory data!!*) |
15955
87cf2ce8ede8
memoization of ResAxioms.cnf_axiom rather than of Reconstruction.clausify_rule
paulson
parents:
15872
diff
changeset
|
429 |
val clause_cache = ref (Symtab.empty : (thm * thm list) Symtab.table) |
87cf2ce8ede8
memoization of ResAxioms.cnf_axiom rather than of Reconstruction.clausify_rule
paulson
parents:
15872
diff
changeset
|
430 |
|
18141
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
431 |
|
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
432 |
(*Generate Skolem functions for a theorem supplied in nnf*) |
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
433 |
fun skolem_of_nnf th = |
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
434 |
map (skolem_of_def o assume o (cterm_of (theory_of_thm th))) (assume_skofuns th); |
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
435 |
|
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
436 |
fun assert_lambda_free ths msg = |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
437 |
case filter (not o lambda_free o prop_of) ths of |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
438 |
[] => () |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
439 |
| ths' => error (msg ^ "\n" ^ space_implode "\n" (map string_of_thm ths')); |
20457
85414caac94a
refinements to conversion into clause form, esp for the HO case
paulson
parents:
20445
diff
changeset
|
440 |
|
20445 | 441 |
fun assume_abstract th = |
20457
85414caac94a
refinements to conversion into clause form, esp for the HO case
paulson
parents:
20445
diff
changeset
|
442 |
if lambda_free (prop_of th) then [th] |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
443 |
else th |> Drule.eta_contraction_rule |> assume_absfuns |
20457
85414caac94a
refinements to conversion into clause form, esp for the HO case
paulson
parents:
20445
diff
changeset
|
444 |
|> tap (fn ths => assert_lambda_free ths "assume_abstract: lambdas") |
20445 | 445 |
|
20419 | 446 |
(*Replace lambdas by assumed function definitions in the theorems*) |
20445 | 447 |
fun assume_abstract_list ths = |
448 |
if abstract_lambdas then List.concat (map assume_abstract ths) |
|
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
449 |
else map Drule.eta_contraction_rule ths; |
20419 | 450 |
|
451 |
(*Replace lambdas by declared function definitions in the theorems*) |
|
452 |
fun declare_abstract' (thy, []) = (thy, []) |
|
453 |
| declare_abstract' (thy, th::ths) = |
|
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
454 |
let val (thy', th_defs) = |
20457
85414caac94a
refinements to conversion into clause form, esp for the HO case
paulson
parents:
20445
diff
changeset
|
455 |
if lambda_free (prop_of th) then (thy, [th]) |
20445 | 456 |
else |
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
457 |
th |> zero_var_indexes |> freeze_thm |
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
458 |
|> Drule.eta_contraction_rule |> transfer thy |> declare_absfuns |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
459 |
val _ = assert_lambda_free th_defs "declare_abstract: lambdas" |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
460 |
val (thy'', ths') = declare_abstract' (thy', ths) |
20419 | 461 |
in (thy'', th_defs @ ths') end; |
462 |
||
463 |
fun declare_abstract (thy, ths) = |
|
464 |
if abstract_lambdas then declare_abstract' (thy, ths) |
|
20863
4ee61dbf192d
improvements to abstraction, ensuring more re-use of abstraction functions
paulson
parents:
20789
diff
changeset
|
465 |
else (thy, map Drule.eta_contraction_rule ths); |
20419 | 466 |
|
18510
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
467 |
(*Skolemize a named theorem, with Skolem functions as additional premises.*) |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
468 |
fun skolem_thm th = |
18510
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
469 |
let val nnfth = to_nnf th |
20419 | 470 |
in Meson.make_cnf (skolem_of_nnf nnfth) nnfth |
20445 | 471 |
|> assume_abstract_list |> Meson.finish_cnf |> rm_redundant_cls |
18510
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
472 |
end |
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
473 |
handle THM _ => []; |
18141
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
474 |
|
21071 | 475 |
(*Keep the full complexity of the original name*) |
476 |
fun flatten_name s = space_implode "_X" (NameSpace.unpack s); |
|
477 |
||
18510
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
478 |
(*Declare Skolem functions for a theorem, supplied in nnf and with its name. |
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
479 |
It returns a modified theory, unless skolemization fails.*) |
16009 | 480 |
fun skolem thy (name,th) = |
21071 | 481 |
let val cname = (case name of "" => gensym "" | s => flatten_name s) |
20419 | 482 |
val _ = Output.debug ("skolemizing " ^ name ^ ": ") |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
483 |
in Option.map |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
484 |
(fn nnfth => |
18141
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
485 |
let val (thy',defs) = declare_skofuns cname nnfth thy |
20419 | 486 |
val cnfs = Meson.make_cnf (map skolem_of_def defs) nnfth |
487 |
val (thy'',cnfs') = declare_abstract (thy',cnfs) |
|
488 |
in (thy'', rm_redundant_cls (Meson.finish_cnf cnfs')) |
|
489 |
end) |
|
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
490 |
(SOME (to_nnf th) handle THM _ => NONE) |
18141
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
491 |
end; |
16009 | 492 |
|
18510
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
493 |
(*Populate the clause cache using the supplied theorem. Return the clausal form |
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
494 |
and modified theory.*) |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
495 |
fun skolem_cache_thm (name,th) thy = |
18144
4edcb5fdc3b0
duplicate axioms in ATP linkup, and general fixes
paulson
parents:
18141
diff
changeset
|
496 |
case Symtab.lookup (!clause_cache) name of |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
497 |
NONE => |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
498 |
(case skolem thy (name, Thm.transfer thy th) of |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
499 |
NONE => ([th],thy) |
20473
7ef72f030679
Using Drule.local_standard to reduce the space usage
paulson
parents:
20461
diff
changeset
|
500 |
| SOME (thy',cls) => |
7ef72f030679
Using Drule.local_standard to reduce the space usage
paulson
parents:
20461
diff
changeset
|
501 |
let val cls = map Drule.local_standard cls |
7ef72f030679
Using Drule.local_standard to reduce the space usage
paulson
parents:
20461
diff
changeset
|
502 |
in |
7ef72f030679
Using Drule.local_standard to reduce the space usage
paulson
parents:
20461
diff
changeset
|
503 |
if null cls then warning ("skolem_cache: empty clause set for " ^ name) |
7ef72f030679
Using Drule.local_standard to reduce the space usage
paulson
parents:
20461
diff
changeset
|
504 |
else (); |
7ef72f030679
Using Drule.local_standard to reduce the space usage
paulson
parents:
20461
diff
changeset
|
505 |
change clause_cache (Symtab.update (name, (th, cls))); |
7ef72f030679
Using Drule.local_standard to reduce the space usage
paulson
parents:
20461
diff
changeset
|
506 |
(cls,thy') |
7ef72f030679
Using Drule.local_standard to reduce the space usage
paulson
parents:
20461
diff
changeset
|
507 |
end) |
18144
4edcb5fdc3b0
duplicate axioms in ATP linkup, and general fixes
paulson
parents:
18141
diff
changeset
|
508 |
| SOME (th',cls) => |
18510
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
509 |
if eq_thm(th,th') then (cls,thy) |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
510 |
else (Output.debug ("skolem_cache: Ignoring variant of theorem " ^ name); |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
511 |
Output.debug (string_of_thm th); |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
512 |
Output.debug (string_of_thm th'); |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
513 |
([th],thy)); |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
514 |
|
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
515 |
(*Exported function to convert Isabelle theorems into axiom clauses*) |
19894 | 516 |
fun cnf_axiom (name,th) = |
21071 | 517 |
(Output.debug ("cnf_axiom called, theorem name = " ^ name); |
18144
4edcb5fdc3b0
duplicate axioms in ATP linkup, and general fixes
paulson
parents:
18141
diff
changeset
|
518 |
case name of |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
519 |
"" => skolem_thm th (*no name, so can't cache*) |
18144
4edcb5fdc3b0
duplicate axioms in ATP linkup, and general fixes
paulson
parents:
18141
diff
changeset
|
520 |
| s => case Symtab.lookup (!clause_cache) s of |
20473
7ef72f030679
Using Drule.local_standard to reduce the space usage
paulson
parents:
20461
diff
changeset
|
521 |
NONE => |
7ef72f030679
Using Drule.local_standard to reduce the space usage
paulson
parents:
20461
diff
changeset
|
522 |
let val cls = map Drule.local_standard (skolem_thm th) |
21071 | 523 |
in Output.debug "inserted into cache"; |
524 |
change clause_cache (Symtab.update (s, (th, cls))); cls |
|
525 |
end |
|
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
526 |
| SOME(th',cls) => |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
527 |
if eq_thm(th,th') then cls |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
528 |
else (Output.debug ("cnf_axiom: duplicate or variant of theorem " ^ name); |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
529 |
Output.debug (string_of_thm th); |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
530 |
Output.debug (string_of_thm th'); |
21071 | 531 |
cls) |
532 |
); |
|
15347 | 533 |
|
18141
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
534 |
fun pairname th = (Thm.name_of_thm th, th); |
89e2e8bed08f
Skolemization by inference, but not quite finished
paulson
parents:
18009
diff
changeset
|
535 |
|
21071 | 536 |
(*Principally for debugging*) |
537 |
fun cnf_name s = |
|
538 |
let val th = thm s |
|
539 |
in cnf_axiom (Thm.name_of_thm th, th) end; |
|
15347 | 540 |
|
15872 | 541 |
(**** Extract and Clausify theorems from a theory's claset and simpset ****) |
15347 | 542 |
|
17404
d16c3a62c396
the experimental tagging system, and the usual tidying
paulson
parents:
17279
diff
changeset
|
543 |
(*Preserve the name of "th" after the transformation "f"*) |
d16c3a62c396
the experimental tagging system, and the usual tidying
paulson
parents:
17279
diff
changeset
|
544 |
fun preserve_name f th = Thm.name_thm (Thm.name_of_thm th, f th); |
d16c3a62c396
the experimental tagging system, and the usual tidying
paulson
parents:
17279
diff
changeset
|
545 |
|
17484
f6a225f97f0a
simplification of the Isabelle-ATP code; hooks for batch generation of problems
paulson
parents:
17412
diff
changeset
|
546 |
fun rules_of_claset cs = |
f6a225f97f0a
simplification of the Isabelle-ATP code; hooks for batch generation of problems
paulson
parents:
17412
diff
changeset
|
547 |
let val {safeIs,safeEs,hazIs,hazEs,...} = rep_cs cs |
19175 | 548 |
val intros = safeIs @ hazIs |
18532 | 549 |
val elims = map Classical.classical_rule (safeEs @ hazEs) |
17404
d16c3a62c396
the experimental tagging system, and the usual tidying
paulson
parents:
17279
diff
changeset
|
550 |
in |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
551 |
Output.debug ("rules_of_claset intros: " ^ Int.toString(length intros) ^ |
17484
f6a225f97f0a
simplification of the Isabelle-ATP code; hooks for batch generation of problems
paulson
parents:
17412
diff
changeset
|
552 |
" elims: " ^ Int.toString(length elims)); |
20017
a2070352371c
made the conversion of elimination rules more robust
paulson
parents:
19894
diff
changeset
|
553 |
map pairname (intros @ elims) |
17404
d16c3a62c396
the experimental tagging system, and the usual tidying
paulson
parents:
17279
diff
changeset
|
554 |
end; |
15347 | 555 |
|
17484
f6a225f97f0a
simplification of the Isabelle-ATP code; hooks for batch generation of problems
paulson
parents:
17412
diff
changeset
|
556 |
fun rules_of_simpset ss = |
f6a225f97f0a
simplification of the Isabelle-ATP code; hooks for batch generation of problems
paulson
parents:
17412
diff
changeset
|
557 |
let val ({rules,...}, _) = rep_ss ss |
f6a225f97f0a
simplification of the Isabelle-ATP code; hooks for batch generation of problems
paulson
parents:
17412
diff
changeset
|
558 |
val simps = Net.entries rules |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
559 |
in |
18680 | 560 |
Output.debug ("rules_of_simpset: " ^ Int.toString(length simps)); |
17484
f6a225f97f0a
simplification of the Isabelle-ATP code; hooks for batch generation of problems
paulson
parents:
17412
diff
changeset
|
561 |
map (fn r => (#name r, #thm r)) simps |
f6a225f97f0a
simplification of the Isabelle-ATP code; hooks for batch generation of problems
paulson
parents:
17412
diff
changeset
|
562 |
end; |
f6a225f97f0a
simplification of the Isabelle-ATP code; hooks for batch generation of problems
paulson
parents:
17412
diff
changeset
|
563 |
|
f6a225f97f0a
simplification of the Isabelle-ATP code; hooks for batch generation of problems
paulson
parents:
17412
diff
changeset
|
564 |
fun claset_rules_of_thy thy = rules_of_claset (claset_of thy); |
f6a225f97f0a
simplification of the Isabelle-ATP code; hooks for batch generation of problems
paulson
parents:
17412
diff
changeset
|
565 |
fun simpset_rules_of_thy thy = rules_of_simpset (simpset_of thy); |
f6a225f97f0a
simplification of the Isabelle-ATP code; hooks for batch generation of problems
paulson
parents:
17412
diff
changeset
|
566 |
|
20774 | 567 |
fun atpset_rules_of_thy thy = map pairname (ResAtpset.get_atpset (Context.Theory thy)); |
19196
62ee8c10d796
Added functions to retrieve local and global atpset rules.
mengj
parents:
19175
diff
changeset
|
568 |
|
62ee8c10d796
Added functions to retrieve local and global atpset rules.
mengj
parents:
19175
diff
changeset
|
569 |
|
17484
f6a225f97f0a
simplification of the Isabelle-ATP code; hooks for batch generation of problems
paulson
parents:
17412
diff
changeset
|
570 |
fun claset_rules_of_ctxt ctxt = rules_of_claset (local_claset_of ctxt); |
f6a225f97f0a
simplification of the Isabelle-ATP code; hooks for batch generation of problems
paulson
parents:
17412
diff
changeset
|
571 |
fun simpset_rules_of_ctxt ctxt = rules_of_simpset (local_simpset_of ctxt); |
15347 | 572 |
|
20774 | 573 |
fun atpset_rules_of_ctxt ctxt = map pairname (ResAtpset.get_atpset (Context.Proof ctxt)); |
574 |
||
15347 | 575 |
|
15872 | 576 |
(**** Translate a set of classical/simplifier rules into CNF (still as type "thm") ****) |
15347 | 577 |
|
19894 | 578 |
(* classical rules: works for both FOL and HOL *) |
579 |
fun cnf_rules [] err_list = ([],err_list) |
|
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
580 |
| cnf_rules ((name,th) :: ths) err_list = |
19894 | 581 |
let val (ts,es) = cnf_rules ths err_list |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
582 |
in (cnf_axiom (name,th) :: ts,es) handle _ => (ts, (th::es)) end; |
15347 | 583 |
|
19894 | 584 |
fun pair_name_cls k (n, []) = [] |
585 |
| pair_name_cls k (n, cls::clss) = (cls, (n,k)) :: pair_name_cls (k+1) (n, clss) |
|
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
586 |
|
19894 | 587 |
fun cnf_rules_pairs_aux pairs [] = pairs |
588 |
| cnf_rules_pairs_aux pairs ((name,th)::ths) = |
|
20457
85414caac94a
refinements to conversion into clause form, esp for the HO case
paulson
parents:
20445
diff
changeset
|
589 |
let val pairs' = (pair_name_cls 0 (name, cnf_axiom(name,th))) @ pairs |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
590 |
handle THM _ => pairs | ResClause.CLAUSE _ => pairs |
19894 | 591 |
in cnf_rules_pairs_aux pairs' ths end; |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
592 |
|
21290
33b6bb5d6ab8
Improvement to classrel clauses: now outputs the minimum needed.
paulson
parents:
21254
diff
changeset
|
593 |
(*The combination of rev and tail recursion preserves the original order*) |
33b6bb5d6ab8
Improvement to classrel clauses: now outputs the minimum needed.
paulson
parents:
21254
diff
changeset
|
594 |
fun cnf_rules_pairs l = cnf_rules_pairs_aux [] (rev l); |
19353 | 595 |
|
19196
62ee8c10d796
Added functions to retrieve local and global atpset rules.
mengj
parents:
19175
diff
changeset
|
596 |
|
18198
95330fc0ea8d
-- combined common CNF functions used by HOL and FOL axioms, the difference between conversion of HOL and FOL theorems only comes in when theorems are converted to ResClause.clause or ResHolClause.clause format.
mengj
parents:
18144
diff
changeset
|
597 |
(**** Convert all theorems of a claset/simpset into clauses (ResClause.clause, or ResHolClause.clause) ****) |
15347 | 598 |
|
20419 | 599 |
(*Setup function: takes a theory and installs ALL known theorems into the clause cache*) |
20457
85414caac94a
refinements to conversion into clause form, esp for the HO case
paulson
parents:
20445
diff
changeset
|
600 |
|
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
601 |
fun skolem_cache (name,th) thy = |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
602 |
let val prop = Thm.prop_of th |
20457
85414caac94a
refinements to conversion into clause form, esp for the HO case
paulson
parents:
20445
diff
changeset
|
603 |
in |
21071 | 604 |
if lambda_free prop |
20969
341808e0b7f2
Abstraction re-use code now checks that the abstraction function can be used in the current
paulson
parents:
20902
diff
changeset
|
605 |
(*Monomorphic theorems can be Skolemized on demand, |
20867
e7b92a48e22b
Refinements to abstraction. Seeding with combinators K, I and B.
paulson
parents:
20863
diff
changeset
|
606 |
but there are problems with re-use of abstraction functions if we don't |
e7b92a48e22b
Refinements to abstraction. Seeding with combinators K, I and B.
paulson
parents:
20863
diff
changeset
|
607 |
do them now, even for monomorphic theorems.*) |
e7b92a48e22b
Refinements to abstraction. Seeding with combinators K, I and B.
paulson
parents:
20863
diff
changeset
|
608 |
then thy |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
609 |
else #2 (skolem_cache_thm (name,th) thy) |
20457
85414caac94a
refinements to conversion into clause form, esp for the HO case
paulson
parents:
20445
diff
changeset
|
610 |
end; |
85414caac94a
refinements to conversion into clause form, esp for the HO case
paulson
parents:
20445
diff
changeset
|
611 |
|
21071 | 612 |
(*The cache can be kept smaller by augmenting the condition above with |
613 |
orelse (not abstract_lambdas andalso monomorphic prop). |
|
614 |
However, while this step does not reduce the time needed to build HOL, |
|
615 |
it doubles the time taken by the first call to the ATP link-up.*) |
|
616 |
||
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
617 |
fun clause_cache_setup thy = fold skolem_cache (PureThy.all_thms_of thy) thy; |
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
618 |
|
16563 | 619 |
|
620 |
(*** meson proof methods ***) |
|
621 |
||
21071 | 622 |
fun skolem_use_cache_thm th = |
623 |
case Symtab.lookup (!clause_cache) (Thm.name_of_thm th) of |
|
624 |
NONE => skolem_thm th |
|
625 |
| SOME (th',cls) => |
|
626 |
if eq_thm(th,th') then cls else skolem_thm th; |
|
627 |
||
628 |
fun cnf_rules_of_ths ths = List.concat (map skolem_use_cache_thm ths); |
|
16563 | 629 |
|
630 |
fun meson_meth ths ctxt = |
|
631 |
Method.SIMPLE_METHOD' HEADGOAL |
|
21096
8f3dffd52db2
meson method MUST NOT use all safe rules, only basic ones for the logical connectives.
paulson
parents:
21071
diff
changeset
|
632 |
(CHANGED_PROP o Meson.meson_claset_tac (cnf_rules_of_ths ths) HOL_cs); |
16563 | 633 |
|
634 |
val meson_method_setup = |
|
18708 | 635 |
Method.add_methods |
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
636 |
[("meson", Method.thms_ctxt_args meson_meth, |
18833 | 637 |
"MESON resolution proof procedure")]; |
15347 | 638 |
|
21102
7f2ebe5c5b72
Conversion to clause form now tolerates Boolean variables without looping.
paulson
parents:
21096
diff
changeset
|
639 |
(** Attribute for converting a theorem into clauses **) |
18510
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
640 |
|
21102
7f2ebe5c5b72
Conversion to clause form now tolerates Boolean variables without looping.
paulson
parents:
21096
diff
changeset
|
641 |
fun meta_cnf_axiom th = map Meson.make_meta_clause (cnf_axiom (pairname th)); |
18510
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
642 |
|
21102
7f2ebe5c5b72
Conversion to clause form now tolerates Boolean variables without looping.
paulson
parents:
21096
diff
changeset
|
643 |
fun clausify_rule (th,i) = List.nth (meta_cnf_axiom th, i) |
7f2ebe5c5b72
Conversion to clause form now tolerates Boolean variables without looping.
paulson
parents:
21096
diff
changeset
|
644 |
|
7f2ebe5c5b72
Conversion to clause form now tolerates Boolean variables without looping.
paulson
parents:
21096
diff
changeset
|
645 |
val clausify = Attrib.syntax (Scan.lift Args.nat |
7f2ebe5c5b72
Conversion to clause form now tolerates Boolean variables without looping.
paulson
parents:
21096
diff
changeset
|
646 |
>> (fn i => Thm.rule_attribute (fn _ => fn th => clausify_rule (th, i)))); |
7f2ebe5c5b72
Conversion to clause form now tolerates Boolean variables without looping.
paulson
parents:
21096
diff
changeset
|
647 |
|
7f2ebe5c5b72
Conversion to clause form now tolerates Boolean variables without looping.
paulson
parents:
21096
diff
changeset
|
648 |
(** The Skolemization attribute **) |
18510
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
649 |
|
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
650 |
fun conj2_rule (th1,th2) = conjI OF [th1,th2]; |
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
651 |
|
20457
85414caac94a
refinements to conversion into clause form, esp for the HO case
paulson
parents:
20445
diff
changeset
|
652 |
(*Conjoin a list of theorems to form a single theorem*) |
85414caac94a
refinements to conversion into clause form, esp for the HO case
paulson
parents:
20445
diff
changeset
|
653 |
fun conj_rule [] = TrueI |
20445 | 654 |
| conj_rule ths = foldr1 conj2_rule ths; |
18510
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
655 |
|
20419 | 656 |
fun skolem_attr (Context.Theory thy, th) = |
657 |
let val name = Thm.name_of_thm th |
|
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
658 |
val (cls, thy') = skolem_cache_thm (name, th) thy |
18728 | 659 |
in (Context.Theory thy', conj_rule cls) end |
21071 | 660 |
| skolem_attr (context, th) = (context, conj_rule (skolem_use_cache_thm th)); |
18510
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
661 |
|
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
662 |
val setup_attrs = Attrib.add_attributes |
21102
7f2ebe5c5b72
Conversion to clause form now tolerates Boolean variables without looping.
paulson
parents:
21096
diff
changeset
|
663 |
[("skolem", Attrib.no_args skolem_attr, "skolemization of a theorem"), |
7f2ebe5c5b72
Conversion to clause form now tolerates Boolean variables without looping.
paulson
parents:
21096
diff
changeset
|
664 |
("clausify", clausify, "conversion to clauses")]; |
7f2ebe5c5b72
Conversion to clause form now tolerates Boolean variables without looping.
paulson
parents:
21096
diff
changeset
|
665 |
|
18708 | 666 |
val setup = clause_cache_setup #> setup_attrs; |
18510
0a6c24f549c3
the "skolem" attribute and better initialization of the clause database
paulson
parents:
18404
diff
changeset
|
667 |
|
20461
d689ad772b2c
skolem_cache_thm: Drule.close_derivation on clauses preserves some space;
wenzelm
parents:
20457
diff
changeset
|
668 |
end; |