src/HOL/HOLCF/Library/Int_Discrete.thy
changeset 41112 866148b76247
child 41292 2b7bc8d9fd6e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/HOL/HOLCF/Library/Int_Discrete.thy	Sat Dec 11 21:27:53 2010 -0800
@@ -0,0 +1,57 @@
+(*  Title:      HOLCF/Library/Int_Discrete.thy
+    Author:     Brian Huffman
+*)
+
+header {* Discrete cpo instance for integers *}
+
+theory Int_Discrete
+imports HOLCF
+begin
+
+text {* Discrete cpo instance for @{typ int}. *}
+
+instantiation int :: discrete_cpo
+begin
+
+definition below_int_def:
+  "(x::int) \<sqsubseteq> y \<longleftrightarrow> x = y"
+
+instance proof
+qed (rule below_int_def)
+
+end
+
+text {*
+  TODO: implement a command to automate discrete predomain instances.
+*}
+
+instantiation int :: predomain
+begin
+
+definition
+  "(liftemb :: int u \<rightarrow> udom) \<equiv> liftemb oo u_map\<cdot>(\<Lambda> x. Discr x)"
+
+definition
+  "(liftprj :: udom \<rightarrow> int u) \<equiv> u_map\<cdot>(\<Lambda> y. undiscr y) oo liftprj"
+
+definition
+  "liftdefl \<equiv> (\<lambda>(t::int itself). LIFTDEFL(int discr))"
+
+instance proof
+  show "ep_pair liftemb (liftprj :: udom \<rightarrow> int u)"
+    unfolding liftemb_int_def liftprj_int_def
+    apply (rule ep_pair_comp)
+    apply (rule ep_pair_u_map)
+    apply (simp add: ep_pair.intro)
+    apply (rule predomain_ep)
+    done
+  show "cast\<cdot>LIFTDEFL(int) = liftemb oo (liftprj :: udom \<rightarrow> int u)"
+    unfolding liftemb_int_def liftprj_int_def liftdefl_int_def
+    apply (simp add: cast_liftdefl cfcomp1 u_map_map)
+    apply (simp add: ID_def [symmetric] u_map_ID)
+    done
+qed
+
+end
+
+end