diff -r a5f53d9d2b60 -r f8537d69f514 doc-src/TutorialI/Ifexpr/Ifexpr.thy --- a/doc-src/TutorialI/Ifexpr/Ifexpr.thy Thu May 29 13:27:13 2008 +0200 +++ b/doc-src/TutorialI/Ifexpr/Ifexpr.thy Thu May 29 22:45:33 2008 +0200 @@ -36,12 +36,11 @@ values: *} -consts "value" :: "boolex \ (nat \ bool) \ bool"; -primrec -"value (Const b) env = b" -"value (Var x) env = env x" -"value (Neg b) env = (\ value b env)" -"value (And b c) env = (value b env \ value c env)"; +primrec "value" :: "boolex \ (nat \ bool) \ bool" where +"value (Const b) env = b" | +"value (Var x) env = env x" | +"value (Neg b) env = (\ value b env)" | +"value (And b c) env = (value b env \ value c env)" text{*\noindent \subsubsection{If-Expressions} @@ -58,12 +57,11 @@ The evaluation of If-expressions proceeds as for @{typ"boolex"}: *} -consts valif :: "ifex \ (nat \ bool) \ bool"; -primrec -"valif (CIF b) env = b" -"valif (VIF x) env = env x" +primrec valif :: "ifex \ (nat \ bool) \ bool" where +"valif (CIF b) env = b" | +"valif (VIF x) env = env x" | "valif (IF b t e) env = (if valif b env then valif t env - else valif e env)"; + else valif e env)" text{* \subsubsection{Converting Boolean and If-Expressions} @@ -73,12 +71,11 @@ translate from @{typ"boolex"} into @{typ"ifex"}: *} -consts bool2if :: "boolex \ ifex"; -primrec -"bool2if (Const b) = CIF b" -"bool2if (Var x) = VIF x" -"bool2if (Neg b) = IF (bool2if b) (CIF False) (CIF True)" -"bool2if (And b c) = IF (bool2if b) (bool2if c) (CIF False)"; +primrec bool2if :: "boolex \ ifex" where +"bool2if (Const b) = CIF b" | +"bool2if (Var x) = VIF x" | +"bool2if (Neg b) = IF (bool2if b) (CIF False) (CIF True)" | +"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 @@ -107,17 +104,15 @@ primitive recursive functions perform this task: *} -consts normif :: "ifex \ ifex \ ifex \ ifex"; -primrec -"normif (CIF b) t e = IF (CIF b) t e" -"normif (VIF x) t e = IF (VIF x) t e" -"normif (IF b t e) u f = normif b (normif t u f) (normif e u f)"; +primrec normif :: "ifex \ ifex \ ifex \ ifex" where +"normif (CIF b) t e = IF (CIF b) t e" | +"normif (VIF x) t e = IF (VIF x) t e" | +"normif (IF b t e) u f = normif b (normif t u f) (normif e u f)" -consts norm :: "ifex \ ifex"; -primrec -"norm (CIF b) = CIF b" -"norm (VIF x) = VIF x" -"norm (IF b t e) = normif b (norm t) (norm e)"; +primrec norm :: "ifex \ ifex" where +"norm (CIF b) = CIF b" | +"norm (VIF x) = VIF x" | +"norm (IF b t e) = normif b (norm t) (norm e)" text{*\noindent Their interplay is tricky; we leave it to you to develop an @@ -150,12 +145,11 @@ the above sense? We define a function that tests If-expressions for normality: *} -consts normal :: "ifex \ bool"; -primrec -"normal(CIF b) = True" -"normal(VIF x) = True" +primrec normal :: "ifex \ bool" where +"normal(CIF b) = True" | +"normal(VIF x) = True" | "normal(IF b t e) = (normal t \ normal e \ - (case b of CIF b \ True | VIF x \ True | IF x y z \ False))"; + (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 @@ -190,26 +184,22 @@ *} (*<*) -consts normif2 :: "ifex => ifex => ifex => ifex" -primrec -"normif2 (CIF b) t e = (if b then t else e)" -"normif2 (VIF x) t e = IF (VIF x) t e" +primrec normif2 :: "ifex => ifex => ifex => ifex" where +"normif2 (CIF b) t e = (if b then t else e)" | +"normif2 (VIF x) t e = IF (VIF x) t e" | "normif2 (IF b t e) u f = normif2 b (normif2 t u f) (normif2 e u f)" -consts norm2 :: "ifex => ifex" -primrec -"norm2 (CIF b) = CIF b" -"norm2 (VIF x) = VIF x" +primrec norm2 :: "ifex => ifex" where +"norm2 (CIF b) = CIF b" | +"norm2 (VIF x) = VIF x" | "norm2 (IF b t e) = normif2 b (norm2 t) (norm2 e)" -consts normal2 :: "ifex => bool" -primrec -"normal2(CIF b) = True" -"normal2(VIF x) = True" +primrec normal2 :: "ifex => bool" where +"normal2(CIF b) = True" | +"normal2(VIF x) = True" | "normal2(IF b t e) = (normal2 t & normal2 e & (case b of CIF b => False | VIF x => True | IF x y z => False))" - lemma [simp]: "ALL t e. valif (normif2 b t e) env = valif (IF b t e) env" apply(induct b)