src/Provers/clasimp.ML
changeset 4652 d24cca140eeb
child 4659 a78ecc7341e3
equal deleted inserted replaced
4651:70dd492a1698 4652:d24cca140eeb
       
     1 (*  Title: 	Provers/clasimp.ML
       
     2     ID:         $Id$
       
     3     Author:     David von Oheimb, TU Muenchen
       
     4 
       
     5 Combination of classical reasoner and simplifier
       
     6 to be used after installing both of them
       
     7 *)
       
     8 
       
     9 infix 4 addSIs2 addSEs2 addSDs2 addIs2 addEs2 addDs2
       
    10 	addsimps2 delsimps2 addcongs2 delcongs2;
       
    11 infix 4 addSss addss;
       
    12 
       
    13 type clasimpset = claset * simpset;
       
    14 
       
    15 signature CLASIMP =
       
    16 sig
       
    17   val addSIs2	: clasimpset * thm list -> clasimpset
       
    18   val addSEs2	: clasimpset * thm list -> clasimpset
       
    19   val addSDs2	: clasimpset * thm list -> clasimpset
       
    20   val addIs2	: clasimpset * thm list -> clasimpset
       
    21   val addEs2	: clasimpset * thm list -> clasimpset
       
    22   val addDs2	: clasimpset * thm list -> clasimpset
       
    23   val addsimps2	: clasimpset * thm list -> clasimpset
       
    24   val delsimps2	: clasimpset * thm list -> clasimpset
       
    25   val addSss	: claset * simpset -> claset
       
    26   val addss	: claset * simpset -> claset
       
    27   val mk_auto_tac:clasimpset -> int -> int -> tactic
       
    28   val auto_tac	: clasimpset -> tactic
       
    29   val Auto_tac	: tactic
       
    30   val auto	: unit -> unit
       
    31 end;
       
    32 
       
    33 structure Clasimp: CLASIMP =
       
    34 struct
       
    35 
       
    36 local 
       
    37   fun pair_upd1 f ((a,b),x) = (f(a,x), b);
       
    38   fun pair_upd2 f ((a,b),x) = (a, f(b,x));
       
    39 in
       
    40   fun op addSIs2   arg = pair_upd1 (op addSIs) arg;
       
    41   fun op addSEs2   arg = pair_upd1 (op addSEs) arg;
       
    42   fun op addSDs2   arg = pair_upd1 (op addSDs) arg;
       
    43   fun op addIs2    arg = pair_upd1 (op addIs ) arg;
       
    44   fun op addEs2    arg = pair_upd1 (op addEs ) arg;
       
    45   fun op addDs2    arg = pair_upd1 (op addDs ) arg;
       
    46   fun op addsimps2 arg = pair_upd2 (op addsimps) arg;
       
    47   fun op delsimps2 arg = pair_upd2 (op delsimps) arg;
       
    48   fun op addcongs2 arg = pair_upd2 (op addcongs) arg;
       
    49   fun op delcongs2 arg = pair_upd2 (op delcongs) arg;
       
    50 end;
       
    51 
       
    52 (*an unsatisfactory fix for the incomplete safe_asm_full_simp_tac!
       
    53   better: asm_really_full_simp_tac, a yet to be implemented version of
       
    54 			asm_full_simp_tac that applies all equalities in the
       
    55 			premises to all the premises *)
       
    56 fun safe_asm_more_full_simp_tac ss = TRY o rot_eq_tac THEN' 
       
    57 				     safe_asm_full_simp_tac ss;
       
    58 
       
    59 (*Add a simpset to a classical set!*)
       
    60 (*Caution: only one simpset added can be added by each of addSss and addss*)
       
    61 fun cs addSss ss = cs addSaltern ("safe_asm_more_full_simp_tac",
       
    62 			CHANGED o (safe_asm_more_full_simp_tac ss));
       
    63 fun cs addss  ss = cs addbefore  (     "asm_full_simp_tac",
       
    64 					asm_full_simp_tac ss);
       
    65 
       
    66 
       
    67 local
       
    68 
       
    69 	fun blast_depth_tac cs m i thm = Blast.depth_tac cs m i thm 
       
    70 		handle Blast.TRANS s => (warning ("Blast_tac: " ^ s); Seq.empty);
       
    71 
       
    72 	(* a variant of depth_tac that avoids interference of the simplifier 
       
    73 	   with dup_step_tac when they are combined by auto_tac *)
       
    74 	fun nodup_depth_tac cs m i state = 
       
    75 	  SELECT_GOAL 
       
    76 	   (appWrappers cs
       
    77 	    (fn i => REPEAT_DETERM1 (COND (has_fewer_prems i) no_tac
       
    78 	                             (safe_step_tac cs i)) THEN_ELSE
       
    79 	     (DEPTH_SOLVE (nodup_depth_tac cs m i),
       
    80 	      inst0_step_tac cs i  APPEND
       
    81 	      COND (K(m=0)) no_tac
       
    82 	        ((instp_step_tac cs i APPEND step_tac cs i)
       
    83 	         THEN DEPTH_SOLVE (nodup_depth_tac cs (m-1) i)))) 1)
       
    84 	  i state;
       
    85 
       
    86 in
       
    87 
       
    88 (*Designed to be idempotent, except if best_tac instantiates variables
       
    89   in some of the subgoals*)
       
    90 fun mk_auto_tac (cs, ss) m n =
       
    91     let val cs' = cs addss ss 
       
    92         val maintac = 
       
    93           blast_depth_tac cs m		(*fast but can't use addss*)
       
    94           ORELSE'
       
    95           nodup_depth_tac cs' n;	(*slower but more general*)
       
    96     in  EVERY [ALLGOALS (asm_full_simp_tac ss),
       
    97 	       TRY (safe_tac cs'),
       
    98 	       REPEAT (FIRSTGOAL maintac),
       
    99                TRY (safe_tac (cs addSss ss)),
       
   100 	       prune_params_tac] 
       
   101     end;
       
   102 end;
       
   103 
       
   104 fun auto_tac (cs,ss) = mk_auto_tac (cs,ss) 4 2;
       
   105 
       
   106 fun Auto_tac st = auto_tac (claset(), simpset()) st;
       
   107 
       
   108 fun auto () = by Auto_tac;
       
   109 
       
   110 end;