(*** Coinduction rules for greatest fixed points ***)
(*weak version*) lemma coinduct: "[a: A; A <= f(A)]==> a : gfp(f)" by (blast dest: gfp_upperbound)
lemma coinduct2_lemma: "[A <= f(A) Un gfp(f); mono(f)]==> A Un gfp(f) <= f(A Un gfp(f))" apply (rule subset_trans) prefer 2 apply (erule mono_Un) apply (rule subst, erule gfp_Tarski) apply (erule Un_least) apply (rule Un_upper2) done
(*strong version, thanks to Martin Coen*) lemma coinduct2: "[a: A; A <= f(A) Un gfp(f); mono(f)]==> a : gfp(f)" apply (rule coinduct) prefer 2 apply (erule coinduct2_lemma, assumption) apply blast done
(*** Even Stronger version of coinduct [by Martin Coen] - instead of the condition A 🚫f(A) consider A <= (f(A) Un f(f(A)) ...) Un gfp(A) ***)
lemma coinduct3_mono_lemma: "mono(f) ==> mono(λx. f(x) Un A Un B)" by (rule monoI) (blast dest: monoD)
lemma coinduct3_lemma: assumes prem: "A <= f(lfp(λx. f(x) Un A Un gfp(f)))" and mono: "mono(f)" shows"lfp(λx. f(x) Un A Un gfp(f)) <= f(lfp(λx. f(x) Un A Un gfp(f)))" apply (rule subset_trans) apply (rule mono [THEN coinduct3_mono_lemma, THEN lfp_lemma3]) apply (rule Un_least [THEN Un_least]) apply (rule subset_refl) apply (rule prem) apply (rule mono [THEN gfp_Tarski, THEN equalityD1, THEN subset_trans]) apply (rule mono [THEN monoD]) apply (subst mono [THEN coinduct3_mono_lemma, THEN lfp_Tarski]) apply (rule Un_upper2) done
lemma coinduct3: assumes 1: "a:A" and 2: "A <= f(lfp(λx. f(x) Un A Un gfp(f)))" and 3: "mono(f)" shows"a : gfp(f)" apply (rule coinduct) prefer 2 apply (rule coinduct3_lemma [OF 2 3]) apply (subst lfp_Tarski [OF coinduct3_mono_lemma, OF 3]) using 1 apply blast done
subsection‹Definition forms of ‹gfp_Tarski›, to control unfolding›
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.