# HG changeset patch # User wenzelm # Date 1475334995 -7200 # Node ID 95c3ae4baba8d37bfbd48c88c14ffef77b15aa50 # Parent ec0fb01c6d50d3699521ded75720946272f04a2a clarified lfp/gfp statements and proofs; diff -r ec0fb01c6d50 -r 95c3ae4baba8 NEWS --- a/NEWS Sat Oct 01 12:03:27 2016 +0200 +++ b/NEWS Sat Oct 01 17:16:35 2016 +0200 @@ -336,6 +336,12 @@ eliminates the need to qualify any of those names in the presence of infix "mod" syntax. INCOMPATIBILITY. +* Statements and proofs of Knaster-Tarski fixpoint combinators lfp/gfp +have been clarified. The fixpoint properties are lfp_fixpoint, its +symmetric lfp_unfold (as before), and the duals for gfp. Auxiliary items +for the proof (lfp_lemma2 etc.) are no longer exported, but can be +easily recovered by composition with eq_refl. Minor INCOMPATIBILITY. + * Constant "surj" is a mere input abbreviation, to avoid hiding an equation in term output. Minor INCOMPATIBILITY. diff -r ec0fb01c6d50 -r 95c3ae4baba8 src/HOL/Complete_Partial_Order.thy --- a/src/HOL/Complete_Partial_Order.thy Sat Oct 01 12:03:27 2016 +0200 +++ b/src/HOL/Complete_Partial_Order.thy Sat Oct 01 17:16:35 2016 +0200 @@ -365,15 +365,15 @@ by standard (fast intro: Sup_upper Sup_least)+ lemma lfp_eq_fixp: - assumes f: "mono f" + assumes mono: "mono f" shows "lfp f = fixp f" proof (rule antisym) - from f have f': "monotone (op \) (op \) f" + from mono have f': "monotone (op \) (op \) f" unfolding mono_def monotone_def . show "lfp f \ fixp f" by (rule lfp_lowerbound, subst fixp_unfold [OF f'], rule order_refl) show "fixp f \ lfp f" - by (rule fixp_lowerbound [OF f'], subst lfp_unfold [OF f], rule order_refl) + by (rule fixp_lowerbound [OF f']) (simp add: lfp_fixpoint [OF mono]) qed hide_const (open) iterates fixp diff -r ec0fb01c6d50 -r 95c3ae4baba8 src/HOL/Inductive.thy --- a/src/HOL/Inductive.thy Sat Oct 01 12:03:27 2016 +0200 +++ b/src/HOL/Inductive.thy Sat Oct 01 17:16:35 2016 +0200 @@ -14,22 +14,14 @@ "primrec" :: thy_decl begin -subsection \Least and greatest fixed points\ +subsection \Least fixed points\ context complete_lattice begin -definition lfp :: "('a \ 'a) \ 'a" \ \least fixed point\ +definition lfp :: "('a \ 'a) \ 'a" where "lfp f = Inf {u. f u \ u}" -definition gfp :: "('a \ 'a) \ 'a" \ \greatest fixed point\ - where "gfp f = Sup {u. u \ f u}" - - -subsection \Proof of Knaster-Tarski Theorem using @{term lfp}\ - -text \@{term "lfp f"} is the least upper bound of the set @{term "{u. f u \ u}"}\ - lemma lfp_lowerbound: "f A \ A \ lfp f \ A" by (auto simp add: lfp_def intro: Inf_lower) @@ -38,14 +30,31 @@ end -lemma lfp_lemma2: "mono f \ f (lfp f) \ lfp f" - by (iprover intro: lfp_greatest order_trans monoD lfp_lowerbound) - -lemma lfp_lemma3: "mono f \ lfp f \ f (lfp f)" - by (iprover intro: lfp_lemma2 monoD lfp_lowerbound) +lemma lfp_fixpoint: + assumes "mono f" + shows "f (lfp f) = lfp f" + unfolding lfp_def +proof (rule order_antisym) + let ?H = "{u. f u \ u}" + let ?a = "\?H" + show "f ?a \ ?a" + proof (rule Inf_greatest) + fix x + assume "x \ ?H" + then have "?a \ x" by (rule Inf_lower) + with \mono f\ have "f ?a \ f x" .. + also from \x \ ?H\ have "f x \ x" .. + finally show "f ?a \ x" . + qed + show "?a \ f ?a" + proof (rule Inf_lower) + from \mono f\ and \f ?a \ ?a\ have "f (f ?a) \ f ?a" .. + then show "f ?a \ ?H" .. + qed +qed lemma lfp_unfold: "mono f \ lfp f = f (lfp f)" - by (iprover intro: order_antisym lfp_lemma2 lfp_lemma3) + by (rule lfp_fixpoint [symmetric]) lemma lfp_const: "lfp (\x. t) = t" by (rule lfp_unfold) (simp add: mono_def) @@ -132,9 +141,13 @@ by (rule lfp_lowerbound [THEN lfp_greatest]) (blast intro: order_trans) -subsection \Proof of Knaster-Tarski Theorem using \gfp\\ +subsection \Greatest fixed points\ -text \@{term "gfp f"} is the greatest lower bound of the set @{term "{u. u \ f u}"}\ +context complete_lattice +begin + +definition gfp :: "('a \ 'a) \ 'a" + where "gfp f = Sup {u. u \ f u}" lemma gfp_upperbound: "X \ f X \ X \ gfp f" by (auto simp add: gfp_def intro: Sup_upper) @@ -142,14 +155,36 @@ lemma gfp_least: "(\u. u \ f u \ u \ X) \ gfp f \ X" by (auto simp add: gfp_def intro: Sup_least) -lemma gfp_lemma2: "mono f \ gfp f \ f (gfp f)" - by (iprover intro: gfp_least order_trans monoD gfp_upperbound) +end + +lemma lfp_le_gfp: "mono f \ lfp f \ gfp f" + by (rule gfp_upperbound) (simp add: lfp_fixpoint) -lemma gfp_lemma3: "mono f \ f (gfp f) \ gfp f" - by (iprover intro: gfp_lemma2 monoD gfp_upperbound) +lemma gfp_fixpoint: + assumes "mono f" + shows "f (gfp f) = gfp f" + unfolding gfp_def +proof (rule order_antisym) + let ?H = "{u. u \ f u}" + let ?a = "\?H" + show "?a \ f ?a" + proof (rule Sup_least) + fix x + assume "x \ ?H" + then have "x \ f x" .. + also from \x \ ?H\ have "x \ ?a" by (rule Sup_upper) + with \mono f\ have "f x \ f ?a" .. + finally show "x \ f ?a" . + qed + show "f ?a \ ?a" + proof (rule Sup_upper) + from \mono f\ and \?a \ f ?a\ have "f ?a \ f (f ?a)" .. + then show "f ?a \ ?H" .. + qed +qed lemma gfp_unfold: "mono f \ gfp f = f (gfp f)" - by (iprover intro: order_antisym gfp_lemma2 gfp_lemma3) + by (rule gfp_fixpoint [symmetric]) lemma gfp_const: "gfp (\x. t) = t" by (rule gfp_unfold) (simp add: mono_def) @@ -158,10 +193,6 @@ by (rule antisym) (simp_all add: gfp_upperbound gfp_unfold[symmetric]) -lemma lfp_le_gfp: "mono f \ lfp f \ gfp f" - by (iprover intro: gfp_upperbound lfp_lemma3) - - subsection \Coinduction rules for greatest fixed points\ text \Weak version.\ @@ -174,7 +205,7 @@ done lemma coinduct_lemma: "X \ f (sup X (gfp f)) \ mono f \ sup X (gfp f) \ f (sup X (gfp f))" - apply (frule gfp_lemma2) + apply (frule gfp_unfold [THEN eq_refl]) apply (drule mono_sup) apply (rule le_supI) apply assumption @@ -190,7 +221,7 @@ by (rule weak_coinduct[rotated], rule coinduct_lemma) blast+ lemma gfp_fun_UnI2: "mono f \ a \ gfp f \ a \ f (X \ gfp f)" - by (blast dest: gfp_lemma2 mono_Un) + by (blast dest: gfp_fixpoint mono_Un) lemma gfp_ordinal_induct[case_names mono step union]: fixes f :: "'a::complete_lattice \ 'a" @@ -248,7 +279,7 @@ "X \ f (lfp (\x. f x \ X \ gfp f)) \ mono f \ lfp (\x. f x \ X \ gfp f) \ f (lfp (\x. f x \ X \ gfp f))" apply (rule subset_trans) - apply (erule coinduct3_mono_lemma [THEN lfp_lemma3]) + apply (erule coinduct3_mono_lemma [THEN lfp_unfold [THEN eq_refl]]) apply (rule Un_least [THEN Un_least]) apply (rule subset_refl, assumption) apply (rule gfp_unfold [THEN equalityD1, THEN subset_trans], assumption) diff -r ec0fb01c6d50 -r 95c3ae4baba8 src/HOL/Library/Extended_Nonnegative_Real.thy --- a/src/HOL/Library/Extended_Nonnegative_Real.thy Sat Oct 01 12:03:27 2016 +0200 +++ b/src/HOL/Library/Extended_Nonnegative_Real.thy Sat Oct 01 17:16:35 2016 +0200 @@ -99,7 +99,7 @@ (auto intro!: mono_funpow sup_continuous_mono[OF f] SUP_least) show "lfp g \ \ (lfp f)" - by (rule lfp_lowerbound) (simp add: eq[symmetric] lfp_unfold[OF mf, symmetric]) + by (rule lfp_lowerbound) (simp add: eq[symmetric] lfp_fixpoint[OF mf]) qed lemma sup_continuous_applyD: "sup_continuous f \ sup_continuous (\x. f x h)" diff -r ec0fb01c6d50 -r 95c3ae4baba8 src/HOL/Library/Order_Continuity.thy --- a/src/HOL/Library/Order_Continuity.thy Sat Oct 01 12:03:27 2016 +0200 +++ b/src/HOL/Library/Order_Continuity.thy Sat Oct 01 17:16:35 2016 +0200 @@ -123,7 +123,7 @@ case (Suc i) have "(F ^^ Suc i) bot = F ((F ^^ i) bot)" by simp also have "\ \ F (lfp F)" by (rule monoD[OF mono Suc]) - also have "\ = lfp F" by (simp add: lfp_unfold[OF mono, symmetric]) + also have "\ = lfp F" by (simp add: lfp_fixpoint[OF mono]) finally show ?case . qed simp qed @@ -287,7 +287,7 @@ fix i show "gfp F \ (F ^^ i) top" proof (induct i) case (Suc i) - have "gfp F = F (gfp F)" by (simp add: gfp_unfold[OF mono, symmetric]) + have "gfp F = F (gfp F)" by (simp add: gfp_fixpoint[OF mono]) also have "\ \ F ((F ^^ i) top)" by (rule monoD[OF mono Suc]) also have "\ = (F ^^ Suc i) top" by simp finally show ?case . diff -r ec0fb01c6d50 -r 95c3ae4baba8 src/HOL/Nat.thy --- a/src/HOL/Nat.thy Sat Oct 01 12:03:27 2016 +0200 +++ b/src/HOL/Nat.thy Sat Oct 01 17:16:35 2016 +0200 @@ -1554,7 +1554,7 @@ by (simp add: comp_def) qed have "(f ^^ n) (lfp f) = lfp f" for n - by (induct n) (auto intro: f lfp_unfold[symmetric]) + by (induct n) (auto intro: f lfp_fixpoint) then show "lfp (f ^^ Suc n) \ lfp f" by (intro lfp_lowerbound) (simp del: funpow.simps) qed @@ -1571,7 +1571,7 @@ by (simp add: comp_def) qed have "(f ^^ n) (gfp f) = gfp f" for n - by (induct n) (auto intro: f gfp_unfold[symmetric]) + by (induct n) (auto intro: f gfp_fixpoint) then show "gfp (f ^^ Suc n) \ gfp f" by (intro gfp_upperbound) (simp del: funpow.simps) qed