src/HOL/Map.thy
changeset 14187 26dfcd0ac436
parent 14186 6d2a494e33be
child 14208 144f45277d5a
equal deleted inserted replaced
14186:6d2a494e33be 14187:26dfcd0ac436
   345 by(simp add:map_upds_def)
   345 by(simp add:map_upds_def)
   346 
   346 
   347 lemma map_upds_Cons[simp]: "m(a#as [|->] b#bs) = (m(a|->b))(as[|->]bs)"
   347 lemma map_upds_Cons[simp]: "m(a#as [|->] b#bs) = (m(a|->b))(as[|->]bs)"
   348 by(simp add:map_upds_def)
   348 by(simp add:map_upds_def)
   349 
   349 
       
   350 lemma map_upds_append1[simp]: "\<And>ys m. size xs < size ys \<Longrightarrow>
       
   351   m(xs@[x] [\<mapsto>] ys) = m(xs [\<mapsto>] ys)(x \<mapsto> ys!size xs)"
       
   352 apply(induct xs)
       
   353  apply(clarsimp simp add:neq_Nil_conv)
       
   354 apply(case_tac ys)
       
   355  apply simp
       
   356 apply simp
       
   357 done
       
   358 
       
   359 lemma map_upds_list_update2_drop[simp]:
       
   360  "\<And>m ys i. \<lbrakk>size xs \<le> i; i < size ys\<rbrakk>
       
   361      \<Longrightarrow> m(xs[\<mapsto>]ys[i:=y]) = m(xs[\<mapsto>]ys)"
       
   362 apply(induct xs)
       
   363  apply simp
       
   364 apply(case_tac ys)
       
   365  apply simp
       
   366 apply(simp split:nat.split)
       
   367 done
   350 
   368 
   351 lemma map_upd_upds_conv_if: "!!x y ys f.
   369 lemma map_upd_upds_conv_if: "!!x y ys f.
   352  (f(x|->y))(xs [|->] ys) =
   370  (f(x|->y))(xs [|->] ys) =
   353  (if x : set(take (length ys) xs) then f(xs [|->] ys)
   371  (if x : set(take (length ys) xs) then f(xs [|->] ys)
   354                                   else (f(xs [|->] ys))(x|->y))"
   372                                   else (f(xs [|->] ys))(x|->y))"
   476 subsection {* @{text "map_le"} *}
   494 subsection {* @{text "map_le"} *}
   477 
   495 
   478 lemma map_le_empty [simp]: "empty \<subseteq>\<^sub>m g"
   496 lemma map_le_empty [simp]: "empty \<subseteq>\<^sub>m g"
   479 by(simp add:map_le_def)
   497 by(simp add:map_le_def)
   480 
   498 
       
   499 lemma [simp]: "f(x := None) \<subseteq>\<^sub>m f"
       
   500 by(force simp add:map_le_def)
       
   501 
   481 lemma map_le_upd[simp]: "f \<subseteq>\<^sub>m g ==> f(a := b) \<subseteq>\<^sub>m g(a := b)"
   502 lemma map_le_upd[simp]: "f \<subseteq>\<^sub>m g ==> f(a := b) \<subseteq>\<^sub>m g(a := b)"
   482 by(fastsimp simp add:map_le_def)
   503 by(fastsimp simp add:map_le_def)
       
   504 
       
   505 lemma [simp]: "m1 \<subseteq>\<^sub>m m2 \<Longrightarrow> m1(x := None) \<subseteq>\<^sub>m m2(x \<mapsto> y)"
       
   506 by(force simp add:map_le_def)
   483 
   507 
   484 lemma map_le_upds[simp]:
   508 lemma map_le_upds[simp]:
   485  "!!f g bs. f \<subseteq>\<^sub>m g ==> f(as [|->] bs) \<subseteq>\<^sub>m g(as [|->] bs)"
   509  "!!f g bs. f \<subseteq>\<^sub>m g ==> f(as [|->] bs) \<subseteq>\<^sub>m g(as [|->] bs)"
   486 apply(induct as)
   510 apply(induct as)
   487  apply simp
   511  apply simp
   493   by (fastsimp simp add: map_le_def dom_def)
   517   by (fastsimp simp add: map_le_def dom_def)
   494 
   518 
   495 lemma map_le_refl [simp]: "f \<subseteq>\<^sub>m f"
   519 lemma map_le_refl [simp]: "f \<subseteq>\<^sub>m f"
   496   by (simp add: map_le_def)
   520   by (simp add: map_le_def)
   497 
   521 
   498 lemma map_le_trans: "\<lbrakk> f \<subseteq>\<^sub>m g; g \<subseteq>\<^sub>m h \<rbrakk> \<Longrightarrow> f \<subseteq>\<^sub>m h"
   522 lemma map_le_trans[trans]: "\<lbrakk> m1 \<subseteq>\<^sub>m m2; m2 \<subseteq>\<^sub>m m3\<rbrakk> \<Longrightarrow> m1 \<subseteq>\<^sub>m m3"
   499   apply (clarsimp simp add: map_le_def)
   523 by(force simp add:map_le_def)
   500   apply (drule_tac x="a" in bspec, fastsimp)+
       
   501   apply assumption
       
   502 done
       
   503 
   524 
   504 lemma map_le_antisym: "\<lbrakk> f \<subseteq>\<^sub>m g; g \<subseteq>\<^sub>m f \<rbrakk> \<Longrightarrow> f = g"
   525 lemma map_le_antisym: "\<lbrakk> f \<subseteq>\<^sub>m g; g \<subseteq>\<^sub>m f \<rbrakk> \<Longrightarrow> f = g"
   505   apply (unfold map_le_def)
   526   apply (unfold map_le_def)
   506   apply (rule ext)
   527   apply (rule ext)
   507   apply (case_tac "x \<in> dom f")
   528   apply (case_tac "x \<in> dom f")