# HG changeset patch # User krauss # Date 1248727804 -7200 # Node ID cdc76a42fed4e57091e753a4f237c815d5c3213c # Parent 0203e1006f1bc35344f92fdb020c9e1bd4660b92 added missing proof of RBT.map_of_alist_of (contributed by Peter Lammich) diff -r 0203e1006f1b -r cdc76a42fed4 src/HOL/Library/RBT.thy --- a/src/HOL/Library/RBT.thy Mon Jul 27 22:50:01 2009 +0200 +++ b/src/HOL/Library/RBT.thy Mon Jul 27 22:50:04 2009 +0200 @@ -916,9 +916,72 @@ "alist_of Empty = []" | "alist_of (Tr _ l k v r) = alist_of l @ (k,v) # alist_of r" +lemma map_of_alist_of_aux: "st (Tr c t1 k v t2) \ RBT.map_of (Tr c t1 k v t2) = RBT.map_of t2 ++ [k\v] ++ RBT.map_of t1" +proof (rule ext) + fix x + assume ST: "st (Tr c t1 k v t2)" + let ?thesis = "RBT.map_of (Tr c t1 k v t2) x = (RBT.map_of t2 ++ [k \ v] ++ RBT.map_of t1) x" + + have DOM_T1: "!!k'. k'\dom (RBT.map_of t1) \ k>k'" + proof - + fix k' + from ST have "t1 |\ k" by simp + with tlt_prop have "\k'\keys t1. k>k'" by auto + moreover assume "k'\dom (RBT.map_of t1)" + ultimately show "k>k'" using RBT.mapof_keys ST by auto + qed + + have DOM_T2: "!!k'. k'\dom (RBT.map_of t2) \ k| t2" by simp + with tgt_prop have "\k'\keys t2. kdom (RBT.map_of t2)" + ultimately show "kdom [k\v]" by simp + moreover have "x\dom (RBT.map_of t2)" proof + assume "x\dom (RBT.map_of t2)" + with DOM_T2 have "k v] x" by simp + moreover have "x\dom (RBT.map_of t1)" proof + assume "x\dom (RBT.map_of t1)" + with DOM_T1 have "k>x" by blast + thus False by simp + qed + ultimately have ?thesis by (simp add: map_add_upd_left map_add_dom_app_simps) + } moreover { + assume C: "x>k" + hence "RBT.map_of (Tr c t1 k v t2) x = RBT.map_of t2 x" by (simp add: less_not_sym[of k x]) + moreover from C have "x\dom [k\v]" by simp + moreover have "x\dom (RBT.map_of t1)" proof + assume "x\dom (RBT.map_of t1)" + with DOM_T1 have "k>x" by simp + with C show False by simp + qed + ultimately have ?thesis by (simp add: map_add_upd_left map_add_dom_app_simps) + } ultimately show ?thesis using less_linear by blast +qed + lemma map_of_alist_of: shows "st t \ Map.map_of (alist_of t) = map_of t" - oops +proof (induct t) + case Empty thus ?case by (simp add: RBT.map_of_Empty) +next + case (Tr c t1 k v t2) + hence "Map.map_of (alist_of (Tr c t1 k v t2)) = RBT.map_of t2 ++ [k \ v] ++ RBT.map_of t1" by simp + also note map_of_alist_of_aux[OF Tr.prems,symmetric] + finally show ?case . +qed lemma fold_alist_fold: "foldwithkey f t x = foldl (\x (k,v). f k v x) x (alist_of t)"