doc-src/TutorialI/Types/document/Pairs.tex
author chaieb
Tue, 20 Sep 2005 10:36:33 +0200
changeset 17499 5274ecba8fea
parent 17187 45bee2f6e61f
child 26698 ca558202ffa5
permissions -rw-r--r--
algebra method added.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
     1
%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
     2
\begin{isabellebody}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
     3
\def\isabellecontext{Pairs}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     4
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     5
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     6
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     7
\endisadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     8
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     9
\isatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    10
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    11
\endisatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    12
{\isafoldtheory}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    13
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    14
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    15
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    16
\endisadelimtheory
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    17
%
11428
332347b9b942 tidying the index
paulson
parents: 11277
diff changeset
    18
\isamarkupsection{Pairs and Tuples%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    19
}
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    20
\isamarkuptrue%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    21
%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    22
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    23
\label{sec:products}
11428
332347b9b942 tidying the index
paulson
parents: 11277
diff changeset
    24
Ordered pairs were already introduced in \S\ref{sec:pairs}, but only with a minimal
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    25
repertoire of operations: pairing and the two projections \isa{fst} and
11149
e258b536a137 *** empty log message ***
nipkow
parents: 10950
diff changeset
    26
\isa{snd}. In any non-trivial application of pairs you will find that this
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    27
quickly leads to unreadable nests of projections. This
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    28
section introduces syntactic sugar to overcome this
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    29
problem: pattern matching with tuples.%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    30
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    31
\isamarkuptrue%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    32
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10824
diff changeset
    33
\isamarkupsubsection{Pattern Matching with Tuples%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    34
}
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    35
\isamarkuptrue%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    36
%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    37
\begin{isamarkuptext}%
10878
b254d5ad6dd4 auto update
paulson
parents: 10824
diff changeset
    38
Tuples may be used as patterns in $\lambda$-abstractions,
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    39
for example \isa{{\isasymlambda}{\isacharparenleft}x{\isacharcomma}y{\isacharcomma}z{\isacharparenright}{\isachardot}x{\isacharplus}y{\isacharplus}z} and \isa{{\isasymlambda}{\isacharparenleft}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isacharcomma}z{\isacharparenright}{\isachardot}x{\isacharplus}y{\isacharplus}z}. In fact,
10878
b254d5ad6dd4 auto update
paulson
parents: 10824
diff changeset
    40
tuple patterns can be used in most variable binding constructs,
b254d5ad6dd4 auto update
paulson
parents: 10824
diff changeset
    41
and they can be nested. Here are
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    42
some typical examples:
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    43
\begin{quote}
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    44
\isa{let\ {\isacharparenleft}x{\isacharcomma}\ y{\isacharparenright}\ {\isacharequal}\ f\ z\ in\ {\isacharparenleft}y{\isacharcomma}\ x{\isacharparenright}}\\
12699
deae80045527 *** empty log message ***
nipkow
parents: 12627
diff changeset
    45
\isa{case\ xs\ of\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymRightarrow}\ {\isadigit{0}}\ {\isacharbar}\ {\isacharparenleft}x{\isacharcomma}\ y{\isacharparenright}\ {\isacharhash}\ zs\ {\isasymRightarrow}\ x\ {\isacharplus}\ y}\\
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    46
\isa{{\isasymforall}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isasymin}A{\isachardot}\ x{\isacharequal}y}\\
10878
b254d5ad6dd4 auto update
paulson
parents: 10824
diff changeset
    47
\isa{{\isacharbraceleft}{\isacharparenleft}x{\isacharcomma}y{\isacharcomma}z{\isacharparenright}{\isachardot}\ x{\isacharequal}z{\isacharbraceright}}\\
14387
e96d5c42c4b0 Polymorphic treatment of binary arithmetic using axclasses
paulson
parents: 13791
diff changeset
    48
\isa{{\isasymUnion}\isactrlbsub {\isacharparenleft}x{\isacharcomma}\ y{\isacharparenright}{\isasymin}A\isactrlesub \ {\isacharbraceleft}x\ {\isacharplus}\ y{\isacharbraceright}}
11149
e258b536a137 *** empty log message ***
nipkow
parents: 10950
diff changeset
    49
\end{quote}
10878
b254d5ad6dd4 auto update
paulson
parents: 10824
diff changeset
    50
The intuitive meanings of these expressions should be obvious.
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    51
Unfortunately, we need to know in more detail what the notation really stands
10878
b254d5ad6dd4 auto update
paulson
parents: 10824
diff changeset
    52
for once we have to reason about it.  Abstraction
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    53
over pairs and tuples is merely a convenient shorthand for a more complex
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    54
internal representation.  Thus the internal and external form of a term may
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    55
differ, which can affect proofs. If you want to avoid this complication,
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    56
stick to \isa{fst} and \isa{snd} and write \isa{{\isasymlambda}p{\isachardot}\ fst\ p\ {\isacharplus}\ snd\ p}
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    57
instead of \isa{{\isasymlambda}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}\ x{\isacharplus}y}.  These terms are distinct even though they
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    58
denote the same function.
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    59
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    60
Internally, \isa{{\isasymlambda}{\isacharparenleft}x{\isacharcomma}\ y{\isacharparenright}{\isachardot}\ t} becomes \isa{split\ {\isacharparenleft}{\isasymlambda}x\ y{\isachardot}\ t{\isacharparenright}}, where
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    61
\cdx{split} is the uncurrying function of type \isa{{\isacharparenleft}{\isacharprime}a\ {\isasymRightarrow}\ {\isacharprime}b\ {\isasymRightarrow}\ {\isacharprime}c{\isacharparenright}\ {\isasymRightarrow}\ {\isacharprime}a\ {\isasymtimes}\ {\isacharprime}b\ {\isasymRightarrow}\ {\isacharprime}c} defined as
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    62
\begin{center}
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    63
\isa{split\ {\isasymequiv}\ {\isasymlambda}c\ p{\isachardot}\ c\ {\isacharparenleft}fst\ p{\isacharparenright}\ {\isacharparenleft}snd\ p{\isacharparenright}}
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    64
\hfill(\isa{split{\isacharunderscore}def})
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    65
\end{center}
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    66
Pattern matching in
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    67
other variable binding constructs is translated similarly. Thus we need to
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    68
understand how to reason about such constructs.%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    69
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    70
\isamarkuptrue%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    71
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10824
diff changeset
    72
\isamarkupsubsection{Theorem Proving%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    73
}
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    74
\isamarkuptrue%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    75
%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    76
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    77
The most obvious approach is the brute force expansion of \isa{split}:%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    78
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    79
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    80
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    81
\ {\isachardoublequoteopen}{\isacharparenleft}{\isasymlambda}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}x{\isacharparenright}\ p\ {\isacharequal}\ fst\ p{\isachardoublequoteclose}\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    82
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    83
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    84
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    85
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    86
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    87
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    88
\isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    89
{\isacharparenleft}simp\ add{\isacharcolon}\ split{\isacharunderscore}def{\isacharparenright}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    90
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    91
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    92
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    93
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    94
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    95
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    96
%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    97
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    98
This works well if rewriting with \isa{split{\isacharunderscore}def} finishes the
11149
e258b536a137 *** empty log message ***
nipkow
parents: 10950
diff changeset
    99
proof, as it does above.  But if it does not, you end up with exactly what
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   100
we are trying to avoid: nests of \isa{fst} and \isa{snd}. Thus this
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   101
approach is neither elegant nor very practical in large examples, although it
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   102
can be effective in small ones.
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   103
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   104
If we consider why this lemma presents a problem, 
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   105
we quickly realize that we need to replace the variable~\isa{p} by some pair \isa{{\isacharparenleft}a{\isacharcomma}\ b{\isacharparenright}}.  Then both sides of the
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   106
equation would simplify to \isa{a} by the simplification rules
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   107
\isa{split\ c\ {\isacharparenleft}a{\isacharcomma}\ b{\isacharparenright}\ {\isacharequal}\ c\ a\ b} and \isa{fst\ {\isacharparenleft}a{\isacharcomma}\ b{\isacharparenright}\ {\isacharequal}\ a}.  
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   108
To reason about tuple patterns requires some way of
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   109
converting a variable of product type into a pair.
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   110
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   111
In case of a subterm of the form \isa{split\ f\ p} this is easy: the split
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   112
rule \isa{split{\isacharunderscore}split} replaces \isa{p} by a pair:%
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   113
\index{*split (method)}%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   114
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   115
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   116
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   117
\ {\isachardoublequoteopen}{\isacharparenleft}{\isasymlambda}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}y{\isacharparenright}\ p\ {\isacharequal}\ snd\ p{\isachardoublequoteclose}\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   118
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   119
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   120
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   121
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   122
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   123
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   124
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   125
{\isacharparenleft}split\ split{\isacharunderscore}split{\isacharparenright}%
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   126
\begin{isamarkuptxt}%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   127
\begin{isabelle}%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   128
\ {\isadigit{1}}{\isachardot}\ {\isasymforall}x\ y{\isachardot}\ p\ {\isacharequal}\ {\isacharparenleft}x{\isacharcomma}\ y{\isacharparenright}\ {\isasymlongrightarrow}\ y\ {\isacharequal}\ snd\ p%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   129
\end{isabelle}
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   130
This subgoal is easily proved by simplification. Thus we could have combined
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   131
simplification and splitting in one command that proves the goal outright:%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   132
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   133
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   134
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   135
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   136
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   137
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   138
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   139
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   140
\endisadelimproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   141
%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   142
\isadelimproof
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   143
%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   144
\endisadelimproof
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   145
%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   146
\isatagproof
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   147
\isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   148
{\isacharparenleft}simp\ split{\isacharcolon}\ split{\isacharunderscore}split{\isacharparenright}%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   149
\endisatagproof
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   150
{\isafoldproof}%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   151
%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   152
\isadelimproof
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   153
%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   154
\endisadelimproof
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   155
%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   156
\begin{isamarkuptext}%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   157
Let us look at a second example:%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   158
\end{isamarkuptext}%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   159
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   160
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   161
\ {\isachardoublequoteopen}let\ {\isacharparenleft}x{\isacharcomma}y{\isacharparenright}\ {\isacharequal}\ p\ in\ fst\ p\ {\isacharequal}\ x{\isachardoublequoteclose}\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   162
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   163
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   164
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   165
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   166
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   167
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   168
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   169
{\isacharparenleft}simp\ only{\isacharcolon}\ Let{\isacharunderscore}def{\isacharparenright}%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   170
\begin{isamarkuptxt}%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   171
\begin{isabelle}%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   172
\ {\isadigit{1}}{\isachardot}\ {\isacharparenleft}{\isasymlambda}{\isacharparenleft}x{\isacharcomma}\ y{\isacharparenright}{\isachardot}\ fst\ p\ {\isacharequal}\ x{\isacharparenright}\ p%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   173
\end{isabelle}
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   174
A paired \isa{let} reduces to a paired $\lambda$-abstraction, which
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   175
can be split as above. The same is true for paired set comprehension:%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   176
\end{isamarkuptxt}%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   177
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   178
%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   179
\endisatagproof
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   180
{\isafoldproof}%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   181
%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   182
\isadelimproof
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   183
%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   184
\endisadelimproof
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   185
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   186
\ {\isachardoublequoteopen}p\ {\isasymin}\ {\isacharbraceleft}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}\ x{\isacharequal}y{\isacharbraceright}\ {\isasymlongrightarrow}\ fst\ p\ {\isacharequal}\ snd\ p{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   187
%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   188
\isadelimproof
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   189
%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   190
\endisadelimproof
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   191
%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   192
\isatagproof
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   193
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   194
\ simp%
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   195
\begin{isamarkuptxt}%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   196
\begin{isabelle}%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   197
\ {\isadigit{1}}{\isachardot}\ split\ op\ {\isacharequal}\ p\ {\isasymlongrightarrow}\ fst\ p\ {\isacharequal}\ snd\ p%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   198
\end{isabelle}
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   199
Again, simplification produces a term suitable for \isa{split{\isacharunderscore}split}
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   200
as above. If you are worried about the strange form of the premise:
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   201
\isa{{\isasymlambda}{\isacharparenleft}x{\isacharcomma}\ y{\isacharparenright}{\isachardot}\ x\ {\isacharequal}\ y} is short for \isa{{\isasymlambda}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}\ x{\isacharequal}y}.
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   202
The same proof procedure works for%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   203
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   204
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   205
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   206
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   207
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   208
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   209
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   210
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   211
\endisadelimproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   212
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   213
\ {\isachardoublequoteopen}p\ {\isasymin}\ {\isacharbraceleft}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}\ x{\isacharequal}y{\isacharbraceright}\ {\isasymLongrightarrow}\ fst\ p\ {\isacharequal}\ snd\ p{\isachardoublequoteclose}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   214
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   215
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   216
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   217
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   218
\isatagproof
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   219
%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   220
\begin{isamarkuptxt}%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   221
\noindent
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   222
except that we now have to use \isa{split{\isacharunderscore}split{\isacharunderscore}asm}, because
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   223
\isa{split} occurs in the assumptions.
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   224
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   225
However, splitting \isa{split} is not always a solution, as no \isa{split}
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   226
may be present in the goal. Consider the following function:%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   227
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   228
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   229
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   230
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   231
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   232
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   233
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   234
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   235
\endisadelimproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   236
\isacommand{consts}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   237
\ swap\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharprime}a\ {\isasymtimes}\ {\isacharprime}b\ {\isasymRightarrow}\ {\isacharprime}b\ {\isasymtimes}\ {\isacharprime}a{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   238
\isacommand{primrec}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   239
\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   240
\ \ {\isachardoublequoteopen}swap\ {\isacharparenleft}x{\isacharcomma}y{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}y{\isacharcomma}x{\isacharparenright}{\isachardoublequoteclose}%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   241
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   242
\noindent
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   243
Note that the above \isacommand{primrec} definition is admissible
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   244
because \isa{{\isasymtimes}} is a datatype. When we now try to prove%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   245
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   246
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   247
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   248
\ {\isachardoublequoteopen}swap{\isacharparenleft}swap\ p{\isacharparenright}\ {\isacharequal}\ p{\isachardoublequoteclose}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   249
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   250
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   251
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   252
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   253
\isatagproof
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   254
%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   255
\begin{isamarkuptxt}%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   256
\noindent
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   257
simplification will do nothing, because the defining equation for \isa{Pairs{\isachardot}swap}
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   258
expects a pair. Again, we need to turn \isa{p} into a pair first, but this
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   259
time there is no \isa{split} in sight. In this case the only thing we can do
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   260
is to split the term by hand:%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   261
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   262
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   263
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   264
{\isacharparenleft}case{\isacharunderscore}tac\ p{\isacharparenright}%
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   265
\begin{isamarkuptxt}%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   266
\noindent
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   267
\begin{isabelle}%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   268
\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}a\ b{\isachardot}\ p\ {\isacharequal}\ {\isacharparenleft}a{\isacharcomma}\ b{\isacharparenright}\ {\isasymLongrightarrow}\ Pairs{\isachardot}swap\ {\isacharparenleft}Pairs{\isachardot}swap\ p{\isacharparenright}\ {\isacharequal}\ p%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   269
\end{isabelle}
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   270
Again, \methdx{case_tac} is applicable because \isa{{\isasymtimes}} is a datatype.
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   271
The subgoal is easily proved by \isa{simp}.
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   272
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   273
Splitting by \isa{case{\isacharunderscore}tac} also solves the previous examples and may thus
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   274
appear preferable to the more arcane methods introduced first. However, see
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   275
the warning about \isa{case{\isacharunderscore}tac} in \S\ref{sec:struct-ind-case}.
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   276
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   277
In case the term to be split is a quantified variable, there are more options.
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   278
You can split \emph{all} \isa{{\isasymAnd}}-quantified variables in a goal
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   279
with the rewrite rule \isa{split{\isacharunderscore}paired{\isacharunderscore}all}:%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   280
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   281
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   282
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   283
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   284
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   285
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   286
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   287
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   288
\endisadelimproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   289
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   290
\ {\isachardoublequoteopen}{\isasymAnd}p\ q{\isachardot}\ swap{\isacharparenleft}swap\ p{\isacharparenright}\ {\isacharequal}\ q\ {\isasymlongrightarrow}\ p\ {\isacharequal}\ q{\isachardoublequoteclose}\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   291
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   292
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   293
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   294
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   295
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   296
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   297
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   298
{\isacharparenleft}simp\ only{\isacharcolon}\ split{\isacharunderscore}paired{\isacharunderscore}all{\isacharparenright}%
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   299
\begin{isamarkuptxt}%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   300
\noindent
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   301
\begin{isabelle}%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   302
\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}a\ b\ aa\ ba{\isachardot}\isanewline
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   303
\isaindent{\ {\isadigit{1}}{\isachardot}\ \ \ \ }Pairs{\isachardot}swap\ {\isacharparenleft}Pairs{\isachardot}swap\ {\isacharparenleft}a{\isacharcomma}\ b{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}aa{\isacharcomma}\ ba{\isacharparenright}\ {\isasymlongrightarrow}\isanewline
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   304
\isaindent{\ {\isadigit{1}}{\isachardot}\ \ \ \ }{\isacharparenleft}a{\isacharcomma}\ b{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}aa{\isacharcomma}\ ba{\isacharparenright}%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   305
\end{isabelle}%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   306
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   307
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   308
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   309
\ simp\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   310
\isacommand{done}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   311
%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   312
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   313
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   314
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   315
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   316
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   317
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   318
%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   319
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   320
\noindent
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   321
Note that we have intentionally included only \isa{split{\isacharunderscore}paired{\isacharunderscore}all}
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   322
in the first simplification step, and then we simplify again. 
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   323
This time the reason was not merely
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   324
pedagogical:
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   325
\isa{split{\isacharunderscore}paired{\isacharunderscore}all} may interfere with other functions
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   326
of the simplifier.
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   327
The following command could fail (here it does not)
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   328
where two separate \isa{simp} applications succeed.%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   329
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   330
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   331
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   332
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   333
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   334
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   335
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   336
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   337
\isacommand{apply}\isamarkupfalse%
17181
5f42dd5e6570 updated;
wenzelm
parents: 17175
diff changeset
   338
{\isacharparenleft}simp\ add{\isacharcolon}\ split{\isacharunderscore}paired{\isacharunderscore}all{\isacharparenright}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   339
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   340
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   341
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   342
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   343
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   344
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   345
%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   346
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   347
\noindent
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   348
Finally, the simplifier automatically splits all \isa{{\isasymforall}} and
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   349
\isa{{\isasymexists}}-quantified variables:%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   350
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   351
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   352
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   353
\ {\isachardoublequoteopen}{\isasymforall}p{\isachardot}\ {\isasymexists}q{\isachardot}\ swap\ p\ {\isacharequal}\ swap\ q{\isachardoublequoteclose}\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   354
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   355
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   356
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   357
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   358
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   359
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   360
\isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   361
\ simp%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   362
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   363
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   364
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   365
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   366
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   367
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   368
%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   369
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   370
\noindent
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   371
To turn off this automatic splitting, just disable the
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   372
responsible simplification rules:
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   373
\begin{center}
10654
458068404143 *** empty log message ***
nipkow
parents: 10608
diff changeset
   374
\isa{{\isacharparenleft}{\isasymforall}x{\isachardot}\ P\ x{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}{\isasymforall}a\ b{\isachardot}\ P\ {\isacharparenleft}a{\isacharcomma}\ b{\isacharparenright}{\isacharparenright}}
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   375
\hfill
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   376
(\isa{split{\isacharunderscore}paired{\isacharunderscore}All})\\
10654
458068404143 *** empty log message ***
nipkow
parents: 10608
diff changeset
   377
\isa{{\isacharparenleft}{\isasymexists}x{\isachardot}\ P\ x{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}{\isasymexists}a\ b{\isachardot}\ P\ {\isacharparenleft}a{\isacharcomma}\ b{\isacharparenright}{\isacharparenright}}
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   378
\hfill
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   379
(\isa{split{\isacharunderscore}paired{\isacharunderscore}Ex})
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   380
\end{center}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   381
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   382
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   383
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   384
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   385
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   386
\endisadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   387
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   388
\isatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   389
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   390
\endisatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   391
{\isafoldtheory}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   392
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   393
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   394
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   395
\endisadelimtheory
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   396
\end{isabellebody}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   397
%%% Local Variables:
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   398
%%% mode: latex
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   399
%%% TeX-master: "root"
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   400
%%% End: