| 18537 |      1 | 
 | 
|  |      2 | (* $Id$ *)
 | 
|  |      3 | 
 | 
|  |      4 | theory tactic imports base begin
 | 
|  |      5 | 
 | 
|  |      6 | chapter {* Tactical theorem proving *}
 | 
|  |      7 | 
 | 
|  |      8 | text {* The basic idea of tactical theorem proving is to refine the
 | 
|  |      9 | initial claim in a backwards fashion, until a solved form is reached.
 | 
|  |     10 | An intermediate goal consists of several subgoals that need to be
 | 
|  |     11 | solved in order to achieve the main statement; zero subgoals means
 | 
|  |     12 | that the proof may be finished.  Goal refinement operations are called
 | 
|  |     13 | tactics; combinators for composing tactics are called tacticals.  *}
 | 
|  |     14 | 
 | 
|  |     15 | 
 | 
|  |     16 | section {* Goals \label{sec:tactical-goals} *}
 | 
|  |     17 | 
 | 
|  |     18 | text {* Isabelle/Pure represents a goal\glossary{Tactical goal}{A
 | 
|  |     19 | theorem of \seeglossary{Horn Clause} form stating that a number of
 | 
|  |     20 | subgoals imply the main conclusion, which is marked as a protected
 | 
|  |     21 | proposition.} as a theorem stating that the subgoals imply the main
 | 
|  |     22 | goal: @{text "A\<^sub>1 \<Longrightarrow> \<dots> \<Longrightarrow> A\<^sub>n \<Longrightarrow> C"}.  The outermost goal
 | 
|  |     23 | structure is that of a Horn Clause\glossary{Horn Clause}{An iterated
 | 
|  |     24 | implication @{text "A\<^sub>1 \<Longrightarrow> \<dots> \<Longrightarrow> A\<^sub>n \<Longrightarrow> C"}, without any
 | 
|  |     25 | outermost quantifiers.  Strictly speaking, propositions @{text
 | 
|  |     26 | "A\<^sub>i"} need to be atomic in Horn Clauses, but Isabelle admits
 | 
|  |     27 | arbitrary substructure here (nested @{text "\<Longrightarrow>"} and @{text "\<And>"}
 | 
|  |     28 | connectives).}: an iterated implication without any
 | 
|  |     29 | quantifiers\footnote{Recall that outermost @{text "\<And>x. \<phi>[x]"} is
 | 
|  |     30 | always represented via schematic variables in the body: @{text
 | 
|  |     31 | "\<phi>[?x]"}.  These may get instantiated during the course of
 | 
|  |     32 | reasoning.}.  For @{text "n = 0"} a goal is solved.
 | 
|  |     33 | 
 | 
|  |     34 | The structure of each subgoal @{text "A\<^sub>i"} is that of a general
 | 
|  |     35 | Heriditary Harrop Formula @{text "\<And>x\<^sub>1 \<dots> \<And>x\<^sub>k. H\<^sub>1 \<Longrightarrow>
 | 
|  |     36 | \<dots> \<Longrightarrow> H\<^sub>m \<Longrightarrow> B"} according to the normal form where any local
 | 
|  |     37 | @{text \<And>} is pulled before @{text \<Longrightarrow>}.  Here @{text "x\<^sub>1, \<dots>,
 | 
|  |     38 | x\<^sub>k"} are goal parameters, i.e.\ arbitrary-but-fixed entities of
 | 
|  |     39 | certain types, and @{text "H\<^sub>1, \<dots>, H\<^sub>m"} are goal
 | 
|  |     40 | hypotheses, i.e.\ facts that may be assumed locally.  Together, this
 | 
|  |     41 | forms the goal context of the conclusion @{text B} to be established.
 | 
|  |     42 | The goal hypotheses may be again arbitrary Harrop Formulas, although
 | 
|  |     43 | the level of nesting rarely exceeds 1--2 in practice.
 | 
|  |     44 | 
 | 
|  |     45 | The main conclusion @{text C} is internally marked as a protected
 | 
|  |     46 | proposition\glossary{Protected proposition}{An arbitrarily structured
 | 
|  |     47 | proposition @{text "C"} which is forced to appear as atomic by
 | 
|  |     48 | wrapping it into a propositional identity operator; notation @{text
 | 
|  |     49 | "#C"}.  Protecting a proposition prevents basic inferences from
 | 
|  |     50 | entering into that structure for the time being.}, which is
 | 
|  |     51 | occasionally represented explicitly by the notation @{text "#C"}.
 | 
|  |     52 | This ensures that the decomposition into subgoals and main conclusion
 | 
|  |     53 | is well-defined for arbitrarily structured claims.
 | 
|  |     54 | 
 | 
|  |     55 | \medskip Basic goal management is performed via the following
 | 
|  |     56 | Isabelle/Pure rules:
 | 
|  |     57 | 
 | 
|  |     58 |   \[
 | 
|  |     59 |   \infer[@{text "(init)"}]{@{text "C \<Longrightarrow> #C"}}{} \qquad
 | 
|  |     60 |   \infer[@{text "(finish)"}]{@{text "#C"}}{@{text "C"}}
 | 
|  |     61 |   \]
 | 
|  |     62 | 
 | 
|  |     63 |   \medskip The following low-level variants admit general reasoning
 | 
|  |     64 |   with protected propositions:
 | 
|  |     65 | 
 | 
|  |     66 |   \[
 | 
|  |     67 |   \infer[@{text "(protect)"}]{@{text "#C"}}{@{text "C"}} \qquad
 | 
|  |     68 |   \infer[@{text "(conclude)"}]{@{text "A\<^sub>1 \<Longrightarrow> \<dots> \<Longrightarrow> A\<^sub>n \<Longrightarrow> C"}}{@{text "A\<^sub>1 \<Longrightarrow> \<dots> \<Longrightarrow> A\<^sub>n \<Longrightarrow> #C"}}
 | 
|  |     69 |   \]
 | 
|  |     70 | *}
 | 
|  |     71 | 
 | 
|  |     72 | text %mlref {*
 | 
|  |     73 |   \begin{mldecls}
 | 
|  |     74 |   @{index_ML Goal.init: "cterm -> thm"} \\
 | 
|  |     75 |   @{index_ML Goal.finish: "thm -> thm"} \\
 | 
|  |     76 |   @{index_ML Goal.protect: "thm -> thm"} \\
 | 
|  |     77 |   @{index_ML Goal.conclude: "thm -> thm"} \\
 | 
|  |     78 |   \end{mldecls}
 | 
|  |     79 | 
 | 
|  |     80 |   \begin{description}
 | 
|  |     81 | 
 | 
|  |     82 |   \item @{ML "Goal.init"}~@{text "\<phi>"} initializes a tactical goal with
 | 
|  |     83 |   the type-checked proposition @{text \<phi>}.
 | 
|  |     84 | 
 | 
|  |     85 |   \item @{ML "Goal.finish"}~@{text "th"} checks whether theorem @{text
 | 
|  |     86 |   "th"} is a solved goal configuration (zero subgoals), and concludes
 | 
|  |     87 |   the result by removing the goal protection.
 | 
|  |     88 | 
 | 
|  |     89 |   \item @{ML "Goal.protect"}~@{text "th"} protects the whole statement
 | 
|  |     90 |   of theorem @{text "th"}.
 | 
|  |     91 | 
 | 
|  |     92 |   \item @{ML "Goal.conclude"}~@{text "th"} removes the goal protection
 | 
|  |     93 |   for any number of pending subgoals.
 | 
|  |     94 | 
 | 
|  |     95 |   \end{description}
 | 
|  |     96 | *}
 | 
|  |     97 | 
 | 
|  |     98 | 
 | 
|  |     99 | section {* Tactics *}
 | 
|  |    100 | 
 | 
|  |    101 | text {*
 | 
|  |    102 | 
 | 
|  |    103 | FIXME
 | 
|  |    104 | 
 | 
|  |    105 | \glossary{Tactic}{Any function that maps a \seeglossary{tactical goal}
 | 
|  |    106 | to a lazy sequence of possible sucessors.  This scheme subsumes
 | 
|  |    107 | failure (empty result sequence), as well as lazy enumeration of proof
 | 
|  |    108 | search results.  Error conditions are usually mapped to an empty
 | 
|  |    109 | result, which gives further tactics a chance to try in turn.
 | 
|  |    110 | Commonly, tactics either take an argument to address a particular
 | 
|  |    111 | subgoal, or operate on a certain range of subgoals in a uniform
 | 
|  |    112 | fashion.  In any case, the main conclusion is normally left untouched,
 | 
|  |    113 | apart from instantiating \seeglossary{schematic variables}.}
 | 
|  |    114 | 
 | 
|  |    115 | 
 | 
|  |    116 | *}
 | 
|  |    117 | 
 | 
|  |    118 | section {* Tacticals *}
 | 
|  |    119 | 
 | 
|  |    120 | text {*
 | 
|  |    121 | 
 | 
|  |    122 | FIXME
 | 
|  |    123 | 
 | 
|  |    124 | \glossary{Tactical}{A functional combinator for building up complex
 | 
|  |    125 | tactics from simpler ones.  Typical tactical perform sequential
 | 
|  |    126 | composition, disjunction (choice), iteration, or goal addressing.
 | 
|  |    127 | Various search strategies may be expressed via tacticals.}
 | 
|  |    128 | 
 | 
|  |    129 | *}
 | 
|  |    130 | 
 | 
|  |    131 | section {* Programmed proofs *}
 | 
|  |    132 | 
 | 
|  |    133 | text {*
 | 
|  |    134 |   In order to perform a complete tactical proof under program control,
 | 
|  |    135 |   one needs to set up an initial goal configuration, apply a tactic,
 | 
|  |    136 |   and finish the result, cf.\ the rules given in
 | 
|  |    137 |   \secref{sec:tactical-goals}.  Further checks are required to ensure
 | 
|  |    138 |   that the result is actually an instance of the original claim --
 | 
|  |    139 |   ill-behaved tactics could have destroyed that information.
 | 
|  |    140 | 
 | 
|  |    141 |   Several simultaneous claims may be handled within a single goal
 | 
|  |    142 |   statement by using meta-level conjunction internally.\footnote{This
 | 
|  |    143 |   is merely syntax for certain derived statements within
 | 
|  |    144 |   Isabelle/Pure, there is no need to introduce a separate conjunction
 | 
|  |    145 |   operator.}  The whole configuration may be considered within a
 | 
|  |    146 |   context of arbitrary-but-fixed parameters and hypotheses, which will
 | 
|  |    147 |   be available as local facts during the proof and discharged into
 | 
|  |    148 |   implications in the result.
 | 
|  |    149 | 
 | 
|  |    150 |   All of these administrative tasks are packaged into a separate
 | 
|  |    151 |   operation, such that the user merely needs to provide the statement
 | 
|  |    152 |   and tactic to be applied.
 | 
|  |    153 | *}
 | 
|  |    154 | 
 | 
|  |    155 | text %mlref {*
 | 
|  |    156 |   \begin{mldecls}
 | 
|  |    157 |   @{index_ML Goal.prove: "theory -> string list -> term list -> term ->
 | 
|  |    158 |   (thm list -> tactic) -> thm"} \\
 | 
|  |    159 |   @{index_ML Goal.prove_multi: "theory -> string list -> term list -> term list ->
 | 
|  |    160 |   (thm list -> tactic) -> thm list"} \\
 | 
|  |    161 |   \end{mldecls}
 | 
|  |    162 | 
 | 
|  |    163 |   \begin{description}
 | 
|  |    164 | 
 | 
|  |    165 |   \item @{ML Goal.prove}~@{text "thy xs As C tac"} states goal @{text
 | 
|  |    166 |   "C"} in the context of arbitrary-but-fixed parameters @{text "xs"}
 | 
|  |    167 |   and hypotheses @{text "As"} and applies tactic @{text "tac"} to
 | 
|  |    168 |   solve it.  The latter may depend on the local assumptions being
 | 
|  |    169 |   presented as facts.  The result is essentially @{text "\<And>xs. As \<Longrightarrow>
 | 
|  |    170 |   C"}, but is normalized by pulling @{text "\<And>"} before @{text "\<Longrightarrow>"}
 | 
|  |    171 |   (the conclusion @{text "C"} itself may be a rule statement), turning
 | 
|  |    172 |   the quantifier prefix into schematic variables, and generalizing
 | 
|  |    173 |   implicit type-variables.
 | 
|  |    174 | 
 | 
|  |    175 |   Any additional fixed variables or hypotheses not being mentioned in
 | 
|  |    176 |   the initial statement are left unchanged --- programmed proofs may
 | 
|  |    177 |   well occur in a larger context.
 | 
|  |    178 | 
 | 
|  |    179 |   \item @{ML Goal.prove_multi} is simular to @{ML Goal.prove}, but
 | 
|  |    180 |   states several conclusions simultaneously.  @{ML
 | 
|  |    181 |   Tactic.conjunction_tac} may be used to split these into individual
 | 
|  |    182 |   subgoals before commencing the actual proof.
 | 
|  |    183 | 
 | 
|  |    184 |   \end{description}
 | 
|  |    185 | *}
 | 
|  |    186 | 
 | 
|  |    187 | end
 | 
|  |    188 | 
 |