| author | wenzelm |
| Thu, 21 Jun 2007 15:42:12 +0200 | |
| changeset 23458 | b2267a9e9e28 |
| parent 23457 | 53b788c014f8 |
| permissions | -rw-r--r-- |
|
23457
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
1 |
(* |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
2 |
ID: $Id$ |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
3 |
Author: Amine Chaieb and Tobias Nipkow, TU Muenchen |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
4 |
|
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
5 |
File containing the implementation of the proof protocoling |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
6 |
and proof generation for multiple quantified formulae. |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
7 |
*) |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
8 |
|
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
9 |
signature QELIM = |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
10 |
sig |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
11 |
val standard_qelim_conv: Proof.context -> (cterm list -> cterm -> thm) -> |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
12 |
(cterm list -> Conv.conv) -> (cterm list -> cterm -> thm) -> cterm -> thm |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
13 |
val gen_qelim_conv: Proof.context -> Conv.conv -> Conv.conv -> Conv.conv -> |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
14 |
(cterm -> 'a -> 'a) -> 'a -> ('a -> cterm -> thm) ->
|
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
15 |
('a -> Conv.conv) -> ('a -> cterm -> thm) -> Conv.conv
|
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
16 |
end; |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
17 |
|
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
18 |
structure Qelim : QELIM = |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
19 |
struct |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
20 |
|
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
21 |
open Conv; |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
22 |
|
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
23 |
local |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
24 |
val all_not_ex = mk_meta_eq @{thm "all_not_ex"}
|
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
25 |
in |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
26 |
fun gen_qelim_conv ctxt precv postcv simpex_conv ins env atcv ncv qcv = |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
27 |
let |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
28 |
val thy = ProofContext.theory_of ctxt |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
29 |
fun conv env p = |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
30 |
case (term_of p) of |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
31 |
Const(s,T)$_$_ => if domain_type T = HOLogic.boolT |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
32 |
andalso s mem ["op &","op |","op -->","op ="] |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
33 |
then binop_conv (conv env) p else atcv env p |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
34 |
| Const("Not",_)$_ => arg_conv (conv env) p
|
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
35 |
| Const("Ex",_)$Abs(s,_,_) =>
|
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
36 |
let |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
37 |
val (e,p0) = Thm.dest_comb p |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
38 |
val (x,p') = Thm.dest_abs (SOME s) p0 |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
39 |
val env' = ins x env |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
40 |
val th = Thm.abstract_rule s x ((conv env' then_conv ncv env') p') |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
41 |
|> Drule.arg_cong_rule e |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
42 |
val th' = simpex_conv (Thm.rhs_of th) |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
43 |
val (l,r) = Thm.dest_equals (cprop_of th') |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
44 |
in if is_refl th' then Thm.transitive th (qcv env (Thm.rhs_of th)) |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
45 |
else Thm.transitive (Thm.transitive th th') (conv env r) end |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
46 |
| Const("Ex",_)$ _ => (eta_conv thy then_conv conv env) p
|
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
47 |
| Const("All",_)$_ =>
|
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
48 |
let |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
49 |
val p = Thm.dest_arg p |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
50 |
val ([(_,T)],[]) = Thm.match (@{cpat "All"}, Thm.dest_fun p)
|
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
51 |
val th = instantiate' [SOME T] [SOME p] all_not_ex |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
52 |
in transitive th (conv env (Thm.rhs_of th)) |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
53 |
end |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
54 |
| _ => atcv env p |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
55 |
in precv then_conv (conv env) then_conv postcv end |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
56 |
end; |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
57 |
|
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
58 |
fun cterm_frees ct = |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
59 |
let fun h acc t = |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
60 |
case (term_of t) of |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
61 |
_$_ => h (h acc (Thm.dest_arg t)) (Thm.dest_fun t) |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
62 |
| Abs(_,_,_) => Thm.dest_abs NONE t ||> h acc |> uncurry (remove (op aconvc)) |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
63 |
| Free _ => insert (op aconvc) t acc |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
64 |
| _ => acc |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
65 |
in h [] ct end; |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
66 |
|
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
67 |
local |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
68 |
val pcv = Simplifier.rewrite |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
69 |
(HOL_basic_ss addsimps (simp_thms @ ex_simps @ all_simps) |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
70 |
@ [@{thm "all_not_ex"}, not_all,ex_disj_distrib])
|
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
71 |
in |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
72 |
fun standard_qelim_conv ctxt atcv ncv qcv p = |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
73 |
gen_qelim_conv ctxt pcv pcv pcv cons (cterm_frees p) atcv ncv qcv p |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
74 |
end; |
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
75 |
|
|
53b788c014f8
moved HOL/Tools/Presburger/qelim.ML to HOL/Tools/qelim.ML;
wenzelm
parents:
diff
changeset
|
76 |
end; |