src/Doc/Tutorial/Ifexpr/Ifexpr.thy
author wenzelm
Sat, 05 Jan 2019 17:24:33 +0100
changeset 69597 ff784d5a5bfb
parent 69505 cc2d676d5395
permissions -rw-r--r--
isabelle update -u control_cartouches;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     1
(*<*)
58860
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
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
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
     5
subsection\<open>Case Study: Boolean Expressions\<close>
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
     6
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
     7
text\<open>\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.
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    11
\<close>
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    12
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    13
subsubsection\<open>Modelling Boolean Expressions\<close>
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
    14
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    15
text\<open>
8745
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:
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    19
\<close>
8745
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
58860
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
diff changeset
    22
                | And boolex boolex
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    23
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    24
text\<open>\noindent
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
    25
The two constants are represented by \<^term>\<open>Const True\<close> and
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
    26
\<^term>\<open>Const False\<close>. Variables are represented by terms of the form
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
    27
\<^term>\<open>Var n\<close>, where \<^term>\<open>n\<close> is a natural number (type \<^typ>\<open>nat\<close>).
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
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
    29
\<^term>\<open>And (Var 0) (Neg(Var 1))\<close>.
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.
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 67613
diff changeset
    34
Hence the function \<open>value\<close> takes an additional parameter, an
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
    35
\emph{environment} of type \<^typ>\<open>nat => bool\<close>, which maps variables to their
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9541
diff changeset
    36
values:
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    37
\<close>
8745
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
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    45
text\<open>\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
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
    50
from constants (\<^term>\<open>CIF\<close>), variables (\<^term>\<open>VIF\<close>) and conditionals
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
    51
(\<^term>\<open>IF\<close>):
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    52
\<close>
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    53
58860
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
diff changeset
    54
datatype ifex = CIF bool | VIF nat | IF ifex ifex ifex
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    55
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    56
text\<open>\noindent
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
    57
The evaluation of If-expressions proceeds as for \<^typ>\<open>boolex\<close>:
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    58
\<close>
8745
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
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    66
text\<open>
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
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
    69
The type \<^typ>\<open>boolex\<close> is close to the customary representation of logical
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
    70
formulae, whereas \<^typ>\<open>ifex\<close> is designed for efficiency. It is easy to
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
    71
translate from \<^typ>\<open>boolex\<close> into \<^typ>\<open>ifex\<close>:
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    72
\<close>
8745
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
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    80
text\<open>\noindent
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
    81
At last, we have something we can verify: that \<^term>\<open>bool2if\<close> preserves the
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    82
value of its argument:
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    83
\<close>
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    84
58860
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
diff changeset
    85
lemma "valif (bool2if b) env = value b env"
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    86
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    87
txt\<open>\noindent
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    88
The proof is canonical:
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    89
\<close>
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    90
58860
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
diff changeset
    91
apply(induct_tac b)
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
diff changeset
    92
apply(auto)
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
    93
done
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    94
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    95
text\<open>\noindent
8745
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
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   100
where the first argument of \<^term>\<open>IF\<close> cannot be another \<^term>\<open>IF\<close> 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
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   102
repeatedly replacing a subterm of the form \<^term>\<open>IF (IF b x y) z u\<close> by
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   103
\<^term>\<open>IF b (IF x z u) (IF y z u)\<close>, 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:
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
   105
\<close>
8745
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
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
   117
text\<open>\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:
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
   121
\<close>
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   122
58860
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
diff changeset
   123
theorem "valif (norm b) env = valif b env"(*<*)oops(*>*)
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   124
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
   125
text\<open>\noindent
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   126
The proof is canonical, provided we first show the following simplification
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   127
lemma, which also helps to understand what \<^term>\<open>normif\<close> does:
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
   128
\<close>
8745
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]:
58860
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
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
(*<*)
58860
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
diff changeset
   133
apply(induct_tac b)
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
diff changeset
   134
by(auto)
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   135
58860
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
diff changeset
   136
theorem "valif (norm b) env = valif b env"
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
diff changeset
   137
apply(induct_tac b)
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
diff changeset
   138
by(auto)
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   139
(*>*)
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
   140
text\<open>\noindent
8745
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
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 67613
diff changeset
   142
of the theorem shown above because of the \<open>[simp]\<close> attribute.
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   143
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   144
But how can we be sure that \<^term>\<open>norm\<close> 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:
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
   146
\<close>
8745
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
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
   154
text\<open>\noindent
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   155
Now we prove \<^term>\<open>normal(norm b)\<close>. Of course, this requires a lemma about
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   156
normality of \<^term>\<open>normif\<close>:
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
   157
\<close>
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   158
58860
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
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
(*<*)
58860
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
diff changeset
   161
apply(induct_tac b)
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
diff changeset
   162
by(auto)
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   163
58860
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
diff changeset
   164
theorem "normal(norm b)"
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
diff changeset
   165
apply(induct_tac b)
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
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
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
   169
text\<open>\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
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 67613
diff changeset
   171
without them and study carefully what \<open>auto\<close> leaves unproved. This 
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10171
diff changeset
   172
can provide the clue.  The necessity of universal quantification
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 67613
diff changeset
   173
(\<open>\<forall>t e\<close>) in the two lemmas is explained in
9933
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}
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   177
  We strengthen the definition of a \<^const>\<open>normal\<close> If-expression as follows:
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
   178
  the first argument of all \<^term>\<open>IF\<close>s must be a variable. Adapt the above
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9792
diff changeset
   179
  development to this changed requirement. (Hint: you may need to formulate
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 67613
diff changeset
   180
  some of the goals as implications (\<open>\<longrightarrow>\<close>) rather than
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 67613
diff changeset
   181
  equalities (\<open>=\<close>).)
9933
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|)}
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
   184
\<close>
9933
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]:
67613
ce654b0e6d69 more symbols;
wenzelm
parents: 67406
diff changeset
   204
  "\<forall>t e. valif (normif2 b t e) env = valif (IF b t e) env"
15243
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
67613
ce654b0e6d69 more symbols;
wenzelm
parents: 67406
diff changeset
   212
lemma [simp]: "\<forall>t e. normal2 t & normal2 e --> normal2(normif2 b t e)"
15243
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
(*>*)