src/HOL/Library/RBT.thy
changeset 39380 5a2662c1e44a
parent 39302 d7728f65b353
child 40612 7ae5b89d8913
equal deleted inserted replaced
39379:ab1b070aa412 39380:5a2662c1e44a
    14 proof -
    14 proof -
    15   have "RBT_Impl.Empty \<in> ?rbt" by simp
    15   have "RBT_Impl.Empty \<in> ?rbt" by simp
    16   then show ?thesis ..
    16   then show ?thesis ..
    17 qed
    17 qed
    18 
    18 
       
    19 lemma rbt_eq_iff:
       
    20   "t1 = t2 \<longleftrightarrow> impl_of t1 = impl_of t2"
       
    21   by (simp add: impl_of_inject)
       
    22 
       
    23 lemma rbt_eqI:
       
    24   "impl_of t1 = impl_of t2 \<Longrightarrow> t1 = t2"
       
    25   by (simp add: rbt_eq_iff)
       
    26 
    19 lemma is_rbt_impl_of [simp, intro]:
    27 lemma is_rbt_impl_of [simp, intro]:
    20   "is_rbt (impl_of t)"
    28   "is_rbt (impl_of t)"
    21   using impl_of [of t] by simp
    29   using impl_of [of t] by simp
    22 
    30 
    23 lemma rbt_eq:
    31 lemma RBT_impl_of [simp, code abstype]:
    24   "t1 = t2 \<longleftrightarrow> impl_of t1 = impl_of t2"
       
    25   by (simp add: impl_of_inject)
       
    26 
       
    27 lemma [code abstype]:
       
    28   "RBT (impl_of t) = t"
    32   "RBT (impl_of t) = t"
    29   by (simp add: impl_of_inverse)
    33   by (simp add: impl_of_inverse)
    30 
    34 
    31 
    35 
    32 subsection {* Primitive operations *}
    36 subsection {* Primitive operations *}
   146   "fold f t = More_List.fold (prod_case f) (entries t)"
   150   "fold f t = More_List.fold (prod_case f) (entries t)"
   147   by (simp add: fold_def fun_eq_iff RBT_Impl.fold_def entries_impl_of)
   151   by (simp add: fold_def fun_eq_iff RBT_Impl.fold_def entries_impl_of)
   148 
   152 
   149 lemma is_empty_empty [simp]:
   153 lemma is_empty_empty [simp]:
   150   "is_empty t \<longleftrightarrow> t = empty"
   154   "is_empty t \<longleftrightarrow> t = empty"
   151   by (simp add: rbt_eq is_empty_def impl_of_empty split: rbt.split)
   155   by (simp add: rbt_eq_iff is_empty_def impl_of_empty split: rbt.split)
   152 
   156 
   153 lemma RBT_lookup_empty [simp]: (*FIXME*)
   157 lemma RBT_lookup_empty [simp]: (*FIXME*)
   154   "RBT_Impl.lookup t = Map.empty \<longleftrightarrow> t = RBT_Impl.Empty"
   158   "RBT_Impl.lookup t = Map.empty \<longleftrightarrow> t = RBT_Impl.Empty"
   155   by (cases t) (auto simp add: fun_eq_iff)
   159   by (cases t) (auto simp add: fun_eq_iff)
   156 
   160 
   182   "Mapping.empty = Mapping empty"
   186   "Mapping.empty = Mapping empty"
   183   by (rule mapping_eqI) simp
   187   by (rule mapping_eqI) simp
   184 
   188 
   185 lemma is_empty_Mapping [code]:
   189 lemma is_empty_Mapping [code]:
   186   "Mapping.is_empty (Mapping t) \<longleftrightarrow> is_empty t"
   190   "Mapping.is_empty (Mapping t) \<longleftrightarrow> is_empty t"
   187   by (simp add: rbt_eq Mapping.is_empty_empty Mapping_def)
   191   by (simp add: rbt_eq_iff Mapping.is_empty_empty Mapping_def)
   188 
   192 
   189 lemma insert_Mapping [code]:
   193 lemma insert_Mapping [code]:
   190   "Mapping.update k v (Mapping t) = Mapping (insert k v t)"
   194   "Mapping.update k v (Mapping t) = Mapping (insert k v t)"
   191   by (rule mapping_eqI) simp
   195   by (rule mapping_eqI) simp
   192 
   196