text‹ \subsection{Case Expressions} \label{sec:case-expressions}\index{*case expressions}%
HOL also features \isa{case}-expressions for analyzing
elements of a datatype. For example,
@{term[display]"case xs of [] => [] | y#ys => y"}
evaluates to🍋‹[]›if🍋‹xs›is🍋‹[]›andto🍋‹y›if 🍋‹xs›is🍋‹y#ys›. (Since the result in both branches must be of
the same type, it follows that 🍋‹y›is of type 🍋‹'a list\ and hence
that 🍋‹xs›is of type 🍋‹'a list list\.)
In general, case expressions are of the form \[ \begin{array}{c} ‹case›~e~‹of›\ pattern@1~‹==>›~e@1\ ‹|›\ \dotsjava.lang.NullPointerException ‹|›~pattern@m~‹==>›~e@m \end{array} \]
Like in functional programming, patterns are expressions consisting of datatype constructors (e.g. 🍋‹[]›and‹#›) and variables, including the wildcard ``\verb$_$''.
Not all cases need to be covered and the order of cases matters.
However, one is well-advised not to wallow in complex patterns because
complex case distinctions tend to induce complex proofs.
\begin{warn}
Internally Isabelle only knows about exhaustive case expressions with
non-nested patterns: $pattern@i$ must be of the form
$C@i~x@ {i1}~\dots~x@ {ik@i}$ and $C@1, \dots, C@m$ must be exactly the
constructors of the type of $e$.
%
More complex case expressions are automatically
translated into the simpler form upon parsing but are not translated backfor printing. This may lead to surprising output. \end{warn}
\begin{warn}
Like ‹if›, ‹case›-expressions may need to be enclosed in
parentheses to indicate their scope. \end{warn}
\subsection{Structural InductionandCase Distinction} \label{sec:struct-ind-case} \index{case distinctions}\index{induction!structural}% Inductionis invoked by\methdx{induct_tac}, as we have seen above;
it works for any datatype. In some cases, inductionis overkill and a case
distinction over all constructors of the datatype suffices. This is performed by\methdx{case_tac}. Here is a trivial example: ›
txt‹\noindent
results in the proof state
@{subgoals[display,indent=0,margin=65]}
which is solved automatically: ›
apply(auto) (*<*)done(*>*) text‹ Note that we do not need to give a lemma a name if we do not intend to refer to it explicitly in the future.
Other basic laws about a datatype are applied automatically during
simplification, so no special methods are provided for them.
\begin{warn} Inductionis only allowed on free (or \isasymAnd-bound) variables that
should not occur among the assumptions of the subgoal; see \S\ref{sec:ind-var-in-prems} for details. Case distinction
(‹case_tac›) works for arbitrary terms, which need to be
quoted if they are non-atomic. However, apart from‹∧›-bound
variables, the terms must not contain variables that are bound outside. For example, given the goal 🍋‹∀xs. xs = [] ∨ (∃y ys. xs = y#ys)›, ‹case_tac xs› will not work as expected because Isabelle interprets
the 🍋‹xs› as a new free variable distinct from the bound 🍋‹xs›in the goal. \end{warn} ›
(*<*) end (*>*)
Messung V0.5
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.