a draft for an example how to turn specifications involving choice executable
authorhaftmann
Wed, 17 Feb 2010 09:48:53 +0100
changeset 35160 6eb2b6c1d2d5
parent 35159 df38e92af926
child 35161 be96405ccaf3
a draft for an example how to turn specifications involving choice executable
src/HOL/ex/Execute_Choice.thy
src/HOL/ex/ROOT.ML
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/HOL/ex/Execute_Choice.thy	Wed Feb 17 09:48:53 2010 +0100
@@ -0,0 +1,64 @@
+(* Author: Florian Haftmann, TU Muenchen *)
+
+header {* A simple cookbook example how to eliminate choice in programs. *}
+
+theory Execute_Choice
+imports Main AssocList
+begin
+
+definition valuesum :: "('a, 'b :: comm_monoid_add) mapping \<Rightarrow> 'b" where
+  "valuesum m = (\<Sum>k \<in> Mapping.keys m. the (Mapping.lookup m k))"
+
+lemma valuesum_rec:
+  assumes fin: "finite (dom (Mapping.lookup m))"
+  shows "valuesum m = (if Mapping.is_empty m then 0 else
+    let l = (SOME l. l \<in> Mapping.keys m) in the (Mapping.lookup m l) + valuesum (Mapping.delete l m))"
+proof (cases "Mapping.is_empty m")
+  case True then show ?thesis by (simp add: is_empty_def keys_def valuesum_def)
+next
+  case False
+  then have l: "\<exists>l. l \<in> dom (Mapping.lookup m)" by (auto simp add: is_empty_def expand_fun_eq mem_def)
+  then have "(let l = SOME l. l \<in> dom (Mapping.lookup m) in
+     the (Mapping.lookup m l) + (\<Sum>k \<in> dom (Mapping.lookup m) - {l}. the (Mapping.lookup m k))) =
+       (\<Sum>k \<in> dom (Mapping.lookup m). the (Mapping.lookup m k))"
+  proof (rule someI2_ex)
+    fix l
+    note fin
+    moreover assume "l \<in> dom (Mapping.lookup m)"
+    moreover obtain A where "A = dom (Mapping.lookup m) - {l}" by simp
+    ultimately have "dom (Mapping.lookup m) = insert l A" and "finite A" and "l \<notin> A" by auto
+    then show "(let l = l
+        in the (Mapping.lookup m l) + (\<Sum>k \<in> dom (Mapping.lookup m) - {l}. the (Mapping.lookup m k))) =
+        (\<Sum>k \<in> dom (Mapping.lookup m). the (Mapping.lookup m k))"
+      by simp
+   qed
+  then show ?thesis by (simp add: keys_def valuesum_def is_empty_def)
+qed
+
+lemma valuesum_rec_AList:
+  "valuesum (AList []) = 0"
+  "valuesum (AList (x # xs)) = (let l = (SOME l. l \<in> Mapping.keys (AList (x # xs))) in
+    the (Mapping.lookup (AList (x # xs)) l) + valuesum (Mapping.delete l (AList (x # xs))))"
+  by (simp_all add: valuesum_rec finite_dom_map_of is_empty_AList)
+
+axioms
+  FIXME: "x \<in> A \<Longrightarrow> y \<in> A \<Longrightarrow> C x = C y"
+
+lemma aux: "(SOME l. l \<in> Mapping.keys (AList (x # xs))) = fst (hd (x # xs))"
+proof (rule FIXME)
+  show "fst (hd (x # xs)) \<in> Mapping.keys (AList (x # xs))"
+    by (simp add: keys_AList)
+  show "(SOME l. l \<in> Mapping.keys (AList (x # xs))) \<in> Mapping.keys (AList (x # xs))"
+    apply (rule someI) apply (simp add: keys_AList) apply auto
+    done
+qed
+
+lemma valuesum_rec_exec [code]:
+  "valuesum (AList []) = 0"
+  "valuesum (AList (x # xs)) = (let l = fst (hd (x # xs)) in
+    the (Mapping.lookup (AList (x # xs)) l) + valuesum (Mapping.delete l (AList (x # xs))))"
+  by (simp_all add: valuesum_rec_AList aux)
+
+value "valuesum (AList [(''abc'', (42::nat)), (''def'', 1705)])"
+
+end
--- a/src/HOL/ex/ROOT.ML	Wed Feb 17 09:48:53 2010 +0100
+++ b/src/HOL/ex/ROOT.ML	Wed Feb 17 09:48:53 2010 +0100
@@ -65,7 +65,8 @@
   "HarmonicSeries",
   "Refute_Examples",
   "Quickcheck_Examples",
-  "Landau"
+  "Landau",
+  "Execute_Choice"
 ];
 
 HTML.with_charset "utf-8" (no_document use_thys)