src/Provers/simplifier.ML
changeset 6911 ef0f25d0bc2d
parent 6556 daa00919502b
child 6994 f22a51ed9f11
equal deleted inserted replaced
6910:7c3503ae3d78 6911:ef0f25d0bc2d
    85   val print_local_simpset: Proof.context -> unit
    85   val print_local_simpset: Proof.context -> unit
    86   val get_local_simpset: Proof.context -> simpset
    86   val get_local_simpset: Proof.context -> simpset
    87   val put_local_simpset: simpset -> Proof.context -> Proof.context
    87   val put_local_simpset: simpset -> Proof.context -> Proof.context
    88   val simp_add_global: theory attribute
    88   val simp_add_global: theory attribute
    89   val simp_del_global: theory attribute
    89   val simp_del_global: theory attribute
       
    90   val simp_only_global: theory attribute
    90   val simp_add_local: Proof.context attribute
    91   val simp_add_local: Proof.context attribute
    91   val simp_del_local: Proof.context attribute
    92   val simp_del_local: Proof.context attribute
       
    93   val simp_only_local: Proof.context attribute
    92   val simp_modifiers: (Args.T list -> (Proof.context attribute * Args.T list)) list
    94   val simp_modifiers: (Args.T list -> (Proof.context attribute * Args.T list)) list
    93   val setup: (theory -> theory) list
    95   val setup: (theory -> theory) list
    94 end;
    96 end;
    95 
    97 
    96 structure Simplifier: SIMPLIFIER =
    98 structure Simplifier: SIMPLIFIER =
   126 fun make_ss (mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac) =
   128 fun make_ss (mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac) =
   127   Simpset {mss = mss, subgoal_tac = subgoal_tac, loop_tacs = loop_tacs,
   129   Simpset {mss = mss, subgoal_tac = subgoal_tac, loop_tacs = loop_tacs,
   128     finish_tac = finish_tac, unsafe_finish_tac = unsafe_finish_tac};
   130     finish_tac = finish_tac, unsafe_finish_tac = unsafe_finish_tac};
   129 
   131 
   130 val empty_ss =
   132 val empty_ss =
   131   let val mss = Thm.set_mk_sym(Thm.empty_mss, Some o symmetric_fun)
   133   let val mss = Thm.set_mk_sym (Thm.empty_mss, Some o symmetric_fun)
   132   in make_ss (mss, K (K no_tac), [], K (K no_tac), K (K no_tac)) end;
   134   in make_ss (mss, K (K no_tac), [], K (K no_tac), K (K no_tac)) end;
   133 
   135 
   134 fun rep_ss (Simpset args) = args;
   136 fun rep_ss (Simpset args) = args;
   135 fun prems_of_ss (Simpset {mss, ...}) = Thm.prems_of_mss mss;
   137 fun prems_of_ss (Simpset {mss, ...}) = Thm.prems_of_mss mss;
   136 
   138 
   166     addloop tac = make_ss (mss, subgoal_tac, 
   168     addloop tac = make_ss (mss, subgoal_tac, 
   167         (case assoc_string (loop_tacs,(fst tac)) of None => () | Some x => 
   169         (case assoc_string (loop_tacs,(fst tac)) of None => () | Some x => 
   168          warning ("overwriting looper "^fst tac); overwrite(loop_tacs,tac)),
   170          warning ("overwriting looper "^fst tac); overwrite(loop_tacs,tac)),
   169            finish_tac, unsafe_finish_tac);
   171            finish_tac, unsafe_finish_tac);
   170 
   172 
   171 fun (ss as Simpset {mss,subgoal_tac,loop_tacs,finish_tac,unsafe_finish_tac})
   173 fun (ss as Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac}) delloop name =
   172     delloop name =
   174   let val (del, rest) = partition (fn (n, _) => n = name) loop_tacs in
   173   let val (del,rest) = partition (fn (n,_) => n=name) loop_tacs
   175     if null del then (warning ("No such looper in simpset: " ^ name); ss)
   174   in if null del then (warning ("No such looper in simpset: " ^ name); ss)
   176     else make_ss (mss, subgoal_tac, rest, finish_tac, unsafe_finish_tac)
   175      else make_ss (mss, subgoal_tac, rest, finish_tac, unsafe_finish_tac)
       
   176   end;
   177   end;
   177 
   178 
   178 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac = _, unsafe_finish_tac})
   179 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac = _, unsafe_finish_tac})
   179     setSSolver finish_tac =
   180     setSSolver finish_tac =
   180   make_ss (mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac);
   181   make_ss (mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac);
   213   make_ss (Thm.set_termless (mss, termless), subgoal_tac, loop_tacs,
   214   make_ss (Thm.set_termless (mss, termless), subgoal_tac, loop_tacs,
   214     finish_tac, unsafe_finish_tac);
   215     finish_tac, unsafe_finish_tac);
   215 
   216 
   216 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   217 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   217     addsimps rews =
   218     addsimps rews =
   218   make_ss (Thm.add_simps (mss, rews), subgoal_tac, loop_tacs,
   219   make_ss (Thm.add_simps (mss, rews), subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac);
   219            finish_tac, unsafe_finish_tac);
       
   220 
   220 
   221 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   221 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   222     delsimps rews =
   222     delsimps rews =
   223   make_ss (Thm.del_simps (mss, rews), subgoal_tac, loop_tacs,
   223   make_ss (Thm.del_simps (mss, rews), subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac);
   224            finish_tac, unsafe_finish_tac);
       
   225 
   224 
   226 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   225 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   227     addeqcongs newcongs =
   226     addeqcongs newcongs =
   228   make_ss (Thm.add_congs (mss, newcongs), subgoal_tac, loop_tacs,
   227   make_ss (Thm.add_congs (mss, newcongs), subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac);
   229     finish_tac, unsafe_finish_tac);
       
   230 
   228 
   231 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   229 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   232     deleqcongs oldcongs =
   230     deleqcongs oldcongs =
   233   make_ss (Thm.del_congs (mss, oldcongs), subgoal_tac, loop_tacs,
   231   make_ss (Thm.del_congs (mss, oldcongs), subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac);
   234     finish_tac, unsafe_finish_tac);
       
   235 
   232 
   236 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   233 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   237     addsimprocs simprocs =
   234     addsimprocs simprocs =
   238   make_ss
   235   make_ss
   239     (Thm.add_simprocs (mss, map rep_simproc simprocs),
   236     (Thm.add_simprocs (mss, map rep_simproc simprocs),
   242 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   239 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   243     delsimprocs simprocs =
   240     delsimprocs simprocs =
   244   make_ss
   241   make_ss
   245     (Thm.del_simprocs (mss, map rep_simproc simprocs),
   242     (Thm.del_simprocs (mss, map rep_simproc simprocs),
   246       subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac);
   243       subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac);
       
   244 
       
   245 fun onlysimps (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac}, rews) =
       
   246   make_ss (Thm.clear_mss mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac)
       
   247     addsimps rews;
   247 
   248 
   248 
   249 
   249 (* merge simpsets *)    (*NOTE: ignores tactics of 2nd simpset (except loopers)*)
   250 (* merge simpsets *)    (*NOTE: ignores tactics of 2nd simpset (except loopers)*)
   250 
   251 
   251 fun merge_ss
   252 fun merge_ss
   326   let val ss = f (get_local_simpset ctxt, [th])
   327   let val ss = f (get_local_simpset ctxt, [th])
   327   in (put_local_simpset ss ctxt, th) end;
   328   in (put_local_simpset ss ctxt, th) end;
   328 
   329 
   329 val simp_add_global = change_global_ss (op addsimps);
   330 val simp_add_global = change_global_ss (op addsimps);
   330 val simp_del_global = change_global_ss (op delsimps);
   331 val simp_del_global = change_global_ss (op delsimps);
       
   332 val simp_only_global = change_global_ss onlysimps;
   331 val simp_add_local = change_local_ss (op addsimps);
   333 val simp_add_local = change_local_ss (op addsimps);
   332 val simp_del_local = change_local_ss (op delsimps);
   334 val simp_del_local = change_local_ss (op delsimps);
       
   335 val simp_only_local = change_local_ss onlysimps;
   333 
   336 
   334 
   337 
   335 
   338 
   336 (** simplification tactics **)
   339 (** simplification tactics **)
   337 
   340 
   403 (** concrete syntax of attributes **)
   406 (** concrete syntax of attributes **)
   404 
   407 
   405 (* add / del *)
   408 (* add / del *)
   406 
   409 
   407 val simpN = "simp";
   410 val simpN = "simp";
       
   411 val asm_simpN = "asm_simp";
   408 val addN = "add";
   412 val addN = "add";
   409 val delN = "del";
   413 val delN = "del";
       
   414 val onlyN = "only";
   410 val otherN = "other";
   415 val otherN = "other";
   411 
   416 
   412 fun simp_att change =
   417 fun simp_att change =
   413   (Args.$$$ addN >> K (op addsimps) ||
   418   (Args.$$$ addN >> K (op addsimps) ||
   414     Args.$$$ delN >> K (op delsimps) ||
   419     Args.$$$ delN >> K (op delsimps) ||
       
   420     Args.$$$ onlyN >> K onlysimps ||
   415     Scan.succeed (op addsimps))
   421     Scan.succeed (op addsimps))
   416   >> change
   422   >> change
   417   |> Scan.lift
   423   |> Scan.lift
   418   |> Attrib.syntax;
   424   |> Attrib.syntax;
   419 
   425 
   443 (* simplification *)
   449 (* simplification *)
   444 
   450 
   445 val simp_modifiers =
   451 val simp_modifiers =
   446  [Args.$$$ simpN -- Args.$$$ addN >> K simp_add_local,
   452  [Args.$$$ simpN -- Args.$$$ addN >> K simp_add_local,
   447   Args.$$$ simpN -- Args.$$$ delN >> K simp_del_local,
   453   Args.$$$ simpN -- Args.$$$ delN >> K simp_del_local,
   448   Args.$$$ otherN >> K I];	(* FIXME ?? *)
   454   Args.$$$ simpN -- Args.$$$ onlyN >> K simp_only_local,
       
   455   Args.$$$ otherN >> K I];
   449 
   456 
   450 val simp_modifiers' =
   457 val simp_modifiers' =
   451  [Args.$$$ addN >> K simp_add_local,
   458  [Args.$$$ addN >> K simp_add_local,
   452   Args.$$$ delN >> K simp_del_local,
   459   Args.$$$ delN >> K simp_del_local,
       
   460   Args.$$$ onlyN >> K simp_only_local,
   453   Args.$$$ otherN >> K I];
   461   Args.$$$ otherN >> K I];
   454 
   462 
   455 val simp_args = Method.only_sectioned_args simp_modifiers';
   463 val simp_args = Method.only_sectioned_args simp_modifiers';
   456 
   464 
   457 fun simp_meth proper tac ctxt = Method.METHOD (fn facts =>
   465 fun simp_meth thin cut tac ctxt = Method.METHOD (fn facts =>
   458   FIRSTGOAL
   466   FIRSTGOAL
   459     ((if proper then REPEAT_DETERM o etac Drule.thin_rl THEN' metacuts_tac facts else K all_tac)
   467     ((if thin then REPEAT_DETERM o etac Drule.thin_rl else K all_tac)
       
   468       THEN' (if cut then metacuts_tac facts else K all_tac)
   460       THEN' tac (get_local_simpset ctxt)));
   469       THEN' tac (get_local_simpset ctxt)));
   461 
   470 
   462 val simp_method = simp_args oo simp_meth;
   471 val simp_method = simp_args ooo simp_meth;
   463 
   472 
   464 
   473 
   465 (* setup_methods *)
   474 (* setup_methods *)
   466 
   475 
   467 val setup_methods = Method.add_methods
   476 val setup_methods = Method.add_methods
   468  [(simpN,               simp_method true asm_full_simp_tac, "simplification"),
   477  [(simpN,               simp_method true true asm_full_simp_tac, "simplification"),
   469   ("simp_tac",          simp_method false simp_tac, "simp_tac"),
   478   (asm_simpN,           simp_method false true asm_full_simp_tac,
   470   ("asm_simp_tac",      simp_method false asm_simp_tac, "asm_simp_tac"),
   479     "simplification (including assumption)"),
   471   ("full_simp_tac",     simp_method false full_simp_tac, "full_simp_tac"),
   480   ("simp_tac",          simp_method false false simp_tac, "simp_tac"),
   472   ("asm_full_simp_tac", simp_method false asm_full_simp_tac, "asm_full_simp_tac"),
   481   ("asm_simp_tac",      simp_method false false asm_simp_tac, "asm_simp_tac"),
   473   ("asm_lr_simp_tac",   simp_method false asm_lr_simp_tac, "asm_lr_simp_tac")];
   482   ("full_simp_tac",     simp_method false false full_simp_tac, "full_simp_tac"),
       
   483   ("asm_full_simp_tac", simp_method false false asm_full_simp_tac, "asm_full_simp_tac"),
       
   484   ("asm_lr_simp_tac",   simp_method false false asm_lr_simp_tac, "asm_lr_simp_tac")];
   474 
   485 
   475 
   486 
   476 
   487 
   477 (** theory setup **)
   488 (** theory setup **)
   478 
   489