src/HOL/Tools/simpdata.ML
author boehmes
Sat Mar 27 02:10:00 2010 +0100 (2010-03-27)
changeset 35983 27e2fa7d4ce7
parent 35364 b8c62d60195c
child 36543 0e7fc5bf38de
permissions -rw-r--r--
slightly more general simproc (avoids errors of linarith)
     1 (*  Title:      HOL/simpdata.ML
     2     Author:     Tobias Nipkow
     3     Copyright   1991  University of Cambridge
     4 
     5 Instantiation of the generic simplifier for HOL.
     6 *)
     7 
     8 (** tools setup **)
     9 
    10 structure Quantifier1 = Quantifier1Fun
    11 (struct
    12   (*abstract syntax*)
    13   fun dest_eq ((c as Const(@{const_name "op ="},_)) $ s $ t) = SOME (c, s, t)
    14     | dest_eq _ = NONE;
    15   fun dest_conj ((c as Const(@{const_name "op &"},_)) $ s $ t) = SOME (c, s, t)
    16     | dest_conj _ = NONE;
    17   fun dest_imp ((c as Const(@{const_name "op -->"},_)) $ s $ t) = SOME (c, s, t)
    18     | dest_imp _ = NONE;
    19   val conj = HOLogic.conj
    20   val imp  = HOLogic.imp
    21   (*rules*)
    22   val iff_reflection = @{thm eq_reflection}
    23   val iffI = @{thm iffI}
    24   val iff_trans = @{thm trans}
    25   val conjI= @{thm conjI}
    26   val conjE= @{thm conjE}
    27   val impI = @{thm impI}
    28   val mp   = @{thm mp}
    29   val uncurry = @{thm uncurry}
    30   val exI  = @{thm exI}
    31   val exE  = @{thm exE}
    32   val iff_allI = @{thm iff_allI}
    33   val iff_exI = @{thm iff_exI}
    34   val all_comm = @{thm all_comm}
    35   val ex_comm = @{thm ex_comm}
    36 end);
    37 
    38 structure Simpdata =
    39 struct
    40 
    41 fun mk_meta_eq r = r RS @{thm eq_reflection};
    42 fun safe_mk_meta_eq r = mk_meta_eq r handle Thm.THM _ => r;
    43 
    44 fun mk_eq th = case concl_of th
    45   (*expects Trueprop if not == *)
    46   of Const (@{const_name "=="},_) $ _ $ _ => th
    47    | _ $ (Const (@{const_name "op ="}, _) $ _ $ _) => mk_meta_eq th
    48    | _ $ (Const (@{const_name "Not"}, _) $ _) => th RS @{thm Eq_FalseI}
    49    | _ => th RS @{thm Eq_TrueI}
    50 
    51 fun mk_eq_True r =
    52   SOME (r RS @{thm meta_eq_to_obj_eq} RS @{thm Eq_TrueI}) handle Thm.THM _ => NONE;
    53 
    54 (* Produce theorems of the form
    55   (P1 =simp=> ... =simp=> Pn => x == y) ==> (P1 =simp=> ... =simp=> Pn => x = y)
    56 *)
    57 
    58 fun lift_meta_eq_to_obj_eq i st =
    59   let
    60     fun count_imp (Const (@{const_name HOL.simp_implies}, _) $ P $ Q) = 1 + count_imp Q
    61       | count_imp _ = 0;
    62     val j = count_imp (Logic.strip_assums_concl (List.nth (prems_of st, i - 1)))
    63   in if j = 0 then @{thm meta_eq_to_obj_eq}
    64     else
    65       let
    66         val Ps = map (fn k => Free ("P" ^ string_of_int k, propT)) (1 upto j);
    67         fun mk_simp_implies Q = fold_rev (fn R => fn S =>
    68           Const (@{const_name HOL.simp_implies}, propT --> propT --> propT) $ R $ S) Ps Q
    69         val aT = TFree ("'a", HOLogic.typeS);
    70         val x = Free ("x", aT);
    71         val y = Free ("y", aT)
    72       in Goal.prove_global (Thm.theory_of_thm st) []
    73         [mk_simp_implies (Logic.mk_equals (x, y))]
    74         (mk_simp_implies (HOLogic.mk_Trueprop (HOLogic.mk_eq (x, y))))
    75         (fn {prems, ...} => EVERY
    76          [rewrite_goals_tac @{thms simp_implies_def},
    77           REPEAT (ares_tac (@{thm meta_eq_to_obj_eq} ::
    78             map (rewrite_rule @{thms simp_implies_def}) prems) 1)])
    79       end
    80   end;
    81 
    82 (*Congruence rules for = (instead of ==)*)
    83 fun mk_meta_cong rl = zero_var_indexes
    84   (let val rl' = Seq.hd (TRYALL (fn i => fn st =>
    85      rtac (lift_meta_eq_to_obj_eq i st) i st) rl)
    86    in mk_meta_eq rl' handle THM _ =>
    87      if can Logic.dest_equals (concl_of rl') then rl'
    88      else error "Conclusion of congruence rules must be =-equality"
    89    end);
    90 
    91 fun mk_atomize pairs =
    92   let
    93     fun atoms thm =
    94       let
    95         fun res th = map (fn rl => th RS rl);   (*exception THM*)
    96         fun res_fixed rls =
    97           if Thm.maxidx_of (Thm.adjust_maxidx_thm ~1 thm) = ~1 then res thm rls
    98           else Variable.trade (K (fn [thm'] => res thm' rls)) (Variable.thm_context thm) [thm];
    99       in
   100         case concl_of thm
   101           of Const (@{const_name Trueprop}, _) $ p => (case head_of p
   102             of Const (a, _) => (case AList.lookup (op =) pairs a
   103               of SOME rls => (maps atoms (res_fixed rls) handle THM _ => [thm])
   104               | NONE => [thm])
   105             | _ => [thm])
   106           | _ => [thm]
   107       end;
   108   in atoms end;
   109 
   110 fun mksimps pairs =
   111   map_filter (try mk_eq) o mk_atomize pairs o gen_all;
   112 
   113 fun unsafe_solver_tac prems =
   114   (fn i => REPEAT_DETERM (match_tac @{thms simp_impliesI} i)) THEN'
   115   FIRST' [resolve_tac (reflexive_thm :: @{thm TrueI} :: @{thm refl} :: prems), atac,
   116     etac @{thm FalseE}];
   117 
   118 val unsafe_solver = mk_solver "HOL unsafe" unsafe_solver_tac;
   119 
   120 
   121 (*No premature instantiation of variables during simplification*)
   122 fun safe_solver_tac prems =
   123   (fn i => REPEAT_DETERM (match_tac @{thms simp_impliesI} i)) THEN'
   124   FIRST' [match_tac (reflexive_thm :: @{thm TrueI} :: @{thm refl} :: prems),
   125          eq_assume_tac, ematch_tac @{thms FalseE}];
   126 
   127 val safe_solver = mk_solver "HOL safe" safe_solver_tac;
   128 
   129 structure Splitter = Splitter
   130 (
   131   val thy = @{theory}
   132   val mk_eq = mk_eq
   133   val meta_eq_to_iff = @{thm meta_eq_to_obj_eq}
   134   val iffD = @{thm iffD2}
   135   val disjE = @{thm disjE}
   136   val conjE = @{thm conjE}
   137   val exE = @{thm exE}
   138   val contrapos = @{thm contrapos_nn}
   139   val contrapos2 = @{thm contrapos_pp}
   140   val notnotD = @{thm notnotD}
   141 );
   142 
   143 val split_tac = Splitter.split_tac;
   144 val split_inside_tac = Splitter.split_inside_tac;
   145 
   146 val op addsplits = Splitter.addsplits;
   147 val op delsplits = Splitter.delsplits;
   148 
   149 
   150 (* integration of simplifier with classical reasoner *)
   151 
   152 structure Clasimp = ClasimpFun
   153  (structure Simplifier = Simplifier and Splitter = Splitter
   154   and Classical  = Classical and Blast = Blast
   155   val iffD1 = @{thm iffD1} val iffD2 = @{thm iffD2} val notE = @{thm notE});
   156 open Clasimp;
   157 
   158 val _ = ML_Antiquote.value "clasimpset"
   159   (Scan.succeed "Clasimp.clasimpset_of (ML_Context.the_local_context ())");
   160 
   161 val mksimps_pairs =
   162  [(@{const_name "op -->"}, [@{thm mp}]),
   163   (@{const_name "op &"}, [@{thm conjunct1}, @{thm conjunct2}]),
   164   (@{const_name All}, [@{thm spec}]),
   165   (@{const_name True}, []),
   166   (@{const_name False}, []),
   167   (@{const_name If}, [@{thm if_bool_eq_conj} RS @{thm iffD1}])];
   168 
   169 val HOL_basic_ss =
   170   Simplifier.global_context @{theory} empty_ss
   171     setsubgoaler asm_simp_tac
   172     setSSolver safe_solver
   173     setSolver unsafe_solver
   174     setmksimps (mksimps mksimps_pairs)
   175     setmkeqTrue mk_eq_True
   176     setmkcong mk_meta_cong;
   177 
   178 fun hol_simplify rews = Simplifier.full_simplify (HOL_basic_ss addsimps rews);
   179 
   180 fun unfold_tac ths =
   181   let val ss0 = Simplifier.clear_ss HOL_basic_ss addsimps ths
   182   in fn ss => ALLGOALS (full_simp_tac (Simplifier.inherit_context ss ss0)) end;
   183 
   184 val defALL_regroup =
   185   Simplifier.simproc @{theory}
   186     "defined ALL" ["ALL x. P x"] Quantifier1.rearrange_all;
   187 
   188 val defEX_regroup =
   189   Simplifier.simproc @{theory}
   190     "defined EX" ["EX x. P x"] Quantifier1.rearrange_ex;
   191 
   192 
   193 val simpset_simprocs = HOL_basic_ss addsimprocs [defALL_regroup, defEX_regroup]
   194 
   195 end;
   196 
   197 structure Splitter = Simpdata.Splitter;
   198 structure Clasimp = Simpdata.Clasimp;