# HG changeset patch # User huffman # Date 1120783279 -7200 # Node ID fb6801c926d2f13171ac7778e276a408031ec291 # Parent 270ec60cc9e829993013da83fb231a77b5debc16 define 'a u with datatype package; removed obsolete lemmas; renamed upE1 to upE and Exh_Up1 to Exh_Up; cleaned up diff -r 270ec60cc9e8 -r fb6801c926d2 src/HOLCF/Up.ML --- a/src/HOLCF/Up.ML Fri Jul 08 02:39:53 2005 +0200 +++ b/src/HOLCF/Up.ML Fri Jul 08 02:41:19 2005 +0200 @@ -1,11 +1,7 @@ (* legacy ML bindings *) -val Iup_def = thm "Iup_def"; -val Ifup_def = thm "Ifup_def"; val less_up_def = thm "less_up_def"; -val Ifup1 = thm "Ifup1"; -val Ifup2 = thm "Ifup2"; val refl_less_up = thm "refl_less_up"; val antisym_less_up = thm "antisym_less_up"; val trans_less_up = thm "trans_less_up"; @@ -20,12 +16,12 @@ val cont_Iup = thm "cont_Iup"; val cont_Ifup1 = thm "cont_Ifup1"; val cont_Ifup2 = thm "cont_Ifup2"; -val Exh_Up1 = thm "Exh_Up1"; +val Exh_Up = thm "Exh_Up"; val up_inject = thm "up_inject"; val up_eq = thm "up_eq"; val up_defined = thm "up_defined"; val up_less = thm "up_less"; -val upE1 = thm "upE1"; +val upE = thm "upE"; val fup1 = thm "fup1"; val fup2 = thm "fup2"; val fup3 = thm "fup3"; diff -r 270ec60cc9e8 -r fb6801c926d2 src/HOLCF/Up.thy --- a/src/HOLCF/Up.thy Fri Jul 08 02:39:53 2005 +0200 +++ b/src/HOLCF/Up.thy Fri Jul 08 02:41:19 2005 +0200 @@ -15,95 +15,46 @@ subsection {* Definition of new type for lifting *} -typedef (Up) 'a u = "UNIV :: 'a option set" .. +datatype 'a u = Ibottom | Iup 'a consts - Iup :: "'a \ 'a u" - Ifup :: "('a \ 'b::pcpo) \ 'a u \ 'b" - -defs - Iup_def: "Iup x \ Abs_Up (Some x)" - Ifup_def: "Ifup f x \ case Rep_Up x of None \ \ | Some z \ f\z" - -lemma Abs_Up_inverse2: "Rep_Up (Abs_Up y) = y" -by (simp add: Up_def Abs_Up_inverse) - -lemma Exh_Up: "z = Abs_Up None \ (\x. z = Iup x)" -apply (unfold Iup_def) -apply (rule Rep_Up_inverse [THEN subst]) -apply (case_tac "Rep_Up z") -apply auto -done + Ifup :: "('a \ 'b::pcpo) \ 'a u \ 'b" -lemma inj_Abs_Up: "inj Abs_Up" (* worthless *) -apply (rule inj_on_inverseI) -apply (rule Abs_Up_inverse2) -done - -lemma inj_Rep_Up: "inj Rep_Up" (* worthless *) -apply (rule inj_on_inverseI) -apply (rule Rep_Up_inverse) -done - -lemma Iup_eq [simp]: "(Iup x = Iup y) = (x = y)" -by (simp add: Iup_def Abs_Up_inject Up_def) - -lemma Iup_defined [simp]: "Iup x \ Abs_Up None" -by (simp add: Iup_def Abs_Up_inject Up_def) - -lemma upE: "\p = Abs_Up None \ Q; \x. p = Iup x \ Q\ \ Q" -by (rule Exh_Up [THEN disjE], auto) - -lemma Ifup1 [simp]: "Ifup f (Abs_Up None) = \" -by (simp add: Ifup_def Abs_Up_inverse2) - -lemma Ifup2 [simp]: "Ifup f (Iup x) = f\x" -by (simp add: Ifup_def Iup_def Abs_Up_inverse2) +primrec + "Ifup f Ibottom = \" + "Ifup f (Iup x) = f\x" subsection {* Ordering on type @{typ "'a u"} *} instance u :: (sq_ord) sq_ord .. defs (overloaded) - less_up_def: "(op \) \ (\x1 x2. case Rep_Up x1 of - None \ True - | Some y1 \ (case Rep_Up x2 of None \ False - | Some y2 \ y1 \ y2))" + less_up_def: + "(op \) \ (\x y. case x of Ibottom \ True | Iup a \ + (case y of Ibottom \ False | Iup b \ a \ b))" -lemma minimal_up [iff]: "Abs_Up None \ z" -by (simp add: less_up_def Abs_Up_inverse2) +lemma minimal_up [iff]: "Ibottom \ z" +by (simp add: less_up_def) -lemma not_Iup_less [iff]: "\ Iup x \ Abs_Up None" -by (simp add: Iup_def less_up_def Abs_Up_inverse2) +lemma not_Iup_less [iff]: "\ Iup x \ Ibottom" +by (simp add: less_up_def) lemma Iup_less [iff]: "(Iup x \ Iup y) = (x \ y)" -by (simp add: Iup_def less_up_def Abs_Up_inverse2) +by (simp add: less_up_def) subsection {* Type @{typ "'a u"} is a partial order *} -lemma refl_less_up: "(p::'a u) \ p" -by (rule_tac p = "p" in upE, auto) +lemma refl_less_up: "(x::'a u) \ x" +by (simp add: less_up_def split: u.split) -lemma antisym_less_up: "\(p1::'a u) \ p2; p2 \ p1\ \ p1 = p2" -apply (rule_tac p = "p1" in upE) -apply (rule_tac p = "p2" in upE) -apply simp -apply simp -apply (rule_tac p = "p2" in upE) -apply simp -apply simp -apply (drule antisym_less, assumption) -apply simp +lemma antisym_less_up: "\(x::'a u) \ y; y \ x\ \ x = y" +apply (simp add: less_up_def split: u.split_asm) +apply (erule (1) antisym_less) done -lemma trans_less_up: "\(p1::'a u) \ p2; p2 \ p3\ \ p1 \ p3" -apply (rule_tac p = "p1" in upE) -apply simp -apply (rule_tac p = "p2" in upE) -apply simp -apply (rule_tac p = "p3" in upE) -apply simp -apply (auto elim: trans_less) +lemma trans_less_up: "\(x::'a u) \ y; y \ z\ \ x \ z" +apply (simp add: less_up_def split: u.split_asm) +apply (erule (1) trans_less) done instance u :: (cpo) po @@ -118,7 +69,7 @@ apply (rule ub_rangeI) apply (subst Iup_less) apply (erule is_ub_lub) -apply (rule_tac p="u" in upE) +apply (case_tac u) apply (drule ub_rangeD) apply simp apply simp @@ -130,25 +81,25 @@ text {* Now some lemmas about chains of @{typ "'a u"} elements *} -lemma up_lemma1: "z \ Abs_Up None \ Iup (THE a. Iup a = z) = z" -by (rule_tac p="z" in upE, simp_all) +lemma up_lemma1: "z \ Ibottom \ Iup (THE a. Iup a = z) = z" +by (case_tac z, simp_all) lemma up_lemma2: - "\chain Y; Y j \ Abs_Up None\ \ Y (i + j) \ Abs_Up None" + "\chain Y; Y j \ Ibottom\ \ Y (i + j) \ Ibottom" apply (erule contrapos_nn) apply (drule_tac x="j" and y="i + j" in chain_mono3) apply (rule le_add2) -apply (rule_tac p="Y j" in upE) +apply (case_tac "Y j") apply assumption apply simp done lemma up_lemma3: - "\chain Y; Y j \ Abs_Up None\ \ Iup (THE a. Iup a = Y (i + j)) = Y (i + j)" + "\chain Y; Y j \ Ibottom\ \ Iup (THE a. Iup a = Y (i + j)) = Y (i + j)" by (rule up_lemma1 [OF up_lemma2]) lemma up_lemma4: - "\chain Y; Y j \ Abs_Up None\ \ chain (\i. THE a. Iup a = Y (i + j))" + "\chain Y; Y j \ Ibottom\ \ chain (\i. THE a. Iup a = Y (i + j))" apply (rule chainI) apply (rule Iup_less [THEN iffD1]) apply (subst up_lemma3, assumption+)+ @@ -156,25 +107,25 @@ done lemma up_lemma5: - "\chain Y; Y j \ Abs_Up None\ \ + "\chain Y; Y j \ Ibottom\ \ (\i. Y (i + j)) = (\i. Iup (THE a. Iup a = Y (i + j)))" by (rule ext, rule up_lemma3 [symmetric]) lemma up_lemma6: - "\chain Y; Y j \ Abs_Up None\ + "\chain Y; Y j \ Ibottom\ \ range Y <<| Iup (\i. THE a. Iup a = Y(i + j))" apply (rule_tac j1="j" in is_lub_range_shift [THEN iffD1]) apply assumption apply (subst up_lemma5, assumption+) apply (rule is_lub_Iup) apply (rule thelubE [OF _ refl]) -apply (rule up_lemma4, assumption+) +apply (erule (1) up_lemma4) done lemma up_chain_cases: "chain Y \ (\A. chain A \ lub (range Y) = Iup (lub (range A)) \ - (\j. \i. Y (i + j) = Iup (A i))) \ (Y = (\i. Abs_Up None))" + (\j. \i. Y (i + j) = Iup (A i))) \ (Y = (\i. Ibottom))" apply (rule disjCI) apply (simp add: expand_fun_eq) apply (erule exE, rename_tac j) @@ -192,7 +143,7 @@ apply (rule_tac x="Iup (lub (range A))" in exI) apply (erule_tac j1="j" in is_lub_range_shift [THEN iffD1]) apply (simp add: is_lub_Iup thelubE) -apply (rule_tac x="Abs_Up None" in exI) +apply (rule_tac x="Ibottom" in exI) apply (rule lub_const) done @@ -202,7 +153,7 @@ subsection {* Type @{typ "'a u"} is pointed *} lemma least_up: "EX x::'a u. ALL y. x\y" -apply (rule_tac x = "Abs_Up None" in exI) +apply (rule_tac x = "Ibottom" in exI) apply (rule minimal_up [THEN allI]) done @@ -210,21 +161,9 @@ by intro_classes (rule least_up) text {* for compatibility with old HOLCF-Version *} -lemma inst_up_pcpo: "\ = Abs_Up None" +lemma inst_up_pcpo: "\ = Ibottom" by (rule minimal_up [THEN UU_I, symmetric]) -text {* some lemmas restated for class pcpo *} - -lemma less_up3b: "~ Iup(x) \ \" -apply (subst inst_up_pcpo) -apply simp -done - -lemma defined_Iup2 [iff]: "Iup(x) ~= \" -apply (subst inst_up_pcpo) -apply (rule Iup_defined) -done - subsection {* Continuity of @{term Iup} and @{term Ifup} *} text {* continuity for @{term Iup} *} @@ -238,18 +177,12 @@ text {* continuity for @{term Ifup} *} lemma cont_Ifup1: "cont (\f. Ifup f x)" -apply (rule contI) -apply (rule_tac p="x" in upE) -apply (simp add: lub_const) -apply (simp add: cont_cfun_fun) -done +by (induct x, simp_all) lemma monofun_Ifup2: "monofun (\x. Ifup f x)" apply (rule monofunI) -apply (rule_tac p="x" in upE) -apply simp -apply (rule_tac p="y" in upE) -apply simp +apply (case_tac x, simp) +apply (case_tac y, simp) apply (simp add: monofun_cfun_arg) done @@ -272,21 +205,21 @@ "fup \ \ f p. Ifup f p" translations -"case l of up\x => t1" == "fup\(LAM x. t1)\l" +"case l of up\x \ t" == "fup\(LAM x. t)\l" text {* continuous versions of lemmas for @{typ "('a)u"} *} -lemma Exh_Up1: "z = \ \ (\x. z = up\x)" -apply (rule_tac p="z" in upE) +lemma Exh_Up: "z = \ \ (\x. z = up\x)" +apply (induct z) apply (simp add: inst_up_pcpo) apply (simp add: up_def cont_Iup) done -lemma up_inject: "up\x = up\y \ x = y" +lemma up_eq [simp]: "(up\x = up\y) = (x = y)" by (simp add: up_def cont_Iup) -lemma up_eq [simp]: "(up\x = up\y) = (x = y)" -by (rule iffI, erule up_inject, simp) +lemma up_inject: "up\x = up\y \ x = y" +by simp lemma up_defined [simp]: " up\x \ \" by (simp add: up_def cont_Iup inst_up_pcpo) @@ -297,8 +230,8 @@ lemma up_less [simp]: "(up\x \ up\y) = (x \ y)" by (simp add: up_def cont_Iup) -lemma upE1: "\p = \ \ Q; \x. p = up\x \ Q\ \ Q" -apply (rule_tac p="p" in upE) +lemma upE: "\p = \ \ Q; \x. p = up\x \ Q\ \ Q" +apply (case_tac p) apply (simp add: inst_up_pcpo) apply (simp add: up_def cont_Iup) done @@ -307,9 +240,9 @@ by (simp add: fup_def cont_Ifup1 cont_Ifup2 inst_up_pcpo) lemma fup2 [simp]: "fup\f\(up\x) = f\x" -by (simp add: up_def fup_def cont_Iup cont_Ifup1 cont_Ifup2 ) +by (simp add: up_def fup_def cont_Iup cont_Ifup1 cont_Ifup2) lemma fup3 [simp]: "fup\up\x = x" -by (rule_tac p=x in upE1, simp_all) +by (rule_tac p=x in upE, simp_all) end