doc-src/Ref/simplifier.tex
changeset 2567 7a28e02e10b7
parent 2479 57109c1a653d
child 2613 cc4eb23d37b3
equal deleted inserted replaced
2566:cbf02fc74332 2567:7a28e02e10b7
   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