src/HOL/SetInterval.thy
changeset 14398 c5c47703f763
parent 13850 6d1bb3059818
child 14418 b62323c85134
equal deleted inserted replaced
14397:b3b15305a1c9 14398:c5c47703f763
    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