equal
deleted
inserted
replaced
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") |