doc-src/TutorialI/Types/document/Pairs.tex
changeset 11866 fbd097aec213
parent 11708 d27253c4594f
child 12627 08eee994bf99
equal deleted inserted replaced
11865:93d5408eb7d9 11866:fbd097aec213
     1 %
     1 %
     2 \begin{isabellebody}%
     2 \begin{isabellebody}%
     3 \def\isabellecontext{Pairs}%
     3 \def\isabellecontext{Pairs}%
       
     4 \isamarkupfalse%
     4 %
     5 %
     5 \isamarkupsection{Pairs and Tuples%
     6 \isamarkupsection{Pairs and Tuples%
     6 }
     7 }
       
     8 \isamarkuptrue%
     7 %
     9 %
     8 \begin{isamarkuptext}%
    10 \begin{isamarkuptext}%
     9 \label{sec:products}
    11 \label{sec:products}
    10 Ordered pairs were already introduced in \S\ref{sec:pairs}, but only with a minimal
    12 Ordered pairs were already introduced in \S\ref{sec:pairs}, but only with a minimal
    11 repertoire of operations: pairing and the two projections \isa{fst} and
    13 repertoire of operations: pairing and the two projections \isa{fst} and
    12 \isa{snd}. In any non-trivial application of pairs you will find that this
    14 \isa{snd}. In any non-trivial application of pairs you will find that this
    13 quickly leads to unreadable nests of projections. This
    15 quickly leads to unreadable nests of projections. This
    14 section introduces syntactic sugar to overcome this
    16 section introduces syntactic sugar to overcome this
    15 problem: pattern matching with tuples.%
    17 problem: pattern matching with tuples.%
    16 \end{isamarkuptext}%
    18 \end{isamarkuptext}%
       
    19 \isamarkuptrue%
    17 %
    20 %
    18 \isamarkupsubsection{Pattern Matching with Tuples%
    21 \isamarkupsubsection{Pattern Matching with Tuples%
    19 }
    22 }
       
    23 \isamarkuptrue%
    20 %
    24 %
    21 \begin{isamarkuptext}%
    25 \begin{isamarkuptext}%
    22 Tuples may be used as patterns in $\lambda$-abstractions,
    26 Tuples may be used as patterns in $\lambda$-abstractions,
    23 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,
    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,
    24 tuple patterns can be used in most variable binding constructs,
    28 tuple patterns can be used in most variable binding constructs,
    49 \end{center}
    53 \end{center}
    50 Pattern matching in
    54 Pattern matching in
    51 other variable binding constructs is translated similarly. Thus we need to
    55 other variable binding constructs is translated similarly. Thus we need to
    52 understand how to reason about such constructs.%
    56 understand how to reason about such constructs.%
    53 \end{isamarkuptext}%
    57 \end{isamarkuptext}%
       
    58 \isamarkuptrue%
    54 %
    59 %
    55 \isamarkupsubsection{Theorem Proving%
    60 \isamarkupsubsection{Theorem Proving%
    56 }
    61 }
       
    62 \isamarkuptrue%
    57 %
    63 %
    58 \begin{isamarkuptext}%
    64 \begin{isamarkuptext}%
    59 The most obvious approach is the brute force expansion of \isa{split}:%
    65 The most obvious approach is the brute force expansion of \isa{split}:%
    60 \end{isamarkuptext}%
    66 \end{isamarkuptext}%
       
    67 \isamarkuptrue%
    61 \isacommand{lemma}\ {\isachardoublequote}{\isacharparenleft}{\isasymlambda}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}x{\isacharparenright}\ p\ {\isacharequal}\ fst\ p{\isachardoublequote}\isanewline
    68 \isacommand{lemma}\ {\isachardoublequote}{\isacharparenleft}{\isasymlambda}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}x{\isacharparenright}\ p\ {\isacharequal}\ fst\ p{\isachardoublequote}\isanewline
    62 \isacommand{by}{\isacharparenleft}simp\ add{\isacharcolon}split{\isacharunderscore}def{\isacharparenright}%
    69 \isamarkupfalse%
       
    70 \isacommand{by}{\isacharparenleft}simp\ add{\isacharcolon}split{\isacharunderscore}def{\isacharparenright}\isamarkupfalse%
       
    71 %
    63 \begin{isamarkuptext}%
    72 \begin{isamarkuptext}%
    64 This works well if rewriting with \isa{split{\isacharunderscore}def} finishes the
    73 This works well if rewriting with \isa{split{\isacharunderscore}def} finishes the
    65 proof, as it does above.  But if it does not, you end up with exactly what
    74 proof, as it does above.  But if it does not, you end up with exactly what
    66 we are trying to avoid: nests of \isa{fst} and \isa{snd}. Thus this
    75 we are trying to avoid: nests of \isa{fst} and \isa{snd}. Thus this
    67 approach is neither elegant nor very practical in large examples, although it
    76 approach is neither elegant nor very practical in large examples, although it
    76 
    85 
    77 In case of a subterm of the form \isa{split\ f\ p} this is easy: the split
    86 In case of a subterm of the form \isa{split\ f\ p} this is easy: the split
    78 rule \isa{split{\isacharunderscore}split} replaces \isa{p} by a pair:%
    87 rule \isa{split{\isacharunderscore}split} replaces \isa{p} by a pair:%
    79 \index{*split (method)}%
    88 \index{*split (method)}%
    80 \end{isamarkuptext}%
    89 \end{isamarkuptext}%
       
    90 \isamarkuptrue%
    81 \isacommand{lemma}\ {\isachardoublequote}{\isacharparenleft}{\isasymlambda}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}y{\isacharparenright}\ p\ {\isacharequal}\ snd\ p{\isachardoublequote}\isanewline
    91 \isacommand{lemma}\ {\isachardoublequote}{\isacharparenleft}{\isasymlambda}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}y{\isacharparenright}\ p\ {\isacharequal}\ snd\ p{\isachardoublequote}\isanewline
    82 \isacommand{apply}{\isacharparenleft}split\ split{\isacharunderscore}split{\isacharparenright}%
    92 \isamarkupfalse%
       
    93 \isacommand{apply}{\isacharparenleft}split\ split{\isacharunderscore}split{\isacharparenright}\isamarkupfalse%
       
    94 %
    83 \begin{isamarkuptxt}%
    95 \begin{isamarkuptxt}%
    84 \begin{isabelle}%
    96 \begin{isabelle}%
    85 \ {\isadigit{1}}{\isachardot}\ {\isasymforall}x\ y{\isachardot}\ p\ {\isacharequal}\ {\isacharparenleft}x{\isacharcomma}\ y{\isacharparenright}\ {\isasymlongrightarrow}\ y\ {\isacharequal}\ snd\ p%
    97 \ {\isadigit{1}}{\isachardot}\ {\isasymforall}x\ y{\isachardot}\ p\ {\isacharequal}\ {\isacharparenleft}x{\isacharcomma}\ y{\isacharparenright}\ {\isasymlongrightarrow}\ y\ {\isacharequal}\ snd\ p%
    86 \end{isabelle}
    98 \end{isabelle}
    87 This subgoal is easily proved by simplification. Thus we could have combined
    99 This subgoal is easily proved by simplification. Thus we could have combined
    88 simplification and splitting in one command that proves the goal outright:%
   100 simplification and splitting in one command that proves the goal outright:%
    89 \end{isamarkuptxt}%
   101 \end{isamarkuptxt}%
    90 \isacommand{by}{\isacharparenleft}simp\ split{\isacharcolon}\ split{\isacharunderscore}split{\isacharparenright}%
   102 \isamarkuptrue%
       
   103 \isamarkupfalse%
       
   104 \isamarkupfalse%
       
   105 \isacommand{by}{\isacharparenleft}simp\ split{\isacharcolon}\ split{\isacharunderscore}split{\isacharparenright}\isamarkupfalse%
       
   106 %
    91 \begin{isamarkuptext}%
   107 \begin{isamarkuptext}%
    92 Let us look at a second example:%
   108 Let us look at a second example:%
    93 \end{isamarkuptext}%
   109 \end{isamarkuptext}%
       
   110 \isamarkuptrue%
    94 \isacommand{lemma}\ {\isachardoublequote}let\ {\isacharparenleft}x{\isacharcomma}y{\isacharparenright}\ {\isacharequal}\ p\ in\ fst\ p\ {\isacharequal}\ x{\isachardoublequote}\isanewline
   111 \isacommand{lemma}\ {\isachardoublequote}let\ {\isacharparenleft}x{\isacharcomma}y{\isacharparenright}\ {\isacharequal}\ p\ in\ fst\ p\ {\isacharequal}\ x{\isachardoublequote}\isanewline
    95 \isacommand{apply}{\isacharparenleft}simp\ only{\isacharcolon}\ Let{\isacharunderscore}def{\isacharparenright}%
   112 \isamarkupfalse%
       
   113 \isacommand{apply}{\isacharparenleft}simp\ only{\isacharcolon}\ Let{\isacharunderscore}def{\isacharparenright}\isamarkupfalse%
       
   114 %
    96 \begin{isamarkuptxt}%
   115 \begin{isamarkuptxt}%
    97 \begin{isabelle}%
   116 \begin{isabelle}%
    98 \ {\isadigit{1}}{\isachardot}\ {\isacharparenleft}{\isasymlambda}{\isacharparenleft}x{\isacharcomma}\ y{\isacharparenright}{\isachardot}\ fst\ p\ {\isacharequal}\ x{\isacharparenright}\ p%
   117 \ {\isadigit{1}}{\isachardot}\ {\isacharparenleft}{\isasymlambda}{\isacharparenleft}x{\isacharcomma}\ y{\isacharparenright}{\isachardot}\ fst\ p\ {\isacharequal}\ x{\isacharparenright}\ p%
    99 \end{isabelle}
   118 \end{isabelle}
   100 A paired \isa{let} reduces to a paired $\lambda$-abstraction, which
   119 A paired \isa{let} reduces to a paired $\lambda$-abstraction, which
   101 can be split as above. The same is true for paired set comprehension:%
   120 can be split as above. The same is true for paired set comprehension:%
   102 \end{isamarkuptxt}%
   121 \end{isamarkuptxt}%
       
   122 \isamarkuptrue%
       
   123 \isamarkupfalse%
   103 \isacommand{lemma}\ {\isachardoublequote}p\ {\isasymin}\ {\isacharbraceleft}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}\ x{\isacharequal}y{\isacharbraceright}\ {\isasymlongrightarrow}\ fst\ p\ {\isacharequal}\ snd\ p{\isachardoublequote}\isanewline
   124 \isacommand{lemma}\ {\isachardoublequote}p\ {\isasymin}\ {\isacharbraceleft}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}\ x{\isacharequal}y{\isacharbraceright}\ {\isasymlongrightarrow}\ fst\ p\ {\isacharequal}\ snd\ p{\isachardoublequote}\isanewline
   104 \isacommand{apply}\ simp%
   125 \isamarkupfalse%
       
   126 \isacommand{apply}\ simp\isamarkupfalse%
       
   127 %
   105 \begin{isamarkuptxt}%
   128 \begin{isamarkuptxt}%
   106 \begin{isabelle}%
   129 \begin{isabelle}%
   107 \ {\isadigit{1}}{\isachardot}\ split\ op\ {\isacharequal}\ p\ {\isasymlongrightarrow}\ fst\ p\ {\isacharequal}\ snd\ p%
   130 \ {\isadigit{1}}{\isachardot}\ split\ op\ {\isacharequal}\ p\ {\isasymlongrightarrow}\ fst\ p\ {\isacharequal}\ snd\ p%
   108 \end{isabelle}
   131 \end{isabelle}
   109 Again, simplification produces a term suitable for \isa{split{\isacharunderscore}split}
   132 Again, simplification produces a term suitable for \isa{split{\isacharunderscore}split}
   110 as above. If you are worried about the strange form of the premise:
   133 as above. If you are worried about the strange form of the premise:
   111 \isa{split\ op\ {\isacharequal}} is short for \isa{{\isasymlambda}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}\ x{\isacharequal}y}.
   134 \isa{split\ op\ {\isacharequal}} is short for \isa{{\isasymlambda}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}\ x{\isacharequal}y}.
   112 The same proof procedure works for%
   135 The same proof procedure works for%
   113 \end{isamarkuptxt}%
   136 \end{isamarkuptxt}%
   114 \isacommand{lemma}\ {\isachardoublequote}p\ {\isasymin}\ {\isacharbraceleft}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}\ x{\isacharequal}y{\isacharbraceright}\ {\isasymLongrightarrow}\ fst\ p\ {\isacharequal}\ snd\ p{\isachardoublequote}%
   137 \isamarkuptrue%
       
   138 \isamarkupfalse%
       
   139 \isacommand{lemma}\ {\isachardoublequote}p\ {\isasymin}\ {\isacharbraceleft}{\isacharparenleft}x{\isacharcomma}y{\isacharparenright}{\isachardot}\ x{\isacharequal}y{\isacharbraceright}\ {\isasymLongrightarrow}\ fst\ p\ {\isacharequal}\ snd\ p{\isachardoublequote}\isamarkupfalse%
       
   140 %
   115 \begin{isamarkuptxt}%
   141 \begin{isamarkuptxt}%
   116 \noindent
   142 \noindent
   117 except that we now have to use \isa{split{\isacharunderscore}split{\isacharunderscore}asm}, because
   143 except that we now have to use \isa{split{\isacharunderscore}split{\isacharunderscore}asm}, because
   118 \isa{split} occurs in the assumptions.
   144 \isa{split} occurs in the assumptions.
   119 
   145 
   120 However, splitting \isa{split} is not always a solution, as no \isa{split}
   146 However, splitting \isa{split} is not always a solution, as no \isa{split}
   121 may be present in the goal. Consider the following function:%
   147 may be present in the goal. Consider the following function:%
   122 \end{isamarkuptxt}%
   148 \end{isamarkuptxt}%
       
   149 \isamarkuptrue%
       
   150 \isamarkupfalse%
   123 \isacommand{consts}\ swap\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}{\isacharprime}a\ {\isasymtimes}\ {\isacharprime}b\ {\isasymRightarrow}\ {\isacharprime}b\ {\isasymtimes}\ {\isacharprime}a{\isachardoublequote}\isanewline
   151 \isacommand{consts}\ swap\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}{\isacharprime}a\ {\isasymtimes}\ {\isacharprime}b\ {\isasymRightarrow}\ {\isacharprime}b\ {\isasymtimes}\ {\isacharprime}a{\isachardoublequote}\isanewline
       
   152 \isamarkupfalse%
   124 \isacommand{primrec}\isanewline
   153 \isacommand{primrec}\isanewline
   125 \ \ {\isachardoublequote}swap\ {\isacharparenleft}x{\isacharcomma}y{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}y{\isacharcomma}x{\isacharparenright}{\isachardoublequote}%
   154 \ \ {\isachardoublequote}swap\ {\isacharparenleft}x{\isacharcomma}y{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}y{\isacharcomma}x{\isacharparenright}{\isachardoublequote}\isamarkupfalse%
       
   155 %
   126 \begin{isamarkuptext}%
   156 \begin{isamarkuptext}%
   127 \noindent
   157 \noindent
   128 Note that the above \isacommand{primrec} definition is admissible
   158 Note that the above \isacommand{primrec} definition is admissible
   129 because \isa{{\isasymtimes}} is a datatype. When we now try to prove%
   159 because \isa{{\isasymtimes}} is a datatype. When we now try to prove%
   130 \end{isamarkuptext}%
   160 \end{isamarkuptext}%
   131 \isacommand{lemma}\ {\isachardoublequote}swap{\isacharparenleft}swap\ p{\isacharparenright}\ {\isacharequal}\ p{\isachardoublequote}%
   161 \isamarkuptrue%
       
   162 \isacommand{lemma}\ {\isachardoublequote}swap{\isacharparenleft}swap\ p{\isacharparenright}\ {\isacharequal}\ p{\isachardoublequote}\isamarkupfalse%
       
   163 %
   132 \begin{isamarkuptxt}%
   164 \begin{isamarkuptxt}%
   133 \noindent
   165 \noindent
   134 simplification will do nothing, because the defining equation for \isa{swap}
   166 simplification will do nothing, because the defining equation for \isa{swap}
   135 expects a pair. Again, we need to turn \isa{p} into a pair first, but this
   167 expects a pair. Again, we need to turn \isa{p} into a pair first, but this
   136 time there is no \isa{split} in sight. In this case the only thing we can do
   168 time there is no \isa{split} in sight. In this case the only thing we can do
   137 is to split the term by hand:%
   169 is to split the term by hand:%
   138 \end{isamarkuptxt}%
   170 \end{isamarkuptxt}%
   139 \isacommand{apply}{\isacharparenleft}case{\isacharunderscore}tac\ p{\isacharparenright}%
   171 \isamarkuptrue%
       
   172 \isacommand{apply}{\isacharparenleft}case{\isacharunderscore}tac\ p{\isacharparenright}\isamarkupfalse%
       
   173 %
   140 \begin{isamarkuptxt}%
   174 \begin{isamarkuptxt}%
   141 \noindent
   175 \noindent
   142 \begin{isabelle}%
   176 \begin{isabelle}%
   143 \ {\isadigit{1}}{\isachardot}\ {\isasymAnd}a\ b{\isachardot}\ p\ {\isacharequal}\ {\isacharparenleft}a{\isacharcomma}\ b{\isacharparenright}\ {\isasymLongrightarrow}\ swap\ {\isacharparenleft}swap\ p{\isacharparenright}\ {\isacharequal}\ p%
   177 \ {\isadigit{1}}{\isachardot}\ {\isasymAnd}a\ b{\isachardot}\ p\ {\isacharequal}\ {\isacharparenleft}a{\isacharcomma}\ b{\isacharparenright}\ {\isasymLongrightarrow}\ swap\ {\isacharparenleft}swap\ p{\isacharparenright}\ {\isacharequal}\ p%
   144 \end{isabelle}
   178 \end{isabelle}
   151 
   185 
   152 In case the term to be split is a quantified variable, there are more options.
   186 In case the term to be split is a quantified variable, there are more options.
   153 You can split \emph{all} \isa{{\isasymAnd}}-quantified variables in a goal
   187 You can split \emph{all} \isa{{\isasymAnd}}-quantified variables in a goal
   154 with the rewrite rule \isa{split{\isacharunderscore}paired{\isacharunderscore}all}:%
   188 with the rewrite rule \isa{split{\isacharunderscore}paired{\isacharunderscore}all}:%
   155 \end{isamarkuptxt}%
   189 \end{isamarkuptxt}%
       
   190 \isamarkuptrue%
       
   191 \isamarkupfalse%
   156 \isacommand{lemma}\ {\isachardoublequote}{\isasymAnd}p\ q{\isachardot}\ swap{\isacharparenleft}swap\ p{\isacharparenright}\ {\isacharequal}\ q\ {\isasymlongrightarrow}\ p\ {\isacharequal}\ q{\isachardoublequote}\isanewline
   192 \isacommand{lemma}\ {\isachardoublequote}{\isasymAnd}p\ q{\isachardot}\ swap{\isacharparenleft}swap\ p{\isacharparenright}\ {\isacharequal}\ q\ {\isasymlongrightarrow}\ p\ {\isacharequal}\ q{\isachardoublequote}\isanewline
   157 \isacommand{apply}{\isacharparenleft}simp\ only{\isacharcolon}split{\isacharunderscore}paired{\isacharunderscore}all{\isacharparenright}%
   193 \isamarkupfalse%
       
   194 \isacommand{apply}{\isacharparenleft}simp\ only{\isacharcolon}split{\isacharunderscore}paired{\isacharunderscore}all{\isacharparenright}\isamarkupfalse%
       
   195 %
   158 \begin{isamarkuptxt}%
   196 \begin{isamarkuptxt}%
   159 \noindent
   197 \noindent
   160 \begin{isabelle}%
   198 \begin{isabelle}%
   161 \ {\isadigit{1}}{\isachardot}\ {\isasymAnd}a\ b\ aa\ ba{\isachardot}\isanewline
   199 \ {\isadigit{1}}{\isachardot}\ {\isasymAnd}a\ b\ aa\ ba{\isachardot}\isanewline
   162 \isaindent{\ {\isadigit{1}}{\isachardot}\ \ \ \ }swap\ {\isacharparenleft}swap\ {\isacharparenleft}a{\isacharcomma}\ b{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}aa{\isacharcomma}\ ba{\isacharparenright}\ {\isasymlongrightarrow}\ {\isacharparenleft}a{\isacharcomma}\ b{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}aa{\isacharcomma}\ ba{\isacharparenright}%
   200 \isaindent{\ {\isadigit{1}}{\isachardot}\ \ \ \ }swap\ {\isacharparenleft}swap\ {\isacharparenleft}a{\isacharcomma}\ b{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}aa{\isacharcomma}\ ba{\isacharparenright}\ {\isasymlongrightarrow}\ {\isacharparenleft}a{\isacharcomma}\ b{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}aa{\isacharcomma}\ ba{\isacharparenright}%
   163 \end{isabelle}%
   201 \end{isabelle}%
   164 \end{isamarkuptxt}%
   202 \end{isamarkuptxt}%
       
   203 \isamarkuptrue%
   165 \isacommand{apply}\ simp\isanewline
   204 \isacommand{apply}\ simp\isanewline
   166 \isacommand{done}%
   205 \isamarkupfalse%
       
   206 \isacommand{done}\isamarkupfalse%
       
   207 %
   167 \begin{isamarkuptext}%
   208 \begin{isamarkuptext}%
   168 \noindent
   209 \noindent
   169 Note that we have intentionally included only \isa{split{\isacharunderscore}paired{\isacharunderscore}all}
   210 Note that we have intentionally included only \isa{split{\isacharunderscore}paired{\isacharunderscore}all}
   170 in the first simplification step, and then we simplify again. 
   211 in the first simplification step, and then we simplify again. 
   171 This time the reason was not merely
   212 This time the reason was not merely
   173 \isa{split{\isacharunderscore}paired{\isacharunderscore}all} may interfere with other functions
   214 \isa{split{\isacharunderscore}paired{\isacharunderscore}all} may interfere with other functions
   174 of the simplifier.
   215 of the simplifier.
   175 The following command could fail (here it does not)
   216 The following command could fail (here it does not)
   176 where two separate \isa{simp} applications succeed.%
   217 where two separate \isa{simp} applications succeed.%
   177 \end{isamarkuptext}%
   218 \end{isamarkuptext}%
   178 \isacommand{apply}{\isacharparenleft}simp\ add{\isacharcolon}split{\isacharunderscore}paired{\isacharunderscore}all{\isacharparenright}%
   219 \isamarkuptrue%
       
   220 \isamarkupfalse%
       
   221 \isacommand{apply}{\isacharparenleft}simp\ add{\isacharcolon}split{\isacharunderscore}paired{\isacharunderscore}all{\isacharparenright}\isamarkupfalse%
       
   222 \isamarkupfalse%
       
   223 %
   179 \begin{isamarkuptext}%
   224 \begin{isamarkuptext}%
   180 \noindent
   225 \noindent
   181 Finally, the simplifier automatically splits all \isa{{\isasymforall}} and
   226 Finally, the simplifier automatically splits all \isa{{\isasymforall}} and
   182 \isa{{\isasymexists}}-quantified variables:%
   227 \isa{{\isasymexists}}-quantified variables:%
   183 \end{isamarkuptext}%
   228 \end{isamarkuptext}%
       
   229 \isamarkuptrue%
   184 \isacommand{lemma}\ {\isachardoublequote}{\isasymforall}p{\isachardot}\ {\isasymexists}q{\isachardot}\ swap\ p\ {\isacharequal}\ swap\ q{\isachardoublequote}\isanewline
   230 \isacommand{lemma}\ {\isachardoublequote}{\isasymforall}p{\isachardot}\ {\isasymexists}q{\isachardot}\ swap\ p\ {\isacharequal}\ swap\ q{\isachardoublequote}\isanewline
   185 \isacommand{by}\ simp%
   231 \isamarkupfalse%
       
   232 \isacommand{by}\ simp\isamarkupfalse%
       
   233 %
   186 \begin{isamarkuptext}%
   234 \begin{isamarkuptext}%
   187 \noindent
   235 \noindent
   188 To turn off this automatic splitting, just disable the
   236 To turn off this automatic splitting, just disable the
   189 responsible simplification rules:
   237 responsible simplification rules:
   190 \begin{center}
   238 \begin{center}
   194 \isa{{\isacharparenleft}{\isasymexists}x{\isachardot}\ P\ x{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}{\isasymexists}a\ b{\isachardot}\ P\ {\isacharparenleft}a{\isacharcomma}\ b{\isacharparenright}{\isacharparenright}}
   242 \isa{{\isacharparenleft}{\isasymexists}x{\isachardot}\ P\ x{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}{\isasymexists}a\ b{\isachardot}\ P\ {\isacharparenleft}a{\isacharcomma}\ b{\isacharparenright}{\isacharparenright}}
   195 \hfill
   243 \hfill
   196 (\isa{split{\isacharunderscore}paired{\isacharunderscore}Ex})
   244 (\isa{split{\isacharunderscore}paired{\isacharunderscore}Ex})
   197 \end{center}%
   245 \end{center}%
   198 \end{isamarkuptext}%
   246 \end{isamarkuptext}%
       
   247 \isamarkuptrue%
       
   248 \isamarkupfalse%
   199 \end{isabellebody}%
   249 \end{isabellebody}%
   200 %%% Local Variables:
   250 %%% Local Variables:
   201 %%% mode: latex
   251 %%% mode: latex
   202 %%% TeX-master: "root"
   252 %%% TeX-master: "root"
   203 %%% End:
   253 %%% End: