diff -r c8a2755bf220 -r ff784d5a5bfb src/Doc/Tutorial/Ifexpr/Ifexpr.thy --- a/src/Doc/Tutorial/Ifexpr/Ifexpr.thy Sat Jan 05 17:00:43 2019 +0100 +++ b/src/Doc/Tutorial/Ifexpr/Ifexpr.thy Sat Jan 05 17:24:33 2019 +0100 @@ -22,17 +22,17 @@ | And boolex boolex text\\noindent -The two constants are represented by @{term"Const True"} and -@{term"Const False"}. Variables are represented by terms of the form -@{term"Var n"}, where @{term"n"} is a natural number (type @{typ"nat"}). +The two constants are represented by \<^term>\Const True\ and +\<^term>\Const False\. Variables are represented by terms of the form +\<^term>\Var n\, where \<^term>\n\ is a natural number (type \<^typ>\nat\). For example, the formula $P@0 \land \neg P@1$ is represented by the term -@{term"And (Var 0) (Neg(Var 1))"}. +\<^term>\And (Var 0) (Neg(Var 1))\. \subsubsection{The Value of a Boolean Expression} The value of a boolean expression depends on the value of its variables. Hence the function \value\ takes an additional parameter, an -\emph{environment} of type @{typ"nat => bool"}, which maps variables to their +\emph{environment} of type \<^typ>\nat => bool\, which maps variables to their values: \ @@ -47,14 +47,14 @@ An alternative and often more efficient (because in a certain sense canonical) representation are so-called \emph{If-expressions} built up -from constants (@{term"CIF"}), variables (@{term"VIF"}) and conditionals -(@{term"IF"}): +from constants (\<^term>\CIF\), variables (\<^term>\VIF\) and conditionals +(\<^term>\IF\): \ datatype ifex = CIF bool | VIF nat | IF ifex ifex ifex text\\noindent -The evaluation of If-expressions proceeds as for @{typ"boolex"}: +The evaluation of If-expressions proceeds as for \<^typ>\boolex\: \ primrec valif :: "ifex \ (nat \ bool) \ bool" where @@ -66,9 +66,9 @@ text\ \subsubsection{Converting Boolean and If-Expressions} -The type @{typ"boolex"} is close to the customary representation of logical -formulae, whereas @{typ"ifex"} is designed for efficiency. It is easy to -translate from @{typ"boolex"} into @{typ"ifex"}: +The type \<^typ>\boolex\ is close to the customary representation of logical +formulae, whereas \<^typ>\ifex\ is designed for efficiency. It is easy to +translate from \<^typ>\boolex\ into \<^typ>\ifex\: \ primrec bool2if :: "boolex \ ifex" where @@ -78,7 +78,7 @@ "bool2if (And b c) = IF (bool2if b) (bool2if c) (CIF False)" text\\noindent -At last, we have something we can verify: that @{term"bool2if"} preserves the +At last, we have something we can verify: that \<^term>\bool2if\ preserves the value of its argument: \ @@ -97,10 +97,10 @@ not show them below. More interesting is the transformation of If-expressions into a normal form -where the first argument of @{term"IF"} cannot be another @{term"IF"} but +where the first argument of \<^term>\IF\ cannot be another \<^term>\IF\ but must be a constant or variable. Such a normal form can be computed by -repeatedly replacing a subterm of the form @{term"IF (IF b x y) z u"} by -@{term"IF b (IF x z u) (IF y z u)"}, which has the same value. The following +repeatedly replacing a subterm of the form \<^term>\IF (IF b x y) z u\ by +\<^term>\IF b (IF x z u) (IF y z u)\, which has the same value. The following primitive recursive functions perform this task: \ @@ -124,7 +124,7 @@ text\\noindent The proof is canonical, provided we first show the following simplification -lemma, which also helps to understand what @{term"normif"} does: +lemma, which also helps to understand what \<^term>\normif\ does: \ lemma [simp]: @@ -141,7 +141,7 @@ Note that the lemma does not have a name, but is implicitly used in the proof of the theorem shown above because of the \[simp]\ attribute. -But how can we be sure that @{term"norm"} really produces a normal form in +But how can we be sure that \<^term>\norm\ really produces a normal form in the above sense? We define a function that tests If-expressions for normality: \ @@ -152,8 +152,8 @@ (case b of CIF b \ True | VIF x \ True | IF x y z \ False))" text\\noindent -Now we prove @{term"normal(norm b)"}. Of course, this requires a lemma about -normality of @{term"normif"}: +Now we prove \<^term>\normal(norm b)\. Of course, this requires a lemma about +normality of \<^term>\normif\: \ lemma [simp]: "\t e. normal(normif b t e) = (normal t \ normal e)" @@ -174,8 +174,8 @@ \S\ref{sec:InductionHeuristics} \begin{exercise} - We strengthen the definition of a @{const normal} If-expression as follows: - the first argument of all @{term IF}s must be a variable. Adapt the above + We strengthen the definition of a \<^const>\normal\ If-expression as follows: + the first argument of all \<^term>\IF\s must be a variable. Adapt the above development to this changed requirement. (Hint: you may need to formulate some of the goals as implications (\\\) rather than equalities (\=\).)