diff -r 0c652e82fdf4 -r a259d259c797 src/HOL/Library/Array.thy --- a/src/HOL/Library/Array.thy Thu Apr 17 22:28:56 2008 +0200 +++ b/src/HOL/Library/Array.thy Fri Apr 18 09:44:16 2008 +0200 @@ -46,14 +46,19 @@ where [code del]: "upd i x a = (do len \ length a; (if i < len - then Heap_Monad.heap (\h. ((), Heap.upd a i x h)) - else raise (''array update: index out of range'')); - return a + then Heap_Monad.heap (\h. (a, Heap.upd a i x h)) + else raise (''array update: index out of range'')) done)" lemma upd_return: "upd i x a \ return a = upd i x a" - unfolding upd_def by (simp add: monad_simp) +proof (rule Heap_eqI) + fix h + obtain len h' where "Heap_Monad.execute (Array.length a) h = (len, h')" + by (cases "Heap_Monad.execute (Array.length a) h") + then show "Heap_Monad.execute (upd i x a \ return a) h = Heap_Monad.execute (upd i x a) h" + by (auto simp add: upd_def bindM_def run_drop split: sum.split) +qed subsection {* Derivates *} @@ -159,7 +164,8 @@ hide (open) const upd' lemma [code func]: "Array.upd i x a = Array.upd' a (index_of_nat i) x \ return a" - by (simp add: upd'_def monad_simp upd_return) + apply (simp add: upd'_def monad_simp) +oops subsubsection {* SML *}