# HG changeset patch # User huffman # Date 1200361093 -3600 # Node ID f1bce5261decb78b08cf0784f82d270a26b12b23 # Parent ff835e25ae879b77eb75a64d70183c92b9403014 add instance for class bifinite diff -r ff835e25ae87 -r f1bce5261dec src/HOLCF/Ssum.thy --- a/src/HOLCF/Ssum.thy Tue Jan 15 02:20:47 2008 +0100 +++ b/src/HOLCF/Ssum.thy Tue Jan 15 02:38:13 2008 +0100 @@ -99,10 +99,10 @@ text {* Strictness *} lemma sinl_strict [simp]: "sinl\\ = \" -by (simp add: sinl_Abs_Ssum Abs_Ssum_strict cpair_strict) +by (simp add: sinl_Abs_Ssum Abs_Ssum_strict) lemma sinr_strict [simp]: "sinr\\ = \" -by (simp add: sinr_Abs_Ssum Abs_Ssum_strict cpair_strict) +by (simp add: sinr_Abs_Ssum Abs_Ssum_strict) lemma sinl_defined_iff [simp]: "(sinl\x = \) = (x = \)" by (cut_tac sinl_eq [of "x" "\"], simp) @@ -214,4 +214,37 @@ apply (rule_tac p=y in ssumE, simp_all add: flat_less_iff) done +subsection {* Strict sum is a bifinite domain *} + +instance "++" :: (bifinite, bifinite) approx .. + +defs (overloaded) + approx_ssum_def: + "approx \ \n. sscase\(\ x. sinl\(approx n\x))\(\ y. sinr\(approx n\y))" + +lemma approx_sinl [simp]: "approx i\(sinl\x) = sinl\(approx i\x)" +unfolding approx_ssum_def by (cases "x = \") simp_all + +lemma approx_sinr [simp]: "approx i\(sinr\x) = sinr\(approx i\x)" +unfolding approx_ssum_def by (cases "x = \") simp_all + +instance "++" :: (bifinite, bifinite) bifinite +proof + fix i :: nat and x :: "'a \ 'b" + show "chain (\i. approx i\x)" + unfolding approx_ssum_def by simp + show "(\i. approx i\x) = x" + unfolding approx_ssum_def + by (simp add: lub_distribs eta_cfun) + show "approx i\(approx i\x) = approx i\x" + by (cases x, simp add: approx_ssum_def, simp, simp) + have "{x::'a \ 'b. approx i\x = x} \ + (\x. sinl\x) ` {x. approx i\x = x} \ + (\x. sinr\x) ` {x. approx i\x = x}" + by (rule subsetI, rule_tac p=x in ssumE2, simp, simp) + thus "finite {x::'a \ 'b. approx i\x = x}" + by (rule finite_subset, + intro finite_UnI finite_imageI finite_fixes_approx) +qed + end