diff -r e447ad4d6edd -r 959548c3b947 src/Doc/IsarRef/Generic.thy --- a/src/Doc/IsarRef/Generic.thy Sun Nov 04 20:23:26 2012 +0100 +++ b/src/Doc/IsarRef/Generic.thy Wed Nov 07 12:14:38 2012 +0100 @@ -1362,13 +1362,13 @@ subsection {* Single-step tactics *} text {* - \begin{matharray}{rcl} + \begin{mldecls} @{index_ML safe_step_tac: "Proof.context -> int -> tactic"} \\ @{index_ML inst_step_tac: "Proof.context -> int -> tactic"} \\ @{index_ML step_tac: "Proof.context -> int -> tactic"} \\ @{index_ML slow_step_tac: "Proof.context -> int -> tactic"} \\ @{index_ML clarify_step_tac: "Proof.context -> int -> tactic"} \\ - \end{matharray} + \end{mldecls} These are the primitive tactics behind the automated proof methods of the Classical Reasoner. By calling them yourself, you can @@ -1405,6 +1405,94 @@ *} +subsection {* Modifying the search step *} + +text {* + \begin{mldecls} + @{index_ML_type wrapper: "(int -> tactic) -> (int -> tactic)"} \\[0.5ex] + @{index_ML_op addSWrapper: "claset * (string * (Proof.context -> wrapper)) + -> claset"} \\ + @{index_ML_op addSbefore: "claset * (string * (int -> tactic)) -> claset"} \\ + @{index_ML_op addSafter: "claset * (string * (int -> tactic)) -> claset"} \\ + @{index_ML_op delSWrapper: "claset * string -> claset"} \\[0.5ex] + @{index_ML_op addWrapper: "claset * (string * (Proof.context -> wrapper)) + -> claset"} \\ + @{index_ML_op addbefore: "claset * (string * (int -> tactic)) -> claset"} \\ + @{index_ML_op addafter: "claset * (string * (int -> tactic)) -> claset"} \\ + @{index_ML_op delWrapper: "claset * string -> claset"} \\[0.5ex] + @{index_ML addSss: "Proof.context -> Proof.context"} \\ + @{index_ML addss: "Proof.context -> Proof.context"} \\ + \end{mldecls} + + The proof strategy of the Classical Reasoner is simple. Perform as + many safe inferences as possible; or else, apply certain safe rules, + allowing instantiation of unknowns; or else, apply an unsafe rule. + The tactics also eliminate assumptions of the form @{text "x = t"} + by substitution if they have been set up to do so. They may perform + a form of Modus Ponens: if there are assumptions @{text "P \ Q"} and + @{text "P"}, then replace @{text "P \ Q"} by @{text "Q"}. + + The classical reasoning tools --- except @{method blast} --- allow + to modify this basic proof strategy by applying two lists of + arbitrary \emph{wrapper tacticals} to it. The first wrapper list, + which is considered to contain safe wrappers only, affects @{ML + safe_step_tac} and all the tactics that call it. The second one, + which may contain unsafe wrappers, affects the unsafe parts of @{ML + step_tac}, @{ML slow_step_tac}, and the tactics that call them. A + wrapper transforms each step of the search, for example by + attempting other tactics before or after the original step tactic. + All members of a wrapper list are applied in turn to the respective + step tactic. + + Initially the two wrapper lists are empty, which means no + modification of the step tactics. Safe and unsafe wrappers are added + to a claset with the functions given below, supplying them with + wrapper names. These names may be used to selectively delete + wrappers. + + \begin{description} + + \item @{text "cs addSWrapper (name, wrapper)"} adds a new wrapper, + which should yield a safe tactic, to modify the existing safe step + tactic. + + \item @{text "cs addSbefore (name, tac)"} adds the given tactic as a + safe wrapper, such that it is tried \emph{before} each safe step of + the search. + + \item @{text "cs addSafter (name, tac)"} adds the given tactic as a + safe wrapper, such that it is tried when a safe step of the search + would fail. + + \item @{text "cs delSWrapper name"} deletes the safe wrapper with + the given name. + + \item @{text "cs addWrapper (name, wrapper)"} adds a new wrapper to + modify the existing (unsafe) step tactic. + + \item @{text "cs addbefore (name, tac)"} adds the given tactic as an + unsafe wrapper, such that it its result is concatenated + \emph{before} the result of each unsafe step. + + \item @{text "cs addafter (name, tac)"} adds the given tactic as an + unsafe wrapper, such that it its result is concatenated \emph{after} + the result of each unsafe step. + + \item @{text "cs delWrapper name"} deletes the unsafe wrapper with + the given name. + + \item @{text "addSss"} adds the simpset of the context to its + classical set. The assumptions and goal will be simplified, in a + rather safe way, after each safe step of the search. + + \item @{text "addss"} adds the simpset of the context to its + classical set. The assumptions and goal will be simplified, before + the each unsafe step of the search. + + \end{description} +*} + + section {* Object-logic setup \label{sec:object-logic} *} text {*