src/Provers/simplifier.ML
changeset 4668 131989b78417
parent 4612 26764de50c74
child 4677 c4b07b8579fd
equal deleted inserted replaced
4667:6328d427a339 4668:131989b78417
    20   type simpset
    20   type simpset
    21   val empty_ss: simpset
    21   val empty_ss: simpset
    22   val rep_ss: simpset ->
    22   val rep_ss: simpset ->
    23    {mss: meta_simpset,
    23    {mss: meta_simpset,
    24     subgoal_tac:        simpset -> int -> tactic,
    24     subgoal_tac:        simpset -> int -> tactic,
    25     loop_tac:                      int -> tactic,
    25     loop_tacs:          (string * (int -> tactic))list,
    26            finish_tac: thm list -> int -> tactic,
    26            finish_tac: thm list -> int -> tactic,
    27     unsafe_finish_tac: thm list -> int -> tactic};
    27     unsafe_finish_tac: thm list -> int -> tactic};
    28   val print_ss: simpset -> unit
    28   val print_ss: simpset -> unit
    29   val print_simpset: theory -> unit
    29   val print_simpset: theory -> unit
    30   val setsubgoaler: simpset *  (simpset -> int -> tactic) -> simpset
    30   val setsubgoaler: simpset *  (simpset -> int -> tactic) -> simpset
    31   val setloop:      simpset *             (int -> tactic) -> simpset
    31   val setloop:      simpset *             (int -> tactic) -> simpset
    32   val addloop:      simpset *             (int -> tactic) -> simpset
    32   val addloop:      simpset *  (string * (int -> tactic)) -> simpset
    33   val setSSolver:   simpset * (thm list -> int -> tactic) -> simpset
    33   val setSSolver:   simpset * (thm list -> int -> tactic) -> simpset
    34   val addSSolver:   simpset * (thm list -> int -> tactic) -> simpset
    34   val addSSolver:   simpset * (thm list -> int -> tactic) -> simpset
    35   val setSolver:    simpset * (thm list -> int -> tactic) -> simpset
    35   val setSolver:    simpset * (thm list -> int -> tactic) -> simpset
    36   val addSolver:    simpset * (thm list -> int -> tactic) -> simpset
    36   val addSolver:    simpset * (thm list -> int -> tactic) -> simpset
    37   val setmksimps:   simpset * (thm -> thm list) -> simpset
    37   val setmksimps:   simpset * (thm -> thm list) -> simpset
   100 
   100 
   101 datatype simpset =
   101 datatype simpset =
   102   Simpset of {
   102   Simpset of {
   103     mss: meta_simpset,
   103     mss: meta_simpset,
   104     subgoal_tac:        simpset -> int -> tactic,
   104     subgoal_tac:        simpset -> int -> tactic,
   105     loop_tac:                      int -> tactic,
   105     loop_tacs:          (string * (int -> tactic))list,
   106            finish_tac: thm list -> int -> tactic,
   106            finish_tac: thm list -> int -> tactic,
   107     unsafe_finish_tac: thm list -> int -> tactic};
   107     unsafe_finish_tac: thm list -> int -> tactic};
   108 
   108 
   109 fun make_ss (mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac) =
   109 fun make_ss (mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac) =
   110   Simpset {mss = mss, subgoal_tac = subgoal_tac, loop_tac = loop_tac,
   110   Simpset {mss = mss, subgoal_tac = subgoal_tac, loop_tacs = loop_tacs,
   111     finish_tac = finish_tac, unsafe_finish_tac = unsafe_finish_tac};
   111     finish_tac = finish_tac, unsafe_finish_tac = unsafe_finish_tac};
   112 
   112 
   113 val empty_ss =
   113 val empty_ss =
   114   make_ss (Thm.empty_mss, K (K no_tac), K no_tac, K (K no_tac), K (K no_tac));
   114   make_ss (Thm.empty_mss, K (K no_tac), [], K (K no_tac), K (K no_tac));
   115 
   115 
   116 fun rep_ss (Simpset args) = args;
   116 fun rep_ss (Simpset args) = args;
   117 fun prems_of_ss (Simpset {mss, ...}) = Thm.prems_of_mss mss;
   117 fun prems_of_ss (Simpset {mss, ...}) = Thm.prems_of_mss mss;
   118 
   118 
   119 
   119 
   134   end;
   134   end;
   135 
   135 
   136 
   136 
   137 (* extend simpsets *)
   137 (* extend simpsets *)
   138 
   138 
   139 fun (Simpset {mss, subgoal_tac = _, loop_tac, finish_tac, unsafe_finish_tac})
   139 fun (Simpset {mss, subgoal_tac = _, loop_tacs, finish_tac, unsafe_finish_tac})
   140     setsubgoaler subgoal_tac =
   140     setsubgoaler subgoal_tac =
   141   make_ss (mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac);
   141   make_ss (mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac);
   142 
   142 
   143 fun (Simpset {mss, subgoal_tac, loop_tac = _, finish_tac, unsafe_finish_tac})
   143 fun (Simpset {mss, subgoal_tac, loop_tacs = _, finish_tac, unsafe_finish_tac})
   144     setloop loop_tac =
   144     setloop tac =
   145   make_ss (mss, subgoal_tac, DETERM o loop_tac, finish_tac, unsafe_finish_tac);
   145   make_ss (mss, subgoal_tac, [("",tac)], finish_tac, unsafe_finish_tac);
   146 
   146 
   147 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac})
   147 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   148     addloop tac =
   148     addloop atac =
   149   make_ss (mss, subgoal_tac, loop_tac ORELSE' (DETERM o tac), finish_tac, unsafe_finish_tac);
   149   make_ss (mss, subgoal_tac, overwrite(loop_tacs,atac),
   150 
   150            finish_tac, unsafe_finish_tac);
   151 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac = _, unsafe_finish_tac})
   151 
       
   152 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac = _, unsafe_finish_tac})
   152     setSSolver finish_tac =
   153     setSSolver finish_tac =
   153   make_ss (mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac);
   154   make_ss (mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac);
   154 
   155 
   155 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac})
   156 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   156     addSSolver tac =
   157     addSSolver tac =
   157   make_ss (mss, subgoal_tac, loop_tac, fn hyps => finish_tac hyps ORELSE' tac hyps,
   158   make_ss (mss, subgoal_tac, loop_tacs, fn hyps => finish_tac hyps ORELSE' tac hyps,
   158     unsafe_finish_tac);
   159     unsafe_finish_tac);
   159 
   160 
   160 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac = _})
   161 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac = _})
   161     setSolver unsafe_finish_tac =
   162     setSolver unsafe_finish_tac =
   162   make_ss (mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac);
   163   make_ss (mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac);
   163 
   164 
   164 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac})
   165 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   165     addSolver tac =
   166     addSolver tac =
   166   make_ss (mss, subgoal_tac, loop_tac, finish_tac,
   167   make_ss (mss, subgoal_tac, loop_tacs, finish_tac,
   167     fn hyps => unsafe_finish_tac hyps ORELSE' tac hyps);
   168     fn hyps => unsafe_finish_tac hyps ORELSE' tac hyps);
   168 
   169 
   169 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac})
   170 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   170     setmksimps mk_simps =
   171     setmksimps mk_simps =
   171   make_ss (Thm.set_mk_rews (mss, map (Thm.strip_shyps o Drule.zero_var_indexes) o mk_simps),
   172   make_ss (Thm.set_mk_rews (mss, map (Thm.strip_shyps o Drule.zero_var_indexes) o mk_simps),
   172     subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac);
   173     subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac);
   173 
   174 
   174 fun (Simpset {mss, subgoal_tac, loop_tac,  finish_tac, unsafe_finish_tac})
   175 fun (Simpset {mss, subgoal_tac, loop_tacs,  finish_tac, unsafe_finish_tac})
   175     settermless termless =
   176     settermless termless =
   176   make_ss (Thm.set_termless (mss, termless), subgoal_tac, loop_tac,
   177   make_ss (Thm.set_termless (mss, termless), subgoal_tac, loop_tacs,
   177     finish_tac, unsafe_finish_tac);
   178     finish_tac, unsafe_finish_tac);
   178 
   179 
   179 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac})
   180 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   180     addsimps rews =
   181     addsimps rews =
   181   let val rews' = flat (map (Thm.mk_rews_of_mss mss) rews) in
   182   make_ss (Thm.add_simps (mss, rews), subgoal_tac, loop_tacs,
   182     make_ss (Thm.add_simps (mss, rews'), subgoal_tac, loop_tac,
   183            finish_tac, unsafe_finish_tac);
   183       finish_tac, unsafe_finish_tac)
   184 
   184   end;
   185 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   185 
       
   186 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac})
       
   187     delsimps rews =
   186     delsimps rews =
   188   let val rews' = flat (map (Thm.mk_rews_of_mss mss) rews) in
   187   make_ss (Thm.del_simps (mss, rews), subgoal_tac, loop_tacs,
   189     make_ss (Thm.del_simps (mss, rews'), subgoal_tac, loop_tac,
   188            finish_tac, unsafe_finish_tac);
   190       finish_tac, unsafe_finish_tac)
   189 
   191   end;
   190 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   192 
       
   193 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac})
       
   194     addeqcongs newcongs =
   191     addeqcongs newcongs =
   195   make_ss (Thm.add_congs (mss, newcongs), subgoal_tac, loop_tac,
   192   make_ss (Thm.add_congs (mss, newcongs), subgoal_tac, loop_tacs,
   196     finish_tac, unsafe_finish_tac);
   193     finish_tac, unsafe_finish_tac);
   197 
   194 
   198 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac})
   195 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   199     deleqcongs oldcongs =
   196     deleqcongs oldcongs =
   200   make_ss (Thm.del_congs (mss, oldcongs), subgoal_tac, loop_tac,
   197   make_ss (Thm.del_congs (mss, oldcongs), subgoal_tac, loop_tacs,
   201     finish_tac, unsafe_finish_tac);
   198     finish_tac, unsafe_finish_tac);
   202 
   199 
   203 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac})
   200 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   204     addsimprocs simprocs =
   201     addsimprocs simprocs =
   205   make_ss
   202   make_ss
   206     (Thm.add_simprocs (mss, map rep_simproc simprocs),
   203     (Thm.add_simprocs (mss, map rep_simproc simprocs),
   207       subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac);
   204       subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac);
   208 
   205 
   209 fun (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac})
   206 fun (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac})
   210     delsimprocs simprocs =
   207     delsimprocs simprocs =
   211   make_ss
   208   make_ss
   212     (Thm.del_simprocs (mss, map rep_simproc simprocs),
   209     (Thm.del_simprocs (mss, map rep_simproc simprocs),
   213       subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac);
   210       subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac);
   214 
   211 
   215 
   212 
   216 (* merge simpsets *)	(*NOTE: ignores tactics of 2nd simpset*)
   213 (* merge simpsets *)	(*NOTE: ignores tactics of 2nd simpset*)
   217 
   214 
   218 fun merge_ss
   215 fun merge_ss
   219    (Simpset {mss = mss1, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac},
   216    (Simpset {mss = mss1, loop_tacs = loop_tacs1,
   220     Simpset {mss = mss2, ...}) =
   217              subgoal_tac, finish_tac, unsafe_finish_tac},
   221   make_ss (Thm.merge_mss (mss1, mss2),
   218     Simpset {mss = mss2, loop_tacs = loop_tacs2, ...}) =
   222     subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac);
   219   make_ss (Thm.merge_mss (mss1, mss2), subgoal_tac,
       
   220            foldl overwrite (loop_tacs1,loop_tacs2),
       
   221            finish_tac, unsafe_finish_tac);
   223 
   222 
   224 
   223 
   225 
   224 
   226 (** simpset theory data **)
   225 (** simpset theory data **)
   227 
   226 
   276 
   275 
   277 
   276 
   278 
   277 
   279 (** simplification tactics **)
   278 (** simplification tactics **)
   280 
   279 
   281 fun solve_all_tac (subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac) mss =
   280 fun solve_all_tac (subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac) mss =
   282   let
   281   let
   283     val ss =
   282     val ss =
   284       make_ss (mss, subgoal_tac, loop_tac, unsafe_finish_tac, unsafe_finish_tac);
   283       make_ss (mss, subgoal_tac, loop_tacs, unsafe_finish_tac, unsafe_finish_tac);
   285     val solve1_tac = (subgoal_tac ss THEN_ALL_NEW (K no_tac)) 1
   284     val solve1_tac = (subgoal_tac ss THEN_ALL_NEW (K no_tac)) 1
   286   in DEPTH_SOLVE solve1_tac end;
   285   in DEPTH_SOLVE solve1_tac end;
   287 
   286 
       
   287 fun loop_tac loop_tacs = FIRST'(map snd loop_tacs);
   288 
   288 
   289 (*not totally safe: may instantiate unknowns that appear also in other subgoals*)
   289 (*not totally safe: may instantiate unknowns that appear also in other subgoals*)
   290 fun basic_gen_simp_tac mode =
   290 fun basic_gen_simp_tac mode =
   291   fn (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac}) =>
   291   fn (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac}) =>
   292     let
   292     let
   293       fun simp_loop_tac i =
   293       fun simp_loop_tac i =
   294         asm_rewrite_goal_tac mode
   294         asm_rewrite_goal_tac mode
   295           (solve_all_tac (subgoal_tac,loop_tac,finish_tac,unsafe_finish_tac))
   295           (solve_all_tac (subgoal_tac,loop_tacs,finish_tac,unsafe_finish_tac))
   296           mss i
   296           mss i
   297         THEN (finish_tac (prems_of_mss mss) i ORELSE
   297         THEN (finish_tac (prems_of_mss mss) i ORELSE
   298               TRY ((loop_tac THEN_ALL_NEW simp_loop_tac) i))
   298               TRY ((loop_tac loop_tacs THEN_ALL_NEW simp_loop_tac) i))
   299     in simp_loop_tac end;
   299     in simp_loop_tac end;
   300 
   300 
   301 fun gen_simp_tac mode (ss as Simpset {unsafe_finish_tac, ...}) =
   301 fun gen_simp_tac mode (ss as Simpset {unsafe_finish_tac, ...}) =
   302   basic_gen_simp_tac mode (ss setSSolver unsafe_finish_tac);
   302   basic_gen_simp_tac mode (ss setSSolver unsafe_finish_tac);
   303 
   303 
   319 
   319 
   320 
   320 
   321 
   321 
   322 (** simplification meta rules **)
   322 (** simplification meta rules **)
   323 
   323 
   324 fun simp mode (Simpset {mss, subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac}) thm =
   324 fun simp mode (Simpset {mss, subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac}) thm =
   325   let
   325   let
   326     val tacf = solve_all_tac (subgoal_tac, loop_tac, finish_tac, unsafe_finish_tac);
   326     val tacf = solve_all_tac (subgoal_tac, loop_tacs, finish_tac, unsafe_finish_tac);
   327     fun prover m th = apsome fst (Seq.pull (tacf m th));
   327     fun prover m th = apsome fst (Seq.pull (tacf m th));
   328   in
   328   in
   329     Drule.rewrite_thm mode prover mss thm
   329     Drule.rewrite_thm mode prover mss thm
   330   end;
   330   end;
   331 
   331