| author | wenzelm | 
| Sat, 02 Apr 2016 23:14:08 +0200 | |
| changeset 62825 | e6e80a8bf624 | 
| parent 60170 | 031ec3d34d31 | 
| child 67406 | 23307fd33906 | 
| permissions | -rw-r--r-- | 
| 43141 | 1 | theory BExp imports AExp begin | 
| 2 | ||
| 3 | subsection "Boolean Expressions" | |
| 4 | ||
| 58310 | 5 | datatype bexp = Bc bool | Not bexp | And bexp bexp | Less aexp aexp | 
| 43141 | 6 | |
| 49191 | 7 | text_raw{*\snip{BExpbvaldef}{1}{2}{% *}
 | 
| 43141 | 8 | fun bval :: "bexp \<Rightarrow> state \<Rightarrow> bool" where | 
| 45216 | 9 | "bval (Bc v) s = v" | | 
| 43141 | 10 | "bval (Not b) s = (\<not> bval b s)" | | 
| 53015 
a1119cf551e8
standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
 wenzelm parents: 
49920diff
changeset | 11 | "bval (And b\<^sub>1 b\<^sub>2) s = (bval b\<^sub>1 s \<and> bval b\<^sub>2 s)" | | 
| 
a1119cf551e8
standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
 wenzelm parents: 
49920diff
changeset | 12 | "bval (Less a\<^sub>1 a\<^sub>2) s = (aval a\<^sub>1 s < aval a\<^sub>2 s)" | 
| 49191 | 13 | text_raw{*}%endsnip*}
 | 
| 43141 | 14 | |
| 15 | value "bval (Less (V ''x'') (Plus (N 3) (V ''y''))) | |
| 44036 | 16 | <''x'' := 3, ''y'' := 1>" | 
| 43141 | 17 | |
| 18 | ||
| 45255 | 19 | subsection "Constant Folding" | 
| 20 | ||
| 21 | text{* Optimizing constructors: *}
 | |
| 22 | ||
| 49191 | 23 | text_raw{*\snip{BExplessdef}{0}{2}{% *}
 | 
| 43141 | 24 | fun less :: "aexp \<Rightarrow> aexp \<Rightarrow> bexp" where | 
| 53015 
a1119cf551e8
standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
 wenzelm parents: 
49920diff
changeset | 25 | "less (N n\<^sub>1) (N n\<^sub>2) = Bc(n\<^sub>1 < n\<^sub>2)" | | 
| 
a1119cf551e8
standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
 wenzelm parents: 
49920diff
changeset | 26 | "less a\<^sub>1 a\<^sub>2 = Less a\<^sub>1 a\<^sub>2" | 
| 49191 | 27 | text_raw{*}%endsnip*}
 | 
| 43141 | 28 | |
| 29 | lemma [simp]: "bval (less a1 a2) s = (aval a1 s < aval a2 s)" | |
| 45015 | 30 | apply(induction a1 a2 rule: less.induct) | 
| 43141 | 31 | apply simp_all | 
| 32 | done | |
| 33 | ||
| 49191 | 34 | text_raw{*\snip{BExpanddef}{2}{2}{% *}
 | 
| 43141 | 35 | fun "and" :: "bexp \<Rightarrow> bexp \<Rightarrow> bexp" where | 
| 45200 | 36 | "and (Bc True) b = b" | | 
| 37 | "and b (Bc True) = b" | | |
| 38 | "and (Bc False) b = Bc False" | | |
| 39 | "and b (Bc False) = Bc False" | | |
| 53015 
a1119cf551e8
standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
 wenzelm parents: 
49920diff
changeset | 40 | "and b\<^sub>1 b\<^sub>2 = And b\<^sub>1 b\<^sub>2" | 
| 49191 | 41 | text_raw{*}%endsnip*}
 | 
| 43141 | 42 | |
| 43 | lemma bval_and[simp]: "bval (and b1 b2) s = (bval b1 s \<and> bval b2 s)" | |
| 45015 | 44 | apply(induction b1 b2 rule: and.induct) | 
| 43141 | 45 | apply simp_all | 
| 46 | done | |
| 47 | ||
| 49191 | 48 | text_raw{*\snip{BExpnotdef}{2}{2}{% *}
 | 
| 43141 | 49 | fun not :: "bexp \<Rightarrow> bexp" where | 
| 45200 | 50 | "not (Bc True) = Bc False" | | 
| 51 | "not (Bc False) = Bc True" | | |
| 43141 | 52 | "not b = Not b" | 
| 49191 | 53 | text_raw{*}%endsnip*}
 | 
| 43141 | 54 | |
| 45255 | 55 | lemma bval_not[simp]: "bval (not b) s = (\<not> bval b s)" | 
| 45015 | 56 | apply(induction b rule: not.induct) | 
| 43141 | 57 | apply simp_all | 
| 58 | done | |
| 59 | ||
| 60 | text{* Now the overall optimizer: *}
 | |
| 61 | ||
| 49191 | 62 | text_raw{*\snip{BExpbsimpdef}{0}{2}{% *}
 | 
| 43141 | 63 | fun bsimp :: "bexp \<Rightarrow> bexp" where | 
| 45256 | 64 | "bsimp (Bc v) = Bc v" | | 
| 65 | "bsimp (Not b) = not(bsimp b)" | | |
| 53015 
a1119cf551e8
standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
 wenzelm parents: 
49920diff
changeset | 66 | "bsimp (And b\<^sub>1 b\<^sub>2) = and (bsimp b\<^sub>1) (bsimp b\<^sub>2)" | | 
| 
a1119cf551e8
standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
 wenzelm parents: 
49920diff
changeset | 67 | "bsimp (Less a\<^sub>1 a\<^sub>2) = less (asimp a\<^sub>1) (asimp a\<^sub>2)" | 
| 49191 | 68 | text_raw{*}%endsnip*}
 | 
| 43141 | 69 | |
| 70 | value "bsimp (And (Less (N 0) (N 1)) b)" | |
| 71 | ||
| 49920 | 72 | value "bsimp (And (Less (N 1) (N 0)) (Bc True))" | 
| 43141 | 73 | |
| 74 | theorem "bval (bsimp b) s = bval b s" | |
| 45015 | 75 | apply(induction b) | 
| 43141 | 76 | apply simp_all | 
| 77 | done | |
| 78 | ||
| 79 | end |