src/HOL/Tools/Qelim/qelim.ML
author wenzelm
Tue, 28 Jul 2015 19:49:54 +0200
changeset 60818 5e11a6e2b044
parent 60801 7664e0916eec
child 61075 f6b0d827240e
permissions -rw-r--r--
more direct access to atomic cterms;
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
23904
chaieb
parents: 23855
diff changeset
     2
    Author:     Amine Chaieb, TU Muenchen
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
     3
23904
chaieb
parents: 23855
diff changeset
     4
Generic quantifier elimination conversions for HOL formulae.
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
     5
*)
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
signature QELIM =
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
     8
sig
41453
c03593812297 do not open ML structures;
wenzelm
parents: 38864
diff changeset
     9
 val gen_qelim_conv: conv -> conv -> conv -> (cterm -> 'a -> 'a) -> 'a ->
c03593812297 do not open ML structures;
wenzelm
parents: 38864
diff changeset
    10
  ('a -> conv) -> ('a -> conv) -> ('a -> conv) -> conv
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 45654
diff changeset
    11
 val standard_qelim_conv: Proof.context ->
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 45654
diff changeset
    12
  (cterm list -> conv) -> (cterm list -> conv) ->
41453
c03593812297 do not open ML structures;
wenzelm
parents: 38864
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
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    19
val all_not_ex = mk_meta_eq @{thm "all_not_ex"};
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    20
23524
123a45589e0a Generic QE need no Context anymore
chaieb
parents: 23489
diff changeset
    21
fun gen_qelim_conv precv postcv simpex_conv ins env atcv ncv qcv =
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    22
 let
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    23
  fun conv env p =
59582
0fbed69ff081 tuned signature -- prefer qualified names;
wenzelm
parents: 54227
diff changeset
    24
   case Thm.term_of p of
41453
c03593812297 do not open ML structures;
wenzelm
parents: 38864
diff changeset
    25
    Const(s,T)$_$_ =>
23904
chaieb
parents: 23855
diff changeset
    26
       if domain_type T = HOLogic.boolT
38795
848be46708dc formerly unnamed infix conjunction and disjunction now named HOL.conj and HOL.disj
haftmann
parents: 38786
diff changeset
    27
          andalso member (op =) [@{const_name HOL.conj}, @{const_name HOL.disj},
38864
4abe644fcea5 formerly unnamed infix equality now named HOL.eq
haftmann
parents: 38795
diff changeset
    28
            @{const_name HOL.implies}, @{const_name HOL.eq}] s
41453
c03593812297 do not open ML structures;
wenzelm
parents: 38864
diff changeset
    29
       then Conv.binop_conv (conv env) p
23904
chaieb
parents: 23855
diff changeset
    30
       else atcv env p
41453
c03593812297 do not open ML structures;
wenzelm
parents: 38864
diff changeset
    31
  | Const(@{const_name Not},_)$_ => Conv.arg_conv (conv env) p
32603
e08fdd615333 tuned const_name antiquotations
haftmann
parents: 30657
diff changeset
    32
  | Const(@{const_name Ex},_)$Abs(s,_,_) =>
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    33
    let
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    34
     val (e,p0) = Thm.dest_comb p
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    35
     val (x,p') = Thm.dest_abs (SOME s) p0
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    36
     val env' = ins x env
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    37
     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
    38
                   |> Drule.arg_cong_rule e
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    39
     val th' = simpex_conv (Thm.rhs_of th)
59582
0fbed69ff081 tuned signature -- prefer qualified names;
wenzelm
parents: 54227
diff changeset
    40
     val (_, r) = Thm.dest_equals (Thm.cprop_of th')
23593
fd12f7d56bd7 renamed Conv.is_refl to Thm.is_reflexive;
wenzelm
parents: 23524
diff changeset
    41
    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
    42
       else Thm.transitive (Thm.transitive th th') (conv env r) end
32603
e08fdd615333 tuned const_name antiquotations
haftmann
parents: 30657
diff changeset
    43
  | Const(@{const_name Ex},_)$ _ => (Thm.eta_long_conversion then_conv conv env) p
e08fdd615333 tuned const_name antiquotations
haftmann
parents: 30657
diff changeset
    44
  | Const(@{const_name All},_)$_ =>
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    45
    let
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    46
     val p = Thm.dest_arg p
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    47
     val ([(_,T)],[]) = Thm.match (@{cpat "All"}, Thm.dest_fun p)
60801
7664e0916eec tuned signature;
wenzelm
parents: 59582
diff changeset
    48
     val th = Thm.instantiate' [SOME T] [SOME p] all_not_ex
36945
9bec62c10714 less pervasive names from structure Thm;
wenzelm
parents: 35410
diff changeset
    49
    in Thm.transitive th (conv env (Thm.rhs_of th))
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    50
    end
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    51
  | _ => atcv env p
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    52
 in precv then_conv (conv env) then_conv postcv end
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    53
23904
chaieb
parents: 23855
diff changeset
    54
(* Instantiation of some parameter for most common cases *)
23489
6c2156c478f6 made type conv pervasive;
wenzelm
parents: 23466
diff changeset
    55
23904
chaieb
parents: 23855
diff changeset
    56
local
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 45654
diff changeset
    57
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 45654
diff changeset
    58
val ss =
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 45654
diff changeset
    59
  simpset_of
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 45654
diff changeset
    60
   (put_simpset HOL_basic_ss @{context}
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 45654
diff changeset
    61
    addsimps @{thms simp_thms ex_simps all_simps all_not_ex not_all ex_disj_distrib});
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 45654
diff changeset
    62
fun pcv ctxt = Simplifier.rewrite (put_simpset ss ctxt)
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    63
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 45654
diff changeset
    64
in
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 45654
diff changeset
    65
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 45654
diff changeset
    66
fun standard_qelim_conv ctxt atcv ncv qcv p =
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 45654
diff changeset
    67
  let val pcv = pcv ctxt
60818
5e11a6e2b044 more direct access to atomic cterms;
wenzelm
parents: 60801
diff changeset
    68
  in gen_qelim_conv pcv pcv pcv cons (Drule.cterm_add_frees p []) atcv ncv qcv p end
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 45654
diff changeset
    69
23904
chaieb
parents: 23855
diff changeset
    70
end;
23466
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    71
886655a150f6 moved quantifier elimination tools to Tools/Qelim/;
wenzelm
parents:
diff changeset
    72
end;