doc-src/TutorialI/Types/document/Pairs.tex
author paulson
Fri, 18 Mar 2005 14:31:50 +0100
changeset 15614 b098158a3f39
parent 15481 fc075ae929e4
child 16353 94e565ded526
permissions -rw-r--r--
auto update
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}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
     4
\isamarkupfalse%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
     5
%
11428
332347b9b942 tidying the index
paulson
parents: 11277
diff changeset
     6
\isamarkupsection{Pairs and Tuples%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
     7
}
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
     8
\isamarkuptrue%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
     9
%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    10
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    11
\label{sec:products}
11428
332347b9b942 tidying the index
paulson
parents: 11277
diff changeset
    12
Ordered pairs were already introduced in \S\ref{sec:pairs}, but only with a minimal
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    13
repertoire of operations: pairing and the two projections \isa{fst} and
11149
e258b536a137 *** empty log message ***
nipkow
parents: 10950
diff changeset
    14
\isa{snd}. In any non-trivial application of pairs you will find that this
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    15
quickly leads to unreadable nests of projections. This
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    16
section introduces syntactic sugar to overcome this
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    17
problem: pattern matching with tuples.%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    18
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    19
\isamarkuptrue%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    20
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10824
diff changeset
    21
\isamarkupsubsection{Pattern Matching with Tuples%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    22
}
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    23
\isamarkuptrue%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    24
%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    25
\begin{isamarkuptext}%
10878
b254d5ad6dd4 auto update
paulson
parents: 10824
diff changeset
    26
Tuples may be used as patterns in $\lambda$-abstractions,
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    27
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
    28
tuple patterns can be used in most variable binding constructs,
b254d5ad6dd4 auto update
paulson
parents: 10824
diff changeset
    29
and they can be nested. Here are
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    30
some typical examples:
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    31
\begin{quote}
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    32
\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
    33
\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
    34
\isa{{\isasymforall}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isasymin}A{\isachardot}\ x{\isacharequal}y}\\
10878
b254d5ad6dd4 auto update
paulson
parents: 10824
diff changeset
    35
\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
    36
\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
    37
\end{quote}
10878
b254d5ad6dd4 auto update
paulson
parents: 10824
diff changeset
    38
The intuitive meanings of these expressions should be obvious.
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    39
Unfortunately, we need to know in more detail what the notation really stands
10878
b254d5ad6dd4 auto update
paulson
parents: 10824
diff changeset
    40
for once we have to reason about it.  Abstraction
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    41
over pairs and tuples is merely a convenient shorthand for a more complex
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    42
internal representation.  Thus the internal and external form of a term may
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    43
differ, which can affect proofs. If you want to avoid this complication,
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    44
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
    45
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
    46
denote the same function.
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    47
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    48
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
    49
\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
    50
\begin{center}
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    51
\isa{split\ {\isasymequiv}\ {\isasymlambda}c\ p{\isachardot}\ c\ {\isacharparenleft}fst\ p{\isacharparenright}\ {\isacharparenleft}snd\ p{\isacharparenright}}
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    52
\hfill(\isa{split{\isacharunderscore}def})
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    53
\end{center}
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    54
Pattern matching in
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    55
other variable binding constructs is translated similarly. Thus we need to
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    56
understand how to reason about such constructs.%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    57
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    58
\isamarkuptrue%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    59
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10824
diff changeset
    60
\isamarkupsubsection{Theorem Proving%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    61
}
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    62
\isamarkuptrue%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    63
%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    64
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    65
The most obvious approach is the brute force expansion of \isa{split}:%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    66
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    67
\isamarkuptrue%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    68
\isacommand{lemma}\ {\isachardoublequote}{\isacharparenleft}{\isasymlambda}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}x{\isacharparenright}\ p\ {\isacharequal}\ fst\ p{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    69
\isamarkupfalse%
15481
fc075ae929e4 the new subst tactic, by Lucas Dixon
paulson
parents: 15446
diff changeset
    70
\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    71
%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    72
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    73
This works well if rewriting with \isa{split{\isacharunderscore}def} finishes the
11149
e258b536a137 *** empty log message ***
nipkow
parents: 10950
diff changeset
    74
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
    75
we are trying to avoid: nests of \isa{fst} and \isa{snd}. Thus this
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    76
approach is neither elegant nor very practical in large examples, although it
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    77
can be effective in small ones.
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    78
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    79
If we consider why this lemma presents a problem, 
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    80
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
    81
equation would simplify to \isa{a} by the simplification rules
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    82
\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
    83
To reason about tuple patterns requires some way of
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    84
converting a variable of product type into a pair.
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    85
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    86
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
    87
rule \isa{split{\isacharunderscore}split} replaces \isa{p} by a pair:%
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    88
\index{*split (method)}%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    89
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    90
\isamarkuptrue%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
    91
\isacommand{lemma}\ {\isachardoublequote}{\isacharparenleft}{\isasymlambda}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}y{\isacharparenright}\ p\ {\isacharequal}\ snd\ p{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    92
\isamarkupfalse%
15481
fc075ae929e4 the new subst tactic, by Lucas Dixon
paulson
parents: 15446
diff changeset
    93
\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    94
\isamarkuptrue%
15614
b098158a3f39 auto update
paulson
parents: 15481
diff changeset
    95
\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    96
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    97
\isamarkupfalse%
15481
fc075ae929e4 the new subst tactic, by Lucas Dixon
paulson
parents: 15446
diff changeset
    98
\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    99
%
10824
4a212e635318 *** empty log message ***
nipkow
parents: 10654
diff changeset
   100
\begin{isamarkuptext}%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   101
Let us look at a second example:%
10824
4a212e635318 *** empty log message ***
nipkow
parents: 10654
diff changeset
   102
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   103
\isamarkuptrue%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   104
\isacommand{lemma}\ {\isachardoublequote}let\ {\isacharparenleft}x{\isacharcomma}y{\isacharparenright}\ {\isacharequal}\ p\ in\ fst\ p\ {\isacharequal}\ x{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   105
\isamarkupfalse%
15481
fc075ae929e4 the new subst tactic, by Lucas Dixon
paulson
parents: 15446
diff changeset
   106
\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   107
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   108
\isamarkupfalse%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   109
\isacommand{lemma}\ {\isachardoublequote}p\ {\isasymin}\ {\isacharbraceleft}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}\ x{\isacharequal}y{\isacharbraceright}\ {\isasymlongrightarrow}\ fst\ p\ {\isacharequal}\ snd\ p{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   110
\isamarkupfalse%
15481
fc075ae929e4 the new subst tactic, by Lucas Dixon
paulson
parents: 15446
diff changeset
   111
\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   112
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   113
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   114
\isacommand{lemma}\ {\isachardoublequote}p\ {\isasymin}\ {\isacharbraceleft}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}\ x{\isacharequal}y{\isacharbraceright}\ {\isasymLongrightarrow}\ fst\ p\ {\isacharequal}\ snd\ p{\isachardoublequote}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   115
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   116
\isamarkupfalse%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   117
\isacommand{consts}\ swap\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}{\isacharprime}a\ {\isasymtimes}\ {\isacharprime}b\ {\isasymRightarrow}\ {\isacharprime}b\ {\isasymtimes}\ {\isacharprime}a{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   118
\isamarkupfalse%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   119
\isacommand{primrec}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   120
\ \ {\isachardoublequote}swap\ {\isacharparenleft}x{\isacharcomma}y{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}y{\isacharcomma}x{\isacharparenright}{\isachardoublequote}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   121
%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   122
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   123
\noindent
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   124
Note that the above \isacommand{primrec} definition is admissible
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   125
because \isa{{\isasymtimes}} is a datatype. When we now try to prove%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   126
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   127
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   128
\isacommand{lemma}\ {\isachardoublequote}swap{\isacharparenleft}swap\ p{\isacharparenright}\ {\isacharequal}\ p{\isachardoublequote}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   129
\isamarkuptrue%
15481
fc075ae929e4 the new subst tactic, by Lucas Dixon
paulson
parents: 15446
diff changeset
   130
\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   131
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   132
\isamarkupfalse%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   133
\isacommand{lemma}\ {\isachardoublequote}{\isasymAnd}p\ q{\isachardot}\ swap{\isacharparenleft}swap\ p{\isacharparenright}\ {\isacharequal}\ q\ {\isasymlongrightarrow}\ p\ {\isacharequal}\ q{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   134
\isamarkupfalse%
15481
fc075ae929e4 the new subst tactic, by Lucas Dixon
paulson
parents: 15446
diff changeset
   135
\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   136
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   137
\isamarkupfalse%
15481
fc075ae929e4 the new subst tactic, by Lucas Dixon
paulson
parents: 15446
diff changeset
   138
\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   139
%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   140
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   141
\noindent
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   142
Note that we have intentionally included only \isa{split{\isacharunderscore}paired{\isacharunderscore}all}
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   143
in the first simplification step, and then we simplify again. 
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   144
This time the reason was not merely
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   145
pedagogical:
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   146
\isa{split{\isacharunderscore}paired{\isacharunderscore}all} may interfere with other functions
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   147
of the simplifier.
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   148
The following command could fail (here it does not)
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   149
where two separate \isa{simp} applications succeed.%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   150
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   151
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   152
\isamarkupfalse%
15481
fc075ae929e4 the new subst tactic, by Lucas Dixon
paulson
parents: 15446
diff changeset
   153
\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   154
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   155
%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   156
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   157
\noindent
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   158
Finally, the simplifier automatically splits all \isa{{\isasymforall}} and
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   159
\isa{{\isasymexists}}-quantified variables:%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   160
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   161
\isamarkuptrue%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   162
\isacommand{lemma}\ {\isachardoublequote}{\isasymforall}p{\isachardot}\ {\isasymexists}q{\isachardot}\ swap\ p\ {\isacharequal}\ swap\ q{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   163
\isamarkupfalse%
15481
fc075ae929e4 the new subst tactic, by Lucas Dixon
paulson
parents: 15446
diff changeset
   164
\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   165
%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   166
\begin{isamarkuptext}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   167
\noindent
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   168
To turn off this automatic splitting, just disable the
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   169
responsible simplification rules:
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   170
\begin{center}
10654
458068404143 *** empty log message ***
nipkow
parents: 10608
diff changeset
   171
\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
   172
\hfill
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   173
(\isa{split{\isacharunderscore}paired{\isacharunderscore}All})\\
10654
458068404143 *** empty log message ***
nipkow
parents: 10608
diff changeset
   174
\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
   175
\hfill
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   176
(\isa{split{\isacharunderscore}paired{\isacharunderscore}Ex})
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   177
\end{center}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   178
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   179
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   180
\isamarkupfalse%
10560
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   181
\end{isabellebody}%
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   182
%%% Local Variables:
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   183
%%% mode: latex
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   184
%%% TeX-master: "root"
f4da791d4850 *** empty log message ***
nipkow
parents:
diff changeset
   185
%%% End: