doc-src/IsarOverview/Isar/document/Logic.tex
author wenzelm
Mon, 29 Aug 2005 16:18:04 +0200
changeset 17184 3d80209e9a53
parent 17181 5f42dd5e6570
child 17187 45bee2f6e61f
permissions -rw-r--r--
use AList operations;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
     1
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
     2
\begin{isabellebody}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
     3
\def\isabellecontext{Logic}%
17181
5f42dd5e6570 updated;
wenzelm
parents: 17175
diff changeset
     4
\isamarkupfalse%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
     5
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
     6
\isadelimtheory
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
     7
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
     8
\endisadelimtheory
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
     9
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    10
\isatagtheory
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    11
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    12
\endisatagtheory
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    13
{\isafoldtheory}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    14
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    15
\isadelimtheory
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    16
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    17
\endisadelimtheory
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    18
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    19
\isamarkupsection{Logic \label{sec:Logic}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    20
}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    21
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    22
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    23
\isamarkupsubsection{Propositional logic%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    24
}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    25
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    26
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    27
\isamarkupsubsubsection{Introduction rules%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    28
}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    29
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    30
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    31
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    32
We start with a really trivial toy proof to introduce the basic
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    33
features of structured proofs.%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    34
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    35
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    36
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    37
\ {\isachardoublequoteopen}A\ {\isasymlongrightarrow}\ A{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    38
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    39
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    40
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    41
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    42
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    43
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    44
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    45
\ {\isacharparenleft}rule\ impI{\isacharparenright}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    46
\ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    47
\ a{\isacharcolon}\ {\isachardoublequoteopen}A{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    48
\ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    49
\ {\isachardoublequoteopen}A{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    50
{\isacharparenleft}rule\ a{\isacharparenright}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    51
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    52
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    53
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    54
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    55
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    56
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    57
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    58
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    59
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    60
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    61
\noindent
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    62
The operational reading: the \isakeyword{assume}-\isakeyword{show}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    63
block proves \isa{A\ {\isasymLongrightarrow}\ A} (\isa{a} is a degenerate rule (no
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    64
assumptions) that proves \isa{A} outright), which rule
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    65
\isa{impI} (\isa{{\isacharparenleft}{\isacharquery}P\ {\isasymLongrightarrow}\ {\isacharquery}Q{\isacharparenright}\ {\isasymLongrightarrow}\ {\isacharquery}P\ {\isasymlongrightarrow}\ {\isacharquery}Q}) turns into the desired \isa{A\ {\isasymlongrightarrow}\ A}.  However, this text is much too detailed for comfort. Therefore
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    66
Isar implements the following principle: \begin{quote}\em Command
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    67
\isakeyword{proof} automatically tries to select an introduction rule
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    68
based on the goal and a predefined list of rules.  \end{quote} Here
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    69
\isa{impI} is applied automatically:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    70
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    71
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    72
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    73
\ {\isachardoublequoteopen}A\ {\isasymlongrightarrow}\ A{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    74
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    75
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    76
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    77
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    78
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    79
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    80
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    81
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    82
\ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    83
\ a{\isacharcolon}\ A\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    84
\ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    85
\ A\ \isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    86
{\isacharparenleft}rule\ a{\isacharparenright}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    87
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
    88
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    89
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    90
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    91
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    92
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    93
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
    94
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    95
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    96
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    97
\noindent Single-identifier formulae such as \isa{A} need not
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    98
be enclosed in double quotes. However, we will continue to do so for
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
    99
uniformity.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   100
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   101
Trivial proofs, in particular those by assumption, should be trivial
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   102
to perform. Proof ``.'' does just that (and a bit more). Thus
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   103
naming of assumptions is often superfluous:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   104
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   105
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   106
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   107
\ {\isachardoublequoteopen}A\ {\isasymlongrightarrow}\ A{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   108
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   109
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   110
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   111
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   112
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   113
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   114
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   115
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   116
\ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   117
\ {\isachardoublequoteopen}A{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   118
\ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   119
\ {\isachardoublequoteopen}A{\isachardoublequoteclose}\ \isacommand{{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   120
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   121
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   122
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   123
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   124
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   125
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   126
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   127
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   128
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   129
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   130
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   131
To hide proofs by assumption further, \isakeyword{by}\isa{{\isacharparenleft}method{\isacharparenright}}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   132
first applies \isa{method} and then tries to solve all remaining subgoals
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   133
by assumption:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   134
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   135
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   136
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   137
\ {\isachardoublequoteopen}A\ {\isasymlongrightarrow}\ A\ {\isasymand}\ A{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   138
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   139
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   140
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   141
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   142
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   143
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   144
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   145
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   146
\ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   147
\ {\isachardoublequoteopen}A{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   148
\ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   149
\ {\isachardoublequoteopen}A\ {\isasymand}\ A{\isachardoublequoteclose}\ \isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   150
{\isacharparenleft}rule\ conjI{\isacharparenright}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   151
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   152
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   153
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   154
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   155
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   156
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   157
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   158
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   159
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   160
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   161
\noindent Rule \isa{conjI} is of course \isa{{\isasymlbrakk}{\isacharquery}P{\isacharsemicolon}\ {\isacharquery}Q{\isasymrbrakk}\ {\isasymLongrightarrow}\ {\isacharquery}P\ {\isasymand}\ {\isacharquery}Q}.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   162
A drawback of implicit proofs by assumption is that it
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   163
is no longer obvious where an assumption is used.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   164
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   165
Proofs of the form \isakeyword{by}\isa{{\isacharparenleft}rule}~\emph{name}\isa{{\isacharparenright}}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   166
can be abbreviated to ``..''  if \emph{name} refers to one of the
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   167
predefined introduction rules (or elimination rules, see below):%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   168
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   169
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   170
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   171
\ {\isachardoublequoteopen}A\ {\isasymlongrightarrow}\ A\ {\isasymand}\ A{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   172
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   173
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   174
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   175
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   176
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   177
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   178
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   179
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   180
\ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   181
\ {\isachardoublequoteopen}A{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   182
\ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   183
\ {\isachardoublequoteopen}A\ {\isasymand}\ A{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   184
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   185
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   186
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   187
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   188
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   189
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   190
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   191
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   192
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   193
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   194
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   195
\noindent
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   196
This is what happens: first the matching introduction rule \isa{conjI}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   197
is applied (first ``.''), then the two subgoals are solved by assumption
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   198
(second ``.'').%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   199
\end{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   200
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   201
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   202
\isamarkupsubsubsection{Elimination rules%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   203
}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   204
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   205
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   206
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   207
A typical elimination rule is \isa{conjE}, $\land$-elimination:
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   208
\begin{isabelle}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   209
\ \ \ \ \ {\isasymlbrakk}{\isacharquery}P\ {\isasymand}\ {\isacharquery}Q{\isacharsemicolon}\ {\isasymlbrakk}{\isacharquery}P{\isacharsemicolon}\ {\isacharquery}Q{\isasymrbrakk}\ {\isasymLongrightarrow}\ {\isacharquery}R{\isasymrbrakk}\ {\isasymLongrightarrow}\ {\isacharquery}R%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   210
\end{isabelle}  In the following proof it is applied
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   211
by hand, after its first (\emph{major}) premise has been eliminated via
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   212
\isa{{\isacharbrackleft}OF\ AB{\isacharbrackright}}:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   213
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   214
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   215
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   216
\ {\isachardoublequoteopen}A\ {\isasymand}\ B\ {\isasymlongrightarrow}\ B\ {\isasymand}\ A{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   217
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   218
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   219
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   220
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   221
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   222
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   223
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   224
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   225
\ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   226
\ AB{\isacharcolon}\ {\isachardoublequoteopen}A\ {\isasymand}\ B{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   227
\ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   228
\ {\isachardoublequoteopen}B\ {\isasymand}\ A{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   229
\ \ \isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   230
\ {\isacharparenleft}rule\ conjE{\isacharbrackleft}OF\ AB{\isacharbrackright}{\isacharparenright}\ \ %
16459
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
   231
\isamarkupcmt{\isa{conjE{\isacharbrackleft}OF\ AB{\isacharbrackright}}: \isa{{\isacharparenleft}{\isasymlbrakk}A{\isacharsemicolon}\ B{\isasymrbrakk}\ {\isasymLongrightarrow}\ {\isacharquery}R{\isacharparenright}\ {\isasymLongrightarrow}\ {\isacharquery}R}%
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
   232
}
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
   233
\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   234
\ \ \ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   235
\ {\isachardoublequoteopen}A{\isachardoublequoteclose}\ {\isachardoublequoteopen}B{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   236
\ \ \ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   237
\ {\isacharquery}thesis\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   238
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   239
\ \ \isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   240
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   241
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   242
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   243
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   244
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   245
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   246
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   247
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   248
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   249
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   250
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   251
\noindent Note that the term \isa{{\isacharquery}thesis} always stands for the
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   252
``current goal'', i.e.\ the enclosing \isakeyword{show} (or
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   253
\isakeyword{have}) statement.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   254
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   255
This is too much proof text. Elimination rules should be selected
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   256
automatically based on their major premise, the formula or rather connective
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   257
to be eliminated. In Isar they are triggered by facts being fed
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   258
\emph{into} a proof. Syntax:
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   259
\begin{center}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   260
\isakeyword{from} \emph{fact} \isakeyword{show} \emph{proposition} \emph{proof}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   261
\end{center}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   262
where \emph{fact} stands for the name of a previously proved
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   263
proposition, e.g.\ an assumption, an intermediate result or some global
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   264
theorem, which may also be modified with \isa{OF} etc.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   265
The \emph{fact} is ``piped'' into the \emph{proof}, which can deal with it
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   266
how it chooses. If the \emph{proof} starts with a plain \isakeyword{proof},
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   267
an elimination rule (from a predefined list) is applied
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   268
whose first premise is solved by the \emph{fact}. Thus the proof above
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   269
is equivalent to the following one:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   270
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   271
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   272
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   273
\ {\isachardoublequoteopen}A\ {\isasymand}\ B\ {\isasymlongrightarrow}\ B\ {\isasymand}\ A{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   274
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   275
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   276
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   277
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   278
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   279
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   280
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   281
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   282
\ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   283
\ AB{\isacharcolon}\ {\isachardoublequoteopen}A\ {\isasymand}\ B{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   284
\ \ \isacommand{from}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   285
\ AB\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   286
\ {\isachardoublequoteopen}B\ {\isasymand}\ A{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   287
\ \ \isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   288
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   289
\ \ \ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   290
\ {\isachardoublequoteopen}A{\isachardoublequoteclose}\ {\isachardoublequoteopen}B{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   291
\ \ \ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   292
\ {\isacharquery}thesis\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   293
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   294
\ \ \isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   295
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   296
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   297
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   298
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   299
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   300
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   301
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   302
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   303
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   304
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   305
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   306
Now we come to a second important principle:
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   307
\begin{quote}\em
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   308
Try to arrange the sequence of propositions in a UNIX-like pipe,
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   309
such that the proof of each proposition builds on the previous proposition.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   310
\end{quote}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   311
The previous proposition can be referred to via the fact \isa{this}.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   312
This greatly reduces the need for explicit naming of propositions:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   313
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   314
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   315
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   316
\ {\isachardoublequoteopen}A\ {\isasymand}\ B\ {\isasymlongrightarrow}\ B\ {\isasymand}\ A{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   317
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   318
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   319
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   320
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   321
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   322
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   323
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   324
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   325
\ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   326
\ {\isachardoublequoteopen}A\ {\isasymand}\ B{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   327
\ \ \isacommand{from}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   328
\ this\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   329
\ {\isachardoublequoteopen}B\ {\isasymand}\ A{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   330
\ \ \isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   331
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   332
\ \ \ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   333
\ {\isachardoublequoteopen}A{\isachardoublequoteclose}\ {\isachardoublequoteopen}B{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   334
\ \ \ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   335
\ {\isacharquery}thesis\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   336
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   337
\ \ \isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   338
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   339
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   340
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   341
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   342
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   343
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   344
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   345
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   346
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   347
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   348
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   349
\noindent Because of the frequency of \isakeyword{from}~\isa{this}, Isar provides two abbreviations:
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   350
\begin{center}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   351
\begin{tabular}{r@ {\quad=\quad}l}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   352
\isakeyword{then} & \isakeyword{from} \isa{this} \\
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   353
\isakeyword{thus} & \isakeyword{then} \isakeyword{show}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   354
\end{tabular}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   355
\end{center}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   356
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   357
Here is an alternative proof that operates purely by forward reasoning:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   358
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   359
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   360
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   361
\ {\isachardoublequoteopen}A\ {\isasymand}\ B\ {\isasymlongrightarrow}\ B\ {\isasymand}\ A{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   362
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   363
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   364
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   365
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   366
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   367
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   368
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   369
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   370
\ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   371
\ ab{\isacharcolon}\ {\isachardoublequoteopen}A\ {\isasymand}\ B{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   372
\ \ \isacommand{from}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   373
\ ab\ \isacommand{have}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   374
\ a{\isacharcolon}\ {\isachardoublequoteopen}A{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   375
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   376
\ \ \isacommand{from}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   377
\ ab\ \isacommand{have}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   378
\ b{\isacharcolon}\ {\isachardoublequoteopen}B{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   379
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   380
\ \ \isacommand{from}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   381
\ b\ a\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   382
\ {\isachardoublequoteopen}B\ {\isasymand}\ A{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   383
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   384
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   385
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   386
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   387
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   388
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   389
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   390
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   391
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   392
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   393
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   394
\noindent It is worth examining this text in detail because it
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   395
exhibits a number of new concepts.  For a start, it is the first time
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   396
we have proved intermediate propositions (\isakeyword{have}) on the
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   397
way to the final \isakeyword{show}. This is the norm in nontrivial
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   398
proofs where one cannot bridge the gap between the assumptions and the
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   399
conclusion in one step. To understand how the proof works we need to
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   400
explain more Isar details.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   401
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   402
Method \isa{rule} can be given a list of rules, in which case
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   403
\isa{{\isacharparenleft}rule}~\textit{rules}\isa{{\isacharparenright}} applies the first matching
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   404
rule in the list \textit{rules}. Command \isakeyword{from} can be
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   405
followed by any number of facts.  Given \isakeyword{from}~\isa{f}$_1$~\dots~\isa{f}$_n$, the proof step
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   406
\isa{{\isacharparenleft}rule}~\textit{rules}\isa{{\isacharparenright}} following a \isakeyword{have}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   407
or \isakeyword{show} searches \textit{rules} for a rule whose first
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   408
$n$ premises can be proved by \isa{f}$_1$~\dots~\isa{f}$_n$ in the
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   409
given order. Finally one needs to know that ``..'' is short for
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   410
\isa{by{\isacharparenleft}rule}~\textit{elim-rules intro-rules}\isa{{\isacharparenright}} (or
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   411
\isa{by{\isacharparenleft}rule}~\textit{intro-rules}\isa{{\isacharparenright}} if there are no facts
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   412
fed into the proof), i.e.\ elimination rules are tried before
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   413
introduction rules.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   414
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   415
Thus in the above proof both \isakeyword{have}s are proved via
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   416
\isa{conjE} triggered by \isakeyword{from}~\isa{ab} whereas
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   417
in the \isakeyword{show} step no elimination rule is applicable and
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   418
the proof succeeds with \isa{conjI}. The latter would fail had
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   419
we written \isakeyword{from}~\isa{a\ b} instead of
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   420
\isakeyword{from}~\isa{b\ a}.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   421
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   422
Proofs starting with a plain \isa{proof} behave the same because the
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   423
latter is short for \isa{proof\ {\isacharparenleft}rule}~\textit{elim-rules
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   424
intro-rules}\isa{{\isacharparenright}} (or \isa{proof\ {\isacharparenleft}rule}~\textit{intro-rules}\isa{{\isacharparenright}} if there are no facts fed into
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   425
the proof).%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   426
\end{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   427
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   428
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   429
\isamarkupsubsection{More constructs%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   430
}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   431
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   432
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   433
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   434
In the previous proof of \isa{A\ {\isasymand}\ B\ {\isasymlongrightarrow}\ B\ {\isasymand}\ A} we needed to feed
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   435
more than one fact into a proof step, a frequent situation. Then the
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   436
UNIX-pipe model appears to break down and we need to name the different
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   437
facts to refer to them. But this can be avoided:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   438
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   439
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   440
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   441
\ {\isachardoublequoteopen}A\ {\isasymand}\ B\ {\isasymlongrightarrow}\ B\ {\isasymand}\ A{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   442
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   443
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   444
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   445
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   446
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   447
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   448
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   449
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   450
\ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   451
\ ab{\isacharcolon}\ {\isachardoublequoteopen}A\ {\isasymand}\ B{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   452
\ \ \isacommand{from}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   453
\ ab\ \isacommand{have}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   454
\ {\isachardoublequoteopen}B{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   455
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   456
\ \ \isacommand{moreover}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   457
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   458
\ \ \isacommand{from}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   459
\ ab\ \isacommand{have}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   460
\ {\isachardoublequoteopen}A{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   461
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   462
\ \ \isacommand{ultimately}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   463
\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   464
\ {\isachardoublequoteopen}B\ {\isasymand}\ A{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   465
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   466
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   467
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   468
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   469
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   470
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   471
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   472
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   473
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   474
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   475
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   476
\noindent You can combine any number of facts \isa{A{\isadigit{1}}} \dots\ \isa{An} into a sequence by separating their proofs with
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   477
\isakeyword{moreover}. After the final fact, \isakeyword{ultimately} stands
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   478
for \isakeyword{from}~\isa{A{\isadigit{1}}}~\dots~\isa{An}.  This avoids having to
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   479
introduce names for all of the sequence elements.%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   480
\end{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   481
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   482
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   483
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   484
Although we have only seen a few introduction and elimination rules so
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   485
far, Isar's predefined rules include all the usual natural deduction
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   486
rules. We conclude our exposition of propositional logic with an extended
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   487
example --- which rules are used implicitly where?%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   488
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   489
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   490
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   491
\ {\isachardoublequoteopen}{\isasymnot}\ {\isacharparenleft}A\ {\isasymand}\ B{\isacharparenright}\ {\isasymlongrightarrow}\ {\isasymnot}\ A\ {\isasymor}\ {\isasymnot}\ B{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   492
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   493
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   494
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   495
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   496
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   497
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   498
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   499
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   500
\ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   501
\ n{\isacharcolon}\ {\isachardoublequoteopen}{\isasymnot}\ {\isacharparenleft}A\ {\isasymand}\ B{\isacharparenright}{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   502
\ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   503
\ {\isachardoublequoteopen}{\isasymnot}\ A\ {\isasymor}\ {\isasymnot}\ B{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   504
\ \ \isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   505
\ {\isacharparenleft}rule\ ccontr{\isacharparenright}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   506
\ \ \ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   507
\ nn{\isacharcolon}\ {\isachardoublequoteopen}{\isasymnot}\ {\isacharparenleft}{\isasymnot}\ A\ {\isasymor}\ {\isasymnot}\ B{\isacharparenright}{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   508
\ \ \ \ \isacommand{have}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   509
\ {\isachardoublequoteopen}{\isasymnot}\ A{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   510
\ \ \ \ \isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   511
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   512
\ \ \ \ \ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   513
\ {\isachardoublequoteopen}A{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   514
\ \ \ \ \ \ \isacommand{have}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   515
\ {\isachardoublequoteopen}{\isasymnot}\ B{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   516
\ \ \ \ \ \ \isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   517
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   518
\ \ \ \ \ \ \ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   519
\ {\isachardoublequoteopen}B{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   520
\ \ \ \ \ \ \ \ \isacommand{have}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   521
\ {\isachardoublequoteopen}A\ {\isasymand}\ B{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   522
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   523
\ \ \ \ \ \ \ \ \isacommand{with}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   524
\ n\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   525
\ False\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   526
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   527
\ \ \ \ \ \ \isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   528
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   529
\ \ \ \ \ \ \isacommand{hence}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   530
\ {\isachardoublequoteopen}{\isasymnot}\ A\ {\isasymor}\ {\isasymnot}\ B{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   531
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   532
\ \ \ \ \ \ \isacommand{with}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   533
\ nn\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   534
\ False\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   535
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   536
\ \ \ \ \isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   537
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   538
\ \ \ \ \isacommand{hence}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   539
\ {\isachardoublequoteopen}{\isasymnot}\ A\ {\isasymor}\ {\isasymnot}\ B{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   540
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   541
\ \ \ \ \isacommand{with}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   542
\ nn\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   543
\ False\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   544
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   545
\ \ \isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   546
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   547
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   548
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   549
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   550
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   551
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   552
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   553
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   554
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   555
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   556
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   557
\noindent
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   558
Rule \isa{ccontr} (``classical contradiction'') is
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   559
\isa{{\isacharparenleft}{\isasymnot}\ P\ {\isasymLongrightarrow}\ False{\isacharparenright}\ {\isasymLongrightarrow}\ P}.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   560
Apart from demonstrating the strangeness of classical
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   561
arguments by contradiction, this example also introduces two new
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   562
abbreviations:
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   563
\begin{center}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   564
\begin{tabular}{l@ {\quad=\quad}l}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   565
\isakeyword{hence} & \isakeyword{then} \isakeyword{have} \\
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   566
\isakeyword{with}~\emph{facts} &
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   567
\isakeyword{from}~\emph{facts} \isa{this}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   568
\end{tabular}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   569
\end{center}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   570
\end{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   571
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   572
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   573
\isamarkupsubsection{Avoiding duplication%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   574
}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   575
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   576
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   577
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   578
So far our examples have been a bit unnatural: normally we want to
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   579
prove rules expressed with \isa{{\isasymLongrightarrow}}, not \isa{{\isasymlongrightarrow}}. Here is an example:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   580
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   581
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   582
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   583
\ {\isachardoublequoteopen}A\ {\isasymand}\ B\ {\isasymLongrightarrow}\ B\ {\isasymand}\ A{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   584
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   585
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   586
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   587
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   588
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   589
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   590
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   591
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   592
\ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   593
\ {\isachardoublequoteopen}A\ {\isasymand}\ B{\isachardoublequoteclose}\ \isacommand{thus}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   594
\ {\isachardoublequoteopen}B{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   595
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   596
\isacommand{next}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   597
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   598
\ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   599
\ {\isachardoublequoteopen}A\ {\isasymand}\ B{\isachardoublequoteclose}\ \isacommand{thus}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   600
\ {\isachardoublequoteopen}A{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   601
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   602
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   603
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   604
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   605
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   606
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   607
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   608
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   609
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   610
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   611
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   612
\noindent The \isakeyword{proof} always works on the conclusion,
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   613
\isa{B\ {\isasymand}\ A} in our case, thus selecting $\land$-introduction. Hence
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   614
we must show \isa{B} and \isa{A}; both are proved by
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   615
$\land$-elimination and the proofs are separated by \isakeyword{next}:
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   616
\begin{description}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   617
\item[\isakeyword{next}] deals with multiple subgoals. For example,
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   618
when showing \isa{A\ {\isasymand}\ B} we need to show both \isa{A} and \isa{B}.  Each subgoal is proved separately, in \emph{any} order. The
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   619
individual proofs are separated by \isakeyword{next}.  \footnote{Each
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   620
\isakeyword{show} must prove one of the pending subgoals.  If a
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   621
\isakeyword{show} matches multiple subgoals, e.g.\ if the subgoals
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   622
contain ?-variables, the first one is proved. Thus the order in which
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   623
the subgoals are proved can matter --- see
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   624
\S\ref{sec:CaseDistinction} for an example.}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   625
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   626
Strictly speaking \isakeyword{next} is only required if the subgoals
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   627
are proved in different assumption contexts which need to be
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   628
separated, which is not the case above. For clarity we
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   629
have employed \isakeyword{next} anyway and will continue to do so.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   630
\end{description}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   631
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   632
This is all very well as long as formulae are small. Let us now look at some
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   633
devices to avoid repeating (possibly large) formulae. A very general method
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   634
is pattern matching:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   635
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   636
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   637
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   638
\ {\isachardoublequoteopen}large{\isacharunderscore}A\ {\isasymand}\ large{\isacharunderscore}B\ {\isasymLongrightarrow}\ large{\isacharunderscore}B\ {\isasymand}\ large{\isacharunderscore}A{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   639
\ \ \ \ \ \ {\isacharparenleft}\isakeyword{is}\ {\isachardoublequoteopen}{\isacharquery}AB\ {\isasymLongrightarrow}\ {\isacharquery}B\ {\isasymand}\ {\isacharquery}A{\isachardoublequoteclose}{\isacharparenright}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   640
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   641
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   642
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   643
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   644
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   645
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   646
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   647
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   648
\ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   649
\ {\isachardoublequoteopen}{\isacharquery}AB{\isachardoublequoteclose}\ \isacommand{thus}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   650
\ {\isachardoublequoteopen}{\isacharquery}B{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   651
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   652
\isacommand{next}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   653
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   654
\ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   655
\ {\isachardoublequoteopen}{\isacharquery}AB{\isachardoublequoteclose}\ \isacommand{thus}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   656
\ {\isachardoublequoteopen}{\isacharquery}A{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   657
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   658
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   659
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   660
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   661
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   662
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   663
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   664
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   665
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   666
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   667
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   668
\noindent Any formula may be followed by
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   669
\isa{{\isacharparenleft}}\isakeyword{is}~\emph{pattern}\isa{{\isacharparenright}} which causes the pattern
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   670
to be matched against the formula, instantiating the \isa{{\isacharquery}}-variables in
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   671
the pattern. Subsequent uses of these variables in other terms causes
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   672
them to be replaced by the terms they stand for.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   673
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   674
We can simplify things even more by stating the theorem by means of the
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   675
\isakeyword{assumes} and \isakeyword{shows} elements which allow direct
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   676
naming of assumptions:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   677
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   678
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   679
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   680
\ \isakeyword{assumes}\ AB{\isacharcolon}\ {\isachardoublequoteopen}large{\isacharunderscore}A\ {\isasymand}\ large{\isacharunderscore}B{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   681
\ \ \isakeyword{shows}\ {\isachardoublequoteopen}large{\isacharunderscore}B\ {\isasymand}\ large{\isacharunderscore}A{\isachardoublequoteclose}\ {\isacharparenleft}\isakeyword{is}\ {\isachardoublequoteopen}{\isacharquery}B\ {\isasymand}\ {\isacharquery}A{\isachardoublequoteclose}{\isacharparenright}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   682
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   683
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   684
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   685
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   686
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   687
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   688
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   689
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   690
\ \ \isacommand{from}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   691
\ AB\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   692
\ {\isachardoublequoteopen}{\isacharquery}B{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   693
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   694
\isacommand{next}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   695
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   696
\ \ \isacommand{from}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   697
\ AB\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   698
\ {\isachardoublequoteopen}{\isacharquery}A{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   699
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   700
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   701
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   702
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   703
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   704
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   705
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   706
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   707
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   708
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   709
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   710
\noindent Note the difference between \isa{{\isacharquery}AB}, a term, and
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   711
\isa{AB}, a fact.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   712
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   713
Finally we want to start the proof with $\land$-elimination so we
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   714
don't have to perform it twice, as above. Here is a slick way to
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   715
achieve this:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   716
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   717
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   718
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   719
\ \isakeyword{assumes}\ AB{\isacharcolon}\ {\isachardoublequoteopen}large{\isacharunderscore}A\ {\isasymand}\ large{\isacharunderscore}B{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   720
\ \ \isakeyword{shows}\ {\isachardoublequoteopen}large{\isacharunderscore}B\ {\isasymand}\ large{\isacharunderscore}A{\isachardoublequoteclose}\ {\isacharparenleft}\isakeyword{is}\ {\isachardoublequoteopen}{\isacharquery}B\ {\isasymand}\ {\isacharquery}A{\isachardoublequoteclose}{\isacharparenright}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   721
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   722
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   723
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   724
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   725
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   726
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   727
\isacommand{using}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   728
\ AB\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   729
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   730
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   731
\ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   732
\ {\isachardoublequoteopen}{\isacharquery}A{\isachardoublequoteclose}\ {\isachardoublequoteopen}{\isacharquery}B{\isachardoublequoteclose}\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   733
\ {\isacharquery}thesis\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   734
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   735
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   736
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   737
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   738
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   739
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   740
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   741
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   742
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   743
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   744
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   745
\noindent Command \isakeyword{using} can appear before a proof
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   746
and adds further facts to those piped into the proof. Here \isa{AB}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   747
is the only such fact and it triggers $\land$-elimination. Another
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   748
frequent idiom is as follows:
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   749
\begin{center}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   750
\isakeyword{from} \emph{major-facts}~
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   751
\isakeyword{show} \emph{proposition}~
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   752
\isakeyword{using} \emph{minor-facts}~
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   753
\emph{proof}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   754
\end{center}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   755
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   756
Sometimes it is necessary to suppress the implicit application of rules in a
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   757
\isakeyword{proof}. For example \isakeyword{show}~\isa{A\ {\isasymor}\ B} would
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   758
trigger $\lor$-introduction, requiring us to prove \isa{A}. A simple
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   759
``\isa{{\isacharminus}}'' prevents this \emph{faux pas}:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   760
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   761
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   762
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   763
\ \isakeyword{assumes}\ AB{\isacharcolon}\ {\isachardoublequoteopen}A\ {\isasymor}\ B{\isachardoublequoteclose}\ \isakeyword{shows}\ {\isachardoublequoteopen}B\ {\isasymor}\ A{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   764
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   765
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   766
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   767
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   768
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   769
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   770
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   771
\ {\isacharminus}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   772
\ \ \isacommand{from}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   773
\ AB\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   774
\ {\isacharquery}thesis\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   775
\ \ \isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   776
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   777
\ \ \ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   778
\ A\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   779
\ {\isacharquery}thesis\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   780
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   781
\ \ \isacommand{next}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   782
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   783
\ \ \ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   784
\ B\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   785
\ {\isacharquery}thesis\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   786
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   787
\ \ \isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   788
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   789
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   790
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   791
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   792
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   793
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   794
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   795
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   796
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   797
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   798
\isamarkupsubsection{Predicate calculus%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   799
}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   800
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   801
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   802
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   803
Command \isakeyword{fix} introduces new local variables into a
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   804
proof. The pair \isakeyword{fix}-\isakeyword{show} corresponds to \isa{{\isasymAnd}}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   805
(the universal quantifier at the
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   806
meta-level) just like \isakeyword{assume}-\isakeyword{show} corresponds to
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   807
\isa{{\isasymLongrightarrow}}. Here is a sample proof, annotated with the rules that are
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   808
applied implicitly:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   809
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   810
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   811
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   812
\ \isakeyword{assumes}\ P{\isacharcolon}\ {\isachardoublequoteopen}{\isasymforall}x{\isachardot}\ P\ x{\isachardoublequoteclose}\ \isakeyword{shows}\ {\isachardoublequoteopen}{\isasymforall}x{\isachardot}\ P{\isacharparenleft}f\ x{\isacharparenright}{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   813
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   814
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   815
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   816
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   817
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   818
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   819
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   820
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ %
16459
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
   821
\isamarkupcmt{\isa{allI}: \isa{{\isacharparenleft}{\isasymAnd}x{\isachardot}\ {\isacharquery}P\ x{\isacharparenright}\ {\isasymLongrightarrow}\ {\isasymforall}x{\isachardot}\ {\isacharquery}P\ x}%
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
   822
}
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
   823
\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   824
\ \ \isacommand{fix}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   825
\ a\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   826
\ \ \isacommand{from}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   827
\ P\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   828
\ {\isachardoublequoteopen}P{\isacharparenleft}f\ a{\isacharparenright}{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   829
\ \ %
16459
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
   830
\isamarkupcmt{\isa{allE}: \isa{{\isasymlbrakk}{\isasymforall}x{\isachardot}\ {\isacharquery}P\ x{\isacharsemicolon}\ {\isacharquery}P\ {\isacharquery}x\ {\isasymLongrightarrow}\ {\isacharquery}R{\isasymrbrakk}\ {\isasymLongrightarrow}\ {\isacharquery}R}%
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
   831
}
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
   832
\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   833
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   834
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   835
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   836
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   837
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   838
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   839
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   840
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   841
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   842
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   843
\noindent Note that in the proof we have chosen to call the bound
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   844
variable \isa{a} instead of \isa{x} merely to show that the choice of
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   845
local names is irrelevant.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   846
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   847
Next we look at \isa{{\isasymexists}} which is a bit more tricky.%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   848
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   849
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   850
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   851
\ \isakeyword{assumes}\ Pf{\isacharcolon}\ {\isachardoublequoteopen}{\isasymexists}x{\isachardot}\ P{\isacharparenleft}f\ x{\isacharparenright}{\isachardoublequoteclose}\ \isakeyword{shows}\ {\isachardoublequoteopen}{\isasymexists}y{\isachardot}\ P\ y{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   852
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   853
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   854
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   855
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   856
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   857
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   858
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   859
\ {\isacharminus}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   860
\ \ \isacommand{from}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   861
\ Pf\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   862
\ {\isacharquery}thesis\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   863
\ \ \isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   864
\ \ \ \ \ \ \ \ \ \ \ \ \ \ %
16459
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
   865
\isamarkupcmt{\isa{exE}: \isa{{\isasymlbrakk}{\isasymexists}x{\isachardot}\ {\isacharquery}P\ x{\isacharsemicolon}\ {\isasymAnd}x{\isachardot}\ {\isacharquery}P\ x\ {\isasymLongrightarrow}\ {\isacharquery}Q{\isasymrbrakk}\ {\isasymLongrightarrow}\ {\isacharquery}Q}%
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
   866
}
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
   867
\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   868
\ \ \ \ \isacommand{fix}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   869
\ x\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   870
\ \ \ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   871
\ {\isachardoublequoteopen}P{\isacharparenleft}f\ x{\isacharparenright}{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   872
\ \ \ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   873
\ {\isacharquery}thesis\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   874
\ \ %
16459
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
   875
\isamarkupcmt{\isa{exI}: \isa{{\isacharquery}P\ {\isacharquery}x\ {\isasymLongrightarrow}\ {\isasymexists}x{\isachardot}\ {\isacharquery}P\ x}%
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
   876
}
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
   877
\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   878
\ \ \isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   879
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   880
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   881
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   882
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   883
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   884
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   885
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   886
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   887
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   888
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   889
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   890
\noindent Explicit $\exists$-elimination as seen above can become
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   891
cumbersome in practice.  The derived Isar language element
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   892
\isakeyword{obtain} provides a more appealing form of generalised
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   893
existence reasoning:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   894
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   895
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   896
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   897
\ \isakeyword{assumes}\ Pf{\isacharcolon}\ {\isachardoublequoteopen}{\isasymexists}x{\isachardot}\ P{\isacharparenleft}f\ x{\isacharparenright}{\isachardoublequoteclose}\ \isakeyword{shows}\ {\isachardoublequoteopen}{\isasymexists}y{\isachardot}\ P\ y{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   898
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   899
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   900
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   901
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   902
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   903
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   904
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   905
\ {\isacharminus}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   906
\ \ \isacommand{from}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   907
\ Pf\ \isacommand{obtain}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   908
\ x\ \isakeyword{where}\ {\isachardoublequoteopen}P{\isacharparenleft}f\ x{\isacharparenright}{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   909
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   910
\ \ \isacommand{thus}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   911
\ {\isachardoublequoteopen}{\isasymexists}y{\isachardot}\ P\ y{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   912
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   913
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   914
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   915
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   916
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   917
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   918
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   919
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   920
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   921
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   922
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   923
\noindent Note how the proof text follows the usual mathematical style
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   924
of concluding $P(x)$ from $\exists x. P(x)$, while carefully introducing $x$
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   925
as a new local variable.  Technically, \isakeyword{obtain} is similar to
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   926
\isakeyword{fix} and \isakeyword{assume} together with a soundness proof of
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   927
the elimination involved.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   928
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   929
Here is a proof of a well known tautology.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   930
Which rule is used where?%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   931
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   932
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   933
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   934
\ \isakeyword{assumes}\ ex{\isacharcolon}\ {\isachardoublequoteopen}{\isasymexists}x{\isachardot}\ {\isasymforall}y{\isachardot}\ P\ x\ y{\isachardoublequoteclose}\ \isakeyword{shows}\ {\isachardoublequoteopen}{\isasymforall}y{\isachardot}\ {\isasymexists}x{\isachardot}\ P\ x\ y{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   935
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   936
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   937
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   938
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   939
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   940
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   941
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   942
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   943
\ \ \isacommand{fix}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   944
\ y\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   945
\ \ \isacommand{from}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   946
\ ex\ \isacommand{obtain}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   947
\ x\ \isakeyword{where}\ {\isachardoublequoteopen}{\isasymforall}y{\isachardot}\ P\ x\ y{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   948
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   949
\ \ \isacommand{hence}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   950
\ {\isachardoublequoteopen}P\ x\ y{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   951
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   952
\ \ \isacommand{thus}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   953
\ {\isachardoublequoteopen}{\isasymexists}x{\isachardot}\ P\ x\ y{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   954
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   955
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   956
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   957
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   958
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   959
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   960
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   961
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   962
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   963
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   964
\isamarkupsubsection{Making bigger steps%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   965
}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   966
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   967
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   968
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   969
So far we have confined ourselves to single step proofs. Of course
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   970
powerful automatic methods can be used just as well. Here is an example,
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   971
Cantor's theorem that there is no surjective function from a set to its
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   972
powerset:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
   973
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   974
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   975
\isacommand{theorem}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   976
\ {\isachardoublequoteopen}{\isasymexists}S{\isachardot}\ S\ {\isasymnotin}\ range\ {\isacharparenleft}f\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ set{\isacharparenright}{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   977
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   978
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   979
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   980
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   981
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
   982
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   983
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   984
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   985
\ \ \isacommand{let}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   986
\ {\isacharquery}S\ {\isacharequal}\ {\isachardoublequoteopen}{\isacharbraceleft}x{\isachardot}\ x\ {\isasymnotin}\ f\ x{\isacharbraceright}{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   987
\ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   988
\ {\isachardoublequoteopen}{\isacharquery}S\ {\isasymnotin}\ range\ f{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   989
\ \ \isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   990
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   991
\ \ \ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   992
\ {\isachardoublequoteopen}{\isacharquery}S\ {\isasymin}\ range\ f{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   993
\ \ \ \ \isacommand{then}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   994
\ \isacommand{obtain}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   995
\ y\ \isakeyword{where}\ fy{\isacharcolon}\ {\isachardoublequoteopen}{\isacharquery}S\ {\isacharequal}\ f\ y{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   996
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   997
\ \ \ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   998
\ False\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
   999
\ \ \ \ \isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1000
\ cases\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1001
\ \ \ \ \ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1002
\ {\isachardoublequoteopen}y\ {\isasymin}\ {\isacharquery}S{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1003
\ \ \ \ \ \ \isacommand{with}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1004
\ fy\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1005
\ False\ \isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1006
\ blast\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1007
\ \ \ \ \isacommand{next}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1008
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1009
\ \ \ \ \ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1010
\ {\isachardoublequoteopen}y\ {\isasymnotin}\ {\isacharquery}S{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1011
\ \ \ \ \ \ \isacommand{with}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1012
\ fy\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1013
\ False\ \isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1014
\ blast\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1015
\ \ \ \ \isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1016
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1017
\ \ \isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1018
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1019
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1020
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1021
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1022
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1023
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1024
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1025
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1026
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1027
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1028
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1029
\noindent
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1030
For a start, the example demonstrates two new constructs:
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1031
\begin{itemize}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1032
\item \isakeyword{let} introduces an abbreviation for a term, in our case
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1033
the witness for the claim.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1034
\item Proof by \isa{cases} starts a proof by cases. Note that it remains
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1035
implicit what the two cases are: it is merely expected that the two subproofs
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1036
prove \isa{P\ {\isasymLongrightarrow}\ {\isacharquery}thesis} and \isa{{\isasymnot}P\ {\isasymLongrightarrow}\ {\isacharquery}thesis} (in that order)
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1037
for some \isa{P}.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1038
\end{itemize}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1039
If you wonder how to \isakeyword{obtain} \isa{y}:
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1040
via the predefined elimination rule \isa{{\isasymlbrakk}b\ {\isasymin}\ range\ f{\isacharsemicolon}\ {\isasymAnd}x{\isachardot}\ b\ {\isacharequal}\ f\ x\ {\isasymLongrightarrow}\ P{\isasymrbrakk}\ {\isasymLongrightarrow}\ P}.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1041
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1042
Method \isa{blast} is used because the contradiction does not follow easily
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1043
by just a single rule. If you find the proof too cryptic for human
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1044
consumption, here is a more detailed version; the beginning up to
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1045
\isakeyword{obtain} stays unchanged.%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1046
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1047
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1048
\isacommand{theorem}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1049
\ {\isachardoublequoteopen}{\isasymexists}S{\isachardot}\ S\ {\isasymnotin}\ range\ {\isacharparenleft}f\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ set{\isacharparenright}{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1050
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1051
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1052
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1053
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1054
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1055
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1056
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1057
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1058
\ \ \isacommand{let}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1059
\ {\isacharquery}S\ {\isacharequal}\ {\isachardoublequoteopen}{\isacharbraceleft}x{\isachardot}\ x\ {\isasymnotin}\ f\ x{\isacharbraceright}{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1060
\ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1061
\ {\isachardoublequoteopen}{\isacharquery}S\ {\isasymnotin}\ range\ f{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1062
\ \ \isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1063
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1064
\ \ \ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1065
\ {\isachardoublequoteopen}{\isacharquery}S\ {\isasymin}\ range\ f{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1066
\ \ \ \ \isacommand{then}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1067
\ \isacommand{obtain}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1068
\ y\ \isakeyword{where}\ fy{\isacharcolon}\ {\isachardoublequoteopen}{\isacharquery}S\ {\isacharequal}\ f\ y{\isachardoublequoteclose}\ \isacommand{{\isachardot}{\isachardot}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1069
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1070
\ \ \ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1071
\ False\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1072
\ \ \ \ \isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1073
\ cases\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1074
\ \ \ \ \ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1075
\ {\isachardoublequoteopen}y\ {\isasymin}\ {\isacharquery}S{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1076
\ \ \ \ \ \ \isacommand{hence}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1077
\ {\isachardoublequoteopen}y\ {\isasymnotin}\ f\ y{\isachardoublequoteclose}\ \ \ \isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1078
\ simp\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1079
\ \ \ \ \ \ \isacommand{hence}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1080
\ {\isachardoublequoteopen}y\ {\isasymnotin}\ {\isacharquery}S{\isachardoublequoteclose}\ \ \ \ \isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1081
{\isacharparenleft}simp\ add{\isacharcolon}fy{\isacharparenright}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1082
\ \ \ \ \ \ \isacommand{thus}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1083
\ False\ \ \ \ \ \ \ \ \ \isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1084
\ contradiction\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1085
\ \ \ \ \isacommand{next}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1086
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1087
\ \ \ \ \ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1088
\ {\isachardoublequoteopen}y\ {\isasymnotin}\ {\isacharquery}S{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1089
\ \ \ \ \ \ \isacommand{hence}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1090
\ {\isachardoublequoteopen}y\ {\isasymin}\ f\ y{\isachardoublequoteclose}\ \ \ \isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1091
\ simp\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1092
\ \ \ \ \ \ \isacommand{hence}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1093
\ {\isachardoublequoteopen}y\ {\isasymin}\ {\isacharquery}S{\isachardoublequoteclose}\ \ \ \ \isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1094
{\isacharparenleft}simp\ add{\isacharcolon}fy{\isacharparenright}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1095
\ \ \ \ \ \ \isacommand{thus}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1096
\ False\ \ \ \ \ \ \ \ \ \isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1097
\ contradiction\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1098
\ \ \ \ \isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1099
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1100
\ \ \isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1101
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1102
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1103
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1104
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1105
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1106
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1107
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1108
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1109
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1110
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1111
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1112
\noindent Method \isa{contradiction} succeeds if both $P$ and
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1113
$\neg P$ are among the assumptions and the facts fed into that step, in any order.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1114
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1115
As it happens, Cantor's theorem can be proved automatically by best-first
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1116
search. Depth-first search would diverge, but best-first search successfully
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1117
navigates through the large search space:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1118
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1119
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1120
\isacommand{theorem}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1121
\ {\isachardoublequoteopen}{\isasymexists}S{\isachardot}\ S\ {\isasymnotin}\ range\ {\isacharparenleft}f\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ set{\isacharparenright}{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1122
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1123
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1124
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1125
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1126
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1127
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1128
\isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1129
\ best%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1130
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1131
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1132
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1133
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1134
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1135
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1136
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1137
\isamarkupsubsection{Raw proof blocks%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1138
}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1139
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1140
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1141
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1142
Although we have shown how to employ powerful automatic methods like
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1143
\isa{blast} to achieve bigger proof steps, there may still be the
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1144
tendency to use the default introduction and elimination rules to
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1145
decompose goals and facts. This can lead to very tedious proofs:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1146
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1147
\isamarkuptrue%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1148
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1149
\isadelimML
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1150
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1151
\endisadelimML
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1152
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1153
\isatagML
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1154
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1155
\endisatagML
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1156
{\isafoldML}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1157
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1158
\isadelimML
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1159
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1160
\endisadelimML
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1161
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1162
\ {\isachardoublequoteopen}{\isasymforall}x\ y{\isachardot}\ A\ x\ y\ {\isasymand}\ B\ x\ y\ {\isasymlongrightarrow}\ C\ x\ y{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1163
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1164
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1165
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1166
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1167
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1168
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1169
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1170
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1171
\ \ \isacommand{fix}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1172
\ x\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1173
\ {\isachardoublequoteopen}{\isasymforall}y{\isachardot}\ A\ x\ y\ {\isasymand}\ B\ x\ y\ {\isasymlongrightarrow}\ C\ x\ y{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1174
\ \ \isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1175
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1176
\ \ \ \ \isacommand{fix}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1177
\ y\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1178
\ {\isachardoublequoteopen}A\ x\ y\ {\isasymand}\ B\ x\ y\ {\isasymlongrightarrow}\ C\ x\ y{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1179
\ \ \ \ \isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1180
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1181
\ \ \ \ \ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1182
\ {\isachardoublequoteopen}A\ x\ y\ {\isasymand}\ B\ x\ y{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1183
\ \ \ \ \ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1184
\ {\isachardoublequoteopen}C\ x\ y{\isachardoublequoteclose}\ \isacommand{sorry}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1185
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1186
\ \ \ \ \isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1187
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1188
\ \ \isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1189
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1190
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1191
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1192
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1193
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1194
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1195
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1196
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1197
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1198
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1199
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1200
\noindent Since we are only interested in the decomposition and not the
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1201
actual proof, the latter has been replaced by
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1202
\isakeyword{sorry}. Command \isakeyword{sorry} proves anything but is
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1203
only allowed in quick and dirty mode, the default interactive mode. It
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1204
is very convenient for top down proof development.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1205
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1206
Luckily we can avoid this step by step decomposition very easily:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1207
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1208
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1209
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1210
\ {\isachardoublequoteopen}{\isasymforall}x\ y{\isachardot}\ A\ x\ y\ {\isasymand}\ B\ x\ y\ {\isasymlongrightarrow}\ C\ x\ y{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1211
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1212
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1213
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1214
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1215
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1216
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1217
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1218
\ {\isacharminus}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1219
\ \ \isacommand{have}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1220
\ {\isachardoublequoteopen}{\isasymAnd}x\ y{\isachardot}\ {\isasymlbrakk}\ A\ x\ y{\isacharsemicolon}\ B\ x\ y\ {\isasymrbrakk}\ {\isasymLongrightarrow}\ C\ x\ y{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1221
\ \ \isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1222
\ {\isacharminus}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1223
\ \ \ \ \isacommand{fix}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1224
\ x\ y\ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1225
\ {\isachardoublequoteopen}A\ x\ y{\isachardoublequoteclose}\ {\isachardoublequoteopen}B\ x\ y{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1226
\ \ \ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1227
\ {\isachardoublequoteopen}C\ x\ y{\isachardoublequoteclose}\ \isacommand{sorry}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1228
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1229
\ \ \isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1230
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1231
\ \ \isacommand{thus}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1232
\ {\isacharquery}thesis\ \isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1233
\ blast\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1234
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1235
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1236
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1237
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1238
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1239
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1240
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1241
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1242
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1243
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1244
\noindent
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1245
This can be simplified further by \emph{raw proof blocks}, i.e.\
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1246
proofs enclosed in braces:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1247
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1248
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1249
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1250
\ {\isachardoublequoteopen}{\isasymforall}x\ y{\isachardot}\ A\ x\ y\ {\isasymand}\ B\ x\ y\ {\isasymlongrightarrow}\ C\ x\ y{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1251
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1252
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1253
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1254
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1255
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1256
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1257
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1258
\ {\isacharminus}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1259
\ \ \isacommand{{\isacharbraceleft}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1260
\ \isacommand{fix}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1261
\ x\ y\ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1262
\ {\isachardoublequoteopen}A\ x\ y{\isachardoublequoteclose}\ {\isachardoublequoteopen}B\ x\ y{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1263
\ \ \ \ \isacommand{have}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1264
\ {\isachardoublequoteopen}C\ x\ y{\isachardoublequoteclose}\ \isacommand{sorry}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1265
\ \isacommand{{\isacharbraceright}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1266
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1267
\ \ \isacommand{thus}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1268
\ {\isacharquery}thesis\ \isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1269
\ blast\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1270
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1271
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1272
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1273
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1274
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1275
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1276
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1277
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1278
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1279
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1280
\noindent The result of the raw proof block is the same theorem
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1281
as above, namely \isa{{\isasymAnd}x\ y{\isachardot}\ {\isasymlbrakk}A\ x\ y{\isacharsemicolon}\ B\ x\ y{\isasymrbrakk}\ {\isasymLongrightarrow}\ C\ x\ y}.  Raw
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1282
proof blocks are like ordinary proofs except that they do not prove
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1283
some explicitly stated property but that the property emerges directly
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1284
out of the \isakeyword{fixe}s, \isakeyword{assume}s and
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1285
\isakeyword{have} in the block. Thus they again serve to avoid
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1286
duplication. Note that the conclusion of a raw proof block is stated with
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1287
\isakeyword{have} rather than \isakeyword{show} because it is not the
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1288
conclusion of some pending goal but some independent claim.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1289
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1290
The general idea demonstrated in this subsection is very
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1291
important in Isar and distinguishes it from tactic-style proofs:
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1292
\begin{quote}\em
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1293
Do not manipulate the proof state into a particular form by applying
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1294
tactics but state the desired form explicitly and let the tactic verify
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1295
that from this form the original goal follows.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1296
\end{quote}
14617
a2bcb11ce445 Added case distinction proof pattern.
nipkow
parents: 13999
diff changeset
  1297
This yields more readable and also more robust proofs.
a2bcb11ce445 Added case distinction proof pattern.
nipkow
parents: 13999
diff changeset
  1298
a2bcb11ce445 Added case distinction proof pattern.
nipkow
parents: 13999
diff changeset
  1299
\subsubsection{General case distinctions}
a2bcb11ce445 Added case distinction proof pattern.
nipkow
parents: 13999
diff changeset
  1300
a2bcb11ce445 Added case distinction proof pattern.
nipkow
parents: 13999
diff changeset
  1301
As an important application of raw proof blocks we show how to deal
a2bcb11ce445 Added case distinction proof pattern.
nipkow
parents: 13999
diff changeset
  1302
with general case distinctions --- more specific kinds are treated in
a2bcb11ce445 Added case distinction proof pattern.
nipkow
parents: 13999
diff changeset
  1303
\S\ref{sec:CaseDistinction}. Imagine that you would like to prove some
a2bcb11ce445 Added case distinction proof pattern.
nipkow
parents: 13999
diff changeset
  1304
goal by distinguishing $n$ cases $P_1$, \dots, $P_n$. You show that
a2bcb11ce445 Added case distinction proof pattern.
nipkow
parents: 13999
diff changeset
  1305
the $n$ cases are exhaustive (i.e.\ $P_1 \lor \dots \lor P_n$) and
a2bcb11ce445 Added case distinction proof pattern.
nipkow
parents: 13999
diff changeset
  1306
that each case $P_i$ implies the goal. Taken together, this proves the
a2bcb11ce445 Added case distinction proof pattern.
nipkow
parents: 13999
diff changeset
  1307
goal. The corresponding Isar proof pattern (for $n = 3$) is very handy:%
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1308
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1309
\isamarkuptrue%
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1310
%
14617
a2bcb11ce445 Added case distinction proof pattern.
nipkow
parents: 13999
diff changeset
  1311
\renewcommand{\isamarkupcmt}[1]{#1}
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1312
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1313
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1314
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1315
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1316
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1317
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1318
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1319
\ {\isacharminus}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1320
\ \ \isacommand{have}\isamarkupfalse%
17181
5f42dd5e6570 updated;
wenzelm
parents: 17175
diff changeset
  1321
\ {\isachardoublequoteopen}P\isactrlisub {\isadigit{1}}\ {\isasymor}\ P\isactrlisub {\isadigit{2}}\ {\isasymor}\ P\isactrlisub {\isadigit{3}}{\isachardoublequoteclose}\ \ %
16459
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1322
\isamarkupcmt{\dots%
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1323
}
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1324
\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1325
\ \ \isacommand{moreover}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1326
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1327
\ \ \isacommand{{\isacharbraceleft}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1328
\ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1329
\ P\isactrlisub {\isadigit{1}}\isanewline
16459
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1330
\ \ \ \ %
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1331
\isamarkupcmt{\dots%
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1332
}
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1333
\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1334
\ \ \ \ \isacommand{have}\isamarkupfalse%
17181
5f42dd5e6570 updated;
wenzelm
parents: 17175
diff changeset
  1335
\ {\isacharquery}thesis\ \ %
16459
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1336
\isamarkupcmt{\dots%
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1337
}
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1338
\ \isacommand{{\isacharbraceright}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1339
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1340
\ \ \isacommand{moreover}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1341
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1342
\ \ \isacommand{{\isacharbraceleft}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1343
\ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1344
\ P\isactrlisub {\isadigit{2}}\isanewline
16459
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1345
\ \ \ \ %
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1346
\isamarkupcmt{\dots%
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1347
}
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1348
\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1349
\ \ \ \ \isacommand{have}\isamarkupfalse%
17181
5f42dd5e6570 updated;
wenzelm
parents: 17175
diff changeset
  1350
\ {\isacharquery}thesis\ \ %
16459
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1351
\isamarkupcmt{\dots%
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1352
}
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1353
\ \isacommand{{\isacharbraceright}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1354
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1355
\ \ \isacommand{moreover}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1356
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1357
\ \ \isacommand{{\isacharbraceleft}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1358
\ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1359
\ P\isactrlisub {\isadigit{3}}\isanewline
16459
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1360
\ \ \ \ %
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1361
\isamarkupcmt{\dots%
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1362
}
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1363
\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1364
\ \ \ \ \isacommand{have}\isamarkupfalse%
17181
5f42dd5e6570 updated;
wenzelm
parents: 17175
diff changeset
  1365
\ {\isacharquery}thesis\ \ %
16459
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1366
\isamarkupcmt{\dots%
7efee005e568 updated;
wenzelm
parents: 15909
diff changeset
  1367
}
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1368
\ \isacommand{{\isacharbraceright}}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1369
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1370
\ \ \isacommand{ultimately}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1371
\ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1372
\ {\isacharquery}thesis\ \isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1373
\ blast\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1374
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1375
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1376
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1377
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1378
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1379
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1380
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1381
\endisadelimproof
14617
a2bcb11ce445 Added case distinction proof pattern.
nipkow
parents: 13999
diff changeset
  1382
%
a2bcb11ce445 Added case distinction proof pattern.
nipkow
parents: 13999
diff changeset
  1383
\renewcommand{\isamarkupcmt}[1]{{\isastylecmt--- #1}}
a2bcb11ce445 Added case distinction proof pattern.
nipkow
parents: 13999
diff changeset
  1384
%
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1385
\isamarkupsubsection{Further refinements%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1386
}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1387
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1388
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1389
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1390
This subsection discusses some further tricks that can make
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1391
life easier although they are not essential.%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1392
\end{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1393
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1394
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1395
\isamarkupsubsubsection{\isakeyword{and}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1396
}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1397
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1398
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1399
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1400
Propositions (following \isakeyword{assume} etc) may but need not be
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1401
separated by \isakeyword{and}. This is not just for readability
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1402
(\isakeyword{from} \isa{A} \isakeyword{and} \isa{B} looks nicer than
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1403
\isakeyword{from} \isa{A} \isa{B}) but for structuring lists of propositions
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1404
into possibly named blocks. In
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1405
\begin{center}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1406
\isakeyword{assume} \isa{A:} $A_1$ $A_2$ \isakeyword{and} \isa{B:} $A_3$
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1407
\isakeyword{and} $A_4$
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1408
\end{center}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1409
label \isa{A} refers to the list of propositions $A_1$ $A_2$ and
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1410
label \isa{B} to $A_3$.%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1411
\end{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1412
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1413
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1414
\isamarkupsubsubsection{\isakeyword{note}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1415
}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1416
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1417
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1418
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1419
If you want to remember intermediate fact(s) that cannot be
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1420
named directly, use \isakeyword{note}. For example the result of raw
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1421
proof block can be named by following it with
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1422
\isakeyword{note}~\isa{some{\isacharunderscore}name\ {\isacharequal}\ this}.  As a side effect,
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1423
\isa{this} is set to the list of facts on the right-hand side. You
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1424
can also say \isa{note\ some{\isacharunderscore}fact}, which simply sets \isa{this},
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1425
i.e.\ recalls \isa{some{\isacharunderscore}fact}, e.g.\ in a \isakeyword{moreover} sequence.%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1426
\end{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1427
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1428
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1429
\isamarkupsubsubsection{\isakeyword{fixes}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1430
}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1431
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1432
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1433
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1434
Sometimes it is necessary to decorate a proposition with type
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1435
constraints, as in Cantor's theorem above. These type constraints tend
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1436
to make the theorem less readable. The situation can be improved a
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1437
little by combining the type constraint with an outer \isa{{\isasymAnd}}:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1438
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1439
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1440
\isacommand{theorem}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1441
\ {\isachardoublequoteopen}{\isasymAnd}f\ {\isacharcolon}{\isacharcolon}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ set{\isachardot}\ {\isasymexists}S{\isachardot}\ S\ {\isasymnotin}\ range\ f{\isachardoublequoteclose}%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1442
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1443
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1444
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1445
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1446
\isatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1447
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1448
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1449
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1450
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1451
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1452
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1453
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1454
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1455
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1456
\noindent However, now \isa{f} is bound and we need a
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1457
\isakeyword{fix}~\isa{f} in the proof before we can refer to \isa{f}.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1458
This is avoided by \isakeyword{fixes}:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1459
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1460
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1461
\isacommand{theorem}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1462
\ \isakeyword{fixes}\ f\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ set{\isachardoublequoteclose}\ \isakeyword{shows}\ {\isachardoublequoteopen}{\isasymexists}S{\isachardot}\ S\ {\isasymnotin}\ range\ f{\isachardoublequoteclose}%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1463
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1464
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1465
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1466
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1467
\isatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1468
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1469
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1470
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1471
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1472
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1473
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1474
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1475
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1476
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1477
\noindent
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1478
Even better, \isakeyword{fixes} allows to introduce concrete syntax locally:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1479
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1480
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1481
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1482
\ comm{\isacharunderscore}mono{\isacharcolon}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1483
\ \ \isakeyword{fixes}\ r\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymRightarrow}\ bool{\isachardoublequoteclose}\ {\isacharparenleft}\isakeyword{infix}\ {\isachardoublequoteopen}{\isachargreater}{\isachardoublequoteclose}\ {\isadigit{6}}{\isadigit{0}}{\isacharparenright}\ \isakeyword{and}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1484
\ \ \ \ \ \ \ f\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}a{\isachardoublequoteclose}\ \ \ {\isacharparenleft}\isakeyword{infixl}\ {\isachardoublequoteopen}{\isacharplus}{\isacharplus}{\isachardoublequoteclose}\ {\isadigit{7}}{\isadigit{0}}{\isacharparenright}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1485
\ \ \isakeyword{assumes}\ comm{\isacharcolon}\ {\isachardoublequoteopen}{\isasymAnd}x\ y{\isacharcolon}{\isacharcolon}{\isacharprime}a{\isachardot}\ x\ {\isacharplus}{\isacharplus}\ y\ {\isacharequal}\ y\ {\isacharplus}{\isacharplus}\ x{\isachardoublequoteclose}\ \isakeyword{and}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1486
\ \ \ \ \ \ \ \ \ \ mono{\isacharcolon}\ {\isachardoublequoteopen}{\isasymAnd}x\ y\ z{\isacharcolon}{\isacharcolon}{\isacharprime}a{\isachardot}\ x\ {\isachargreater}\ y\ {\isasymLongrightarrow}\ x\ {\isacharplus}{\isacharplus}\ z\ {\isachargreater}\ y\ {\isacharplus}{\isacharplus}\ z{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1487
\ \ \isakeyword{shows}\ {\isachardoublequoteopen}x\ {\isachargreater}\ y\ {\isasymLongrightarrow}\ z\ {\isacharplus}{\isacharplus}\ x\ {\isachargreater}\ z\ {\isacharplus}{\isacharplus}\ y{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1488
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1489
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1490
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1491
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1492
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1493
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1494
\isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1495
{\isacharparenleft}simp\ add{\isacharcolon}\ comm\ mono{\isacharparenright}%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1496
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1497
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1498
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1499
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1500
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1501
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1502
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1503
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1504
\noindent The concrete syntax is dropped at the end of the proof and the
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1505
theorem becomes \begin{isabelle}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1506
{\isasymlbrakk}{\isasymAnd}x\ y{\isachardot}\ {\isacharquery}f\ x\ y\ {\isacharequal}\ {\isacharquery}f\ y\ x{\isacharsemicolon}\isanewline
14617
a2bcb11ce445 Added case distinction proof pattern.
nipkow
parents: 13999
diff changeset
  1507
\isaindent{\ }{\isasymAnd}x\ y\ z{\isachardot}\ {\isacharquery}r\ x\ y\ {\isasymLongrightarrow}\ {\isacharquery}r\ {\isacharparenleft}{\isacharquery}f\ x\ z{\isacharparenright}\ {\isacharparenleft}{\isacharquery}f\ y\ z{\isacharparenright}{\isacharsemicolon}\ {\isacharquery}r\ {\isacharquery}x\ {\isacharquery}y{\isasymrbrakk}\isanewline
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1508
{\isasymLongrightarrow}\ {\isacharquery}r\ {\isacharparenleft}{\isacharquery}f\ {\isacharquery}z\ {\isacharquery}x{\isacharparenright}\ {\isacharparenleft}{\isacharquery}f\ {\isacharquery}z\ {\isacharquery}y{\isacharparenright}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1509
\end{isabelle}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1510
\tweakskip%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1511
\end{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1512
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1513
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1514
\isamarkupsubsubsection{\isakeyword{obtain}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1515
}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1516
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1517
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1518
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1519
The \isakeyword{obtain} construct can introduce multiple
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1520
witnesses and propositions as in the following proof fragment:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1521
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1522
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1523
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1524
\ \isakeyword{assumes}\ A{\isacharcolon}\ {\isachardoublequoteopen}{\isasymexists}x\ y{\isachardot}\ P\ x\ y\ {\isasymand}\ Q\ x\ y{\isachardoublequoteclose}\ \isakeyword{shows}\ {\isachardoublequoteopen}R{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1525
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1526
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1527
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1528
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1529
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1530
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1531
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1532
\ {\isacharminus}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1533
\ \ \isacommand{from}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1534
\ A\ \isacommand{obtain}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1535
\ x\ y\ \isakeyword{where}\ P{\isacharcolon}\ {\isachardoublequoteopen}P\ x\ y{\isachardoublequoteclose}\ \isakeyword{and}\ Q{\isacharcolon}\ {\isachardoublequoteopen}Q\ x\ y{\isachardoublequoteclose}\ \ \isacommand{by}\isamarkupfalse%
17181
5f42dd5e6570 updated;
wenzelm
parents: 17175
diff changeset
  1536
\ blast%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1537
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1538
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1539
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1540
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1541
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1542
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1543
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1544
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1545
Remember also that one does not even need to start with a formula
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1546
containing \isa{{\isasymexists}} as we saw in the proof of Cantor's theorem.%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1547
\end{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1548
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1549
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1550
\isamarkupsubsubsection{Combining proof styles%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1551
}
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1552
\isamarkuptrue%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1553
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1554
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1555
Finally, whole ``scripts'' (tactic-based proofs in the style of
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1556
\cite{LNCS2283}) may appear in the leaves of the proof tree, although this is
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1557
best avoided.  Here is a contrived example:%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1558
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1559
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1560
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1561
\ {\isachardoublequoteopen}A\ {\isasymlongrightarrow}\ {\isacharparenleft}A\ {\isasymlongrightarrow}\ B{\isacharparenright}\ {\isasymlongrightarrow}\ B{\isachardoublequoteclose}\isanewline
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1562
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1563
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1564
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1565
\endisadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1566
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1567
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1568
\isacommand{proof}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1569
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1570
\ \ \isacommand{assume}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1571
\ a{\isacharcolon}\ {\isachardoublequoteopen}A{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1572
\ \ \isacommand{show}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1573
\ {\isachardoublequoteopen}{\isacharparenleft}A\ {\isasymlongrightarrow}B{\isacharparenright}\ {\isasymlongrightarrow}\ B{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1574
\ \ \ \ \isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1575
{\isacharparenleft}rule\ impI{\isacharparenright}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1576
\ \ \ \ \isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1577
{\isacharparenleft}erule\ impE{\isacharparenright}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1578
\ \ \ \ \isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1579
{\isacharparenleft}rule\ a{\isacharparenright}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1580
\ \ \ \ \isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1581
\ assumption\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1582
\ \ \ \ \isacommand{done}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1583
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1584
\isacommand{qed}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1585
%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1586
\endisatagproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1587
{\isafoldproof}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1588
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1589
\isadelimproof
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1590
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1591
\endisadelimproof
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1592
%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1593
\begin{isamarkuptext}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1594
\noindent You may need to resort to this technique if an
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1595
automatic step fails to prove the desired proposition.
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1596
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1597
When converting a proof from tactic-style into Isar you can proceed
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1598
in a top-down manner: parts of the proof can be left in script form
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1599
while the outer structure is already expressed in Isar.%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1600
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17125
diff changeset
  1601
\isamarkuptrue%
17125
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1602
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1603
\isadelimtheory
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1604
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1605
\endisadelimtheory
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1606
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1607
\isatagtheory
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1608
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1609
\endisatagtheory
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1610
{\isafoldtheory}%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1611
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1612
\isadelimtheory
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1613
%
e6a82d1a1829 updated;
wenzelm
parents: 16459
diff changeset
  1614
\endisadelimtheory
13999
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1615
\end{isabellebody}%
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1616
%%% Local Variables:
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1617
%%% mode: latex
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1618
%%% TeX-master: "root"
454a2ad0c381 IsarOverview moved one level up
kleing
parents:
diff changeset
  1619
%%% End: