doc-src/Ref/substitution.tex
author clasohm
Thu, 29 Jun 1995 12:28:27 +0200
changeset 1163 c080ff36d24e
parent 332 01b87a921967
child 2038 26b62963806c
permissions -rw-r--r--
changed 'chol' labels to 'hol'; added a few parentheses
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     1
%% $Id$
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     2
\chapter{Substitution Tactics} \label{substitution}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
     3
\index{tactics!substitution|(}\index{equality|(}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
     4
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     5
Replacing equals by equals is a basic form of reasoning.  Isabelle supports
332
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
     6
several kinds of equality reasoning.  {\bf Substitution} means replacing
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     7
free occurrences of~$t$ by~$u$ in a subgoal.  This is easily done, given an
332
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
     8
equality $t=u$, provided the logic possesses the appropriate rule.  The
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
     9
tactic {\tt hyp_subst_tac} performs substitution even in the assumptions.
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
    10
But it works via object-level implication, and therefore must be specially
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
    11
set up for each suitable object-logic.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    12
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    13
Substitution should not be confused with object-level {\bf rewriting}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    14
Given equalities of the form $t=u$, rewriting replaces instances of~$t$ by
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    15
corresponding instances of~$u$, and continues until it reaches a normal
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    16
form.  Substitution handles `one-off' replacements by particular
332
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
    17
equalities while rewriting handles general equations.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    18
Chapter~\ref{simp-chap} discusses Isabelle's rewriting tactics.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    19
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    20
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    21
\section{Substitution rules}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    22
\index{substitution!rules}\index{*subst theorem}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    23
Many logics include a substitution rule of the form
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    24
$$ \List{\Var{a}=\Var{b}; \Var{P}(\Var{a})} \Imp 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    25
   \Var{P}(\Var{b})  \eqno(subst)$$
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    26
In backward proof, this may seem difficult to use: the conclusion
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    27
$\Var{P}(\Var{b})$ admits far too many unifiers.  But, if the theorem {\tt
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    28
eqth} asserts $t=u$, then \hbox{\tt eqth RS subst} is the derived rule
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    29
\[ \Var{P}(t) \Imp \Var{P}(u). \]
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    30
Provided $u$ is not an unknown, resolution with this rule is
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    31
well-behaved.\footnote{Unifying $\Var{P}(u)$ with a formula~$Q$
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    32
expresses~$Q$ in terms of its dependence upon~$u$.  There are still $2^k$
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    33
unifiers, if $Q$ has $k$ occurrences of~$u$, but Isabelle ensures that
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    34
the first unifier includes all the occurrences.}  To replace $u$ by~$t$ in
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    35
subgoal~$i$, use
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    36
\begin{ttbox} 
332
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
    37
resolve_tac [eqth RS subst] \(i\){\it.}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    38
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    39
To replace $t$ by~$u$ in
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    40
subgoal~$i$, use
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    41
\begin{ttbox} 
332
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
    42
resolve_tac [eqth RS ssubst] \(i\){\it,}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    43
\end{ttbox}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    44
where \tdxbold{ssubst} is the `swapped' substitution rule
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    45
$$ \List{\Var{a}=\Var{b}; \Var{P}(\Var{b})} \Imp 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    46
   \Var{P}(\Var{a}).  \eqno(ssubst)$$
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    47
If \tdx{sym} denotes the symmetry rule
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    48
\(\Var{a}=\Var{b}\Imp\Var{b}=\Var{a}\), then {\tt ssubst} is just
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    49
\hbox{\tt sym RS subst}.  Many logics with equality include the rules {\tt
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    50
subst} and {\tt ssubst}, as well as {\tt refl}, {\tt sym} and {\tt trans}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    51
(for the usual equality laws).  Examples include {\tt FOL} and {\tt HOL},
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    52
but not {\tt CTT} (Constructive Type Theory).
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    53
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    54
Elim-resolution is well-behaved with assumptions of the form $t=u$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    55
To replace $u$ by~$t$ or $t$ by~$u$ in subgoal~$i$, use
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    56
\begin{ttbox} 
332
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
    57
eresolve_tac [subst] \(i\)    {\rm or}    eresolve_tac [ssubst] \(i\){\it.}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    58
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    59
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    60
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    61
\section{Substitution in the hypotheses}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    62
\index{assumptions!substitution in}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    63
Substitution rules, like other rules of natural deduction, do not affect
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    64
the assumptions.  This can be inconvenient.  Consider proving the subgoal
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    65
\[ \List{c=a; c=b} \Imp a=b. \]
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    66
Calling {\tt eresolve_tac\ts[ssubst]\ts\(i\)} simply discards the
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    67
assumption~$c=a$, since $c$ does not occur in~$a=b$.  Of course, we can
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    68
work out a solution.  First apply {\tt eresolve_tac\ts[subst]\ts\(i\)},
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    69
replacing~$a$ by~$c$:
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    70
\[ \List{c=b} \Imp c=b \]
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    71
Equality reasoning can be difficult, but this trivial proof requires
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    72
nothing more sophisticated than substitution in the assumptions.
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    73
Object-logics that include the rule~$(subst)$ provide tactics for this
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    74
purpose:
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    75
\begin{ttbox} 
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    76
hyp_subst_tac       : int -> tactic
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    77
bound_hyp_subst_tac : int -> tactic
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    78
\end{ttbox}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    79
\begin{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    80
\item[\ttindexbold{hyp_subst_tac} {\it i}] 
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    81
  selects an equality assumption of the form $t=u$ or $u=t$, where $t$ is a
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    82
  free variable or parameter.  Deleting this assumption, it replaces $t$
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    83
  by~$u$ throughout subgoal~$i$, including the other assumptions.
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    84
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    85
\item[\ttindexbold{bound_hyp_subst_tac} {\it i}] 
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    86
  is similar but only substitutes for parameters (bound variables).
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    87
  Uses for this are discussed below.
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    88
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    89
The term being replaced must be a free variable or parameter.  Substitution
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    90
for constants is usually unhelpful, since they may appear in other
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    91
theorems.  For instance, the best way to use the assumption $0=1$ is to
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    92
contradict a theorem that states $0\not=1$, rather than to replace 0 by~1
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    93
in the subgoal!
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    94
332
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
    95
Substitution for free variables is also unhelpful if they appear in the
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    96
premises of a rule being derived --- the substitution affects object-level
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    97
assumptions, not meta-level assumptions.  For instance, replacing~$a$
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    98
by~$b$ could make the premise~$P(a)$ worthless.  To avoid this problem, use
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    99
{\tt bound_hyp_subst_tac}; alternatively, call \ttindex{cut_facts_tac} to
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   100
insert the atomic premises as object-level assumptions.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   101
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   102
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   103
\section{Setting up {\tt hyp_subst_tac}} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   104
Many Isabelle object-logics, such as {\tt FOL}, {\tt HOL} and their
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   105
descendants, come with {\tt hyp_subst_tac} already defined.  A few others,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   106
such as {\tt CTT}, do not support this tactic because they lack the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   107
rule~$(subst)$.  When defining a new logic that includes a substitution
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   108
rule and implication, you must set up {\tt hyp_subst_tac} yourself.  It
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   109
is packaged as the \ML{} functor \ttindex{HypsubstFun}, which takes the
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   110
argument signature~{\tt HYPSUBST_DATA}:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   111
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   112
signature HYPSUBST_DATA =
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   113
  sig
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   114
  val subst      : thm
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   115
  val sym        : thm
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   116
  val rev_cut_eq : thm
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   117
  val imp_intr   : thm
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   118
  val rev_mp     : thm
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   119
  val dest_eq    : term -> term*term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   120
  end;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   121
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   122
Thus, the functor requires the following items:
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   123
\begin{ttdescription}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   124
\item[\tdxbold{subst}] should be the substitution rule
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   125
$\List{\Var{a}=\Var{b};\; \Var{P}(\Var{a})} \Imp \Var{P}(\Var{b})$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   126
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   127
\item[\tdxbold{sym}] should be the symmetry rule
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   128
$\Var{a}=\Var{b}\Imp\Var{b}=\Var{a}$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   129
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   130
\item[\tdxbold{rev_cut_eq}] should have the form
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   131
$\List{\Var{a}=\Var{b};\; \Var{a}=\Var{b}\Imp\Var{R}} \Imp \Var{R}$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   132
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   133
\item[\tdxbold{imp_intr}] should be the implies introduction
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   134
rule $(\Var{P}\Imp\Var{Q})\Imp \Var{P}\imp\Var{Q}$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   135
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   136
\item[\tdxbold{rev_mp}] should be the `reversed' implies elimination
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   137
rule $\List{\Var{P};  \;\Var{P}\imp\Var{Q}} \Imp \Var{Q}$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   138
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   139
\item[\ttindexbold{dest_eq}] should return the pair~$(t,u)$ when
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   140
applied to the \ML{} term that represents~$t=u$.  For other terms, it
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   141
should raise exception~\xdx{Match}.
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   142
\end{ttdescription}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   143
The functor resides in file {\tt Provers/hypsubst.ML} in the Isabelle
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   144
distribution directory.  It is not sensitive to the precise formalization
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   145
of the object-logic.  It is not concerned with the names of the equality
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   146
and implication symbols, or the types of formula and terms.  Coding the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   147
function {\tt dest_eq} requires knowledge of Isabelle's representation of
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   148
terms.  For {\tt FOL} it is defined by
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   149
\begin{ttbox} 
286
e7efbf03562b first draft of Springer book
lcp
parents: 148
diff changeset
   150
fun dest_eq (Const("Trueprop",_) $ (Const("op =",_)$t$u)) = (t,u)
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   151
\end{ttbox}
148
67d046de093e corrected trivial typo;
wenzelm
parents: 104
diff changeset
   152
Here {\tt Trueprop} is the coercion from type~$o$ to type~$prop$, while
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   153
\hbox{\tt op =} is the internal name of the infix operator~{\tt=}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   154
Pattern-matching expresses the function concisely, using wildcards~({\tt_})
332
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
   155
for the types.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   156
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   157
Here is how {\tt hyp_subst_tac} works.  Given a subgoal of the form
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   158
\[ \List{P@1; \cdots ; t=u; \cdots ; P@n} \Imp Q, \] it locates a suitable
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   159
equality assumption and moves it to the last position using elim-resolution
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   160
on {\tt rev_cut_eq} (possibly re-orienting it using~{\tt sym}):
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   161
\[ \List{P@1; \cdots ; P@n; t=u} \Imp Q \]
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   162
Using $n$ calls of {\tt eresolve_tac\ts[rev_mp]}, it creates the subgoal
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   163
\[ \List{t=u} \Imp P@1\imp \cdots \imp P@n \imp Q \]
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   164
By {\tt eresolve_tac\ts[ssubst]}, it replaces~$t$ by~$u$ throughout:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   165
\[ P'@1\imp \cdots \imp P'@n \imp Q' \]
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   166
Finally, using $n$ calls of \hbox{\tt resolve_tac\ts[imp_intr]}, it restores
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   167
$P'@1$, \ldots, $P'@n$ as assumptions:
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   168
\[ \List{P'@n; \cdots ; P'@1} \Imp Q' \]
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   169
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   170
\index{equality|)}\index{tactics!substitution|)}