266 \subsection{*The solver}\label{sec:simp-solver} |
266 \subsection{*The solver}\label{sec:simp-solver} |
267 The solver is a tactic that attempts to solve a subgoal after |
267 The solver is a tactic that attempts to solve a subgoal after |
268 simplification. Typically it just proves trivial subgoals such as {\tt |
268 simplification. Typically it just proves trivial subgoals such as {\tt |
269 True} and $t=t$. It could use sophisticated means such as {\tt |
269 True} and $t=t$. It could use sophisticated means such as {\tt |
270 fast_tac}, though that could make simplification expensive. The solver |
270 fast_tac}, though that could make simplification expensive. The solver |
271 is set using \ttindex{setsolver}. |
271 is set using \ttindex{setsolver}. Additional solvers, which are tried after |
|
272 the already set solver, may be added with \ttindex{addsolver}. |
272 |
273 |
273 Rewriting does not instantiate unknowns. For example, rewriting cannot |
274 Rewriting does not instantiate unknowns. For example, rewriting cannot |
274 prove $a\in \Var{A}$ since this requires instantiating~$\Var{A}$. The |
275 prove $a\in \Var{A}$ since this requires instantiating~$\Var{A}$. The |
275 solver, however, is an arbitrary tactic and may instantiate unknowns as it |
276 solver, however, is an arbitrary tactic and may instantiate unknowns as it |
276 pleases. This is the only way the simplifier can handle a conditional |
277 pleases. This is the only way the simplifier can handle a conditional |
310 simplification process is started all over again. Each of the subgoals |
311 simplification process is started all over again. Each of the subgoals |
311 generated by the looper is attacked in turn, in reverse order. A |
312 generated by the looper is attacked in turn, in reverse order. A |
312 typical looper is case splitting: the expansion of a conditional. Another |
313 typical looper is case splitting: the expansion of a conditional. Another |
313 possibility is to apply an elimination rule on the assumptions. More |
314 possibility is to apply an elimination rule on the assumptions. More |
314 adventurous loopers could start an induction. The looper is set with |
315 adventurous loopers could start an induction. The looper is set with |
315 \ttindex{setloop}. |
316 \ttindex{setloop}. Additional loopers, which are tried after the already set |
|
317 looper, may be added with \ttindex{addloop}. |
316 |
318 |
317 |
319 |
318 \begin{figure} |
320 \begin{figure} |
319 \index{*simpset ML type} |
321 \index{*simpset ML type} |
|
322 \index{*empty_ss} |
|
323 \index{*rep_ss} |
|
324 \index{*prems_of_ss} |
|
325 \index{*setloop} |
|
326 \index{*addloop} |
|
327 \index{*setsolver} |
|
328 \index{*addsolver} |
|
329 \index{*setsubgoaler} |
|
330 \index{*setmksimps} |
|
331 \index{*addsimps} |
|
332 \index{*delsimps} |
|
333 \index{*addeqcongs} |
|
334 \index{*merge_ss} |
|
335 \index{*simpset} |
|
336 \index{*Addsimps} |
|
337 \index{*Delsimps} |
320 \index{*simp_tac} |
338 \index{*simp_tac} |
321 \index{*asm_simp_tac} |
339 \index{*asm_simp_tac} |
|
340 \index{*full_simp_tac} |
322 \index{*asm_full_simp_tac} |
341 \index{*asm_full_simp_tac} |
323 \index{*addeqcongs} |
342 \index{*Simp_tac} |
324 \index{*addsimps} |
343 \index{*Asm_simp_tac} |
325 \index{*delsimps} |
344 \index{*Full_simp_tac} |
326 \index{*empty_ss} |
345 \index{*Asm_full_simp_tac} |
327 \index{*merge_ss} |
346 |
328 \index{*setsubgoaler} |
347 \begin{ttbox} |
329 \index{*setsolver} |
348 infix 4 setloop addloop setsolver addsolver |
330 \index{*setloop} |
349 setsubgoaler setmksimps |
331 \index{*setmksimps} |
350 addsimps addeqcongs delsimps; |
332 \index{*prems_of_ss} |
|
333 \index{*rep_ss} |
|
334 \begin{ttbox} |
|
335 infix addsimps addeqcongs delsimps |
|
336 setsubgoaler setsolver setloop setmksimps; |
|
337 |
351 |
338 signature SIMPLIFIER = |
352 signature SIMPLIFIER = |
339 sig |
353 sig |
340 type simpset |
354 type simpset |
341 val simp_tac: simpset -> int -> tactic |
355 val empty_ss: simpset |
342 val asm_simp_tac: simpset -> int -> tactic |
356 val rep_ss: simpset -> {simps: thm list, congs: thm list} |
343 val full_simp_tac: simpset -> int -> tactic |
357 val prems_of_ss: simpset -> thm list |
344 val asm_full_simp_tac: simpset -> int -> tactic\smallskip |
358 val setloop: simpset * (int -> tactic) -> simpset |
345 val addeqcongs: simpset * thm list -> simpset |
359 val addloop: simpset * (int -> tactic) -> simpset |
346 val addsimps: simpset * thm list -> simpset |
360 val setsolver: simpset * (thm list -> int -> tactic) -> simpset |
347 val delsimps: simpset * thm list -> simpset |
361 val addsolver: simpset * (thm list -> int -> tactic) -> simpset |
348 val empty_ss: simpset |
|
349 val merge_ss: simpset * simpset -> simpset |
|
350 val setsubgoaler: simpset * (simpset -> int -> tactic) -> simpset |
362 val setsubgoaler: simpset * (simpset -> int -> tactic) -> simpset |
351 val setsolver: simpset * (thm list -> int -> tactic) -> simpset |
363 val setmksimps: simpset * (thm -> thm list) -> simpset |
352 val setloop: simpset * (int -> tactic) -> simpset |
364 val addsimps: simpset * thm list -> simpset |
353 val setmksimps: simpset * (thm -> thm list) -> simpset |
365 val delsimps: simpset * thm list -> simpset |
354 val prems_of_ss: simpset -> thm list |
366 val addeqcongs: simpset * thm list -> simpset |
355 val rep_ss: simpset -> \{simps: thm list, congs: thm list\} |
367 val merge_ss: simpset * simpset -> simpset |
|
368 val simpset: simpset ref |
|
369 val Addsimps: thm list -> unit |
|
370 val Delsimps: thm list -> unit |
|
371 val simp_tac: simpset -> int -> tactic |
|
372 val asm_simp_tac: simpset -> int -> tactic |
|
373 val full_simp_tac: simpset -> int -> tactic |
|
374 val asm_full_simp_tac: simpset -> int -> tactic |
|
375 val Simp_tac: int -> tactic |
|
376 val Asm_simp_tac: int -> tactic |
|
377 val Full_simp_tac: int -> tactic |
|
378 val Asm_full_simp_tac: int -> tactic |
356 end; |
379 end; |
357 \end{ttbox} |
380 \end{ttbox} |
358 \caption{The simplifier primitives} \label{SIMPLIFIER} |
381 \caption{The simplifier primitives} \label{SIMPLIFIER} |
359 \end{figure} |
382 \end{figure} |
360 |
383 |