doc-src/TutorialI/Types/document/Pairs.tex
author wenzelm
Mon, 08 Nov 2010 00:00:47 +0100
changeset 40406 313a24b66a8d
parent 37610 1b09880d9734
child 46189 7f6668317e24
permissions -rw-r--r--
updated generated files;
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,
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
    39
for example \isa{{\isaliteral{5C3C6C616D6264613E}{\isasymlambda}}{\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}y{\isaliteral{2C}{\isacharcomma}}z{\isaliteral{29}{\isacharparenright}}{\isaliteral{2E}{\isachardot}}x{\isaliteral{2B}{\isacharplus}}y{\isaliteral{2B}{\isacharplus}}z} and \isa{{\isaliteral{5C3C6C616D6264613E}{\isasymlambda}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}y{\isaliteral{29}{\isacharparenright}}{\isaliteral{2C}{\isacharcomma}}z{\isaliteral{29}{\isacharparenright}}{\isaliteral{2E}{\isachardot}}x{\isaliteral{2B}{\isacharplus}}y{\isaliteral{2B}{\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}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
    44
\isa{let\ {\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}\ y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ f\ z\ in\ {\isaliteral{28}{\isacharparenleft}}y{\isaliteral{2C}{\isacharcomma}}\ x{\isaliteral{29}{\isacharparenright}}}\\
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
    45
\isa{case\ xs\ of\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isadigit{0}}\ {\isaliteral{7C}{\isacharbar}}\ {\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}\ y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{23}{\isacharhash}}\ zs\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ x\ {\isaliteral{2B}{\isacharplus}}\ y}\\
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
    46
\isa{{\isaliteral{5C3C666F72616C6C3E}{\isasymforall}}{\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}y{\isaliteral{29}{\isacharparenright}}{\isaliteral{5C3C696E3E}{\isasymin}}A{\isaliteral{2E}{\isachardot}}\ x{\isaliteral{3D}{\isacharequal}}y}\\
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
    47
\isa{{\isaliteral{7B}{\isacharbraceleft}}{\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}y{\isaliteral{2C}{\isacharcomma}}z{\isaliteral{29}{\isacharparenright}}{\isaliteral{2E}{\isachardot}}\ x{\isaliteral{3D}{\isacharequal}}z{\isaliteral{7D}{\isacharbraceright}}}\\
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
    48
\isa{{\isaliteral{5C3C556E696F6E3E}{\isasymUnion}}\isaliteral{5C3C5E627375623E}{}\isactrlbsub {\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}\ y{\isaliteral{29}{\isacharparenright}}{\isaliteral{5C3C696E3E}{\isasymin}}A\isaliteral{5C3C5E657375623E}{}\isactrlesub \ {\isaliteral{7B}{\isacharbraceleft}}x\ {\isaliteral{2B}{\isacharplus}}\ y{\isaliteral{7D}{\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,
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
    56
stick to \isa{fst} and \isa{snd} and write \isa{{\isaliteral{5C3C6C616D6264613E}{\isasymlambda}}p{\isaliteral{2E}{\isachardot}}\ fst\ p\ {\isaliteral{2B}{\isacharplus}}\ snd\ p}
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
    57
instead of \isa{{\isaliteral{5C3C6C616D6264613E}{\isasymlambda}}{\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}y{\isaliteral{29}{\isacharparenright}}{\isaliteral{2E}{\isachardot}}\ x{\isaliteral{2B}{\isacharplus}}y}.  These terms are distinct even though they
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    58
denote the same function.
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    59
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
    60
Internally, \isa{{\isaliteral{5C3C6C616D6264613E}{\isasymlambda}}{\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}\ y{\isaliteral{29}{\isacharparenright}}{\isaliteral{2E}{\isachardot}}\ t} becomes \isa{split\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C6C616D6264613E}{\isasymlambda}}x\ y{\isaliteral{2E}{\isachardot}}\ t{\isaliteral{29}{\isacharparenright}}}, where
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
    61
\cdx{split} is the uncurrying function of type \isa{{\isaliteral{28}{\isacharparenleft}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}b\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}c{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C74696D65733E}{\isasymtimes}}\ {\isaliteral{27}{\isacharprime}}b\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}c} defined as
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    62
\begin{center}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
    63
\isa{prod{\isaliteral{5F}{\isacharunderscore}}case\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C6C616D6264613E}{\isasymlambda}}c\ p{\isaliteral{2E}{\isachardot}}\ c\ {\isaliteral{28}{\isacharparenleft}}fst\ p{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{28}{\isacharparenleft}}snd\ p{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}}
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
    64
\hfill(\isa{split{\isaliteral{5F}{\isacharunderscore}}def})
10560
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}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
    77
The most obvious approach is the brute force expansion of \isa{prod{\isaliteral{5F}{\isacharunderscore}}case}:%
10560
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%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
    81
\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C6C616D6264613E}{\isasymlambda}}{\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}y{\isaliteral{29}{\isacharparenright}}{\isaliteral{2E}{\isachardot}}x{\isaliteral{29}{\isacharparenright}}\ p\ {\isaliteral{3D}{\isacharequal}}\ fst\ p{\isaliteral{22}{\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%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
    89
{\isaliteral{28}{\isacharparenleft}}simp\ add{\isaliteral{3A}{\isacharcolon}}\ split{\isaliteral{5F}{\isacharunderscore}}def{\isaliteral{29}{\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}%
27027
63f0b638355c *** empty log message ***
nipkow
parents: 26698
diff changeset
    98
\noindent
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
    99
This works well if rewriting with \isa{split{\isaliteral{5F}{\isacharunderscore}}def} finishes the
11149
e258b536a137 *** empty log message ***
nipkow
parents: 10950
diff changeset
   100
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
   101
we are trying to avoid: nests of \isa{fst} and \isa{snd}. Thus this
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   102
approach is neither elegant nor very practical in large examples, although it
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   103
can be effective in small ones.
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   104
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   105
If we consider why this lemma presents a problem, 
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   106
we realize that we need to replace variable~\isa{p} by some pair \isa{{\isaliteral{28}{\isacharparenleft}}a{\isaliteral{2C}{\isacharcomma}}\ b{\isaliteral{29}{\isacharparenright}}}.  Then both sides of the
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   107
equation would simplify to \isa{a} by the simplification rules
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   108
\isa{prod{\isaliteral{5F}{\isacharunderscore}}case\ f\ {\isaliteral{28}{\isacharparenleft}}a{\isaliteral{2C}{\isacharcomma}}\ b{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ f\ a\ b} and \isa{fst\ {\isaliteral{28}{\isacharparenleft}}a{\isaliteral{2C}{\isacharcomma}}\ b{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ a}.  
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   109
To reason about tuple patterns requires some way of
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   110
converting a variable of product type into a pair.
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   111
In case of a subterm of the form \isa{prod{\isaliteral{5F}{\isacharunderscore}}case\ f\ p} this is easy: the split
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   112
rule \isa{split{\isaliteral{5F}{\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%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   117
\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C6C616D6264613E}{\isasymlambda}}{\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}y{\isaliteral{29}{\isacharparenright}}{\isaliteral{2E}{\isachardot}}y{\isaliteral{29}{\isacharparenright}}\ p\ {\isaliteral{3D}{\isacharequal}}\ snd\ p{\isaliteral{22}{\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%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   125
{\isaliteral{28}{\isacharparenleft}}split\ split{\isaliteral{5F}{\isacharunderscore}}split{\isaliteral{29}{\isacharparenright}}%
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   126
\begin{isamarkuptxt}%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   127
\begin{isabelle}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   128
\ {\isadigit{1}}{\isaliteral{2E}{\isachardot}}\ {\isaliteral{5C3C666F72616C6C3E}{\isasymforall}}x\ y{\isaliteral{2E}{\isachardot}}\ p\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}\ y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ y\ {\isaliteral{3D}{\isacharequal}}\ snd\ p%
16353
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%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   148
{\isaliteral{28}{\isacharparenleft}}simp\ split{\isaliteral{3A}{\isacharcolon}}\ split{\isaliteral{5F}{\isacharunderscore}}split{\isaliteral{29}{\isacharparenright}}%
17175
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%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   161
\ {\isaliteral{22}{\isachardoublequoteopen}}let\ {\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ p\ in\ fst\ p\ {\isaliteral{3D}{\isacharequal}}\ x{\isaliteral{22}{\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%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   169
{\isaliteral{28}{\isacharparenleft}}simp\ only{\isaliteral{3A}{\isacharcolon}}\ Let{\isaliteral{5F}{\isacharunderscore}}def{\isaliteral{29}{\isacharparenright}}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   170
\begin{isamarkuptxt}%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   171
\begin{isabelle}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   172
\ {\isadigit{1}}{\isaliteral{2E}{\isachardot}}\ case\ p\ of\ {\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}\ y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ fst\ p\ {\isaliteral{3D}{\isacharequal}}\ x%
17175
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%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   186
\ {\isaliteral{22}{\isachardoublequoteopen}}p\ {\isaliteral{5C3C696E3E}{\isasymin}}\ {\isaliteral{7B}{\isacharbraceleft}}{\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}y{\isaliteral{29}{\isacharparenright}}{\isaliteral{2E}{\isachardot}}\ x{\isaliteral{3D}{\isacharequal}}y{\isaliteral{7D}{\isacharbraceright}}\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ fst\ p\ {\isaliteral{3D}{\isacharequal}}\ snd\ p{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
17175
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}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   197
\ {\isadigit{1}}{\isaliteral{2E}{\isachardot}}\ prod{\isaliteral{5F}{\isacharunderscore}}case\ op\ {\isaliteral{3D}{\isacharequal}}\ p\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ fst\ p\ {\isaliteral{3D}{\isacharequal}}\ snd\ p%
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   198
\end{isabelle}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   199
Again, simplification produces a term suitable for \isa{split{\isaliteral{5F}{\isacharunderscore}}split}
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   200
as above. If you are worried about the strange form of the premise:
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   201
\isa{split\ {\isaliteral{28}{\isacharparenleft}}op\ {\isaliteral{3D}{\isacharequal}}{\isaliteral{29}{\isacharparenright}}} is short for \isa{{\isaliteral{5C3C6C616D6264613E}{\isasymlambda}}{\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}\ y{\isaliteral{29}{\isacharparenright}}{\isaliteral{2E}{\isachardot}}\ x\ {\isaliteral{3D}{\isacharequal}}\ y}.
16353
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%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   213
\ {\isaliteral{22}{\isachardoublequoteopen}}p\ {\isaliteral{5C3C696E3E}{\isasymin}}\ {\isaliteral{7B}{\isacharbraceleft}}{\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}y{\isaliteral{29}{\isacharparenright}}{\isaliteral{2E}{\isachardot}}\ x{\isaliteral{3D}{\isacharequal}}y{\isaliteral{7D}{\isacharbraceright}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ fst\ p\ {\isaliteral{3D}{\isacharequal}}\ snd\ p{\isaliteral{22}{\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
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   222
except that we now have to use \isa{split{\isaliteral{5F}{\isacharunderscore}}split{\isaliteral{5F}{\isacharunderscore}}asm}, because
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   223
\isa{prod{\isaliteral{5F}{\isacharunderscore}}case} occurs in the assumptions.
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   224
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   225
However, splitting \isa{prod{\isaliteral{5F}{\isacharunderscore}}case} is not always a solution, as no \isa{prod{\isaliteral{5F}{\isacharunderscore}}case}
16353
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{primrec}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   237
\ swap\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{27}{\isacharprime}}a\ {\isaliteral{5C3C74696D65733E}{\isasymtimes}}\ {\isaliteral{27}{\isacharprime}}b\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ {\isaliteral{27}{\isacharprime}}b\ {\isaliteral{5C3C74696D65733E}{\isasymtimes}}\ {\isaliteral{27}{\isacharprime}}a{\isaliteral{22}{\isachardoublequoteclose}}\ \isakeyword{where}\ {\isaliteral{22}{\isachardoublequoteopen}}swap\ {\isaliteral{28}{\isacharparenleft}}x{\isaliteral{2C}{\isacharcomma}}y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}y{\isaliteral{2C}{\isacharcomma}}x{\isaliteral{29}{\isacharparenright}}{\isaliteral{22}{\isachardoublequoteclose}}%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   238
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   239
\noindent
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   240
Note that the above \isacommand{primrec} definition is admissible
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   241
because \isa{{\isaliteral{5C3C74696D65733E}{\isasymtimes}}} is a datatype. When we now try to prove%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   242
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   243
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   244
\isacommand{lemma}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   245
\ {\isaliteral{22}{\isachardoublequoteopen}}swap{\isaliteral{28}{\isacharparenleft}}swap\ p{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ p{\isaliteral{22}{\isachardoublequoteclose}}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   246
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   247
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   248
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   249
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   250
\isatagproof
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   251
%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   252
\begin{isamarkuptxt}%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   253
\noindent
27027
63f0b638355c *** empty log message ***
nipkow
parents: 26698
diff changeset
   254
simplification will do nothing, because the defining equation for
63f0b638355c *** empty log message ***
nipkow
parents: 26698
diff changeset
   255
\isa{swap} expects a pair. Again, we need to turn \isa{p}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   256
into a pair first, but this time there is no \isa{prod{\isaliteral{5F}{\isacharunderscore}}case} in sight.
27027
63f0b638355c *** empty log message ***
nipkow
parents: 26698
diff changeset
   257
The only thing we can do is to split the term by hand:%
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   258
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   259
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   260
\isacommand{apply}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   261
{\isaliteral{28}{\isacharparenleft}}case{\isaliteral{5F}{\isacharunderscore}}tac\ p{\isaliteral{29}{\isacharparenright}}%
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   262
\begin{isamarkuptxt}%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   263
\noindent
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   264
\begin{isabelle}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   265
\ {\isadigit{1}}{\isaliteral{2E}{\isachardot}}\ {\isaliteral{5C3C416E643E}{\isasymAnd}}a\ b{\isaliteral{2E}{\isachardot}}\ p\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}a{\isaliteral{2C}{\isacharcomma}}\ b{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ swap\ {\isaliteral{28}{\isacharparenleft}}swap\ p{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ p%
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   266
\end{isabelle}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   267
Again, \methdx{case_tac} is applicable because \isa{{\isaliteral{5C3C74696D65733E}{\isasymtimes}}} is a datatype.
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   268
The subgoal is easily proved by \isa{simp}.
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   269
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   270
Splitting by \isa{case{\isaliteral{5F}{\isacharunderscore}}tac} also solves the previous examples and may thus
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   271
appear preferable to the more arcane methods introduced first. However, see
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   272
the warning about \isa{case{\isaliteral{5F}{\isacharunderscore}}tac} in \S\ref{sec:struct-ind-case}.
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   273
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   274
Alternatively, you can split \emph{all} \isa{{\isaliteral{5C3C416E643E}{\isasymAnd}}}-quantified variables
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   275
in a goal with the rewrite rule \isa{split{\isaliteral{5F}{\isacharunderscore}}paired{\isaliteral{5F}{\isacharunderscore}}all}:%
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   276
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   277
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   278
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   279
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   280
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   281
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   282
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   283
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   284
\endisadelimproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   285
\isacommand{lemma}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   286
\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C416E643E}{\isasymAnd}}p\ q{\isaliteral{2E}{\isachardot}}\ swap{\isaliteral{28}{\isacharparenleft}}swap\ p{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ q\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ p\ {\isaliteral{3D}{\isacharequal}}\ q{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   287
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   288
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   289
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   290
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   291
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   292
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   293
\isacommand{apply}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   294
{\isaliteral{28}{\isacharparenleft}}simp\ only{\isaliteral{3A}{\isacharcolon}}\ split{\isaliteral{5F}{\isacharunderscore}}paired{\isaliteral{5F}{\isacharunderscore}}all{\isaliteral{29}{\isacharparenright}}%
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   295
\begin{isamarkuptxt}%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   296
\noindent
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   297
\begin{isabelle}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   298
\ {\isadigit{1}}{\isaliteral{2E}{\isachardot}}\ {\isaliteral{5C3C416E643E}{\isasymAnd}}a\ b\ aa\ ba{\isaliteral{2E}{\isachardot}}\ swap\ {\isaliteral{28}{\isacharparenleft}}swap\ {\isaliteral{28}{\isacharparenleft}}a{\isaliteral{2C}{\isacharcomma}}\ b{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}aa{\isaliteral{2C}{\isacharcomma}}\ ba{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ {\isaliteral{28}{\isacharparenleft}}a{\isaliteral{2C}{\isacharcomma}}\ b{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}aa{\isaliteral{2C}{\isacharcomma}}\ ba{\isaliteral{29}{\isacharparenright}}%
16353
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   299
\end{isabelle}%
94e565ded526 updated;
wenzelm
parents: 15614
diff changeset
   300
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   301
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   302
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   303
\ simp\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   304
\isacommand{done}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   305
%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   306
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   307
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   308
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   309
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   310
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   311
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   312
%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   313
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   314
\noindent
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   315
Note that we have intentionally included only \isa{split{\isaliteral{5F}{\isacharunderscore}}paired{\isaliteral{5F}{\isacharunderscore}}all}
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   316
in the first simplification step, and then we simplify again. 
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   317
This time the reason was not merely
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   318
pedagogical:
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   319
\isa{split{\isaliteral{5F}{\isacharunderscore}}paired{\isaliteral{5F}{\isacharunderscore}}all} may interfere with other functions
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   320
of the simplifier.
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   321
The following command could fail (here it does not)
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   322
where two separate \isa{simp} applications succeed.%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   323
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   324
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   325
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   326
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   327
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   328
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   329
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   330
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   331
\isacommand{apply}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   332
{\isaliteral{28}{\isacharparenleft}}simp\ add{\isaliteral{3A}{\isacharcolon}}\ split{\isaliteral{5F}{\isacharunderscore}}paired{\isaliteral{5F}{\isacharunderscore}}all{\isaliteral{29}{\isacharparenright}}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   333
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   334
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   335
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   336
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   337
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   338
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   339
%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   340
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   341
\noindent
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   342
Finally, the simplifier automatically splits all \isa{{\isaliteral{5C3C666F72616C6C3E}{\isasymforall}}} and
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   343
\isa{{\isaliteral{5C3C6578697374733E}{\isasymexists}}}-quantified variables:%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   344
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   345
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   346
\isacommand{lemma}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   347
\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C666F72616C6C3E}{\isasymforall}}p{\isaliteral{2E}{\isachardot}}\ {\isaliteral{5C3C6578697374733E}{\isasymexists}}q{\isaliteral{2E}{\isachardot}}\ swap\ p\ {\isaliteral{3D}{\isacharequal}}\ swap\ q{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   348
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   349
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   350
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   351
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   352
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   353
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   354
\isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   355
\ simp%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   356
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   357
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   358
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   359
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   360
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   361
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   362
%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   363
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   364
\noindent
27027
63f0b638355c *** empty log message ***
nipkow
parents: 26698
diff changeset
   365
To turn off this automatic splitting, disable the
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   366
responsible simplification rules:
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   367
\begin{center}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   368
\isa{{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C666F72616C6C3E}{\isasymforall}}x{\isaliteral{2E}{\isachardot}}\ P\ x{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C666F72616C6C3E}{\isasymforall}}a\ b{\isaliteral{2E}{\isachardot}}\ P\ {\isaliteral{28}{\isacharparenleft}}a{\isaliteral{2C}{\isacharcomma}}\ b{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}}
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   369
\hfill
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   370
(\isa{split{\isaliteral{5F}{\isacharunderscore}}paired{\isaliteral{5F}{\isacharunderscore}}All})\\
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   371
\isa{{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C6578697374733E}{\isasymexists}}x{\isaliteral{2E}{\isachardot}}\ P\ x{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C6578697374733E}{\isasymexists}}a\ b{\isaliteral{2E}{\isachardot}}\ P\ {\isaliteral{28}{\isacharparenleft}}a{\isaliteral{2C}{\isacharcomma}}\ b{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}}
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   372
\hfill
40406
313a24b66a8d updated generated files;
wenzelm
parents: 37610
diff changeset
   373
(\isa{split{\isaliteral{5F}{\isacharunderscore}}paired{\isaliteral{5F}{\isacharunderscore}}Ex})
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   374
\end{center}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   375
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   376
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   377
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   378
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   379
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   380
\endisadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   381
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   382
\isatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   383
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   384
\endisatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   385
{\isafoldtheory}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   386
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   387
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   388
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   389
\endisadelimtheory
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   390
\end{isabellebody}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   391
%%% Local Variables:
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   392
%%% mode: latex
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   393
%%% TeX-master: "root"
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   394
%%% End: