# HG changeset patch # User huffman # Date 1198265372 -3600 # Node ID de65baf8910670c020f4faf561c934ca64ee3967 # Parent 9da2343deb921e788a0aac6c1490bc3f5cfaca91 changed type definition to make Iwhen and reasoning about chains unnecessary; rearranged sections diff -r 9da2343deb92 -r de65baf89106 src/HOLCF/Ssum.thy --- a/src/HOLCF/Ssum.thy Fri Dec 21 16:18:23 2007 +0100 +++ b/src/HOLCF/Ssum.thy Fri Dec 21 20:29:32 2007 +0100 @@ -8,7 +8,7 @@ header {* The type of strict sums *} theory Ssum -imports Cprod +imports Cprod Tr begin defaultsort pcpo @@ -16,7 +16,9 @@ subsection {* Definition of strict sum type *} pcpodef (Ssum) ('a, 'b) "++" (infixr "++" 10) = - "{p::'a \ 'b. cfst\p = \ \ csnd\p = \}" + "{p :: tr \ ('a \ 'b). + (cfst\p \ TT \ csnd\(csnd\p) = \) \ + (cfst\p \ FF \ cfst\(csnd\p) = \)}" by simp syntax (xsymbols) @@ -29,31 +31,75 @@ definition sinl :: "'a \ ('a ++ 'b)" where - "sinl = (\ a. Abs_Ssum >)" + "sinl = (\ a. Abs_Ssum (\ _. TT)\a, a, \>)" definition sinr :: "'b \ ('a ++ 'b)" where - "sinr = (\ b. Abs_Ssum <\, b>)" + "sinr = (\ b. Abs_Ssum (\ _. FF)\b, \, b>)" + +lemma sinl_Ssum: "(\ _. TT)\a, a, \> \ Ssum" +by (simp add: Ssum_def strictify_conv_if) + +lemma sinr_Ssum: "(\ _. FF)\b, \, b> \ Ssum" +by (simp add: Ssum_def strictify_conv_if) + +lemma sinl_Abs_Ssum: "sinl\a = Abs_Ssum (\ _. TT)\a, a, \>" +by (unfold sinl_def, simp add: cont_Abs_Ssum sinl_Ssum) + +lemma sinr_Abs_Ssum: "sinr\b = Abs_Ssum (\ _. FF)\b, \, b>" +by (unfold sinr_def, simp add: cont_Abs_Ssum sinr_Ssum) + +lemma Rep_Ssum_sinl: "Rep_Ssum (sinl\a) = (\ _. TT)\a, a, \>" +by (simp add: sinl_Abs_Ssum Abs_Ssum_inverse sinl_Ssum) + +lemma Rep_Ssum_sinr: "Rep_Ssum (sinr\b) = (\ _. FF)\b, \, b>" +by (simp add: sinr_Abs_Ssum Abs_Ssum_inverse sinr_Ssum) subsection {* Properties of @{term sinl} and @{term sinr} *} -lemma sinl_Abs_Ssum: "sinl\a = Abs_Ssum >" -by (unfold sinl_def, simp add: cont_Abs_Ssum Ssum_def) - -lemma sinr_Abs_Ssum: "sinr\b = Abs_Ssum <\, b>" -by (unfold sinr_def, simp add: cont_Abs_Ssum Ssum_def) - -lemma Rep_Ssum_sinl: "Rep_Ssum (sinl\a) = >" -by (unfold sinl_def, simp add: cont_Abs_Ssum Abs_Ssum_inverse Ssum_def) - -lemma Rep_Ssum_sinr: "Rep_Ssum (sinr\b) = <\, b>" -by (unfold sinr_def, simp add: cont_Abs_Ssum Abs_Ssum_inverse Ssum_def) +text {* Compactness *} lemma compact_sinl [simp]: "compact x \ compact (sinl\x)" -by (rule compact_Ssum, simp add: Rep_Ssum_sinl) +by (rule compact_Ssum, simp add: Rep_Ssum_sinl strictify_conv_if) lemma compact_sinr [simp]: "compact x \ compact (sinr\x)" -by (rule compact_Ssum, simp add: Rep_Ssum_sinr) +by (rule compact_Ssum, simp add: Rep_Ssum_sinr strictify_conv_if) + +text {* Ordering *} + +lemma sinl_less [simp]: "(sinl\x \ sinl\y) = (x \ y)" +by (simp add: less_Ssum_def Rep_Ssum_sinl strictify_conv_if) + +lemma sinr_less [simp]: "(sinr\x \ sinr\y) = (x \ y)" +by (simp add: less_Ssum_def Rep_Ssum_sinr strictify_conv_if) + +lemma sinl_less_sinr [simp]: "(sinl\x \ sinr\y) = (x = \)" +by (simp add: less_Ssum_def Rep_Ssum_sinl Rep_Ssum_sinr strictify_conv_if) + +lemma sinr_less_sinl [simp]: "(sinr\x \ sinl\y) = (x = \)" +by (simp add: less_Ssum_def Rep_Ssum_sinl Rep_Ssum_sinr strictify_conv_if) + +text {* Equality *} + +lemma sinl_eq [simp]: "(sinl\x = sinl\y) = (x = y)" +by (simp add: po_eq_conv) + +lemma sinr_eq [simp]: "(sinr\x = sinr\y) = (x = y)" +by (simp add: po_eq_conv) + +lemma sinl_eq_sinr [simp]: "(sinl\x = sinr\y) = (x = \ \ y = \)" +by (subst po_eq_conv, simp) + +lemma sinr_eq_sinl [simp]: "(sinr\x = sinl\y) = (x = \ \ y = \)" +by (subst po_eq_conv, simp) + +lemma sinl_inject: "sinl\x = sinl\y \ x = y" +by (rule sinl_eq [THEN iffD1]) + +lemma sinr_inject: "sinr\x = sinr\y \ x = y" +by (rule sinr_eq [THEN iffD1]) + +text {* Strictness *} lemma sinl_strict [simp]: "sinl\\ = \" by (simp add: sinl_Abs_Ssum Abs_Ssum_strict cpair_strict) @@ -61,18 +107,6 @@ lemma sinr_strict [simp]: "sinr\\ = \" by (simp add: sinr_Abs_Ssum Abs_Ssum_strict cpair_strict) -lemma sinl_eq [simp]: "(sinl\x = sinl\y) = (x = y)" -by (simp add: sinl_Abs_Ssum Abs_Ssum_inject Ssum_def) - -lemma sinr_eq [simp]: "(sinr\x = sinr\y) = (x = y)" -by (simp add: sinr_Abs_Ssum Abs_Ssum_inject Ssum_def) - -lemma sinl_inject: "sinl\x = sinl\y \ x = y" -by (rule sinl_eq [THEN iffD1]) - -lemma sinr_inject: "sinr\x = sinr\y \ x = y" -by (rule sinr_eq [THEN iffD1]) - lemma sinl_defined_iff [simp]: "(sinl\x = \) = (x = \)" by (cut_tac sinl_eq [of "x" "\"], simp) @@ -90,13 +124,18 @@ lemma Exh_Ssum: "z = \ \ (\a. z = sinl\a \ a \ \) \ (\b. z = sinr\b \ b \ \)" apply (rule_tac x=z in Abs_Ssum_induct) -apply (rule_tac p=y in cprodE) -apply (simp add: sinl_Abs_Ssum sinr_Abs_Ssum) -apply (simp add: Abs_Ssum_inject Ssum_def) -apply (auto simp add: cpair_strict Abs_Ssum_strict) +apply (rule_tac p=y in cprodE, rename_tac t x) +apply (rule_tac p=x in cprodE, rename_tac a b) +apply (rule_tac p=t in trE) +apply (rule disjI1) +apply (simp add: Ssum_def cpair_strict Abs_Ssum_strict) +apply (rule disjI2, rule disjI1, rule_tac x=a in exI) +apply (simp add: sinl_Abs_Ssum Ssum_def) +apply (rule disjI2, rule disjI2, rule_tac x=b in exI) +apply (simp add: sinr_Abs_Ssum Ssum_def) done -lemma ssumE: +lemma ssumE [cases type: ++]: "\p = \ \ Q; \x. \p = sinl\x; x \ \\ \ Q; \y. \p = sinr\y; y \ \\ \ Q\ \ Q" @@ -104,119 +143,19 @@ lemma ssumE2: "\\x. p = sinl\x \ Q; \y. p = sinr\y \ Q\ \ Q" -apply (rule_tac p=p in ssumE) -apply (simp only: sinl_strict [symmetric]) -apply simp -apply simp -done - -subsection {* Ordering properties of @{term sinl} and @{term sinr} *} - -lemma sinl_less [simp]: "(sinl\x \ sinl\y) = (x \ y)" -by (simp add: less_Ssum_def Rep_Ssum_sinl) - -lemma sinr_less [simp]: "(sinr\x \ sinr\y) = (x \ y)" -by (simp add: less_Ssum_def Rep_Ssum_sinr) - -lemma sinl_less_sinr [simp]: "(sinl\x \ sinr\y) = (x = \)" -by (simp add: less_Ssum_def Rep_Ssum_sinl Rep_Ssum_sinr) - -lemma sinr_less_sinl [simp]: "(sinr\x \ sinl\y) = (x = \)" -by (simp add: less_Ssum_def Rep_Ssum_sinl Rep_Ssum_sinr) - -lemma sinl_eq_sinr [simp]: "(sinl\x = sinr\y) = (x = \ \ y = \)" -by (subst po_eq_conv, simp) - -lemma sinr_eq_sinl [simp]: "(sinr\x = sinl\y) = (x = \ \ y = \)" -by (subst po_eq_conv, simp) - -subsection {* Chains of strict sums *} +by (cases p, simp only: sinl_strict [symmetric], simp, simp) lemma less_sinlD: "p \ sinl\x \ \y. p = sinl\y \ y \ x" -apply (rule_tac p=p in ssumE) -apply (rule_tac x="\" in exI, simp) -apply simp -apply simp -done +by (cases p, rule_tac x="\" in exI, simp_all) lemma less_sinrD: "p \ sinr\x \ \y. p = sinr\y \ y \ x" -apply (rule_tac p=p in ssumE) -apply (rule_tac x="\" in exI, simp) -apply simp -apply simp -done - -lemma ssum_chain_lemma: -"chain Y \ (\A. chain A \ Y = (\i. sinl\(A i))) \ - (\B. chain B \ Y = (\i. sinr\(B i)))" - apply (rule_tac p="lub (range Y)" in ssumE2) - apply (rule disjI1) - apply (rule_tac x="\i. cfst\(Rep_Ssum (Y i))" in exI) - apply (rule conjI) - apply (rule chain_monofun) - apply (erule cont_Rep_Ssum [THEN ch2ch_cont]) - apply (rule ext, drule_tac x=i in is_ub_thelub, simp) - apply (drule less_sinlD, clarify) - apply (simp add: Rep_Ssum_sinl) - apply (rule disjI2) - apply (rule_tac x="\i. csnd\(Rep_Ssum (Y i))" in exI) - apply (rule conjI) - apply (rule chain_monofun) - apply (erule cont_Rep_Ssum [THEN ch2ch_cont]) - apply (rule ext, drule_tac x=i in is_ub_thelub, simp) - apply (drule less_sinrD, clarify) - apply (simp add: Rep_Ssum_sinr) -done - -subsection {* Definitions of constants *} - -definition - Iwhen :: "['a \ 'c, 'b \ 'c, 'a ++ 'b] \ 'c" where - "Iwhen = (\f g s. - if cfst\(Rep_Ssum s) \ \ then f\(cfst\(Rep_Ssum s)) else - if csnd\(Rep_Ssum s) \ \ then g\(csnd\(Rep_Ssum s)) else \)" +by (cases p, rule_tac x="\" in exI, simp_all) -text {* rewrites for @{term Iwhen} *} - -lemma Iwhen1 [simp]: "Iwhen f g \ = \" -by (simp add: Iwhen_def Rep_Ssum_strict) - -lemma Iwhen2 [simp]: "x \ \ \ Iwhen f g (sinl\x) = f\x" -by (simp add: Iwhen_def Rep_Ssum_sinl) - -lemma Iwhen3 [simp]: "y \ \ \ Iwhen f g (sinr\y) = g\y" -by (simp add: Iwhen_def Rep_Ssum_sinr) - -lemma Iwhen4: "Iwhen f g (sinl\x) = strictify\f\x" -by (simp add: strictify_conv_if) - -lemma Iwhen5: "Iwhen f g (sinr\y) = strictify\g\y" -by (simp add: strictify_conv_if) - -subsection {* Continuity of @{term Iwhen} *} - -text {* @{term Iwhen} is continuous in all arguments *} - -lemma cont_Iwhen1: "cont (\f. Iwhen f g s)" -by (rule_tac p=s in ssumE, simp_all) - -lemma cont_Iwhen2: "cont (\g. Iwhen f g s)" -by (rule_tac p=s in ssumE, simp_all) - -lemma cont_Iwhen3: "cont (\s. Iwhen f g s)" -apply (rule contI) -apply (drule ssum_chain_lemma, safe) -apply (simp add: contlub_cfun_arg [symmetric]) -apply (simp add: Iwhen4 cont_cfun_arg) -apply (simp add: contlub_cfun_arg [symmetric]) -apply (simp add: Iwhen5 cont_cfun_arg) -done - -subsection {* Continuous versions of constants *} +subsection {* Case analysis combinator *} definition sscase :: "('a \ 'c) \ ('b \ 'c) \ ('a ++ 'b) \ 'c" where - "sscase = (\ f g s. Iwhen f g s)" + "sscase = (\ f g s. (\. If t then f\x else g\y fi)\(Rep_Ssum s))" translations "case s of CONST sinl\x \ t1 | CONST sinr\y \ t2" == "CONST sscase\(\ x. t1)\(\ y. t2)\s" @@ -225,19 +164,18 @@ "\(CONST sinl\x). t" == "CONST sscase\(\ x. t)\\" "\(CONST sinr\y). t" == "CONST sscase\\\(\ y. t)" -text {* continuous versions of lemmas for @{term sscase} *} - -lemma beta_sscase: "sscase\f\g\s = Iwhen f g s" -by (simp add: sscase_def cont_Iwhen1 cont_Iwhen2 cont_Iwhen3) +lemma beta_sscase: + "sscase\f\g\s = (\. If t then f\x else g\y fi)\(Rep_Ssum s)" +unfolding sscase_def by (simp add: cont_Rep_Ssum) lemma sscase1 [simp]: "sscase\f\g\\ = \" -by (simp add: beta_sscase) +unfolding beta_sscase by (simp add: Rep_Ssum_strict) lemma sscase2 [simp]: "x \ \ \ sscase\f\g\(sinl\x) = f\x" -by (simp add: beta_sscase) +unfolding beta_sscase by (simp add: Rep_Ssum_sinl) lemma sscase3 [simp]: "y \ \ \ sscase\f\g\(sinr\y) = g\y" -by (simp add: beta_sscase) +unfolding beta_sscase by (simp add: Rep_Ssum_sinr) lemma sscase4 [simp]: "sscase\sinl\sinr\z = z" by (rule_tac p=z in ssumE, simp_all)