src/Doc/Tutorial/Ifexpr/Ifexpr.thy
author wenzelm
Sat, 05 Apr 2014 15:03:40 +0200
changeset 56421 1ffd7eaa778b
parent 48985 5386df44a037
child 58860 fee7cfa69c50
permissions -rw-r--r--
updated to jedit_build-20140405: Code2HTML.jar, CommonControls.jar, Console.jar, kappalayout.jar, Navigator.jar, SideKick.jar, doc with jEdit manuals (ant dist-manuals);
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
(*>*)