# HG changeset patch # User oheimb # Date 991321560 -7200 # Node ID c5c403d30c77d96c1652e860ed3bdbbf8d049036 # Parent 4c55b020d6ee3ff5ad7a52dd6148ac6fbc9f74b3 added Library/Nat_Infinity.thy and Library/Continuity.thy diff -r 4c55b020d6ee -r c5c403d30c77 src/HOL/Library/Continuity.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Library/Continuity.thy Thu May 31 17:06:00 2001 +0200 @@ -0,0 +1,219 @@ +(* Title: HOL/Library/Continuity.thy + ID: $$ + Author: David von Oheimb, TU Muenchen + License: GPL (GNU GENERAL PUBLIC LICENSE) + +*) + +header {* + \title{Continuity and interations (of set transformers)} + \author{David von Oheimb} +*} + +theory Continuity = Relation_Power: + + +subsection "Chains" + +constdefs + up_chain :: "(nat => 'a set) => bool" + "up_chain F == !i. F i <= F (Suc i)" + +lemma up_chainI: "(!!i. F i <= F (Suc i)) ==> up_chain F" +by (simp add: up_chain_def); + +lemma up_chainD: "up_chain F ==> F i <= F (Suc i)" +by (simp add: up_chain_def); + +lemma up_chain_less_mono [rule_format]: "up_chain F ==> x < y --> F x <= F y" +apply (induct_tac y) +apply (blast dest: up_chainD elim: less_SucE)+ +done + +lemma up_chain_mono: "up_chain F ==> x <= y ==> F x <= F y" +apply (drule le_imp_less_or_eq) +apply (blast dest: up_chain_less_mono) +done + + +constdefs + down_chain :: "(nat => 'a set) => bool" + "down_chain F == !i. F (Suc i) <= F i" + +lemma down_chainI: "(!!i. F (Suc i) <= F i) ==> down_chain F" +by (simp add: down_chain_def); + +lemma down_chainD: "down_chain F ==> F (Suc i) <= F i" +by (simp add: down_chain_def); + +lemma down_chain_less_mono[rule_format]: "down_chain F ==> x < y --> F y <= F x" +apply (induct_tac y) +apply (blast dest: down_chainD elim: less_SucE)+ +done + +lemma down_chain_mono: "down_chain F ==> x <= y ==> F y <= F x" +apply (drule le_imp_less_or_eq) +apply (blast dest: down_chain_less_mono) +done + + +subsection "Continuity" + +constdefs + up_cont :: "('a set => 'a set) => bool" + "up_cont f == !F. up_chain F --> f (Union (range F)) = Union (f`(range F))" + +lemma up_contI: + "(!!F. up_chain F ==> f (Union (range F)) = Union (f`(range F))) ==> up_cont f" +apply (unfold up_cont_def) +by blast + +lemma up_contD: + "[| up_cont f; up_chain F |] ==> f (Union (range F)) = Union (f`(range F))" +apply (unfold up_cont_def) +by auto + + +lemma up_cont_mono: "up_cont f ==> mono f" +apply (rule monoI) +apply (drule_tac F = "%i. if i = 0 then A else B" in up_contD) +apply (rule up_chainI) +apply simp+ +apply (drule Un_absorb1) +apply auto +done + + +constdefs + down_cont :: "('a set => 'a set) => bool" + "down_cont f == !F. down_chain F --> f (Inter (range F)) = Inter (f`(range F))" + +lemma down_contI: + "(!!F. down_chain F ==> f (Inter (range F)) = Inter (f`(range F))) ==> + down_cont f" +apply (unfold down_cont_def) +by blast + +lemma down_contD: "[| down_cont f; down_chain F |] ==> + f (Inter (range F)) = Inter (f`(range F))" +apply (unfold down_cont_def) +by auto + +lemma down_cont_mono: "down_cont f ==> mono f" +apply (rule monoI) +apply (drule_tac F = "%i. if i = 0 then B else A" in down_contD) +apply (rule down_chainI) +apply simp+ +apply (drule Int_absorb1) +apply auto +done + + +subsection "Iteration" + +constdefs + + up_iterate :: "('a set => 'a set) => nat => 'a set" + "up_iterate f n == (f^n) {}" + +lemma up_iterate_0 [simp]: "up_iterate f 0 = {}" +by (simp add: up_iterate_def) + +lemma up_iterate_Suc [simp]: + "up_iterate f (Suc i) = f (up_iterate f i)" +by (simp add: up_iterate_def) + +lemma up_iterate_chain: "mono F ==> up_chain (up_iterate F)" +apply (rule up_chainI) +apply (induct_tac i) +apply simp+ +apply (erule (1) monoD) +done + +lemma UNION_up_iterate_is_fp: +"up_cont F ==> F (UNION UNIV (up_iterate F)) = UNION UNIV (up_iterate F)" +apply (frule up_cont_mono [THEN up_iterate_chain]) +apply (drule (1) up_contD) +apply simp +apply (auto simp del: up_iterate_Suc simp add: up_iterate_Suc [symmetric]) +apply (case_tac "xa") +apply auto +done + +lemma UNION_up_iterate_lowerbound: +"[| mono F; F P = P |] ==> UNION UNIV (up_iterate F) <= P" +apply (subgoal_tac "(!!i. up_iterate F i <= P)") +apply fast +apply (induct_tac "i") +prefer 2 apply (drule (1) monoD) +apply auto +done + +lemma UNION_up_iterate_is_lfp: + "up_cont F ==> lfp F = UNION UNIV (up_iterate F)" +apply (rule set_eq_subset [THEN iffD2]) +apply (rule conjI) +prefer 2 +apply (drule up_cont_mono) +apply (rule UNION_up_iterate_lowerbound) +apply assumption +apply (erule lfp_unfold [symmetric]) +apply (rule lfp_lowerbound) +apply (rule set_eq_subset [THEN iffD1, THEN conjunct2]) +apply (erule UNION_up_iterate_is_fp [symmetric]) +done + + +constdefs + + down_iterate :: "('a set => 'a set) => nat => 'a set" + "down_iterate f n == (f^n) UNIV" + +lemma down_iterate_0 [simp]: "down_iterate f 0 = UNIV" +by (simp add: down_iterate_def) + +lemma down_iterate_Suc [simp]: + "down_iterate f (Suc i) = f (down_iterate f i)" +by (simp add: down_iterate_def) + +lemma down_iterate_chain: "mono F ==> down_chain (down_iterate F)" +apply (rule down_chainI) +apply (induct_tac i) +apply simp+ +apply (erule (1) monoD) +done + +lemma INTER_down_iterate_is_fp: +"down_cont F ==> + F (INTER UNIV (down_iterate F)) = INTER UNIV (down_iterate F)" +apply (frule down_cont_mono [THEN down_iterate_chain]) +apply (drule (1) down_contD) +apply simp +apply (auto simp del: down_iterate_Suc simp add: down_iterate_Suc [symmetric]) +apply (case_tac "xa") +apply auto +done + +lemma INTER_down_iterate_upperbound: +"[| mono F; F P = P |] ==> P <= INTER UNIV (down_iterate F)" +apply (subgoal_tac "(!!i. P <= down_iterate F i)") +apply fast +apply (induct_tac "i") +prefer 2 apply (drule (1) monoD) +apply auto +done + +lemma INTER_down_iterate_is_gfp: + "down_cont F ==> gfp F = INTER UNIV (down_iterate F)" +apply (rule set_eq_subset [THEN iffD2]) +apply (rule conjI) +apply (drule down_cont_mono) +apply (rule INTER_down_iterate_upperbound) +apply assumption +apply (erule gfp_unfold [symmetric]) +apply (rule gfp_upperbound) +apply (rule set_eq_subset [THEN iffD1, THEN conjunct2]) +apply (erule INTER_down_iterate_is_fp) +done + +end diff -r 4c55b020d6ee -r c5c403d30c77 src/HOL/Library/Nat_Infinity.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Library/Nat_Infinity.thy Thu May 31 17:06:00 2001 +0200 @@ -0,0 +1,216 @@ +(* Title: HOL/Library/Nat_Infinity.thy + ID: $ $ + Author: David von Oheimb, TU Muenchen + License: GPL (GNU GENERAL PUBLIC LICENSE) + +*) + +header {* + \title{Natural numbers with infinity} + \author{David von Oheimb} +*} + +theory Nat_Infinity = Datatype: + +subsection "Definitions" + +text {* + We extend the standard natural numbers by a special value indicating infinity. + This includes extending the ordering relations @{term "op <"} and + @{term "op <="}. +*} + +datatype inat = Fin nat | Infty + +instance inat :: ord .. +instance inat :: zero .. + +consts + + iSuc :: "inat => inat" + +syntax (xsymbols) + + Infty :: inat ("\") + +defs + + iZero_def: "0 == Fin 0" + iSuc_def: "iSuc i == case i of Fin n => Fin (Suc n) | \ => \" + iless_def: "m < n == case m of Fin m1 => (case n of Fin n1 => m1 < n1 + | \ => True) + | \ => False " + ile_def: "(m::inat) <= n == \(n \ 0" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma i0_ne_Infty [simp]: "0 \ \" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma iSuc_Fin [simp]: "iSuc (Fin n) = Fin (Suc n)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma iSuc_Infty [simp]: "iSuc \ = \" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma iSuc_ne_0 [simp]: "iSuc n \ 0" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma iSuc_inject [simp]: "(iSuc x = iSuc y) = (x = y)" +by(simp add:inat_defs split:inat_splits, arith?) + + +subsection "Ordering relations" + +lemma Infty_ilessE [elim!]: "\ < Fin m ==> R" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma iless_linear: "m < n | m = n | n < (m::inat)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma iless_not_refl [simp]: "\ n < (n::inat)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma iless_trans: "i < j ==> j < k ==> i < (k::inat)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma iless_not_sym: "n < m ==> \ m < (n::inat)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma Fin_iless_mono [simp]: "(Fin n < Fin m) = (n < m)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma Fin_iless_Infty [simp]: "Fin n < \" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma Infty_eq [simp]: "n < \ = (n \ \)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma i0_eq [simp]: "((0::inat) < n) = (n \ 0)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma i0_iless_iSuc [simp]: "0 < iSuc n" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma not_ilessi0 [simp]: "\ n < (0::inat)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma Fin_iless: "n < Fin m ==> \k. n = Fin k" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma iSuc_mono [simp]: "iSuc n < iSuc m = (n < m)" +by(simp add:inat_defs split:inat_splits, arith?) + + +(* ----------------------------------------------------------------------- *) + +lemma ile_def2: "m <= n = (m < n | m = (n::inat))" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma ile_refl [simp]: "n <= (n::inat)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma ile_trans: "i <= j ==> j <= k ==> i <= (k::inat)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma ile_iless_trans: "i <= j ==> j < k ==> i < (k::inat)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma iless_ile_trans: "i < j ==> j <= k ==> i < (k::inat)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma Infty_ub [simp]: "n <= \" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma i0_lb [simp]: "(0::inat) <= n" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma Infty_ileE [elim!]: "\ <= Fin m ==> R" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma Fin_ile_mono [simp]: "(Fin n <= Fin m) = (n <= m)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma ilessI1: "n <= m ==> n \ m ==> n < (m::inat)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma ileI1: "m < n ==> iSuc m <= n" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma Suc_ile_eq: "Fin (Suc m) <= n = (Fin m < n)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma iSuc_ile_mono [simp]: "iSuc n <= iSuc m = (n <= m)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma iless_Suc_eq [simp]: "Fin m < iSuc n = (Fin m <= n)" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma not_iSuc_ilei0 [simp]: "\ iSuc n <= 0" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma ile_iSuc [simp]: "n <= iSuc n" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma Fin_ile: "n <= Fin m ==> \k. n = Fin k" +by(simp add:inat_defs split:inat_splits, arith?) + +lemma chain_incr: "\i. \j. Y i < Y j ==> \j. Fin k < Y j" +apply (induct_tac "k") +apply (simp (no_asm) only: Fin_0) +apply (fast intro: ile_iless_trans i0_lb) +apply (erule exE) +apply (drule spec) +apply (erule exE) +apply (drule ileI1) +apply (rule iSuc_Fin [THEN subst]) +apply (rule exI) +apply (erule (1) ile_iless_trans) +done + +ML {* +val Fin_0 = thm "Fin_0"; +val Suc_ile_eq = thm "Suc_ile_eq"; +val iSuc_Fin = thm "iSuc_Fin"; +val iSuc_Infty = thm "iSuc_Infty"; +val iSuc_mono = thm "iSuc_mono"; +val iSuc_ile_mono = thm "iSuc_ile_mono"; +val not_iSuc_ilei0=thm "not_iSuc_ilei0"; +val iSuc_inject = thm "iSuc_inject"; +val i0_iless_iSuc = thm "i0_iless_iSuc"; +val i0_eq = thm "i0_eq"; +val i0_lb = thm "i0_lb"; +val ile_def = thm "ile_def"; +val ile_refl = thm "ile_refl"; +val Infty_ub = thm "Infty_ub"; +val ilessI1 = thm "ilessI1"; +val ile_iless_trans = thm "ile_iless_trans"; +val ile_trans = thm "ile_trans"; +val ileI1 = thm "ileI1"; +val ile_iSuc = thm "ile_iSuc"; +val Fin_iless_Infty = thm "Fin_iless_Infty"; +val Fin_ile_mono = thm "Fin_ile_mono"; +val chain_incr = thm "chain_incr"; +val Infty_eq = thm "Infty_eq"; +*} + +end + + +