9 header {* Maps *} |
9 header {* Maps *} |
10 |
10 |
11 theory Map = List: |
11 theory Map = List: |
12 |
12 |
13 types ('a,'b) "~=>" = "'a => 'b option" (infixr 0) |
13 types ('a,'b) "~=>" = "'a => 'b option" (infixr 0) |
|
14 translations (type) "a ~=> b " <= (type) "a => b option" |
14 |
15 |
15 consts |
16 consts |
16 chg_map :: "('b => 'b) => 'a => ('a ~=> 'b) => ('a ~=> 'b)" |
17 chg_map :: "('b => 'b) => 'a => ('a ~=> 'b) => ('a ~=> 'b)" |
17 map_add:: "('a ~=> 'b) => ('a ~=> 'b) => ('a ~=> 'b)" (infixl "++" 100) |
18 map_add :: "('a ~=> 'b) => ('a ~=> 'b) => ('a ~=> 'b)" (infixl "++" 100) |
|
19 map_image::"('b => 'c) => ('a ~=> 'b) => ('a ~=> 'c)" (infixr "`>" 90) |
|
20 restrict_map :: "('a ~=> 'b) => 'a set => ('a ~=> 'b)" ("_|'__" [90, 91] 90) |
18 dom :: "('a ~=> 'b) => 'a set" |
21 dom :: "('a ~=> 'b) => 'a set" |
19 ran :: "('a ~=> 'b) => 'b set" |
22 ran :: "('a ~=> 'b) => 'b set" |
20 map_of :: "('a * 'b)list => 'a ~=> 'b" |
23 map_of :: "('a * 'b)list => 'a ~=> 'b" |
21 map_upds:: "('a ~=> 'b) => 'a list => 'b list => |
24 map_upds:: "('a ~=> 'b) => 'a list => 'b list => |
22 ('a ~=> 'b)" ("_/'(_[|->]_/')" [900,0,0]900) |
25 ('a ~=> 'b)" ("_/'(_[|->]_/')" [900,0,0]900) |
|
26 map_upd_s::"('a ~=> 'b) => 'a set => 'b => |
|
27 ('a ~=> 'b)" ("_/'(_{|->}_/')" [900,0,0]900) |
|
28 map_subst::"('a ~=> 'b) => 'b => 'b => |
|
29 ('a ~=> 'b)" ("_/'(_~>_/')" [900,0,0]900) |
23 map_le :: "('a ~=> 'b) => ('a ~=> 'b) => bool" (infix "\<subseteq>\<^sub>m" 50) |
30 map_le :: "('a ~=> 'b) => ('a ~=> 'b) => bool" (infix "\<subseteq>\<^sub>m" 50) |
24 |
31 |
25 syntax |
32 syntax |
26 empty :: "'a ~=> 'b" |
33 empty :: "'a ~=> 'b" |
27 map_upd :: "('a ~=> 'b) => 'a => 'b => ('a ~=> 'b)" |
34 map_upd :: "('a ~=> 'b) => 'a => 'b => ('a ~=> 'b)" |
28 ("_/'(_/|->_')" [900,0,0]900) |
35 ("_/'(_/|->_')" [900,0,0]900) |
29 |
36 |
30 syntax (xsymbols) |
37 syntax (xsymbols) |
31 "~=>" :: "[type, type] => type" (infixr "\<leadsto>" 0) |
38 "~=>" :: "[type, type] => type" (infixr "\<leadsto>" 0) |
|
39 restrict_map :: "('a ~=> 'b) => 'a set => ('a ~=> 'b)" ("_\<lfloor>_" [90, 91] 90) |
32 map_upd :: "('a ~=> 'b) => 'a => 'b => ('a ~=> 'b)" |
40 map_upd :: "('a ~=> 'b) => 'a => 'b => ('a ~=> 'b)" |
33 ("_/'(_/\<mapsto>/_')" [900,0,0]900) |
41 ("_/'(_/\<mapsto>/_')" [900,0,0]900) |
34 map_upds :: "('a ~=> 'b) => 'a list => 'b list => ('a ~=> 'b)" |
42 map_upds :: "('a ~=> 'b) => 'a list => 'b list => ('a ~=> 'b)" |
35 ("_/'(_/[\<mapsto>]/_')" [900,0,0]900) |
43 ("_/'(_/[\<mapsto>]/_')" [900,0,0]900) |
|
44 map_upd_s :: "('a ~=> 'b) => 'a set => 'b => ('a ~=> 'b)" |
|
45 ("_/'(_/{\<mapsto>}/_')" [900,0,0]900) |
|
46 map_subst :: "('a ~=> 'b) => 'b => 'b => |
|
47 ('a ~=> 'b)" ("_/'(_\<leadsto>_/')" [900,0,0]900) |
|
48 "@chg_map" :: "('a ~=> 'b) => 'a => ('b => 'b) => ('a ~=> 'b)" |
|
49 ("_/'(_/\<mapsto>\<lambda>_. _')" [900,0,0,0] 900) |
36 |
50 |
37 translations |
51 translations |
38 "empty" => "_K None" |
52 "empty" => "_K None" |
39 "empty" <= "%x. None" |
53 "empty" <= "%x. None" |
40 |
54 |
41 "m(a|->b)" == "m(a:=Some b)" |
55 "m(a|->b)" == "m(a:=Some b)" |
|
56 "m(x\<mapsto>\<lambda>y. f)" == "chg_map (\<lambda>y. f) x m" |
42 |
57 |
43 defs |
58 defs |
44 chg_map_def: "chg_map f a m == case m a of None => m | Some b => m(a|->f b)" |
59 chg_map_def: "chg_map f a m == case m a of None => m | Some b => m(a|->f b)" |
45 |
60 |
46 map_add_def: "m1++m2 == %x. case m2 x of None => m1 x | Some y => Some y" |
61 map_add_def: "m1++m2 == %x. case m2 x of None => m1 x | Some y => Some y" |
|
62 map_image_def: "f`>m == option_map f o m" |
|
63 restrict_map_def: "m|_A == %x. if x : A then m x else None" |
47 |
64 |
48 map_upds_def: "m(xs [|->] ys) == m ++ map_of (rev(zip xs ys))" |
65 map_upds_def: "m(xs [|->] ys) == m ++ map_of (rev(zip xs ys))" |
|
66 map_upd_s_def: "m(as{|->}b) == %x. if x : as then Some b else m x" |
|
67 map_subst_def: "m(a~>b) == %x. if m x = Some a then Some b else m x" |
49 |
68 |
50 dom_def: "dom(m) == {a. m a ~= None}" |
69 dom_def: "dom(m) == {a. m a ~= None}" |
51 ran_def: "ran(m) == {b. EX a. m a = Some b}" |
70 ran_def: "ran(m) == {b. EX a. m a = Some b}" |
52 |
71 |
53 map_le_def: "m1 \<subseteq>\<^sub>m m2 == ALL a : dom m1. m1 a = m2 a" |
72 map_le_def: "m1 \<subseteq>\<^sub>m m2 == ALL a : dom m1. m1 a = m2 a" |
81 lemma map_upd_nonempty[simp]: "t(k|->x) ~= empty" |
100 lemma map_upd_nonempty[simp]: "t(k|->x) ~= empty" |
82 apply safe |
101 apply safe |
83 apply (drule_tac x = "k" in fun_cong) |
102 apply (drule_tac x = "k" in fun_cong) |
84 apply (simp (no_asm_use)) |
103 apply (simp (no_asm_use)) |
85 done |
104 done |
|
105 |
|
106 lemma map_upd_eqD1: "m(a\<mapsto>x) = n(a\<mapsto>y) \<Longrightarrow> x = y" |
|
107 by (drule fun_cong [of _ _ a], auto) |
|
108 |
|
109 lemma map_upd_Some_unfold: |
|
110 "((m(a|->b)) x = Some y) = (x = a \<and> b = y \<or> x \<noteq> a \<and> m x = Some y)" |
|
111 by auto |
86 |
112 |
87 lemma finite_range_updI: "finite (range f) ==> finite (range (f(a|->b)))" |
113 lemma finite_range_updI: "finite (range f) ==> finite (range (f(a|->b)))" |
88 apply (unfold image_def) |
114 apply (unfold image_def) |
89 apply (simp (no_asm_use) add: full_SetCompr_eq) |
115 apply (simp (no_asm_use) add: full_SetCompr_eq) |
90 apply (rule finite_subset) |
116 apply (rule finite_subset) |
241 apply auto |
267 apply auto |
242 apply (erule finite_range_updI) |
268 apply (erule finite_range_updI) |
243 done |
269 done |
244 declare fun_upd_apply [simp] |
270 declare fun_upd_apply [simp] |
245 |
271 |
246 |
272 subsection {* @{term map_image} *} |
247 subsection {* map\_upds *} |
273 |
|
274 lemma map_image_empty [simp]: "f`>empty = empty" |
|
275 by (auto simp: map_image_def empty_def) |
|
276 |
|
277 lemma map_image_upd [simp]: "f`>m(a|->b) = (f`>m)(a|->f b)" |
|
278 apply (auto simp: map_image_def fun_upd_def) |
|
279 by (rule ext, auto) |
|
280 |
|
281 subsection {* @{term restrict_map} *} |
|
282 |
|
283 lemma restrict_in [simp]: "x \<in> A \<Longrightarrow> (m\<lfloor>A) x = m x" |
|
284 by (auto simp: restrict_map_def) |
|
285 |
|
286 lemma restrict_out [simp]: "x \<notin> A \<Longrightarrow> (m\<lfloor>A) x = None" |
|
287 by (auto simp: restrict_map_def) |
|
288 |
|
289 lemma ran_restrictD: "y \<in> ran (m\<lfloor>A) \<Longrightarrow> \<exists>x\<in>A. m x = Some y" |
|
290 by (auto simp: restrict_map_def ran_def split: split_if_asm) |
|
291 |
|
292 lemma dom_valF_restrict [simp]: "dom (m\<lfloor>A) = dom m \<inter> A" |
|
293 by (auto simp: restrict_map_def dom_def split: split_if_asm) |
|
294 |
|
295 lemma restrict_upd_same [simp]: "m(x\<mapsto>y)\<lfloor>(-{x}) = m\<lfloor>(-{x})" |
|
296 by (rule ext, auto simp: restrict_map_def) |
|
297 |
|
298 lemma restrict_restrict [simp]: "m\<lfloor>A\<lfloor>B = m\<lfloor>(A\<inter>B)" |
|
299 by (rule ext, auto simp: restrict_map_def) |
|
300 |
|
301 |
|
302 subsection {* @{term map_upds} *} |
248 |
303 |
249 lemma map_upds_Nil1[simp]: "m([] [|->] bs) = m" |
304 lemma map_upds_Nil1[simp]: "m([] [|->] bs) = m" |
250 by(simp add:map_upds_def) |
305 by(simp add:map_upds_def) |
251 |
306 |
252 lemma map_upds_Nil2[simp]: "m(as [|->] []) = m" |
307 lemma map_upds_Nil2[simp]: "m(as [|->] []) = m" |
278 apply simp |
333 apply simp |
279 apply(case_tac ys) |
334 apply(case_tac ys) |
280 apply(auto simp: map_upd_upds_conv_if) |
335 apply(auto simp: map_upd_upds_conv_if) |
281 done |
336 done |
282 |
337 |
283 subsection {* dom *} |
338 subsection {* @{term map_upd_s} *} |
|
339 |
|
340 lemma map_upd_s_apply [simp]: |
|
341 "(m(as{|->}b)) x = (if x : as then Some b else m x)" |
|
342 by (simp add: map_upd_s_def) |
|
343 |
|
344 lemma map_subst_apply [simp]: |
|
345 "(m(a~>b)) x = (if m x = Some a then Some b else m x)" |
|
346 by (simp add: map_subst_def) |
|
347 |
|
348 subsection {* @{term dom} *} |
284 |
349 |
285 lemma domI: "m a = Some b ==> a : dom m" |
350 lemma domI: "m a = Some b ==> a : dom m" |
286 apply (unfold dom_def) |
351 apply (unfold dom_def) |
287 apply auto |
352 apply auto |
288 done |
353 done |
|
354 (* declare domI [intro]? *) |
289 |
355 |
290 lemma domD: "a : dom m ==> ? b. m a = Some b" |
356 lemma domD: "a : dom m ==> ? b. m a = Some b" |
291 apply (unfold dom_def) |
357 apply (unfold dom_def) |
292 apply auto |
358 apply auto |
293 done |
359 done |