# HG changeset patch # User immler # Date 1470136395 -7200 # Node ID a4acecf4dc21a4e2d8992cc9a03303ebcaa3d3b4 # Parent ba972a7dbeba4c150c64d9f14988ffd57c227e30 more natural definition of type finmap diff -r ba972a7dbeba -r a4acecf4dc21 src/HOL/Probability/Fin_Map.thy --- a/src/HOL/Probability/Fin_Map.thy Mon Aug 01 22:36:47 2016 +0200 +++ b/src/HOL/Probability/Fin_Map.thy Tue Aug 02 13:13:15 2016 +0200 @@ -14,29 +14,37 @@ @{const Pi\<^sub>M}.\ typedef ('i, 'a) finmap ("(_ \\<^sub>F /_)" [22, 21] 21) = - "{(I::'i set, f::'i \ 'a). finite I \ f \ extensional I}" by auto + "{f::'i \ 'a option. finite (dom f)}" + by (auto intro!: exI[where x="\_. None"]) + +setup_lifting type_definition_finmap + subsection \Domain and Application\ -definition domain where "domain P = fst (Rep_finmap P)" +lift_definition domain::"('i, 'a) finmap \ 'i set" is dom . lemma finite_domain[simp, intro]: "finite (domain P)" - by (cases P) (auto simp: domain_def Abs_finmap_inverse) + by transfer simp -definition proj ("'((_)')\<^sub>F" [0] 1000) where "proj P i = snd (Rep_finmap P) i" +lift_definition proj :: "('i, 'a) finmap \ 'i \ 'a" ("'((_)')\<^sub>F" [0] 1000) is + "\f x. if x \ dom f then the (f x) else undefined" . declare [[coercion proj]] lemma extensional_proj[simp, intro]: "(P)\<^sub>F \ extensional (domain P)" - by (cases P) (auto simp: domain_def Abs_finmap_inverse proj_def[abs_def]) + by transfer (auto simp: extensional_def) lemma proj_undefined[simp, intro]: "i \ domain P \ P i = undefined" using extensional_proj[of P] unfolding extensional_def by auto lemma finmap_eq_iff: "P = Q \ (domain P = domain Q \ (\i\domain P. P i = Q i))" - by (cases P, cases Q) - (auto simp add: Abs_finmap_inject extensional_def domain_def proj_def Abs_finmap_inverse - intro: extensionalityI) + apply transfer + apply (safe intro!: ext) + subgoal for P Q x + by (cases "x \ dom P"; cases "P x") (auto dest!: bspec[where x=x]) + done + subsection \Countable Finite Maps\ @@ -60,19 +68,21 @@ subsection \Constructor of Finite Maps\ -definition "finmap_of inds f = Abs_finmap (inds, restrict f inds)" +lift_definition finmap_of::"'i set \ ('i \ 'a) \ ('i, 'a) finmap" is + "\I f x. if x \ I \ finite I then Some (f x) else None" + by (simp add: dom_def) lemma proj_finmap_of[simp]: assumes "finite inds" shows "(finmap_of inds f)\<^sub>F = restrict f inds" using assms - by (auto simp: Abs_finmap_inverse finmap_of_def proj_def) + by transfer force lemma domain_finmap_of[simp]: assumes "finite inds" shows "domain (finmap_of inds f) = inds" using assms - by (auto simp: Abs_finmap_inverse finmap_of_def domain_def) + by transfer (auto split: if_splits) lemma finmap_of_eq_iff[simp]: assumes "finite i" "finite j"