31 "{)l..u} == {)l..} Int {..u}" |
31 "{)l..u} == {)l..} Int {..u}" |
32 |
32 |
33 atLeastAtMost :: "['a::ord, 'a] => 'a set" ("(1{_.._})") |
33 atLeastAtMost :: "['a::ord, 'a] => 'a set" ("(1{_.._})") |
34 "{l..u} == {l..} Int {..u}" |
34 "{l..u} == {l..} Int {..u}" |
35 |
35 |
36 |
|
37 subsection {* Setup of transitivity reasoner *} |
|
38 |
|
39 ML {* |
|
40 |
|
41 structure Trans_Tac = Trans_Tac_Fun ( |
|
42 struct |
|
43 val less_reflE = thm "order_less_irrefl" RS thm "notE"; |
|
44 val le_refl = thm "order_refl"; |
|
45 val less_imp_le = thm "order_less_imp_le"; |
|
46 val not_lessI = thm "linorder_not_less" RS thm "iffD2"; |
|
47 val not_leI = thm "linorder_not_less" RS thm "iffD2"; |
|
48 val not_lessD = thm "linorder_not_less" RS thm "iffD1"; |
|
49 val not_leD = thm "linorder_not_le" RS thm "iffD1"; |
|
50 val eqI = thm "order_antisym"; |
|
51 val eqD1 = thm "order_eq_refl"; |
|
52 val eqD2 = thm "sym" RS thm "order_eq_refl"; |
|
53 val less_trans = thm "order_less_trans"; |
|
54 val less_le_trans = thm "order_less_le_trans"; |
|
55 val le_less_trans = thm "order_le_less_trans"; |
|
56 val le_trans = thm "order_trans"; |
|
57 fun decomp (Trueprop $ t) = |
|
58 let fun dec (Const ("Not", _) $ t) = ( |
|
59 case dec t of |
|
60 None => None |
|
61 | Some (t1, rel, t2) => Some (t1, "~" ^ rel, t2)) |
|
62 | dec (Const (rel, _) $ t1 $ t2) = |
|
63 Some (t1, implode (drop (3, explode rel)), t2) |
|
64 | dec _ = None |
|
65 in dec t end |
|
66 | decomp _ = None |
|
67 end); |
|
68 |
|
69 val trans_tac = Trans_Tac.trans_tac; |
|
70 |
|
71 *} |
|
72 |
|
73 method_setup trans = |
|
74 {* Method.no_args (Method.SIMPLE_METHOD' HEADGOAL (trans_tac)) *} |
|
75 {* simple transitivity reasoner *} |
|
76 |
|
77 |
|
78 subsection {*lessThan*} |
36 subsection {*lessThan*} |
79 |
37 |
80 lemma lessThan_iff [iff]: "(i: lessThan k) = (i<k)" |
38 lemma lessThan_iff [iff]: "(i: lessThan k) = (i<k)" |
81 by (simp add: lessThan_def) |
39 by (simp add: lessThan_def) |
82 |
40 |
93 by blast |
51 by blast |
94 |
52 |
95 lemma Compl_lessThan [simp]: |
53 lemma Compl_lessThan [simp]: |
96 "!!k:: 'a::linorder. -lessThan k = atLeast k" |
54 "!!k:: 'a::linorder. -lessThan k = atLeast k" |
97 apply (auto simp add: lessThan_def atLeast_def) |
55 apply (auto simp add: lessThan_def atLeast_def) |
98 apply (blast intro: linorder_not_less [THEN iffD1]) |
|
99 apply (blast dest: order_le_less_trans) |
|
100 done |
56 done |
101 |
57 |
102 lemma single_Diff_lessThan [simp]: "!!k:: 'a::order. {k} - lessThan k = {k}" |
58 lemma single_Diff_lessThan [simp]: "!!k:: 'a::order. {k} - lessThan k = {k}" |
103 by auto |
59 by auto |
104 |
60 |
121 by blast |
77 by blast |
122 |
78 |
123 lemma Compl_greaterThan [simp]: |
79 lemma Compl_greaterThan [simp]: |
124 "!!k:: 'a::linorder. -greaterThan k = atMost k" |
80 "!!k:: 'a::linorder. -greaterThan k = atMost k" |
125 apply (simp add: greaterThan_def atMost_def le_def, auto) |
81 apply (simp add: greaterThan_def atMost_def le_def, auto) |
126 apply (blast intro: linorder_not_less [THEN iffD1]) |
|
127 apply (blast dest: order_le_less_trans) |
|
128 done |
82 done |
129 |
83 |
130 lemma Compl_atMost [simp]: "!!k:: 'a::linorder. -atMost k = greaterThan k" |
84 lemma Compl_atMost [simp]: "!!k:: 'a::linorder. -atMost k = greaterThan k" |
131 apply (subst Compl_greaterThan [symmetric]) |
85 apply (subst Compl_greaterThan [symmetric]) |
132 apply (rule double_complement) |
86 apply (rule double_complement) |
151 by blast |
105 by blast |
152 |
106 |
153 lemma Compl_atLeast [simp]: |
107 lemma Compl_atLeast [simp]: |
154 "!!k:: 'a::linorder. -atLeast k = lessThan k" |
108 "!!k:: 'a::linorder. -atLeast k = lessThan k" |
155 apply (simp add: lessThan_def atLeast_def le_def, auto) |
109 apply (simp add: lessThan_def atLeast_def le_def, auto) |
156 apply (blast intro: linorder_not_less [THEN iffD1]) |
|
157 apply (blast dest: order_le_less_trans) |
|
158 done |
110 done |
159 |
111 |
160 |
112 |
161 subsection {*atMost*} |
113 subsection {*atMost*} |
162 |
114 |
187 |
139 |
188 lemma greaterThan_subset_iff [iff]: |
140 lemma greaterThan_subset_iff [iff]: |
189 "(greaterThan x \<subseteq> greaterThan y) = (y \<le> (x::'a::linorder))" |
141 "(greaterThan x \<subseteq> greaterThan y) = (y \<le> (x::'a::linorder))" |
190 apply (auto simp add: greaterThan_def) |
142 apply (auto simp add: greaterThan_def) |
191 apply (subst linorder_not_less [symmetric], blast) |
143 apply (subst linorder_not_less [symmetric], blast) |
192 apply (blast intro: order_le_less_trans) |
|
193 done |
144 done |
194 |
145 |
195 lemma greaterThan_eq_iff [iff]: |
146 lemma greaterThan_eq_iff [iff]: |
196 "(greaterThan x = greaterThan y) = (x = (y::'a::linorder))" |
147 "(greaterThan x = greaterThan y) = (x = (y::'a::linorder))" |
197 apply (rule iffI) |
148 apply (rule iffI) |
207 |
158 |
208 lemma lessThan_subset_iff [iff]: |
159 lemma lessThan_subset_iff [iff]: |
209 "(lessThan x \<subseteq> lessThan y) = (x \<le> (y::'a::linorder))" |
160 "(lessThan x \<subseteq> lessThan y) = (x \<le> (y::'a::linorder))" |
210 apply (auto simp add: lessThan_def) |
161 apply (auto simp add: lessThan_def) |
211 apply (subst linorder_not_less [symmetric], blast) |
162 apply (subst linorder_not_less [symmetric], blast) |
212 apply (blast intro: order_less_le_trans) |
|
213 done |
163 done |
214 |
164 |
215 lemma lessThan_eq_iff [iff]: |
165 lemma lessThan_eq_iff [iff]: |
216 "(lessThan x = lessThan y) = (x = (y::'a::linorder))" |
166 "(lessThan x = lessThan y) = (x = (y::'a::linorder))" |
217 apply (rule iffI) |
167 apply (rule iffI) |
268 "{..u(} Un {u::'a::linorder} = {..u}" |
218 "{..u(} Un {u::'a::linorder} = {..u}" |
269 "(l::'a::linorder) < u ==> {l} Un {)l..u(} = {l..u(}" |
219 "(l::'a::linorder) < u ==> {l} Un {)l..u(} = {l..u(}" |
270 "(l::'a::linorder) < u ==> {)l..u(} Un {u} = {)l..u}" |
220 "(l::'a::linorder) < u ==> {)l..u(} Un {u} = {)l..u}" |
271 "(l::'a::linorder) <= u ==> {l} Un {)l..u} = {l..u}" |
221 "(l::'a::linorder) <= u ==> {l} Un {)l..u} = {l..u}" |
272 "(l::'a::linorder) <= u ==> {l..u(} Un {u} = {l..u}" |
222 "(l::'a::linorder) <= u ==> {l..u(} Un {u} = {l..u}" |
273 by auto (elim linorder_neqE | trans+)+ |
223 by auto |
274 |
224 |
275 (* One- and two-sided intervals *) |
225 (* One- and two-sided intervals *) |
276 |
226 |
277 lemma ivl_disj_un_one: |
227 lemma ivl_disj_un_one: |
278 "(l::'a::linorder) < u ==> {..l} Un {)l..u(} = {..u(}" |
228 "(l::'a::linorder) < u ==> {..l} Un {)l..u(} = {..u(}" |
281 "(l::'a::linorder) <= u ==> {..l(} Un {l..u} = {..u}" |
231 "(l::'a::linorder) <= u ==> {..l(} Un {l..u} = {..u}" |
282 "(l::'a::linorder) <= u ==> {)l..u} Un {)u..} = {)l..}" |
232 "(l::'a::linorder) <= u ==> {)l..u} Un {)u..} = {)l..}" |
283 "(l::'a::linorder) < u ==> {)l..u(} Un {u..} = {)l..}" |
233 "(l::'a::linorder) < u ==> {)l..u(} Un {u..} = {)l..}" |
284 "(l::'a::linorder) <= u ==> {l..u} Un {)u..} = {l..}" |
234 "(l::'a::linorder) <= u ==> {l..u} Un {)u..} = {l..}" |
285 "(l::'a::linorder) <= u ==> {l..u(} Un {u..} = {l..}" |
235 "(l::'a::linorder) <= u ==> {l..u(} Un {u..} = {l..}" |
286 by auto trans+ |
236 by auto |
287 |
237 |
288 (* Two- and two-sided intervals *) |
238 (* Two- and two-sided intervals *) |
289 |
239 |
290 lemma ivl_disj_un_two: |
240 lemma ivl_disj_un_two: |
291 "[| (l::'a::linorder) < m; m <= u |] ==> {)l..m(} Un {m..u(} = {)l..u(}" |
241 "[| (l::'a::linorder) < m; m <= u |] ==> {)l..m(} Un {m..u(} = {)l..u(}" |
294 "[| (l::'a::linorder) <= m; m < u |] ==> {l..m} Un {)m..u(} = {l..u(}" |
244 "[| (l::'a::linorder) <= m; m < u |] ==> {l..m} Un {)m..u(} = {l..u(}" |
295 "[| (l::'a::linorder) < m; m <= u |] ==> {)l..m(} Un {m..u} = {)l..u}" |
245 "[| (l::'a::linorder) < m; m <= u |] ==> {)l..m(} Un {m..u} = {)l..u}" |
296 "[| (l::'a::linorder) <= m; m <= u |] ==> {)l..m} Un {)m..u} = {)l..u}" |
246 "[| (l::'a::linorder) <= m; m <= u |] ==> {)l..m} Un {)m..u} = {)l..u}" |
297 "[| (l::'a::linorder) <= m; m <= u |] ==> {l..m(} Un {m..u} = {l..u}" |
247 "[| (l::'a::linorder) <= m; m <= u |] ==> {l..m(} Un {m..u} = {l..u}" |
298 "[| (l::'a::linorder) <= m; m <= u |] ==> {l..m} Un {)m..u} = {l..u}" |
248 "[| (l::'a::linorder) <= m; m <= u |] ==> {l..m} Un {)m..u} = {l..u}" |
299 by auto trans+ |
249 by auto |
300 |
250 |
301 lemmas ivl_disj_un = ivl_disj_un_singleton ivl_disj_un_one ivl_disj_un_two |
251 lemmas ivl_disj_un = ivl_disj_un_singleton ivl_disj_un_one ivl_disj_un_two |
302 |
252 |
303 (** Disjoint Intersections **) |
253 (** Disjoint Intersections **) |
304 |
254 |
322 "{..l(} Int {l..u} = {}" |
272 "{..l(} Int {l..u} = {}" |
323 "{)l..u} Int {)u..} = {}" |
273 "{)l..u} Int {)u..} = {}" |
324 "{)l..u(} Int {u..} = {}" |
274 "{)l..u(} Int {u..} = {}" |
325 "{l..u} Int {)u..} = {}" |
275 "{l..u} Int {)u..} = {}" |
326 "{l..u(} Int {u..} = {}" |
276 "{l..u(} Int {u..} = {}" |
327 by auto trans+ |
277 by auto |
328 |
278 |
329 (* Two- and two-sided intervals *) |
279 (* Two- and two-sided intervals *) |
330 |
280 |
331 lemma ivl_disj_int_two: |
281 lemma ivl_disj_int_two: |
332 "{)l::'a::order..m(} Int {m..u(} = {}" |
282 "{)l::'a::order..m(} Int {m..u(} = {}" |
335 "{l..m} Int {)m..u(} = {}" |
285 "{l..m} Int {)m..u(} = {}" |
336 "{)l..m(} Int {m..u} = {}" |
286 "{)l..m(} Int {m..u} = {}" |
337 "{)l..m} Int {)m..u} = {}" |
287 "{)l..m} Int {)m..u} = {}" |
338 "{l..m(} Int {m..u} = {}" |
288 "{l..m(} Int {m..u} = {}" |
339 "{l..m} Int {)m..u} = {}" |
289 "{l..m} Int {)m..u} = {}" |
340 by auto trans+ |
290 by auto |
341 |
291 |
342 lemmas ivl_disj_int = ivl_disj_int_singleton ivl_disj_int_one ivl_disj_int_two |
292 lemmas ivl_disj_int = ivl_disj_int_singleton ivl_disj_int_one ivl_disj_int_two |
343 |
293 |
344 end |
294 end |