author | clasohm |
Thu, 19 Jan 1995 16:05:21 +0100 | |
changeset 866 | 2d3d020eef11 |
parent 332 | 01b87a921967 |
child 876 | 5c18634db55d |
permissions | -rw-r--r-- |
104 | 1 |
%% $Id$ |
2 |
\chapter{Theorems and Forward Proof} |
|
3 |
\index{theorems|(} |
|
326 | 4 |
|
104 | 5 |
Theorems, which represent the axioms, theorems and rules of object-logics, |
326 | 6 |
have type \mltydx{thm}. This chapter begins by describing operations that |
7 |
print theorems and that join them in forward proof. Most theorem |
|
8 |
operations are intended for advanced applications, such as programming new |
|
9 |
proof procedures. Many of these operations refer to signatures, certified |
|
10 |
terms and certified types, which have the \ML{} types {\tt Sign.sg}, {\tt |
|
11 |
Sign.cterm} and {\tt Sign.ctyp} and are discussed in |
|
104 | 12 |
Chapter~\ref{theories}. Beginning users should ignore such complexities |
13 |
--- and skip all but the first section of this chapter. |
|
14 |
||
15 |
The theorem operations do not print error messages. Instead, they raise |
|
326 | 16 |
exception~\xdx{THM}\@. Use \ttindex{print_exn} to display |
104 | 17 |
exceptions nicely: |
18 |
\begin{ttbox} |
|
19 |
allI RS mp handle e => print_exn e; |
|
20 |
{\out Exception THM raised:} |
|
21 |
{\out RSN: no unifiers -- premise 1} |
|
22 |
{\out (!!x. ?P(x)) ==> ALL x. ?P(x)} |
|
23 |
{\out [| ?P --> ?Q; ?P |] ==> ?Q} |
|
24 |
{\out} |
|
25 |
{\out uncaught exception THM} |
|
26 |
\end{ttbox} |
|
27 |
||
28 |
||
29 |
\section{Basic operations on theorems} |
|
30 |
\subsection{Pretty-printing a theorem} |
|
326 | 31 |
\index{theorems!printing of} |
104 | 32 |
\begin{ttbox} |
326 | 33 |
prth : thm -> thm |
34 |
prths : thm list -> thm list |
|
35 |
prthq : thm Sequence.seq -> thm Sequence.seq |
|
36 |
print_thm : thm -> unit |
|
37 |
print_goals : int -> thm -> unit |
|
38 |
string_of_thm : thm -> string |
|
104 | 39 |
\end{ttbox} |
326 | 40 |
The first three commands are for interactive use. They are identity |
41 |
functions that display, then return, their argument. The \ML{} identifier |
|
42 |
{\tt it} will refer to the value just displayed. |
|
43 |
||
44 |
The others are for use in programs. Functions with result type {\tt unit} |
|
45 |
are convenient for imperative programming. |
|
46 |
||
47 |
\begin{ttdescription} |
|
104 | 48 |
\item[\ttindexbold{prth} {\it thm}] |
49 |
prints {\it thm\/} at the terminal. |
|
50 |
||
51 |
\item[\ttindexbold{prths} {\it thms}] |
|
52 |
prints {\it thms}, a list of theorems. |
|
53 |
||
54 |
\item[\ttindexbold{prthq} {\it thmq}] |
|
55 |
prints {\it thmq}, a sequence of theorems. It is useful for inspecting |
|
56 |
the output of a tactic. |
|
57 |
||
58 |
\item[\ttindexbold{print_thm} {\it thm}] |
|
59 |
prints {\it thm\/} at the terminal. |
|
60 |
||
61 |
\item[\ttindexbold{print_goals} {\it limit\/} {\it thm}] |
|
62 |
prints {\it thm\/} in goal style, with the premises as subgoals. It prints |
|
63 |
at most {\it limit\/} subgoals. The subgoal module calls {\tt print_goals} |
|
64 |
to display proof states. |
|
65 |
||
66 |
\item[\ttindexbold{string_of_thm} {\it thm}] |
|
67 |
converts {\it thm\/} to a string. |
|
326 | 68 |
\end{ttdescription} |
104 | 69 |
|
70 |
||
326 | 71 |
\subsection{Forward proof: joining rules by resolution} |
72 |
\index{theorems!joining by resolution} |
|
73 |
\index{resolution}\index{forward proof} |
|
104 | 74 |
\begin{ttbox} |
75 |
RSN : thm * (int * thm) -> thm \hfill{\bf infix} |
|
76 |
RS : thm * thm -> thm \hfill{\bf infix} |
|
77 |
MRS : thm list * thm -> thm \hfill{\bf infix} |
|
78 |
RLN : thm list * (int * thm list) -> thm list \hfill{\bf infix} |
|
79 |
RL : thm list * thm list -> thm list \hfill{\bf infix} |
|
326 | 80 |
MRL : thm list list * thm list -> thm list \hfill{\bf infix} |
104 | 81 |
\end{ttbox} |
326 | 82 |
Joining rules together is a simple way of deriving new rules. These |
104 | 83 |
functions are especially useful with destruction rules. |
326 | 84 |
\begin{ttdescription} |
104 | 85 |
\item[\tt$thm@1$ RSN $(i,thm@2)$] \indexbold{*RSN} |
326 | 86 |
resolves the conclusion of $thm@1$ with the $i$th premise of~$thm@2$. |
87 |
Unless there is precisely one resolvent it raises exception |
|
88 |
\xdx{THM}; in that case, use {\tt RLN}. |
|
104 | 89 |
|
90 |
\item[\tt$thm@1$ RS $thm@2$] \indexbold{*RS} |
|
91 |
abbreviates \hbox{\tt$thm@1$ RSN $(1,thm@2)$}. Thus, it resolves the |
|
92 |
conclusion of $thm@1$ with the first premise of~$thm@2$. |
|
93 |
||
94 |
\item[\tt {$[thm@1,\ldots,thm@n]$} MRS $thm$] \indexbold{*MRS} |
|
332 | 95 |
uses {\tt RSN} to resolve $thm@i$ against premise~$i$ of $thm$, for |
104 | 96 |
$i=n$, \ldots,~1. This applies $thm@n$, \ldots, $thm@1$ to the first $n$ |
97 |
premises of $thm$. Because the theorems are used from right to left, it |
|
98 |
does not matter if the $thm@i$ create new premises. {\tt MRS} is useful |
|
99 |
for expressing proof trees. |
|
100 |
||
151 | 101 |
\item[\tt$thms@1$ RLN $(i,thms@2)$] \indexbold{*RLN} |
326 | 102 |
joins lists of theorems. For every $thm@1$ in $thms@1$ and $thm@2$ in |
103 |
$thms@2$, it resolves the conclusion of $thm@1$ with the $i$th premise |
|
104 |
of~$thm@2$, accumulating the results. |
|
104 | 105 |
|
151 | 106 |
\item[\tt$thms@1$ RL $thms@2$] \indexbold{*RL} |
107 |
abbreviates \hbox{\tt$thms@1$ RLN $(1,thms@2)$}. |
|
104 | 108 |
|
109 |
\item[\tt {$[thms@1,\ldots,thms@n]$} MRL $thms$] \indexbold{*MRL} |
|
110 |
is analogous to {\tt MRS}, but combines theorem lists rather than theorems. |
|
111 |
It too is useful for expressing proof trees. |
|
326 | 112 |
\end{ttdescription} |
104 | 113 |
|
114 |
||
115 |
\subsection{Expanding definitions in theorems} |
|
326 | 116 |
\index{meta-rewriting!in theorems} |
104 | 117 |
\begin{ttbox} |
118 |
rewrite_rule : thm list -> thm -> thm |
|
119 |
rewrite_goals_rule : thm list -> thm -> thm |
|
120 |
\end{ttbox} |
|
326 | 121 |
\begin{ttdescription} |
104 | 122 |
\item[\ttindexbold{rewrite_rule} {\it defs} {\it thm}] |
123 |
unfolds the {\it defs} throughout the theorem~{\it thm}. |
|
124 |
||
125 |
\item[\ttindexbold{rewrite_goals_rule} {\it defs} {\it thm}] |
|
126 |
unfolds the {\it defs} in the premises of~{\it thm}, but leaves the |
|
127 |
conclusion unchanged. This rule underlies \ttindex{rewrite_goals_tac}, but |
|
128 |
serves little purpose in forward proof. |
|
326 | 129 |
\end{ttdescription} |
104 | 130 |
|
131 |
||
326 | 132 |
\subsection{Instantiating a theorem} |
133 |
\index{instantiation} |
|
286 | 134 |
\begin{ttbox} |
104 | 135 |
read_instantiate : (string*string)list -> thm -> thm |
136 |
read_instantiate_sg : Sign.sg -> (string*string)list -> thm -> thm |
|
137 |
cterm_instantiate : (Sign.cterm*Sign.cterm)list -> thm -> thm |
|
138 |
\end{ttbox} |
|
139 |
These meta-rules instantiate type and term unknowns in a theorem. They are |
|
140 |
occasionally useful. They can prevent difficulties with higher-order |
|
141 |
unification, and define specialized versions of rules. |
|
326 | 142 |
\begin{ttdescription} |
104 | 143 |
\item[\ttindexbold{read_instantiate} {\it insts} {\it thm}] |
144 |
processes the instantiations {\it insts} and instantiates the rule~{\it |
|
145 |
thm}. The processing of instantiations is described |
|
326 | 146 |
in \S\ref{res_inst_tac}, under {\tt res_inst_tac}. |
104 | 147 |
|
148 |
Use {\tt res_inst_tac}, not {\tt read_instantiate}, to instantiate a rule |
|
149 |
and refine a particular subgoal. The tactic allows instantiation by the |
|
150 |
subgoal's parameters, and reads the instantiations using the signature |
|
326 | 151 |
associated with the proof state. |
152 |
||
153 |
Use {\tt read_instantiate_sg} below if {\it insts\/} appears to be treated |
|
154 |
incorrectly. |
|
104 | 155 |
|
326 | 156 |
\item[\ttindexbold{read_instantiate_sg} {\it sg} {\it insts} {\it thm}] |
157 |
resembles \hbox{\tt read_instantiate {\it insts} {\it thm}}, but reads |
|
158 |
the instantiations under signature~{\it sg}. This is necessary to |
|
159 |
instantiate a rule from a general theory, such as first-order logic, |
|
160 |
using the notation of some specialized theory. Use the function {\tt |
|
161 |
sign_of} to get a theory's signature. |
|
104 | 162 |
|
163 |
\item[\ttindexbold{cterm_instantiate} {\it ctpairs} {\it thm}] |
|
164 |
is similar to {\tt read_instantiate}, but the instantiations are provided |
|
165 |
as pairs of certified terms, not as strings to be read. |
|
326 | 166 |
\end{ttdescription} |
104 | 167 |
|
168 |
||
866
2d3d020eef11
added documentation of bind_thm, qed, qed_goal, get_thm, thms_of
clasohm
parents:
332
diff
changeset
|
169 |
\subsection{Miscellaneous forward rules}\label{MiscellaneousForwardRules} |
326 | 170 |
\index{theorems!standardizing} |
104 | 171 |
\begin{ttbox} |
332 | 172 |
standard : thm -> thm |
173 |
zero_var_indexes : thm -> thm |
|
174 |
make_elim : thm -> thm |
|
104 | 175 |
rule_by_tactic : tactic -> thm -> thm |
176 |
\end{ttbox} |
|
326 | 177 |
\begin{ttdescription} |
104 | 178 |
\item[\ttindexbold{standard} $thm$] |
179 |
puts $thm$ into the standard form of object-rules. It discharges all |
|
332 | 180 |
meta-assumptions, replaces free variables by schematic variables, and |
104 | 181 |
renames schematic variables to have subscript zero. |
182 |
||
183 |
\item[\ttindexbold{zero_var_indexes} $thm$] |
|
184 |
makes all schematic variables have subscript zero, renaming them to avoid |
|
185 |
clashes. |
|
186 |
||
187 |
\item[\ttindexbold{make_elim} $thm$] |
|
188 |
\index{rules!converting destruction to elimination} |
|
189 |
converts $thm$, a destruction rule of the form $\List{P@1;\ldots;P@m}\Imp |
|
190 |
Q$, to the elimination rule $\List{P@1; \ldots; P@m; Q\Imp R}\Imp R$. This |
|
191 |
is the basis for destruct-resolution: {\tt dresolve_tac}, etc. |
|
192 |
||
193 |
\item[\ttindexbold{rule_by_tactic} {\it tac} {\it thm}] |
|
194 |
applies {\it tac\/} to the {\it thm}, freezing its variables first, then |
|
195 |
yields the proof state returned by the tactic. In typical usage, the |
|
196 |
{\it thm\/} represents an instance of a rule with several premises, some |
|
197 |
with contradictory assumptions (because of the instantiation). The |
|
198 |
tactic proves those subgoals and does whatever else it can, and returns |
|
199 |
whatever is left. |
|
326 | 200 |
\end{ttdescription} |
104 | 201 |
|
202 |
||
203 |
\subsection{Taking a theorem apart} |
|
326 | 204 |
\index{theorems!taking apart} |
104 | 205 |
\index{flex-flex constraints} |
206 |
\begin{ttbox} |
|
207 |
concl_of : thm -> term |
|
208 |
prems_of : thm -> term list |
|
209 |
nprems_of : thm -> int |
|
210 |
tpairs_of : thm -> (term*term)list |
|
211 |
stamps_of_thy : thm -> string ref list |
|
866
2d3d020eef11
added documentation of bind_thm, qed, qed_goal, get_thm, thms_of
clasohm
parents:
332
diff
changeset
|
212 |
theory_of_thm : thm -> theory |
286 | 213 |
dest_state : thm*int -> (term*term)list*term list*term*term |
104 | 214 |
rep_thm : thm -> \{prop:term, hyps:term list, |
215 |
maxidx:int, sign:Sign.sg\} |
|
216 |
\end{ttbox} |
|
326 | 217 |
\begin{ttdescription} |
104 | 218 |
\item[\ttindexbold{concl_of} $thm$] |
219 |
returns the conclusion of $thm$ as a term. |
|
220 |
||
221 |
\item[\ttindexbold{prems_of} $thm$] |
|
222 |
returns the premises of $thm$ as a list of terms. |
|
223 |
||
224 |
\item[\ttindexbold{nprems_of} $thm$] |
|
286 | 225 |
returns the number of premises in $thm$, and is equivalent to {\tt |
226 |
length(prems_of~$thm$)}. |
|
104 | 227 |
|
228 |
\item[\ttindexbold{tpairs_of} $thm$] |
|
229 |
returns the flex-flex constraints of $thm$. |
|
230 |
||
231 |
\item[\ttindexbold{stamps_of_thm} $thm$] |
|
332 | 232 |
returns the \rmindex{stamps} of the signature associated with~$thm$. |
104 | 233 |
|
866
2d3d020eef11
added documentation of bind_thm, qed, qed_goal, get_thm, thms_of
clasohm
parents:
332
diff
changeset
|
234 |
\item[\ttindexbold{theory_of_thm} $thm$] |
2d3d020eef11
added documentation of bind_thm, qed, qed_goal, get_thm, thms_of
clasohm
parents:
332
diff
changeset
|
235 |
returns the theory associated with $thm$. |
2d3d020eef11
added documentation of bind_thm, qed, qed_goal, get_thm, thms_of
clasohm
parents:
332
diff
changeset
|
236 |
|
104 | 237 |
\item[\ttindexbold{dest_state} $(thm,i)$] |
238 |
decomposes $thm$ as a tuple containing a list of flex-flex constraints, a |
|
239 |
list of the subgoals~1 to~$i-1$, subgoal~$i$, and the rest of the theorem |
|
240 |
(this will be an implication if there are more than $i$ subgoals). |
|
241 |
||
242 |
\item[\ttindexbold{rep_thm} $thm$] |
|
243 |
decomposes $thm$ as a record containing the statement of~$thm$, its list of |
|
332 | 244 |
meta-assumptions, the maximum subscript of its unknowns, and its signature. |
326 | 245 |
\end{ttdescription} |
104 | 246 |
|
247 |
||
248 |
\subsection{Tracing flags for unification} |
|
326 | 249 |
\index{tracing!of unification} |
104 | 250 |
\begin{ttbox} |
251 |
Unify.trace_simp : bool ref \hfill{\bf initially false} |
|
252 |
Unify.trace_types : bool ref \hfill{\bf initially false} |
|
253 |
Unify.trace_bound : int ref \hfill{\bf initially 10} |
|
254 |
Unify.search_bound : int ref \hfill{\bf initially 20} |
|
255 |
\end{ttbox} |
|
256 |
Tracing the search may be useful when higher-order unification behaves |
|
257 |
unexpectedly. Letting {\tt res_inst_tac} circumvent the problem is easier, |
|
258 |
though. |
|
326 | 259 |
\begin{ttdescription} |
260 |
\item[Unify.trace_simp := true;] |
|
104 | 261 |
causes tracing of the simplification phase. |
262 |
||
326 | 263 |
\item[Unify.trace_types := true;] |
104 | 264 |
generates warnings of incompleteness, when unification is not considering |
265 |
all possible instantiations of type unknowns. |
|
266 |
||
326 | 267 |
\item[Unify.trace_bound := $n$;] |
104 | 268 |
causes unification to print tracing information once it reaches depth~$n$. |
269 |
Use $n=0$ for full tracing. At the default value of~10, tracing |
|
270 |
information is almost never printed. |
|
271 |
||
326 | 272 |
\item[Unify.search_bound := $n$;] |
104 | 273 |
causes unification to limit its search to depth~$n$. Because of this |
274 |
bound, higher-order unification cannot return an infinite sequence, though |
|
275 |
it can return a very long one. The search rarely approaches the default |
|
276 |
value of~20. If the search is cut off, unification prints {\tt |
|
277 |
***Unification bound exceeded}. |
|
326 | 278 |
\end{ttdescription} |
104 | 279 |
|
280 |
||
281 |
\section{Primitive meta-level inference rules} |
|
282 |
\index{meta-rules|(} |
|
283 |
These implement the meta-logic in {\sc lcf} style, as functions from theorems |
|
284 |
to theorems. They are, rarely, useful for deriving results in the pure |
|
285 |
theory. Mainly, they are included for completeness, and most users should |
|
326 | 286 |
not bother with them. The meta-rules raise exception \xdx{THM} to signal |
104 | 287 |
malformed premises, incompatible signatures and similar errors. |
288 |
||
326 | 289 |
\index{meta-assumptions} |
104 | 290 |
The meta-logic uses natural deduction. Each theorem may depend on |
332 | 291 |
meta-level assumptions. Certain rules, such as $({\Imp}I)$, |
104 | 292 |
discharge assumptions; in most other rules, the conclusion depends on all |
293 |
of the assumptions of the premises. Formally, the system works with |
|
294 |
assertions of the form |
|
295 |
\[ \phi \quad [\phi@1,\ldots,\phi@n], \] |
|
332 | 296 |
where $\phi@1$,~\ldots,~$\phi@n$ are the assumptions. Do not confuse |
104 | 297 |
meta-level assumptions with the object-level assumptions in a subgoal, |
298 |
which are represented in the meta-logic using~$\Imp$. |
|
299 |
||
300 |
Each theorem has a signature. Certified terms have a signature. When a |
|
301 |
rule takes several premises and certified terms, it merges the signatures |
|
302 |
to make a signature for the conclusion. This fails if the signatures are |
|
303 |
incompatible. |
|
304 |
||
326 | 305 |
\index{meta-implication} |
332 | 306 |
The {\bf implication} rules are $({\Imp}I)$ |
104 | 307 |
and $({\Imp}E)$: |
308 |
\[ \infer[({\Imp}I)]{\phi\Imp \psi}{\infer*{\psi}{[\phi]}} \qquad |
|
309 |
\infer[({\Imp}E)]{\psi}{\phi\Imp \psi & \phi} \] |
|
310 |
||
326 | 311 |
\index{meta-equality} |
104 | 312 |
Equality of truth values means logical equivalence: |
313 |
\[ \infer[({\equiv}I)]{\phi\equiv\psi}{\infer*{\psi}{[\phi]} & |
|
286 | 314 |
\infer*{\phi}{[\psi]}} |
104 | 315 |
\qquad |
316 |
\infer[({\equiv}E)]{\psi}{\phi\equiv \psi & \phi} \] |
|
317 |
||
332 | 318 |
The {\bf equality} rules are reflexivity, symmetry, and transitivity: |
104 | 319 |
\[ {a\equiv a}\,(refl) \qquad |
320 |
\infer[(sym)]{b\equiv a}{a\equiv b} \qquad |
|
321 |
\infer[(trans)]{a\equiv c}{a\equiv b & b\equiv c} \] |
|
322 |
||
326 | 323 |
\index{lambda calc@$\lambda$-calculus} |
104 | 324 |
The $\lambda$-conversions are $\alpha$-conversion, $\beta$-conversion, and |
325 |
extensionality:\footnote{$\alpha$-conversion holds if $y$ is not free |
|
326 |
in~$a$; $(ext)$ holds if $x$ is not free in the assumptions, $f$, or~$g$.} |
|
327 |
\[ {(\lambda x.a) \equiv (\lambda y.a[y/x])} \qquad |
|
328 |
{((\lambda x.a)(b)) \equiv a[b/x]} \qquad |
|
329 |
\infer[(ext)]{f\equiv g}{f(x) \equiv g(x)} \] |
|
330 |
||
332 | 331 |
The {\bf abstraction} and {\bf combination} rules let conversions be |
332 |
applied to subterms:\footnote{Abstraction holds if $x$ is not free in the |
|
104 | 333 |
assumptions.} |
334 |
\[ \infer[(abs)]{(\lambda x.a) \equiv (\lambda x.b)}{a\equiv b} \qquad |
|
335 |
\infer[(comb)]{f(a)\equiv g(b)}{f\equiv g & a\equiv b} \] |
|
336 |
||
326 | 337 |
\index{meta-quantifiers} |
332 | 338 |
The {\bf universal quantification} rules are $(\Forall I)$ and $(\Forall |
104 | 339 |
E)$:\footnote{$(\Forall I)$ holds if $x$ is not free in the assumptions.} |
340 |
\[ \infer[(\Forall I)]{\Forall x.\phi}{\phi} \qquad |
|
286 | 341 |
\infer[(\Forall E)]{\phi[b/x]}{\Forall x.\phi} \] |
104 | 342 |
|
343 |
||
326 | 344 |
\subsection{Assumption rule} |
345 |
\index{meta-assumptions} |
|
104 | 346 |
\begin{ttbox} |
347 |
assume: Sign.cterm -> thm |
|
348 |
\end{ttbox} |
|
326 | 349 |
\begin{ttdescription} |
104 | 350 |
\item[\ttindexbold{assume} $ct$] |
332 | 351 |
makes the theorem \(\phi \;[\phi]\), where $\phi$ is the value of~$ct$. |
104 | 352 |
The rule checks that $ct$ has type $prop$ and contains no unknowns, which |
332 | 353 |
are not allowed in assumptions. |
326 | 354 |
\end{ttdescription} |
104 | 355 |
|
326 | 356 |
\subsection{Implication rules} |
357 |
\index{meta-implication} |
|
104 | 358 |
\begin{ttbox} |
359 |
implies_intr : Sign.cterm -> thm -> thm |
|
360 |
implies_intr_list : Sign.cterm list -> thm -> thm |
|
361 |
implies_intr_hyps : thm -> thm |
|
362 |
implies_elim : thm -> thm -> thm |
|
363 |
implies_elim_list : thm -> thm list -> thm |
|
364 |
\end{ttbox} |
|
326 | 365 |
\begin{ttdescription} |
104 | 366 |
\item[\ttindexbold{implies_intr} $ct$ $thm$] |
367 |
is $({\Imp}I)$, where $ct$ is the assumption to discharge, say~$\phi$. It |
|
332 | 368 |
maps the premise~$\psi$ to the conclusion $\phi\Imp\psi$, removing all |
369 |
occurrences of~$\phi$ from the assumptions. The rule checks that $ct$ has |
|
370 |
type $prop$. |
|
104 | 371 |
|
372 |
\item[\ttindexbold{implies_intr_list} $cts$ $thm$] |
|
373 |
applies $({\Imp}I)$ repeatedly, on every element of the list~$cts$. |
|
374 |
||
375 |
\item[\ttindexbold{implies_intr_hyps} $thm$] |
|
332 | 376 |
applies $({\Imp}I)$ to discharge all the hypotheses (assumptions) of~$thm$. |
377 |
It maps the premise $\phi \; [\phi@1,\ldots,\phi@n]$ to the conclusion |
|
104 | 378 |
$\List{\phi@1,\ldots,\phi@n}\Imp\phi$. |
379 |
||
380 |
\item[\ttindexbold{implies_elim} $thm@1$ $thm@2$] |
|
381 |
applies $({\Imp}E)$ to $thm@1$ and~$thm@2$. It maps the premises $\phi\Imp |
|
382 |
\psi$ and $\phi$ to the conclusion~$\psi$. |
|
383 |
||
384 |
\item[\ttindexbold{implies_elim_list} $thm$ $thms$] |
|
385 |
applies $({\Imp}E)$ repeatedly to $thm$, using each element of~$thms$ in |
|
151 | 386 |
turn. It maps the premises $\List{\phi@1,\ldots,\phi@n}\Imp\psi$ and |
104 | 387 |
$\phi@1$,\ldots,$\phi@n$ to the conclusion~$\psi$. |
326 | 388 |
\end{ttdescription} |
104 | 389 |
|
326 | 390 |
\subsection{Logical equivalence rules} |
391 |
\index{meta-equality} |
|
104 | 392 |
\begin{ttbox} |
326 | 393 |
equal_intr : thm -> thm -> thm |
394 |
equal_elim : thm -> thm -> thm |
|
104 | 395 |
\end{ttbox} |
326 | 396 |
\begin{ttdescription} |
104 | 397 |
\item[\ttindexbold{equal_intr} $thm@1$ $thm@2$] |
332 | 398 |
applies $({\equiv}I)$ to $thm@1$ and~$thm@2$. It maps the premises~$\psi$ |
399 |
and~$\phi$ to the conclusion~$\phi\equiv\psi$; the assumptions are those of |
|
400 |
the first premise with~$\phi$ removed, plus those of |
|
401 |
the second premise with~$\psi$ removed. |
|
104 | 402 |
|
403 |
\item[\ttindexbold{equal_elim} $thm@1$ $thm@2$] |
|
404 |
applies $({\equiv}E)$ to $thm@1$ and~$thm@2$. It maps the premises |
|
405 |
$\phi\equiv\psi$ and $\phi$ to the conclusion~$\psi$. |
|
326 | 406 |
\end{ttdescription} |
104 | 407 |
|
408 |
||
409 |
\subsection{Equality rules} |
|
326 | 410 |
\index{meta-equality} |
104 | 411 |
\begin{ttbox} |
412 |
reflexive : Sign.cterm -> thm |
|
413 |
symmetric : thm -> thm |
|
414 |
transitive : thm -> thm -> thm |
|
415 |
\end{ttbox} |
|
326 | 416 |
\begin{ttdescription} |
104 | 417 |
\item[\ttindexbold{reflexive} $ct$] |
151 | 418 |
makes the theorem \(ct\equiv ct\). |
104 | 419 |
|
420 |
\item[\ttindexbold{symmetric} $thm$] |
|
421 |
maps the premise $a\equiv b$ to the conclusion $b\equiv a$. |
|
422 |
||
423 |
\item[\ttindexbold{transitive} $thm@1$ $thm@2$] |
|
424 |
maps the premises $a\equiv b$ and $b\equiv c$ to the conclusion~${a\equiv c}$. |
|
326 | 425 |
\end{ttdescription} |
104 | 426 |
|
427 |
||
428 |
\subsection{The $\lambda$-conversion rules} |
|
326 | 429 |
\index{lambda calc@$\lambda$-calculus} |
104 | 430 |
\begin{ttbox} |
431 |
beta_conversion : Sign.cterm -> thm |
|
432 |
extensional : thm -> thm |
|
433 |
abstract_rule : string -> Sign.cterm -> thm -> thm |
|
434 |
combination : thm -> thm -> thm |
|
435 |
\end{ttbox} |
|
326 | 436 |
There is no rule for $\alpha$-conversion because Isabelle regards |
437 |
$\alpha$-convertible theorems as equal. |
|
438 |
\begin{ttdescription} |
|
104 | 439 |
\item[\ttindexbold{beta_conversion} $ct$] |
440 |
makes the theorem $((\lambda x.a)(b)) \equiv a[b/x]$, where $ct$ is the |
|
441 |
term $(\lambda x.a)(b)$. |
|
442 |
||
443 |
\item[\ttindexbold{extensional} $thm$] |
|
444 |
maps the premise $f(x) \equiv g(x)$ to the conclusion $f\equiv g$. |
|
445 |
Parameter~$x$ is taken from the premise. It may be an unknown or a free |
|
332 | 446 |
variable (provided it does not occur in the assumptions); it must not occur |
104 | 447 |
in $f$ or~$g$. |
448 |
||
449 |
\item[\ttindexbold{abstract_rule} $v$ $x$ $thm$] |
|
450 |
maps the premise $a\equiv b$ to the conclusion $(\lambda x.a) \equiv |
|
451 |
(\lambda x.b)$, abstracting over all occurrences (if any!) of~$x$. |
|
452 |
Parameter~$x$ is supplied as a cterm. It may be an unknown or a free |
|
332 | 453 |
variable (provided it does not occur in the assumptions). In the |
104 | 454 |
conclusion, the bound variable is named~$v$. |
455 |
||
456 |
\item[\ttindexbold{combination} $thm@1$ $thm@2$] |
|
457 |
maps the premises $f\equiv g$ and $a\equiv b$ to the conclusion~$f(a)\equiv |
|
458 |
g(b)$. |
|
326 | 459 |
\end{ttdescription} |
104 | 460 |
|
461 |
||
326 | 462 |
\subsection{Forall introduction rules} |
463 |
\index{meta-quantifiers} |
|
104 | 464 |
\begin{ttbox} |
465 |
forall_intr : Sign.cterm -> thm -> thm |
|
466 |
forall_intr_list : Sign.cterm list -> thm -> thm |
|
467 |
forall_intr_frees : thm -> thm |
|
468 |
\end{ttbox} |
|
469 |
||
326 | 470 |
\begin{ttdescription} |
104 | 471 |
\item[\ttindexbold{forall_intr} $x$ $thm$] |
472 |
applies $({\Forall}I)$, abstracting over all occurrences (if any!) of~$x$. |
|
473 |
The rule maps the premise $\phi$ to the conclusion $\Forall x.\phi$. |
|
474 |
Parameter~$x$ is supplied as a cterm. It may be an unknown or a free |
|
332 | 475 |
variable (provided it does not occur in the assumptions). |
104 | 476 |
|
477 |
\item[\ttindexbold{forall_intr_list} $xs$ $thm$] |
|
478 |
applies $({\Forall}I)$ repeatedly, on every element of the list~$xs$. |
|
479 |
||
480 |
\item[\ttindexbold{forall_intr_frees} $thm$] |
|
481 |
applies $({\Forall}I)$ repeatedly, generalizing over all the free variables |
|
482 |
of the premise. |
|
326 | 483 |
\end{ttdescription} |
104 | 484 |
|
485 |
||
326 | 486 |
\subsection{Forall elimination rules} |
104 | 487 |
\begin{ttbox} |
488 |
forall_elim : Sign.cterm -> thm -> thm |
|
489 |
forall_elim_list : Sign.cterm list -> thm -> thm |
|
490 |
forall_elim_var : int -> thm -> thm |
|
491 |
forall_elim_vars : int -> thm -> thm |
|
492 |
\end{ttbox} |
|
493 |
||
326 | 494 |
\begin{ttdescription} |
104 | 495 |
\item[\ttindexbold{forall_elim} $ct$ $thm$] |
496 |
applies $({\Forall}E)$, mapping the premise $\Forall x.\phi$ to the conclusion |
|
497 |
$\phi[ct/x]$. The rule checks that $ct$ and $x$ have the same type. |
|
498 |
||
499 |
\item[\ttindexbold{forall_elim_list} $cts$ $thm$] |
|
500 |
applies $({\Forall}E)$ repeatedly, on every element of the list~$cts$. |
|
501 |
||
502 |
\item[\ttindexbold{forall_elim_var} $k$ $thm$] |
|
503 |
applies $({\Forall}E)$, mapping the premise $\Forall x.\phi$ to the conclusion |
|
504 |
$\phi[\Var{x@k}/x]$. Thus, it replaces the outermost $\Forall$-bound |
|
505 |
variable by an unknown having subscript~$k$. |
|
506 |
||
507 |
\item[\ttindexbold{forall_elim_vars} $ks$ $thm$] |
|
508 |
applies {\tt forall_elim_var} repeatedly, for every element of the list~$ks$. |
|
326 | 509 |
\end{ttdescription} |
104 | 510 |
|
326 | 511 |
\subsection{Instantiation of unknowns} |
512 |
\index{instantiation} |
|
104 | 513 |
\begin{ttbox} |
286 | 514 |
instantiate: (indexname*Sign.ctyp)list * |
515 |
(Sign.cterm*Sign.cterm)list -> thm -> thm |
|
104 | 516 |
\end{ttbox} |
326 | 517 |
\begin{ttdescription} |
518 |
\item[\ttindexbold{instantiate} ($tyinsts$, $insts$) $thm$] |
|
519 |
simultaneously substitutes types for type unknowns (the |
|
104 | 520 |
$tyinsts$) and terms for term unknowns (the $insts$). Instantiations are |
521 |
given as $(v,t)$ pairs, where $v$ is an unknown and $t$ is a term (of the |
|
522 |
same type as $v$) or a type (of the same sort as~$v$). All the unknowns |
|
523 |
must be distinct. The rule normalizes its conclusion. |
|
326 | 524 |
\end{ttdescription} |
104 | 525 |
|
526 |
||
326 | 527 |
\subsection{Freezing/thawing type unknowns} |
528 |
\index{type unknowns!freezing/thawing of} |
|
104 | 529 |
\begin{ttbox} |
530 |
freezeT: thm -> thm |
|
531 |
varifyT: thm -> thm |
|
532 |
\end{ttbox} |
|
326 | 533 |
\begin{ttdescription} |
104 | 534 |
\item[\ttindexbold{freezeT} $thm$] |
535 |
converts all the type unknowns in $thm$ to free type variables. |
|
536 |
||
537 |
\item[\ttindexbold{varifyT} $thm$] |
|
538 |
converts all the free type variables in $thm$ to type unknowns. |
|
326 | 539 |
\end{ttdescription} |
104 | 540 |
|
541 |
||
542 |
\section{Derived rules for goal-directed proof} |
|
543 |
Most of these rules have the sole purpose of implementing particular |
|
544 |
tactics. There are few occasions for applying them directly to a theorem. |
|
545 |
||
546 |
\subsection{Proof by assumption} |
|
326 | 547 |
\index{meta-assumptions} |
104 | 548 |
\begin{ttbox} |
549 |
assumption : int -> thm -> thm Sequence.seq |
|
550 |
eq_assumption : int -> thm -> thm |
|
551 |
\end{ttbox} |
|
326 | 552 |
\begin{ttdescription} |
104 | 553 |
\item[\ttindexbold{assumption} {\it i} $thm$] |
554 |
attempts to solve premise~$i$ of~$thm$ by assumption. |
|
555 |
||
556 |
\item[\ttindexbold{eq_assumption}] |
|
557 |
is like {\tt assumption} but does not use unification. |
|
326 | 558 |
\end{ttdescription} |
104 | 559 |
|
560 |
||
561 |
\subsection{Resolution} |
|
326 | 562 |
\index{resolution} |
104 | 563 |
\begin{ttbox} |
564 |
biresolution : bool -> (bool*thm)list -> int -> thm |
|
565 |
-> thm Sequence.seq |
|
566 |
\end{ttbox} |
|
326 | 567 |
\begin{ttdescription} |
104 | 568 |
\item[\ttindexbold{biresolution} $match$ $rules$ $i$ $state$] |
326 | 569 |
performs bi-resolution on subgoal~$i$ of $state$, using the list of $\it |
104 | 570 |
(flag,rule)$ pairs. For each pair, it applies resolution if the flag |
571 |
is~{\tt false} and elim-resolution if the flag is~{\tt true}. If $match$ |
|
572 |
is~{\tt true}, the $state$ is not instantiated. |
|
326 | 573 |
\end{ttdescription} |
104 | 574 |
|
575 |
||
576 |
\subsection{Composition: resolution without lifting} |
|
326 | 577 |
\index{resolution!without lifting} |
104 | 578 |
\begin{ttbox} |
579 |
compose : thm * int * thm -> thm list |
|
580 |
COMP : thm * thm -> thm |
|
581 |
bicompose : bool -> bool * thm * int -> int -> thm |
|
582 |
-> thm Sequence.seq |
|
583 |
\end{ttbox} |
|
584 |
In forward proof, a typical use of composition is to regard an assertion of |
|
585 |
the form $\phi\Imp\psi$ as atomic. Schematic variables are not renamed, so |
|
586 |
beware of clashes! |
|
326 | 587 |
\begin{ttdescription} |
104 | 588 |
\item[\ttindexbold{compose} ($thm@1$, $i$, $thm@2$)] |
589 |
uses $thm@1$, regarded as an atomic formula, to solve premise~$i$ |
|
590 |
of~$thm@2$. Let $thm@1$ and $thm@2$ be $\psi$ and $\List{\phi@1; \ldots; |
|
591 |
\phi@n} \Imp \phi$. For each $s$ that unifies~$\psi$ and $\phi@i$, the |
|
592 |
result list contains the theorem |
|
593 |
\[ (\List{\phi@1; \ldots; \phi@{i-1}; \phi@{i+1}; \ldots; \phi@n} \Imp \phi)s. |
|
594 |
\] |
|
595 |
||
596 |
\item[\tt $thm@1$ COMP $thm@2$] |
|
597 |
calls \hbox{\tt compose ($thm@1$, 1, $thm@2$)} and returns the result, if |
|
326 | 598 |
unique; otherwise, it raises exception~\xdx{THM}\@. It is |
104 | 599 |
analogous to {\tt RS}\@. |
600 |
||
601 |
For example, suppose that $thm@1$ is $a=b\Imp b=a$, a symmetry rule, and |
|
332 | 602 |
that $thm@2$ is $\List{P\Imp Q; \neg Q} \Imp\neg P$, which is the |
104 | 603 |
principle of contrapositives. Then the result would be the |
604 |
derived rule $\neg(b=a)\Imp\neg(a=b)$. |
|
605 |
||
606 |
\item[\ttindexbold{bicompose} $match$ ($flag$, $rule$, $m$) $i$ $state$] |
|
607 |
refines subgoal~$i$ of $state$ using $rule$, without lifting. The $rule$ |
|
608 |
is taken to have the form $\List{\psi@1; \ldots; \psi@m} \Imp \psi$, where |
|
326 | 609 |
$\psi$ need not be atomic; thus $m$ determines the number of new |
104 | 610 |
subgoals. If $flag$ is {\tt true} then it performs elim-resolution --- it |
611 |
solves the first premise of~$rule$ by assumption and deletes that |
|
612 |
assumption. If $match$ is~{\tt true}, the $state$ is not instantiated. |
|
326 | 613 |
\end{ttdescription} |
104 | 614 |
|
615 |
||
616 |
\subsection{Other meta-rules} |
|
617 |
\begin{ttbox} |
|
618 |
trivial : Sign.cterm -> thm |
|
619 |
lift_rule : (thm * int) -> thm -> thm |
|
620 |
rename_params_rule : string list * int -> thm -> thm |
|
621 |
rewrite_cterm : thm list -> Sign.cterm -> thm |
|
622 |
flexflex_rule : thm -> thm Sequence.seq |
|
623 |
\end{ttbox} |
|
326 | 624 |
\begin{ttdescription} |
104 | 625 |
\item[\ttindexbold{trivial} $ct$] |
626 |
makes the theorem \(\phi\Imp\phi\), where $\phi$ is the value of~$ct$. |
|
627 |
This is the initial state for a goal-directed proof of~$\phi$. The rule |
|
628 |
checks that $ct$ has type~$prop$. |
|
629 |
||
630 |
\item[\ttindexbold{lift_rule} ($state$, $i$) $rule$] \index{lifting} |
|
631 |
prepares $rule$ for resolution by lifting it over the parameters and |
|
632 |
assumptions of subgoal~$i$ of~$state$. |
|
633 |
||
634 |
\item[\ttindexbold{rename_params_rule} ({\it names}, {\it i}) $thm$] |
|
635 |
uses the $names$ to rename the parameters of premise~$i$ of $thm$. The |
|
636 |
names must be distinct. If there are fewer names than parameters, then the |
|
637 |
rule renames the innermost parameters and may modify the remaining ones to |
|
638 |
ensure that all the parameters are distinct. |
|
639 |
\index{parameters!renaming} |
|
640 |
||
641 |
\item[\ttindexbold{rewrite_cterm} $defs$ $ct$] |
|
642 |
transforms $ct$ to $ct'$ by repeatedly applying $defs$ as rewrite rules; it |
|
643 |
returns the conclusion~$ct\equiv ct'$. This underlies the meta-rewriting |
|
644 |
tactics and rules. |
|
326 | 645 |
\index{meta-rewriting!in terms} |
104 | 646 |
|
647 |
\item[\ttindexbold{flexflex_rule} $thm$] \index{flex-flex constraints} |
|
648 |
removes all flex-flex pairs from $thm$ using the trivial unifier. |
|
326 | 649 |
\end{ttdescription} |
104 | 650 |
\index{theorems|)} |
651 |
\index{meta-rules|)} |