doc-src/TutorialI/Ifexpr/Ifexpr.thy
author hoelzl
Mon, 23 Aug 2010 19:35:57 +0200
changeset 38656 d5d342611edb
parent 27015 f8537d69f514
permissions -rw-r--r--
Rewrite the Probability theory. Introduced pinfreal as real numbers with infinity. Use pinfreal as value for measures. Introduces Lebesgue Measure based on the integral in Multivariate Analysis. Proved Radon Nikodym for arbitrary sigma finite measure spaces.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     1
(*<*)
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 15905
diff changeset
     2
theory Ifexpr imports Main begin;
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     3
(*>*)
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     4
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10795
diff changeset
     5
subsection{*Case Study: Boolean Expressions*}
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
     6
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 10978
diff changeset
     7
text{*\label{sec:boolex}\index{boolean expressions example|(}
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
     8
The aim of this case study is twofold: it shows how to model boolean
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
     9
expressions and some algorithms for manipulating them, and it demonstrates
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    10
the constructs introduced above.
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    11
*}
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    12
10978
5eebea8f359f *** empty log message ***
nipkow
parents: 10971
diff changeset
    13
subsubsection{*Modelling Boolean Expressions*}
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    14
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    15
text{*
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    16
We want to represent boolean expressions built up from variables and
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    17
constants by negation and conjunction. The following datatype serves exactly
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    18
that purpose:
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    19
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    20
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    21
datatype boolex = Const bool | Var nat | Neg boolex
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    22
                | And boolex boolex;
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    23
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    24
text{*\noindent
9541
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 9458
diff changeset
    25
The two constants are represented by @{term"Const True"} and
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 9458
diff changeset
    26
@{term"Const False"}. Variables are represented by terms of the form
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9541
diff changeset
    27
@{term"Var n"}, where @{term"n"} is a natural number (type @{typ"nat"}).
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    28
For example, the formula $P@0 \land \neg P@1$ is represented by the term
9541
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 9458
diff changeset
    29
@{term"And (Var 0) (Neg(Var 1))"}.
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    30
10978
5eebea8f359f *** empty log message ***
nipkow
parents: 10971
diff changeset
    31
\subsubsection{The Value of a Boolean Expression}
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    32
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    33
The value of a boolean expression depends on the value of its variables.
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9541
diff changeset
    34
Hence the function @{text"value"} takes an additional parameter, an
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9541
diff changeset
    35
\emph{environment} of type @{typ"nat => bool"}, which maps variables to their
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9541
diff changeset
    36
values:
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    37
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    38
27015
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
    39
primrec "value" :: "boolex \<Rightarrow> (nat \<Rightarrow> bool) \<Rightarrow> bool" where
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
    40
"value (Const b) env = b" |
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
    41
"value (Var x)   env = env x" |
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
    42
"value (Neg b)   env = (\<not> value b env)" |
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
    43
"value (And b c) env = (value b env \<and> value c env)"
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    44
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    45
text{*\noindent
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10795
diff changeset
    46
\subsubsection{If-Expressions}
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    47
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    48
An alternative and often more efficient (because in a certain sense
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    49
canonical) representation are so-called \emph{If-expressions} built up
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9541
diff changeset
    50
from constants (@{term"CIF"}), variables (@{term"VIF"}) and conditionals
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9541
diff changeset
    51
(@{term"IF"}):
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    52
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    53
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    54
datatype ifex = CIF bool | VIF nat | IF ifex ifex ifex;
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    55
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    56
text{*\noindent
10971
6852682eaf16 *** empty log message ***
nipkow
parents: 10885
diff changeset
    57
The evaluation of If-expressions proceeds as for @{typ"boolex"}:
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    58
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    59
27015
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
    60
primrec valif :: "ifex \<Rightarrow> (nat \<Rightarrow> bool) \<Rightarrow> bool" where
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
    61
"valif (CIF b)    env = b" |
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
    62
"valif (VIF x)    env = env x" |
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    63
"valif (IF b t e) env = (if valif b env then valif t env
27015
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
    64
                                        else valif e env)"
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    65
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    66
text{*
10978
5eebea8f359f *** empty log message ***
nipkow
parents: 10971
diff changeset
    67
\subsubsection{Converting Boolean and If-Expressions}
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    68
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9541
diff changeset
    69
The type @{typ"boolex"} is close to the customary representation of logical
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9541
diff changeset
    70
formulae, whereas @{typ"ifex"} is designed for efficiency. It is easy to
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9541
diff changeset
    71
translate from @{typ"boolex"} into @{typ"ifex"}:
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    72
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    73
27015
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
    74
primrec bool2if :: "boolex \<Rightarrow> ifex" where
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
    75
"bool2if (Const b) = CIF b" |
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
    76
"bool2if (Var x)   = VIF x" |
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
    77
"bool2if (Neg b)   = IF (bool2if b) (CIF False) (CIF True)" |
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
    78
"bool2if (And b c) = IF (bool2if b) (bool2if c) (CIF False)"
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    79
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    80
text{*\noindent
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9541
diff changeset
    81
At last, we have something we can verify: that @{term"bool2if"} preserves the
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    82
value of its argument:
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    83
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    84
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    85
lemma "valif (bool2if b) env = value b env";
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    86
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    87
txt{*\noindent
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    88
The proof is canonical:
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    89
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    90
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    91
apply(induct_tac b);
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
    92
apply(auto);
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
    93
done
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    94
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    95
text{*\noindent
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    96
In fact, all proofs in this case study look exactly like this. Hence we do
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    97
not show them below.
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    98
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    99
More interesting is the transformation of If-expressions into a normal form
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9541
diff changeset
   100
where the first argument of @{term"IF"} cannot be another @{term"IF"} but
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   101
must be a constant or variable. Such a normal form can be computed by
9541
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 9458
diff changeset
   102
repeatedly replacing a subterm of the form @{term"IF (IF b x y) z u"} by
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 9458
diff changeset
   103
@{term"IF b (IF x z u) (IF y z u)"}, which has the same value. The following
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   104
primitive recursive functions perform this task:
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   105
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   106
27015
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   107
primrec normif :: "ifex \<Rightarrow> ifex \<Rightarrow> ifex \<Rightarrow> ifex" where
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   108
"normif (CIF b)    t e = IF (CIF b) t e" |
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   109
"normif (VIF x)    t e = IF (VIF x) t e" |
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   110
"normif (IF b t e) u f = normif b (normif t u f) (normif e u f)"
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   111
27015
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   112
primrec norm :: "ifex \<Rightarrow> ifex" where
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   113
"norm (CIF b)    = CIF b" |
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   114
"norm (VIF x)    = VIF x" |
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   115
"norm (IF b t e) = normif b (norm t) (norm e)"
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   116
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   117
text{*\noindent
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 10978
diff changeset
   118
Their interplay is tricky; we leave it to you to develop an
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   119
intuitive understanding. Fortunately, Isabelle can help us to verify that the
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   120
transformation preserves the value of the expression:
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   121
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   122
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   123
theorem "valif (norm b) env = valif b env";(*<*)oops;(*>*)
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   124
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   125
text{*\noindent
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   126
The proof is canonical, provided we first show the following simplification
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 10978
diff changeset
   127
lemma, which also helps to understand what @{term"normif"} does:
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   128
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   129
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   130
lemma [simp]:
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10171
diff changeset
   131
  "\<forall>t e. valif (normif b t e) env = valif (IF b t e) env";
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   132
(*<*)
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   133
apply(induct_tac b);
9458
c613cd06d5cf apply. -> by
nipkow
parents: 8771
diff changeset
   134
by(auto);
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   135
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   136
theorem "valif (norm b) env = valif b env";
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   137
apply(induct_tac b);
9458
c613cd06d5cf apply. -> by
nipkow
parents: 8771
diff changeset
   138
by(auto);
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   139
(*>*)
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   140
text{*\noindent
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   141
Note that the lemma does not have a name, but is implicitly used in the proof
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9541
diff changeset
   142
of the theorem shown above because of the @{text"[simp]"} attribute.
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   143
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9541
diff changeset
   144
But how can we be sure that @{term"norm"} really produces a normal form in
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 10978
diff changeset
   145
the above sense? We define a function that tests If-expressions for normality:
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   146
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   147
27015
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   148
primrec normal :: "ifex \<Rightarrow> bool" where
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   149
"normal(CIF b) = True" |
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   150
"normal(VIF x) = True" |
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10171
diff changeset
   151
"normal(IF b t e) = (normal t \<and> normal e \<and>
27015
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   152
     (case b of CIF b \<Rightarrow> True | VIF x \<Rightarrow> True | IF x y z \<Rightarrow> False))"
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   153
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   154
text{*\noindent
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 10978
diff changeset
   155
Now we prove @{term"normal(norm b)"}. Of course, this requires a lemma about
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9541
diff changeset
   156
normality of @{term"normif"}:
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   157
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   158
12327
5a4d78204492 *** empty log message ***
nipkow
parents: 11456
diff changeset
   159
lemma [simp]: "\<forall>t e. normal(normif b t e) = (normal t \<and> normal e)";
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8745
diff changeset
   160
(*<*)
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   161
apply(induct_tac b);
9458
c613cd06d5cf apply. -> by
nipkow
parents: 8771
diff changeset
   162
by(auto);
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   163
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   164
theorem "normal(norm b)";
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   165
apply(induct_tac b);
9458
c613cd06d5cf apply. -> by
nipkow
parents: 8771
diff changeset
   166
by(auto);
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
   167
(*>*)
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   168
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
   169
text{*\medskip
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10171
diff changeset
   170
How do we come up with the required lemmas? Try to prove the main theorems
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10171
diff changeset
   171
without them and study carefully what @{text auto} leaves unproved. This 
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10171
diff changeset
   172
can provide the clue.  The necessity of universal quantification
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
   173
(@{text"\<forall>t e"}) in the two lemmas is explained in
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
   174
\S\ref{sec:InductionHeuristics}
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
   175
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
   176
\begin{exercise}
15905
0a4cc9b113c7 introduced @{const ...} antiquotation
haftmann
parents: 15243
diff changeset
   177
  We strengthen the definition of a @{const normal} If-expression as follows:
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
   178
  the first argument of all @{term IF}s must be a variable. Adapt the above
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
   179
  development to this changed requirement. (Hint: you may need to formulate
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
   180
  some of the goals as implications (@{text"\<longrightarrow>"}) rather than
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
   181
  equalities (@{text"="}).)
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
   182
\end{exercise}
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 10978
diff changeset
   183
\index{boolean expressions example|)}
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
   184
*}
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
   185
(*<*)
15243
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   186
27015
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   187
primrec normif2 :: "ifex => ifex => ifex => ifex" where
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   188
"normif2 (CIF b)    t e = (if b then t else e)" |
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   189
"normif2 (VIF x)    t e = IF (VIF x) t e" |
15243
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   190
"normif2 (IF b t e) u f = normif2 b (normif2 t u f) (normif2 e u f)"
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   191
27015
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   192
primrec norm2 :: "ifex => ifex" where
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   193
"norm2 (CIF b)    = CIF b" |
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   194
"norm2 (VIF x)    = VIF x" |
15243
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   195
"norm2 (IF b t e) = normif2 b (norm2 t) (norm2 e)"
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   196
27015
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   197
primrec normal2 :: "ifex => bool" where
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   198
"normal2(CIF b) = True" |
f8537d69f514 *** empty log message ***
nipkow
parents: 17555
diff changeset
   199
"normal2(VIF x) = True" |
15243
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   200
"normal2(IF b t e) = (normal2 t & normal2 e &
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   201
     (case b of CIF b => False | VIF x => True | IF x y z => False))"
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   202
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   203
lemma [simp]:
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   204
  "ALL t e. valif (normif2 b t e) env = valif (IF b t e) env"
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   205
apply(induct b)
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   206
by(auto)
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   207
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   208
theorem "valif (norm2 b) env = valif b env"
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   209
apply(induct b)
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   210
by(auto)
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   211
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   212
lemma [simp]: "ALL t e. normal2 t & normal2 e --> normal2(normif2 b t e)"
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   213
apply(induct b)
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   214
by(auto)
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   215
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   216
theorem "normal2(norm2 b)"
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   217
apply(induct b)
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   218
by(auto)
ba52fdc2c4e8 Added solution to exercise.
nipkow
parents: 12327
diff changeset
   219
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8745
diff changeset
   220
end
026f37a86ea7 *** empty log message ***
nipkow
parents: 8745
diff changeset
   221
(*>*)