1 (* Title: HOL/Induct/ABexp.thy |
1 (* Title: HOL/Induct/ABexp.thy |
2 ID: $Id$ |
2 ID: $Id$ |
3 Author: Stefan Berghofer, TU Muenchen |
3 Author: Stefan Berghofer, TU Muenchen |
4 Copyright 1998 TU Muenchen |
4 Copyright 1998 TU Muenchen |
5 |
|
6 Arithmetic and boolean expressions |
|
7 *) |
5 *) |
8 |
6 |
9 ABexp = Main + |
7 header {* Arithmetic and boolean expressions *} |
10 |
8 |
11 datatype |
9 theory ABexp = Main: |
12 'a aexp = IF ('a bexp) ('a aexp) ('a aexp) |
10 |
13 | Sum ('a aexp) ('a aexp) |
11 datatype 'a aexp = |
14 | Diff ('a aexp) ('a aexp) |
12 IF "'a bexp" "'a aexp" "'a aexp" |
15 | Var 'a |
13 | Sum "'a aexp" "'a aexp" |
16 | Num nat |
14 | Diff "'a aexp" "'a aexp" |
17 and |
15 | Var 'a |
18 'a bexp = Less ('a aexp) ('a aexp) |
16 | Num nat |
19 | And ('a bexp) ('a bexp) |
17 and 'a bexp = |
20 | Neg ('a bexp) |
18 Less "'a aexp" "'a aexp" |
|
19 | And "'a bexp" "'a bexp" |
|
20 | Neg "'a bexp" |
21 |
21 |
22 |
22 |
23 (** evaluation of arithmetic and boolean expressions **) |
23 text {* \medskip Evaluation of arithmetic and boolean expressions *} |
24 |
24 |
25 consts |
25 consts |
26 evala :: ('a => nat) => 'a aexp => nat |
26 evala :: "('a => nat) => 'a aexp => nat" |
27 evalb :: ('a => nat) => 'a bexp => bool |
27 evalb :: "('a => nat) => 'a bexp => bool" |
28 |
28 |
29 primrec |
29 primrec |
30 "evala env (IF b a1 a2) = |
30 "evala env (IF b a1 a2) = (if evalb env b then evala env a1 else evala env a2)" |
31 (if evalb env b then evala env a1 else evala env a2)" |
|
32 "evala env (Sum a1 a2) = evala env a1 + evala env a2" |
31 "evala env (Sum a1 a2) = evala env a1 + evala env a2" |
33 "evala env (Diff a1 a2) = evala env a1 - evala env a2" |
32 "evala env (Diff a1 a2) = evala env a1 - evala env a2" |
34 "evala env (Var v) = env v" |
33 "evala env (Var v) = env v" |
35 "evala env (Num n) = n" |
34 "evala env (Num n) = n" |
36 |
35 |
37 "evalb env (Less a1 a2) = (evala env a1 < evala env a2)" |
36 "evalb env (Less a1 a2) = (evala env a1 < evala env a2)" |
38 "evalb env (And b1 b2) = (evalb env b1 & evalb env b2)" |
37 "evalb env (And b1 b2) = (evalb env b1 \<and> evalb env b2)" |
39 "evalb env (Neg b) = (~ evalb env b)" |
38 "evalb env (Neg b) = (\<not> evalb env b)" |
40 |
39 |
41 |
40 |
42 (** substitution on arithmetic and boolean expressions **) |
41 text {* \medskip Substitution on arithmetic and boolean expressions *} |
43 |
42 |
44 consts |
43 consts |
45 substa :: ('a => 'b aexp) => 'a aexp => 'b aexp |
44 substa :: "('a => 'b aexp) => 'a aexp => 'b aexp" |
46 substb :: ('a => 'b aexp) => 'a bexp => 'b bexp |
45 substb :: "('a => 'b aexp) => 'a bexp => 'b bexp" |
47 |
46 |
48 primrec |
47 primrec |
49 "substa f (IF b a1 a2) = |
48 "substa f (IF b a1 a2) = IF (substb f b) (substa f a1) (substa f a2)" |
50 IF (substb f b) (substa f a1) (substa f a2)" |
|
51 "substa f (Sum a1 a2) = Sum (substa f a1) (substa f a2)" |
49 "substa f (Sum a1 a2) = Sum (substa f a1) (substa f a2)" |
52 "substa f (Diff a1 a2) = Diff (substa f a1) (substa f a2)" |
50 "substa f (Diff a1 a2) = Diff (substa f a1) (substa f a2)" |
53 "substa f (Var v) = f v" |
51 "substa f (Var v) = f v" |
54 "substa f (Num n) = Num n" |
52 "substa f (Num n) = Num n" |
55 |
53 |
56 "substb f (Less a1 a2) = Less (substa f a1) (substa f a2)" |
54 "substb f (Less a1 a2) = Less (substa f a1) (substa f a2)" |
57 "substb f (And b1 b2) = And (substb f b1) (substb f b2)" |
55 "substb f (And b1 b2) = And (substb f b1) (substb f b2)" |
58 "substb f (Neg b) = Neg (substb f b)" |
56 "substb f (Neg b) = Neg (substb f b)" |
59 |
57 |
|
58 lemma subst1_aexp_bexp: |
|
59 "evala env (substa (Var (v := a')) a) = evala (env (v := evala env a')) a \<and> |
|
60 evalb env (substb (Var (v := a')) b) = evalb (env (v := evala env a')) b" |
|
61 -- {* one variable *} |
|
62 apply (induct a and b) |
|
63 apply simp_all |
|
64 done |
|
65 |
|
66 lemma subst_all_aexp_bexp: |
|
67 "evala env (substa s a) = evala (\<lambda>x. evala env (s x)) a \<and> |
|
68 evalb env (substb s b) = evalb (\<lambda>x. evala env (s x)) b" |
|
69 -- {* all variables *} |
|
70 apply (induct a and b) |
|
71 apply auto |
|
72 done |
|
73 |
60 end |
74 end |