src/HOL/Tools/Qelim/qelim.ML
author chaieb
Mon, 02 Jul 2007 10:43:20 +0200
changeset 23524 123a45589e0a
parent 23489 6c2156c478f6
child 23593 fd12f7d56bd7
permissions -rw-r--r--
Generic QE need no Context anymore
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
     1
(*  Title:      HOL/Tools/Qelim/qelim.ML
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
     3
    Author:     Amine Chaieb and Tobias Nipkow, TU Muenchen
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
     4
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
     5
Proof protocoling and proof generation for multiple quantified
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
     6
formulae.
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
     7
*)
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
     8
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
     9
signature QELIM =
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    10
sig
23524
123a45589e0a Generic QE need no Context anymore
chaieb
parents: 23489
diff changeset
    11
 val gen_qelim_conv: conv -> conv -> conv ->
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    12
   (cterm -> 'a -> 'a) -> 'a -> ('a -> cterm -> thm) ->
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    13
   ('a -> conv) -> ('a -> cterm -> thm) -> conv
23524
123a45589e0a Generic QE need no Context anymore
chaieb
parents: 23489
diff changeset
    14
 val standard_qelim_conv: (cterm list -> cterm -> thm) ->
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    15
   (cterm list -> conv) -> (cterm list -> cterm -> thm) -> cterm -> thm
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    16
end;
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    17
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    18
structure Qelim: QELIM =
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    19
struct
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    20
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    21
open Conv;
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    22
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    23
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    24
(* gen_qelim_conv *)
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    25
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    26
val all_not_ex = mk_meta_eq @{thm "all_not_ex"};
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    27
23524
123a45589e0a Generic QE need no Context anymore
chaieb
parents: 23489
diff changeset
    28
fun gen_qelim_conv precv postcv simpex_conv ins env atcv ncv qcv =
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    29
 let
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    30
  fun conv env p =
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    31
   case (term_of p) of
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    32
    Const(s,T)$_$_ => if domain_type T = HOLogic.boolT
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    33
                         andalso s mem ["op &","op |","op -->","op ="]
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    34
                     then binop_conv (conv env) p else atcv env p
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    35
  | Const("Not",_)$_ => arg_conv (conv env) p
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    36
  | Const("Ex",_)$Abs(s,_,_) =>
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    37
    let
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    38
     val (e,p0) = Thm.dest_comb p
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    39
     val (x,p') = Thm.dest_abs (SOME s) p0
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    40
     val env' = ins x env
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    41
     val th = Thm.abstract_rule s x ((conv env' then_conv ncv env') p')
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    42
                   |> Drule.arg_cong_rule e
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    43
     val th' = simpex_conv (Thm.rhs_of th)
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    44
     val (l,r) = Thm.dest_equals (cprop_of th')
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    45
    in if is_refl th' then Thm.transitive th (qcv env (Thm.rhs_of th))
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    46
       else Thm.transitive (Thm.transitive th th') (conv env r) end
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    47
  | Const("Ex",_)$ _ => (Thm.eta_long_conversion then_conv conv env) p
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    48
  | Const("All",_)$_ =>
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    49
    let
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    50
     val p = Thm.dest_arg p
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    51
     val ([(_,T)],[]) = Thm.match (@{cpat "All"}, Thm.dest_fun p)
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    52
     val th = instantiate' [SOME T] [SOME p] all_not_ex
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    53
    in transitive th (conv env (Thm.rhs_of th))
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    54
    end
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    55
  | _ => atcv env p
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    56
 in precv then_conv (conv env) then_conv postcv end
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    57
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    58
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    59
(* standard_qelim_conv *)
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    60
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    61
val pcv = Simplifier.rewrite
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    62
                 (HOL_basic_ss addsimps (simp_thms @ ex_simps @ all_simps)
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    63
                     @ [@{thm "all_not_ex"}, not_all, ex_disj_distrib]);
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    64
23524
123a45589e0a Generic QE need no Context anymore
chaieb
parents: 23489
diff changeset
    65
fun standard_qelim_conv atcv ncv qcv p =
123a45589e0a Generic QE need no Context anymore
chaieb
parents: 23489
diff changeset
    66
  gen_qelim_conv pcv pcv pcv cons (Thm.add_cterm_frees p []) atcv ncv qcv p;
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    67
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    68
end;