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} |