src/HOL/Tools/Qelim/qelim.ML
author wenzelm
Sat, 10 Nov 2007 18:36:08 +0100
changeset 25380 03201004c77e
parent 23904 ba6c806590f8
child 30657 db260dfd2d8c
permissions -rw-r--r--
put_inductives: be permissive about multiple versions (target names are not necessarily unique); add_inductive: store info under global (!) name -- very rough approximation of the real thing;
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$
23904
chaieb
parents: 23855
diff changeset
     3
    Author:     Amine Chaieb, TU Muenchen
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
     4
23904
chaieb
parents: 23855
diff changeset
     5
Generic quantifier elimination conversions for HOL formulae.
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
     6
*)
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
signature QELIM =
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
     9
sig
23904
chaieb
parents: 23855
diff changeset
    10
 val gen_qelim_conv: conv -> conv -> conv -> (cterm -> 'a -> 'a) -> 'a 
chaieb
parents: 23855
diff changeset
    11
                     -> ('a -> conv) -> ('a -> conv) -> ('a -> conv) -> conv
chaieb
parents: 23855
diff changeset
    12
 val standard_qelim_conv: (cterm list -> conv) -> (cterm list -> conv) 
chaieb
parents: 23855
diff changeset
    13
                          -> (cterm list -> conv) -> conv
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    14
end;
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    15
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    16
structure Qelim: QELIM =
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    17
struct
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    18
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    19
open Conv;
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    20
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    21
val all_not_ex = mk_meta_eq @{thm "all_not_ex"};
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    22
23524
123a45589e0a Generic QE need no Context anymore
chaieb
parents: 23489
diff changeset
    23
fun gen_qelim_conv precv postcv simpex_conv ins env atcv ncv qcv =
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    24
 let
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    25
  fun conv env p =
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    26
   case (term_of p) of
23904
chaieb
parents: 23855
diff changeset
    27
    Const(s,T)$_$_ => 
chaieb
parents: 23855
diff changeset
    28
       if domain_type T = HOLogic.boolT
chaieb
parents: 23855
diff changeset
    29
          andalso s mem ["op &","op |","op -->","op ="]
chaieb
parents: 23855
diff changeset
    30
       then binop_conv (conv env) p 
chaieb
parents: 23855
diff changeset
    31
       else atcv env p
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    32
  | Const("Not",_)$_ => arg_conv (conv env) p
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    33
  | Const("Ex",_)$Abs(s,_,_) =>
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    34
    let
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    35
     val (e,p0) = Thm.dest_comb p
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    36
     val (x,p') = Thm.dest_abs (SOME s) p0
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    37
     val env' = ins x env
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    38
     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
    39
                   |> Drule.arg_cong_rule e
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    40
     val th' = simpex_conv (Thm.rhs_of th)
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    41
     val (l,r) = Thm.dest_equals (cprop_of th')
23593
fd12f7d56bd7 renamed Conv.is_refl to Thm.is_reflexive;
wenzelm
parents: 23524
diff changeset
    42
    in if Thm.is_reflexive th' then Thm.transitive th (qcv env (Thm.rhs_of th))
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    43
       else Thm.transitive (Thm.transitive th th') (conv env r) end
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    44
  | Const("Ex",_)$ _ => (Thm.eta_long_conversion then_conv conv env) p
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    45
  | Const("All",_)$_ =>
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    46
    let
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    47
     val p = Thm.dest_arg p
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    48
     val ([(_,T)],[]) = Thm.match (@{cpat "All"}, Thm.dest_fun p)
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    49
     val th = instantiate' [SOME T] [SOME p] all_not_ex
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    50
    in transitive th (conv env (Thm.rhs_of th))
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    51
    end
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    52
  | _ => atcv env p
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    53
 in precv then_conv (conv env) then_conv postcv end
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    54
23904
chaieb
parents: 23855
diff changeset
    55
(* Instantiation of some parameter for most common cases *)
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    56
23904
chaieb
parents: 23855
diff changeset
    57
local
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    58
val pcv = Simplifier.rewrite
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    59
                 (HOL_basic_ss addsimps (simp_thms @ ex_simps @ all_simps)
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    60
                     @ [@{thm "all_not_ex"}, not_all, ex_disj_distrib]);
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    61
23904
chaieb
parents: 23855
diff changeset
    62
in fun standard_qelim_conv atcv ncv qcv p =
chaieb
parents: 23855
diff changeset
    63
      gen_qelim_conv pcv pcv pcv cons (Thm.add_cterm_frees p []) atcv ncv qcv p
chaieb
parents: 23855
diff changeset
    64
end;
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    65
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    66
end;