| author | nipkow |
| Sun, 10 Mar 2013 18:29:10 +0100 | |
| changeset 51389 | 8a9f0503b1c0 |
| parent 51359 | 00b45c7e831f |
| child 51698 | c0af8bbc5825 |
| permissions | -rw-r--r-- |
| 47619 | 1 |
(* Author: Tobias Nipkow *) |
2 |
||
3 |
theory Abs_State |
|
4 |
imports Abs_Int0 |
|
5 |
begin |
|
6 |
||
| 49396 | 7 |
subsubsection "Set-based lattices" |
| 47619 | 8 |
|
9 |
instantiation com :: vars |
|
10 |
begin |
|
11 |
||
12 |
fun vars_com :: "com \<Rightarrow> vname set" where |
|
13 |
"vars com.SKIP = {}" |
|
|
14 |
"vars (x::=e) = {x} \<union> vars e" |
|
|
15 |
"vars (c1;c2) = vars c1 \<union> vars c2" | |
|
16 |
"vars (IF b THEN c1 ELSE c2) = vars b \<union> vars c1 \<union> vars c2" | |
|
17 |
"vars (WHILE b DO c) = vars b \<union> vars c" |
|
18 |
||
19 |
instance .. |
|
20 |
||
21 |
end |
|
22 |
||
23 |
||
24 |
lemma finite_avars: "finite(vars(a::aexp))" |
|
25 |
by(induction a) simp_all |
|
26 |
||
27 |
lemma finite_bvars: "finite(vars(b::bexp))" |
|
28 |
by(induction b) (simp_all add: finite_avars) |
|
29 |
||
30 |
lemma finite_cvars: "finite(vars(c::com))" |
|
31 |
by(induction c) (simp_all add: finite_avars finite_bvars) |
|
32 |
||
33 |
||
| 49396 | 34 |
class L = |
35 |
fixes L :: "vname set \<Rightarrow> 'a set" |
|
| 47619 | 36 |
|
37 |
||
| 49396 | 38 |
instantiation acom :: (L)L |
| 47619 | 39 |
begin |
40 |
||
| 49396 | 41 |
definition L_acom where |
42 |
"L X = {C. vars(strip C) \<subseteq> X \<and> (\<forall>a \<in> set(annos C). a \<in> L X)}"
|
|
| 47619 | 43 |
|
44 |
instance .. |
|
45 |
||
46 |
end |
|
47 |
||
48 |
||
| 49396 | 49 |
instantiation option :: (L)L |
| 47619 | 50 |
begin |
51 |
||
| 49396 | 52 |
definition L_option where |
53 |
"L X = {opt. case opt of None \<Rightarrow> True | Some x \<Rightarrow> x \<in> L X}"
|
|
| 47619 | 54 |
|
| 49396 | 55 |
lemma L_option_simps[simp]: "None \<in> L X" "(Some x \<in> L X) = (x \<in> L X)" |
56 |
by(simp_all add: L_option_def) |
|
| 47619 | 57 |
|
58 |
instance .. |
|
59 |
||
60 |
end |
|
61 |
||
| 51389 | 62 |
class semilatticeL = order + sup + L + |
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
63 |
fixes Top :: "vname set \<Rightarrow> 'a" |
| 51389 | 64 |
assumes sup_ge1 [simp]: "x \<in> L X \<Longrightarrow> y \<in> L X \<Longrightarrow> x \<le> x \<squnion> y" |
65 |
and sup_ge2 [simp]: "x \<in> L X \<Longrightarrow> y \<in> L X \<Longrightarrow> y \<le> x \<squnion> y" |
|
66 |
and sup_least[simp]: "x \<le> z \<Longrightarrow> y \<le> z \<Longrightarrow> x \<squnion> y \<le> z" |
|
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
67 |
and Top[simp]: "x \<in> L X \<Longrightarrow> x \<le> Top X" |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
68 |
and Top_in_L[simp]: "Top X \<in> L X" |
| 51389 | 69 |
and sup_in_L[simp]: "x \<in> L X \<Longrightarrow> y \<in> L X \<Longrightarrow> x \<squnion> y \<in> L X" |
| 47619 | 70 |
|
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
71 |
notation (input) Top ("\<top>\<^bsub>_\<^esub>")
|
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
72 |
notation (latex output) Top ("\<top>\<^bsub>\<^raw:\isa{>_\<^raw:}>\<^esub>")
|
| 47619 | 73 |
|
| 49396 | 74 |
instantiation option :: (semilatticeL)semilatticeL |
| 47619 | 75 |
begin |
76 |
||
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
77 |
definition Top_option where "Top c = Some(Top c)" |
| 47619 | 78 |
|
79 |
instance proof |
|
80 |
case goal1 thus ?case by(cases x, simp, cases y, simp_all) |
|
81 |
next |
|
82 |
case goal2 thus ?case by(cases y, simp, cases x, simp_all) |
|
83 |
next |
|
84 |
case goal3 thus ?case by(cases z, simp, cases y, simp, cases x, simp_all) |
|
85 |
next |
|
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
86 |
case goal4 thus ?case by(cases x, simp_all add: Top_option_def) |
| 47619 | 87 |
next |
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
88 |
case goal5 thus ?case by(simp add: Top_option_def) |
| 47619 | 89 |
next |
| 49396 | 90 |
case goal6 thus ?case by(simp add: L_option_def split: option.splits) |
| 47619 | 91 |
qed |
92 |
||
93 |
end |
|
94 |
||
95 |
||
96 |
subsection "Abstract State with Computable Ordering" |
|
97 |
||
98 |
hide_type st --"to avoid long names" |
|
99 |
||
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
100 |
text{* A concrete type of state with computable @{text"\<le>"}: *}
|
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
101 |
|
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
102 |
fun st :: "(vname \<Rightarrow> 'a) * vname set \<Rightarrow> bool" where |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
103 |
"st (f,X) = (\<forall>x. x \<notin> X \<longrightarrow> f x = undefined)" |
| 47619 | 104 |
|
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
105 |
typedef 'a st = "{p :: (vname \<Rightarrow> 'a) * vname set. st p}"
|
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
106 |
proof |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
107 |
show "(\<lambda>x. undefined,{}) \<in> {p. st p}" by simp
|
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
108 |
qed |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
109 |
|
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
110 |
setup_lifting type_definition_st |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
111 |
|
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
112 |
lift_definition St :: "(vname \<Rightarrow> 'a) \<Rightarrow> vname set \<Rightarrow> 'a st" is |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
113 |
"\<lambda>f X. (\<lambda>x. if x \<in> X then f x else undefined, X)" |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
114 |
by(simp) |
| 47619 | 115 |
|
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
116 |
lift_definition update :: "'a st \<Rightarrow> vname \<Rightarrow> 'a \<Rightarrow> 'a st" is |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
117 |
"\<lambda>(f,X) x a. (f(x := a), insert x X)" |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
118 |
by(auto) |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
119 |
|
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
120 |
lift_definition "fun" :: "'a st \<Rightarrow> vname \<Rightarrow> 'a" is fst .. |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
121 |
|
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
122 |
lift_definition dom :: "'a st \<Rightarrow> vname set" is snd .. |
| 47619 | 123 |
|
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
124 |
lemma dom_St[simp]: "dom(St f X) = X" |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
125 |
by(simp add: St.rep_eq dom.rep_eq) |
| 47619 | 126 |
|
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
127 |
lemma fun_St[simp]: "fun(St f X) = (\<lambda>x. if x \<in> X then f x else undefined)" |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
128 |
by(simp add: St.rep_eq fun.rep_eq) |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
129 |
|
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
130 |
definition show_st :: "'a st \<Rightarrow> (vname * 'a)set" where |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
131 |
"show_st S = (\<lambda>x. (x, fun S x)) ` dom S" |
| 47619 | 132 |
|
133 |
definition "show_acom = map_acom (Option.map show_st)" |
|
| 51036 | 134 |
definition "show_acom_opt = Option.map show_acom" |
| 47619 | 135 |
|
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
136 |
lemma fun_update[simp]: "fun (update S x y) = (fun S)(x:=y)" |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
137 |
by transfer auto |
| 47619 | 138 |
|
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
139 |
lemma dom_update[simp]: "dom (update S x y) = insert x (dom S)" |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
140 |
by transfer auto |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
141 |
|
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
142 |
definition \<gamma>_st :: "('a \<Rightarrow> 'b set) \<Rightarrow> 'a st \<Rightarrow> (vname \<Rightarrow> 'b) set" where
|
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
143 |
"\<gamma>_st \<gamma> F = {f. \<forall>x\<in>dom F. f x \<in> \<gamma>(fun F x)}"
|
| 47619 | 144 |
|
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
145 |
lemma ext_st: "dom F = dom G \<Longrightarrow> \<forall>x \<in> dom G. fun F x = fun G x \<Longrightarrow> F=G" |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
146 |
apply(induct F rule:Abs_st_induct) |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
147 |
apply(induct G rule:Abs_st_induct) |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
148 |
apply (auto simp:Abs_st_inject fun_def dom_def Abs_st_inverse simp del: st.simps) |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
149 |
apply(rule ext) |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
150 |
apply auto |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
151 |
done |
| 47619 | 152 |
|
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
153 |
instantiation st :: (order) order |
| 47619 | 154 |
begin |
155 |
||
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
156 |
definition less_eq_st :: "'a st \<Rightarrow> 'a st \<Rightarrow> bool" where |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
157 |
"F \<le> (G::'a st) = (dom F = dom G \<and> (\<forall>x \<in> dom F. fun F x \<le> fun G x))" |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
158 |
|
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
159 |
definition less_st where "F < (G::'a st) = (F \<le> G \<and> \<not> G \<le> F)" |
| 47619 | 160 |
|
161 |
instance |
|
162 |
proof |
|
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
163 |
case goal1 show ?case by(rule less_st_def) |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
164 |
next |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
165 |
case goal2 show ?case by(auto simp: less_eq_st_def) |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
166 |
next |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
167 |
case goal3 thus ?case by(fastforce simp: less_eq_st_def) |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
168 |
next |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
169 |
case goal4 thus ?case by (metis less_eq_st_def antisym ext_st) |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
170 |
qed |
| 47619 | 171 |
|
172 |
end |
|
173 |
||
| 51389 | 174 |
instantiation st :: (sup) sup |
| 47619 | 175 |
begin |
176 |
||
| 51389 | 177 |
definition sup_st :: "'a st \<Rightarrow> 'a st \<Rightarrow> 'a st" where |
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
178 |
"F \<squnion> (G::'a st) = St (\<lambda>x. fun F x \<squnion> fun G x) (dom F)" |
| 47619 | 179 |
|
180 |
instance .. |
|
181 |
||
182 |
end |
|
183 |
||
| 49396 | 184 |
instantiation st :: (type) L |
| 47619 | 185 |
begin |
186 |
||
| 49396 | 187 |
definition L_st :: "vname set \<Rightarrow> 'a st set" where |
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
188 |
"L(X::vname set) = {F. dom F = X}"
|
| 47619 | 189 |
|
190 |
instance .. |
|
191 |
||
192 |
end |
|
193 |
||
| 49396 | 194 |
instantiation st :: (semilattice) semilatticeL |
| 47619 | 195 |
begin |
196 |
||
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
197 |
definition Top_st :: "vname set \<Rightarrow> 'a st" where "Top(X) = St (\<lambda>x. \<top>) X" |
| 47619 | 198 |
|
199 |
instance |
|
| 51389 | 200 |
proof qed(auto simp add: less_eq_st_def sup_st_def Top_st_def L_st_def) |
| 47619 | 201 |
|
202 |
end |
|
203 |
||
204 |
||
| 49399 | 205 |
text{* Trick to make code generator happy. *}
|
206 |
lemma [code]: "L = (L :: _ \<Rightarrow> _ st set)" |
|
207 |
by(rule refl) |
|
208 |
(* L is not used in the code but is part of a type class that is used. |
|
209 |
Hence the code generator wants to build a dictionary with L in it. |
|
210 |
But L is not executable. This looping defn makes it look as if it were. *) |
|
211 |
||
212 |
||
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
213 |
lemma mono_fun: "F \<le> G \<Longrightarrow> x : dom F \<Longrightarrow> fun F x \<le> fun G x" |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
214 |
by(auto simp: less_eq_st_def) |
| 47619 | 215 |
|
216 |
lemma mono_update[simp]: |
|
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
217 |
"a1 \<le> a2 \<Longrightarrow> S1 \<le> S2 \<Longrightarrow> update S1 x a1 \<le> update S2 x a2" |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
218 |
by(auto simp add: less_eq_st_def) |
| 47619 | 219 |
|
220 |
||
| 49396 | 221 |
locale Gamma = Val_abs where \<gamma>=\<gamma> for \<gamma> :: "'av::semilattice \<Rightarrow> val set" |
| 47619 | 222 |
begin |
223 |
||
| 49497 | 224 |
abbreviation \<gamma>\<^isub>s :: "'av st \<Rightarrow> state set" |
225 |
where "\<gamma>\<^isub>s == \<gamma>_st \<gamma>" |
|
| 47619 | 226 |
|
227 |
abbreviation \<gamma>\<^isub>o :: "'av st option \<Rightarrow> state set" |
|
| 49497 | 228 |
where "\<gamma>\<^isub>o == \<gamma>_option \<gamma>\<^isub>s" |
| 47619 | 229 |
|
230 |
abbreviation \<gamma>\<^isub>c :: "'av st option acom \<Rightarrow> state set acom" |
|
231 |
where "\<gamma>\<^isub>c == map_acom \<gamma>\<^isub>o" |
|
232 |
||
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
233 |
lemma gamma_s_Top[simp]: "\<gamma>\<^isub>s (Top X) = UNIV" |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
234 |
by(auto simp: Top_st_def \<gamma>_st_def) |
| 47619 | 235 |
|
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
236 |
lemma gamma_o_Top[simp]: "\<gamma>\<^isub>o (Top X) = UNIV" |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
237 |
by (simp add: Top_option_def) |
| 47619 | 238 |
|
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
239 |
lemma mono_gamma_s: "f \<le> g \<Longrightarrow> \<gamma>\<^isub>s f \<subseteq> \<gamma>\<^isub>s g" |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
240 |
apply(simp add:\<gamma>_st_def subset_iff less_eq_st_def split: if_splits) |
| 47619 | 241 |
by (metis mono_gamma subsetD) |
242 |
||
243 |
lemma mono_gamma_o: |
|
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
244 |
"S1 \<le> S2 \<Longrightarrow> \<gamma>\<^isub>o S1 \<subseteq> \<gamma>\<^isub>o S2" |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
245 |
by(induction S1 S2 rule: less_eq_option.induct)(simp_all add: mono_gamma_s) |
| 47619 | 246 |
|
|
51359
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
247 |
lemma mono_gamma_c: "C1 \<le> C2 \<Longrightarrow> \<gamma>\<^isub>c C1 \<le> \<gamma>\<^isub>c C2" |
|
00b45c7e831f
major redesign: order instead of preorder, new definition of intervals as quotients
nipkow
parents:
51036
diff
changeset
|
248 |
by (induction C1 C2 rule: less_eq_acom.induct) (simp_all add:mono_gamma_o) |
| 47619 | 249 |
|
250 |
lemma in_gamma_option_iff: |
|
251 |
"x : \<gamma>_option r u \<longleftrightarrow> (\<exists>u'. u = Some u' \<and> x : r u')" |
|
252 |
by (cases u) auto |
|
253 |
||
254 |
end |
|
255 |
||
256 |
end |