Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quellcode-Bibliothek

© Kompilation durch diese Firma

[Weder Korrektheit noch Funktionsfähigkeit der Software werden zugesichert.]

Datei: product_measure.pvs   Sprache: Isabelle

Original von: Isabelle©

(*  Title:      HOL/Algebra/Complete_Lattice.thy
    Author:     Clemens Ballarin, started 7 November 2003
    Copyright:  Clemens Ballarin

Most congruence rules by Stephan Hohe.
With additional contributions from Alasdair Armstrong and Simon Foster.
*)


theory Complete_Lattice
imports Lattice
begin

section \<open>Complete Lattices\<close>

locale weak_complete_lattice = weak_partial_order +
  assumes sup_exists:
    "[| A \ carrier L |] ==> \s. least L s (Upper L A)"
    and inf_exists:
    "[| A \ carrier L |] ==> \i. greatest L i (Lower L A)"

sublocale weak_complete_lattice \<subseteq> weak_lattice
proof
  fix x y
  assume a: "x \ carrier L" "y \ carrier L"
  thus "\s. is_lub L s {x, y}"
    by (rule_tac sup_exists[of "{x, y}"], auto)
  from a show "\s. is_glb L s {x, y}"
    by (rule_tac inf_exists[of "{x, y}"], auto)
qed

text \<open>Introduction rule: the usual definition of complete lattice\<close>

lemma (in weak_partial_order) weak_complete_latticeI:
  assumes sup_exists:
    "!!A. [| A \ carrier L |] ==> \s. least L s (Upper L A)"
    and inf_exists:
    "!!A. [| A \ carrier L |] ==> \i. greatest L i (Lower L A)"
  shows "weak_complete_lattice L"
  by standard (auto intro: sup_exists inf_exists)

lemma (in weak_complete_lattice) dual_weak_complete_lattice:
  "weak_complete_lattice (inv_gorder L)"
proof -
  interpret dual: weak_lattice "inv_gorder L"
    by (metis dual_weak_lattice)
  show ?thesis
    by (unfold_locales) (simp_all add:inf_exists sup_exists)
qed

lemma (in weak_complete_lattice) supI:
  "[| !!l. least L l (Upper L A) ==> P l; A \ carrier L |]
  ==> P (\<Squnion>A)"
proof (unfold sup_def)
  assume L: "A \ carrier L"
    and P: "!!l. least L l (Upper L A) ==> P l"
  with sup_exists obtain s where "least L s (Upper L A)" by blast
  with L show "P (SOME l. least L l (Upper L A))"
  by (fast intro: someI2 weak_least_unique P)
qed

lemma (in weak_complete_lattice) sup_closed [simp]:
  "A \ carrier L ==> \A \ carrier L"
  by (rule supI) simp_all

lemma (in weak_complete_lattice) sup_cong:
  assumes "A \ carrier L" "B \ carrier L" "A {.=} B"
  shows "\ A .= \ B"
proof -
  have "\ x. is_lub L x A \ is_lub L x B"
    by (rule least_Upper_cong_r, simp_all add: assms)
  moreover have "\ B \ carrier L"
    by (simp add: assms(2))
  ultimately show ?thesis
    by (simp add: sup_def)
qed

sublocale weak_complete_lattice \<subseteq> weak_bounded_lattice
  apply (unfold_locales)
  apply (metis Upper_empty empty_subsetI sup_exists)
  apply (metis Lower_empty empty_subsetI inf_exists)
done

lemma (in weak_complete_lattice) infI:
  "[| !!i. greatest L i (Lower L A) ==> P i; A \ carrier L |]
  ==> P (\<Sqinter>A)"
proof (unfold inf_def)
  assume L: "A \ carrier L"
    and P: "!!l. greatest L l (Lower L A) ==> P l"
  with inf_exists obtain s where "greatest L s (Lower L A)" by blast
  with L show "P (SOME l. greatest L l (Lower L A))"
  by (fast intro: someI2 weak_greatest_unique P)
qed

lemma (in weak_complete_lattice) inf_closed [simp]:
  "A \ carrier L ==> \A \ carrier L"
  by (rule infI) simp_all

lemma (in weak_complete_lattice) inf_cong:
  assumes "A \ carrier L" "B \ carrier L" "A {.=} B"
  shows "\ A .= \ B"
proof -
  have "\ x. is_glb L x A \ is_glb L x B"
    by (rule greatest_Lower_cong_r, simp_all add: assms)
  moreover have "\ B \ carrier L"
    by (simp add: assms(2))
  ultimately show ?thesis
    by (simp add: inf_def)
qed

theorem (in weak_partial_order) weak_complete_lattice_criterion1:
  assumes top_exists: "\g. greatest L g (carrier L)"
    and inf_exists:
      "\A. [| A \ carrier L; A \ {} |] ==> \i. greatest L i (Lower L A)"
  shows "weak_complete_lattice L"
proof (rule weak_complete_latticeI)
  from top_exists obtain top where top: "greatest L top (carrier L)" ..
  fix A
  assume L: "A \ carrier L"
  let ?B = "Upper L A"
  from L top have "top \ ?B" by (fast intro!: Upper_memI intro: greatest_le)
  then have B_non_empty: "?B \ {}" by fast
  have B_L: "?B \ carrier L" by simp
  from inf_exists [OF B_L B_non_empty]
  obtain b where b_inf_B: "greatest L b (Lower L ?B)" ..
  then have bcarr: "b \ carrier L"
    by auto
  have "least L b (Upper L A)"
  proof (rule least_UpperI)
    show "\x. x \ A \ x \ b"
      by (meson L Lower_memI Upper_memD b_inf_B greatest_le subsetD)
    show "\y. y \ Upper L A \ b \ y"
      by (meson B_L b_inf_B greatest_Lower_below)
  qed (use bcarr L in auto)
  then show "\s. least L s (Upper L A)" ..
next
  fix A
  assume L: "A \ carrier L"
  show "\i. greatest L i (Lower L A)"
    by (metis L Lower_empty inf_exists top_exists)
qed


text \<open>Supremum\<close>

declare (in partial_order) weak_sup_of_singleton [simp del]

lemma (in partial_order) sup_of_singleton [simp]:
  "x \ carrier L ==> \{x} = x"
  using weak_sup_of_singleton unfolding eq_is_equal .

lemma (in upper_semilattice) join_assoc_lemma:
  assumes L: "x \ carrier L" "y \ carrier L" "z \ carrier L"
  shows "x \ (y \ z) = \{x, y, z}"
  using weak_join_assoc_lemma L unfolding eq_is_equal .

lemma (in upper_semilattice) join_assoc:
  assumes L: "x \ carrier L" "y \ carrier L" "z \ carrier L"
  shows "(x \ y) \ z = x \ (y \ z)"
  using weak_join_assoc L unfolding eq_is_equal .


text \<open>Infimum\<close>

declare (in partial_order) weak_inf_of_singleton [simp del]

lemma (in partial_order) inf_of_singleton [simp]:
  "x \ carrier L ==> \{x} = x"
  using weak_inf_of_singleton unfolding eq_is_equal .

text \<open>Condition on \<open>A\<close>: infimum exists.\<close>

lemma (in lower_semilattice) meet_assoc_lemma:
  assumes L: "x \ carrier L" "y \ carrier L" "z \ carrier L"
  shows "x \ (y \ z) = \{x, y, z}"
  using weak_meet_assoc_lemma L unfolding eq_is_equal .

lemma (in lower_semilattice) meet_assoc:
  assumes L: "x \ carrier L" "y \ carrier L" "z \ carrier L"
  shows "(x \ y) \ z = x \ (y \ z)"
  using weak_meet_assoc L unfolding eq_is_equal .


subsection \<open>Infimum Laws\<close>

context weak_complete_lattice
begin

lemma inf_glb: 
  assumes "A \ carrier L"
  shows "greatest L (\A) (Lower L A)"
proof -
  obtain i where "greatest L i (Lower L A)"
    by (metis assms inf_exists)
  thus ?thesis
    by (metis inf_def someI_ex)
qed

lemma inf_lower:
  assumes "A \ carrier L" "x \ A"
  shows "\A \ x"
  by (metis assms greatest_Lower_below inf_glb)

lemma inf_greatest: 
  assumes "A \ carrier L" "z \ carrier L"
          "(\x. x \ A \ z \ x)"
  shows "z \ \A"
  by (metis Lower_memI assms greatest_le inf_glb)

lemma weak_inf_empty [simp]: "\{} .= \"
  by (metis Lower_empty empty_subsetI inf_glb top_greatest weak_greatest_unique)

lemma weak_inf_carrier [simp]: "\carrier L .= \"
  by (metis bottom_weak_eq inf_closed inf_lower subset_refl)

lemma weak_inf_insert [simp]: 
  assumes "a \ carrier L" "A \ carrier L"
  shows "\insert a A .= a \ \A"
proof (rule weak_le_antisym)
  show "\insert a A \ a \ \A"
    by (simp add: assms inf_lower local.inf_greatest meet_le)
  show aA: "a \ \A \ carrier L"
    using assms by simp
  show "a \ \A \ \insert a A"
    apply (rule inf_greatest)
    using assms apply (simp_all add: aA)
    by (meson aA inf_closed inf_lower local.le_trans meet_left meet_right subsetCE)
  show "\insert a A \ carrier L"
    using assms by (force intro: le_trans inf_closed meet_right meet_left inf_lower)
qed

subsection \<open>Supremum Laws\<close>

lemma sup_lub: 
  assumes "A \ carrier L"
  shows "least L (\A) (Upper L A)"
    by (metis Upper_is_closed assms least_closed least_cong supI sup_closed sup_exists weak_least_unique)

lemma sup_upper: 
  assumes "A \ carrier L" "x \ A"
  shows "x \ \A"
  by (metis assms least_Upper_above supI)

lemma sup_least:
  assumes "A \ carrier L" "z \ carrier L"
          "(\x. x \ A \ x \ z)"
  shows "\A \ z"
  by (metis Upper_memI assms least_le sup_lub)

lemma weak_sup_empty [simp]: "\{} .= \"
  by (metis Upper_empty bottom_least empty_subsetI sup_lub weak_least_unique)

lemma weak_sup_carrier [simp]: "\carrier L .= \"
  by (metis Lower_closed Lower_empty sup_closed sup_upper top_closed top_higher weak_le_antisym)

lemma weak_sup_insert [simp]: 
  assumes "a \ carrier L" "A \ carrier L"
  shows "\insert a A .= a \ \A"
proof (rule weak_le_antisym)
  show aA: "a \ \A \ carrier L"
    using assms by simp
  show "\insert a A \ a \ \A"
    apply (rule sup_least)
    using assms apply (simp_all add: aA)
    by (meson aA join_left join_right local.le_trans subsetCE sup_closed sup_upper)
  show "a \ \A \ \insert a A"
    by (simp add: assms join_le local.sup_least sup_upper)
  show "\insert a A \ carrier L"
    using assms by (force intro: le_trans inf_closed meet_right meet_left inf_lower)
qed

end


subsection \<open>Fixed points of a lattice\<close>

definition "fps L f = {x \ carrier L. f x .=\<^bsub>L\<^esub> x}"

abbreviation "fpl L f \ L\carrier := fps L f\"

lemma (in weak_partial_order) 
  use_fps: "x \ fps L f \ f x .= x"
  by (simp add: fps_def)

lemma fps_carrier [simp]:
  "fps L f \ carrier L"
  by (auto simp add: fps_def)

lemma (in weak_complete_lattice) fps_sup_image: 
  assumes "f \ carrier L \ carrier L" "A \ fps L f"
  shows "\ (f ` A) .= \ A"
proof -
  from assms(2) have AL: "A \ carrier L"
    by (auto simp add: fps_def)
  show ?thesis
  proof (rule sup_cong, simp_all add: AL)
    from assms(1) AL show "f ` A \ carrier L"
      by auto
    then have *: "\b. \A \ {x \ carrier L. f x .= x}; b \ A\ \ \a\f ` A. b .= a"
      by (meson AL assms(2) image_eqI local.sym subsetCE use_fps)
    from assms(2) show "f ` A {.=} A"
      by (auto simp add: fps_def intro: set_eqI2 [OF _ *])
  qed
qed

lemma (in weak_complete_lattice) fps_idem:
  assumes "f \ carrier L \ carrier L" "Idem f"
  shows "fps L f {.=} f ` carrier L"
proof (rule set_eqI2)
  show "\a. a \ fps L f \ \b\f ` carrier L. a .= b"
    using assms by (force simp add: fps_def intro: local.sym)
  show "\b. b \ f ` carrier L \ \a\fps L f. b .= a"
    using assms by (force simp add: idempotent_def fps_def)
qed

context weak_complete_lattice
begin

lemma weak_sup_pre_fixed_point: 
  assumes "f \ carrier L \ carrier L" "isotone L L f" "A \ fps L f"
  shows "(\\<^bsub>L\<^esub> A) \\<^bsub>L\<^esub> f (\\<^bsub>L\<^esub> A)"
proof (rule sup_least)
  from assms(3) show AL: "A \ carrier L"
    by (auto simp add: fps_def)
  thus fA: "f (\A) \ carrier L"
    by (simp add: assms funcset_carrier[of f L L])
  fix x
  assume xA: "x \ A"
  hence "x \ fps L f"
    using assms subsetCE by blast
  hence "f x .=\<^bsub>L\<^esub> x"
    by (auto simp add: fps_def)
  moreover have "f x \\<^bsub>L\<^esub> f (\\<^bsub>L\<^esub>A)"
    by (meson AL assms(2) subsetCE sup_closed sup_upper use_iso1 xA)
  ultimately show "x \\<^bsub>L\<^esub> f (\\<^bsub>L\<^esub>A)"
    by (meson AL fA assms(1) funcset_carrier le_cong local.refl subsetCE xA)
qed

lemma weak_sup_post_fixed_point: 
  assumes "f \ carrier L \ carrier L" "isotone L L f" "A \ fps L f"
  shows "f (\\<^bsub>L\<^esub> A) \\<^bsub>L\<^esub> (\\<^bsub>L\<^esub> A)"
proof (rule inf_greatest)
  from assms(3) show AL: "A \ carrier L"
    by (auto simp add: fps_def)
  thus fA: "f (\A) \ carrier L"
    by (simp add: assms funcset_carrier[of f L L])
  fix x
  assume xA: "x \ A"
  hence "x \ fps L f"
    using assms subsetCE by blast
  hence "f x .=\<^bsub>L\<^esub> x"
    by (auto simp add: fps_def)
  moreover have "f (\\<^bsub>L\<^esub>A) \\<^bsub>L\<^esub> f x"
    by (meson AL assms(2) inf_closed inf_lower subsetCE use_iso1 xA)   
  ultimately show "f (\\<^bsub>L\<^esub>A) \\<^bsub>L\<^esub> x"
    by (meson AL assms(1) fA funcset_carrier le_cong_r subsetCE xA)
qed


subsubsection \<open>Least fixed points\<close>

lemma LFP_closed [intro, simp]:
  "LFP f \ carrier L"
  by (metis (lifting) LEAST_FP_def inf_closed mem_Collect_eq subsetI)

lemma LFP_lowerbound: 
  assumes "x \ carrier L" "f x \ x"
  shows "LFP f \ x"
  by (auto intro:inf_lower assms simp add:LEAST_FP_def)

lemma LFP_greatest: 
  assumes "x \ carrier L"
          "(\u. \ u \ carrier L; f u \ u \ \ x \ u)"
  shows "x \ LFP f"
  by (auto simp add:LEAST_FP_def intro:inf_greatest assms)

lemma LFP_lemma2: 
  assumes "Mono f" "f \ carrier L \ carrier L"
  shows "f (LFP f) \ LFP f"
proof (rule LFP_greatest)
  have f: "\x. x \ carrier L \ f x \ carrier L"
    using assms by (auto simp add: Pi_def)
  with assms show "f (LFP f) \ carrier L"
    by blast
  show "\u. \u \ carrier L; f u \ u\ \ f (LFP f) \ u"
    by (meson LFP_closed LFP_lowerbound assms(1) f local.le_trans use_iso1)
qed

lemma LFP_lemma3: 
  assumes "Mono f" "f \ carrier L \ carrier L"
  shows "LFP f \ f (LFP f)"
  using assms by (simp add: Pi_def) (metis LFP_closed LFP_lemma2 LFP_lowerbound assms(2) use_iso2)

lemma LFP_weak_unfold: 
  "\ Mono f; f \ carrier L \ carrier L \ \ LFP f .= f (LFP f)"
  by (auto intro: LFP_lemma2 LFP_lemma3 funcset_mem)

lemma LFP_fixed_point [intro]:
  assumes "Mono f" "f \ carrier L \ carrier L"
  shows "LFP f \ fps L f"
proof -
  have "f (LFP f) \ carrier L"
    using assms(2) by blast
  with assms show ?thesis
    by (simp add: LFP_weak_unfold fps_def local.sym)
qed

lemma LFP_least_fixed_point:
  assumes "Mono f" "f \ carrier L \ carrier L" "x \ fps L f"
  shows "LFP f \ x"
  using assms by (force intro: LFP_lowerbound simp add: fps_def)
  
lemma LFP_idem: 
  assumes "f \ carrier L \ carrier L" "Mono f" "Idem f"
  shows "LFP f .= (f \)"
proof (rule weak_le_antisym)
  from assms(1) show fb: "f \ \ carrier L"
    by (rule funcset_mem, simp)
  from assms show mf: "LFP f \ carrier L"
    by blast
  show "LFP f \ f \"
  proof -
    have "f (f \) .= f \"
      by (auto simp add: fps_def fb assms(3) idempotent)
    moreover have "f (f \) \ carrier L"
      by (rule funcset_mem[of f "carrier L"], simp_all add: assms fb)
    ultimately show ?thesis
      by (auto intro: LFP_lowerbound simp add: fb)
  qed
  show "f \ \ LFP f"
  proof -
    have "f \ \ f (LFP f)"
      by (auto intro: use_iso1[of _ f] simp add: assms)
    moreover have "... .= LFP f"
      using assms(1) assms(2) fps_def by force
    moreover from assms(1) have "f (LFP f) \ carrier L"
      by (auto)
    ultimately show ?thesis
      using fb by blast
  qed
qed


subsubsection \<open>Greatest fixed points\<close>
  
lemma GFP_closed [intro, simp]:
  "GFP f \ carrier L"
  by (auto intro:sup_closed simp add:GREATEST_FP_def)
  
lemma GFP_upperbound:
  assumes "x \ carrier L" "x \ f x"
  shows "x \ GFP f"
  by (auto intro:sup_upper assms simp add:GREATEST_FP_def)

lemma GFP_least: 
  assumes "x \ carrier L"
          "(\u. \ u \ carrier L; u \ f u \ \ u \ x)"
  shows "GFP f \ x"
  by (auto simp add:GREATEST_FP_def intro:sup_least assms)

lemma GFP_lemma2:
  assumes "Mono f" "f \ carrier L \ carrier L"
  shows "GFP f \ f (GFP f)"
proof (rule GFP_least)
  have f: "\x. x \ carrier L \ f x \ carrier L"
    using assms by (auto simp add: Pi_def)
  with assms show "f (GFP f) \ carrier L"
    by blast
  show "\u. \u \ carrier L; u \ f u\ \ u \ f (GFP f)"
    by (meson GFP_closed GFP_upperbound le_trans assms(1) f local.le_trans use_iso1)
qed

lemma GFP_lemma3:
  assumes "Mono f" "f \ carrier L \ carrier L"
  shows "f (GFP f) \ GFP f"
  by (metis GFP_closed GFP_lemma2 GFP_upperbound assms funcset_mem use_iso2)
  
lemma GFP_weak_unfold: 
  "\ Mono f; f \ carrier L \ carrier L \ \ GFP f .= f (GFP f)"
  by (auto intro: GFP_lemma2 GFP_lemma3 funcset_mem)

lemma (in weak_complete_lattice) GFP_fixed_point [intro]:
  assumes "Mono f" "f \ carrier L \ carrier L"
  shows "GFP f \ fps L f"
  using assms
proof -
  have "f (GFP f) \ carrier L"
    using assms(2) by blast
  with assms show ?thesis
    by (simp add: GFP_weak_unfold fps_def local.sym)
qed

lemma GFP_greatest_fixed_point:
  assumes "Mono f" "f \ carrier L \ carrier L" "x \ fps L f"
  shows "x \ GFP f"
  using assms 
  by (rule_tac GFP_upperbound, auto simp add: fps_def, meson PiE local.sym weak_refl)
    
lemma GFP_idem: 
  assumes "f \ carrier L \ carrier L" "Mono f" "Idem f"
  shows "GFP f .= (f \)"
proof (rule weak_le_antisym)
  from assms(1) show fb: "f \ \ carrier L"
    by (rule funcset_mem, simp)
  from assms show mf: "GFP f \ carrier L"
    by blast
  show "f \ \ GFP f"
  proof -
    have "f (f \) .= f \"
      by (auto simp add: fps_def fb assms(3) idempotent)
    moreover have "f (f \) \ carrier L"
      by (rule funcset_mem[of f "carrier L"], simp_all add: assms fb)
    ultimately show ?thesis
      by (rule_tac GFP_upperbound, simp_all add: fb local.sym)
  qed
  show "GFP f \ f \"
  proof -
    have "GFP f \ f (GFP f)"
      by (simp add: GFP_lemma2 assms(1) assms(2))
    moreover have "... \ f \"
      by (auto intro: use_iso1[of _ f] simp add: assms)
    moreover from assms(1) have "f (GFP f) \ carrier L"
      by (auto)
    ultimately show ?thesis
      using fb local.le_trans by blast
  qed
qed

end


subsection \<open>Complete lattices where \<open>eq\<close> is the Equality\<close>

locale complete_lattice = partial_order +
  assumes sup_exists:
    "[| A \ carrier L |] ==> \s. least L s (Upper L A)"
    and inf_exists:
    "[| A \ carrier L |] ==> \i. greatest L i (Lower L A)"

sublocale complete_lattice \<subseteq> lattice
proof
  fix x y
  assume a: "x \ carrier L" "y \ carrier L"
  thus "\s. is_lub L s {x, y}"
    by (rule_tac sup_exists[of "{x, y}"], auto)
  from a show "\s. is_glb L s {x, y}"
    by (rule_tac inf_exists[of "{x, y}"], auto)
qed

sublocale complete_lattice \<subseteq> weak?: weak_complete_lattice
  by standard (auto intro: sup_exists inf_exists)

lemma complete_lattice_lattice [simp]: 
  assumes "complete_lattice X"
  shows "lattice X"
proof -
  interpret c: complete_lattice X
    by (simp add: assms)
  show ?thesis
    by (unfold_locales)
qed

text \<open>Introduction rule: the usual definition of complete lattice\<close>

lemma (in partial_order) complete_latticeI:
  assumes sup_exists:
    "!!A. [| A \ carrier L |] ==> \s. least L s (Upper L A)"
    and inf_exists:
    "!!A. [| A \ carrier L |] ==> \i. greatest L i (Lower L A)"
  shows "complete_lattice L"
  by standard (auto intro: sup_exists inf_exists)

theorem (in partial_order) complete_lattice_criterion1:
  assumes top_exists: "\g. greatest L g (carrier L)"
    and inf_exists:
      "!!A. [| A \ carrier L; A \ {} |] ==> \i. greatest L i (Lower L A)"
  shows "complete_lattice L"
proof (rule complete_latticeI)
  from top_exists obtain top where top: "greatest L top (carrier L)" ..
  fix A
  assume L: "A \ carrier L"
  let ?B = "Upper L A"
  from L top have "top \ ?B" by (fast intro!: Upper_memI intro: greatest_le)
  then have B_non_empty: "?B \ {}" by fast
  have B_L: "?B \ carrier L" by simp
  from inf_exists [OF B_L B_non_empty]
  obtain b where b_inf_B: "greatest L b (Lower L ?B)" ..
  then have bcarr: "b \ carrier L"
    by blast
  have "least L b (Upper L A)"
  proof (rule least_UpperI)
    show "\x. x \ A \ x \ b"
      by (meson L Lower_memI Upper_memD b_inf_B greatest_le rev_subsetD)
    show "\y. y \ Upper L A \ b \ y"
      by (auto elim: greatest_Lower_below [OF b_inf_B])
  qed (use L bcarr in auto)
  then show "\s. least L s (Upper L A)" ..
next
  fix A
  assume L: "A \ carrier L"
  show "\i. greatest L i (Lower L A)"
  proof (cases "A = {}")
    case True then show ?thesis
      by (simp add: top_exists)
  next
    case False with L show ?thesis
      by (rule inf_exists)
  qed
qed

(* TODO: prove dual version *)

subsection \<open>Fixed points\<close>

context complete_lattice
begin

lemma LFP_unfold: 
  "\ Mono f; f \ carrier L \ carrier L \ \ LFP f = f (LFP f)"
  using eq_is_equal weak.LFP_weak_unfold by auto

lemma LFP_const:
  "t \ carrier L \ LFP (\ x. t) = t"
  by (simp add: local.le_antisym weak.LFP_greatest weak.LFP_lowerbound)

lemma LFP_id:
  "LFP id = \"
  by (simp add: local.le_antisym weak.LFP_lowerbound)

lemma GFP_unfold:
  "\ Mono f; f \ carrier L \ carrier L \ \ GFP f = f (GFP f)"
  using eq_is_equal weak.GFP_weak_unfold by auto

lemma GFP_const:
  "t \ carrier L \ GFP (\ x. t) = t"
  by (simp add: local.le_antisym weak.GFP_least weak.GFP_upperbound)

lemma GFP_id:
  "GFP id = \"
  using weak.GFP_upperbound by auto

end


subsection \<open>Interval complete lattices\<close>
  
context weak_complete_lattice
begin

  lemma at_least_at_most_Sup: "\ a \ carrier L; b \ carrier L; a \ b \ \ \ \a..b\ .= b"
    by (rule weak_le_antisym [OF sup_least sup_upper]) (auto simp add: at_least_at_most_closed)

  lemma at_least_at_most_Inf: "\ a \ carrier L; b \ carrier L; a \ b \ \ \ \a..b\ .= a"
    by (rule weak_le_antisym [OF inf_lower inf_greatest]) (auto simp add: at_least_at_most_closed)

end

lemma weak_complete_lattice_interval:
  assumes "weak_complete_lattice L" "a \ carrier L" "b \ carrier L" "a \\<^bsub>L\<^esub> b"
  shows "weak_complete_lattice (L \ carrier := \a..b\\<^bsub>L\<^esub> \)"
proof -
  interpret L: weak_complete_lattice L
    by (simp add: assms)
  interpret weak_partial_order "L \ carrier := \a..b\\<^bsub>L\<^esub> \"
  proof -
    have "\a..b\\<^bsub>L\<^esub> \ carrier L"
      by (auto simp add: at_least_at_most_def)
    thus "weak_partial_order (L\carrier := \a..b\\<^bsub>L\<^esub>\)"
      by (simp add: L.weak_partial_order_axioms weak_partial_order_subset)
  qed

  show ?thesis
  proof
    fix A
    assume a: "A \ carrier (L\carrier := \a..b\\<^bsub>L\<^esub>\)"
    show "\s. is_lub (L\carrier := \a..b\\<^bsub>L\<^esub>\) s A"
    proof (cases "A = {}")
      case True
      thus ?thesis
        by (rule_tac x="a" in exI, auto simp add: least_def assms)
    next
      case False
      show ?thesis
      proof (intro exI least_UpperI, simp_all)
        show b:"\ x. x \ A \ x \\<^bsub>L\<^esub> \\<^bsub>L\<^esub>A"
          using a by (auto intro: L.sup_upper, meson L.at_least_at_most_closed L.sup_upper subset_trans)
        show "\y. y \ Upper (L\carrier := \a..b\\<^bsub>L\<^esub>\) A \ \\<^bsub>L\<^esub>A \\<^bsub>L\<^esub> y"
          using a L.at_least_at_most_closed by (rule_tac L.sup_least, auto intro: funcset_mem simp add: Upper_def)
        from a show *: "A \ \a..b\\<^bsub>L\<^esub>"
          by auto
        show "\\<^bsub>L\<^esub>A \ \a..b\\<^bsub>L\<^esub>"
        proof (rule_tac L.at_least_at_most_member)
          show 1: "\\<^bsub>L\<^esub>A \ carrier L"
            by (meson L.at_least_at_most_closed L.sup_closed subset_trans *)
          show "a \\<^bsub>L\<^esub> \\<^bsub>L\<^esub>A"
            by (meson "*" False L.at_least_at_most_closed L.at_least_at_most_lower L.le_trans L.sup_upper 1 all_not_in_conv assms(2) subsetD subset_trans)
          show "\\<^bsub>L\<^esub>A \\<^bsub>L\<^esub> b"
          proof (rule L.sup_least)
            show "A \ carrier L" "\x. x \ A \ x \\<^bsub>L\<^esub> b"
              using * L.at_least_at_most_closed by blast+
          qed (simp add: assms)
        qed
      qed
    qed
    show "\s. is_glb (L\carrier := \a..b\\<^bsub>L\<^esub>\) s A"
    proof (cases "A = {}")
      case True
      thus ?thesis
        by (rule_tac x="b" in exI, auto simp add: greatest_def assms)
    next
      case False
      show ?thesis
      proof (rule_tac x="\\<^bsub>L\<^esub> A" in exI, rule greatest_LowerI, simp_all)
        show b:"\x. x \ A \ \\<^bsub>L\<^esub>A \\<^bsub>L\<^esub> x"
          using a L.at_least_at_most_closed by (force intro!: L.inf_lower)
        show "\y. y \ Lower (L\carrier := \a..b\\<^bsub>L\<^esub>\) A \ y \\<^bsub>L\<^esub> \\<^bsub>L\<^esub>A"
           using a L.at_least_at_most_closed by (rule_tac L.inf_greatest, auto intro: funcset_carrier' simp add: Lower_def)
        from a show *: "A \ \a..b\\<^bsub>L\<^esub>"
          by auto
        show "\\<^bsub>L\<^esub>A \ \a..b\\<^bsub>L\<^esub>"
        proof (rule_tac L.at_least_at_most_member)
          show 1: "\\<^bsub>L\<^esub>A \ carrier L"
            by (meson "*" L.at_least_at_most_closed L.inf_closed subset_trans)
          show "a \\<^bsub>L\<^esub> \\<^bsub>L\<^esub>A"
            by (meson "*" L.at_least_at_most_closed L.at_least_at_most_lower L.inf_greatest assms(2) subsetD subset_trans)
          show "\\<^bsub>L\<^esub>A \\<^bsub>L\<^esub> b"
            by (meson * 1 False L.at_least_at_most_closed L.at_least_at_most_upper L.inf_lower L.le_trans all_not_in_conv assms(3) subsetD subset_trans)
        qed
      qed
    qed
  qed
qed


subsection \<open>Knaster-Tarski theorem and variants\<close>
  
text \<open>The set of fixed points of a complete lattice is itself a complete lattice\<close>

theorem Knaster_Tarski:
  assumes "weak_complete_lattice L" and f: "f \ carrier L \ carrier L" and "isotone L L f"
  shows "weak_complete_lattice (fpl L f)" (is "weak_complete_lattice ?L'")
proof -
  interpret L: weak_complete_lattice L
    by (simp add: assms)
  interpret weak_partial_order ?L'
  proof -
    have "{x \ carrier L. f x .=\<^bsub>L\<^esub> x} \ carrier L"
      by (auto)
    thus "weak_partial_order ?L'"
      by (simp add: L.weak_partial_order_axioms weak_partial_order_subset)
  qed
  show ?thesis
  proof (unfold_locales, simp_all)
    fix A
    assume A: "A \ fps L f"
    show "\s. is_lub (fpl L f) s A"
    proof
      from A have AL: "A \ carrier L"
        by (meson fps_carrier subset_eq)

      let ?w = "\\<^bsub>L\<^esub> A"
      have w: "f (\\<^bsub>L\<^esub>A) \ carrier L"
        by (rule funcset_mem[of f "carrier L"], simp_all add: AL assms(2))

      have pf_w: "(\\<^bsub>L\<^esub> A) \\<^bsub>L\<^esub> f (\\<^bsub>L\<^esub> A)"
        by (simp add: A L.weak_sup_pre_fixed_point assms(2) assms(3))

      have f_top_chain: "f ` \?w..\\<^bsub>L\<^esub>\\<^bsub>L\<^esub> \ \?w..\\<^bsub>L\<^esub>\\<^bsub>L\<^esub>"
      proof (auto simp add: at_least_at_most_def)
        fix x
        assume b: "x \ carrier L" "\\<^bsub>L\<^esub>A \\<^bsub>L\<^esub> x"
        from b show fx: "f x \ carrier L"
          using assms(2) by blast
        show "\\<^bsub>L\<^esub>A \\<^bsub>L\<^esub> f x"
        proof -
          have "?w \\<^bsub>L\<^esub> f ?w"
          proof (rule_tac L.sup_least, simp_all add: AL w)
            fix y
            assume c: "y \ A"
            hence y: "y \ fps L f"
              using A subsetCE by blast
            with assms have "y .=\<^bsub>L\<^esub> f y"
            proof -
              from y have "y \ carrier L"
                by (simp add: fps_def)
              moreover hence "f y \ carrier L"
                by (rule_tac funcset_mem[of f "carrier L"], simp_all add: assms)
              ultimately show ?thesis using y
                by (rule_tac L.sym, simp_all add: L.use_fps)
            qed              
            moreover have "y \\<^bsub>L\<^esub> \\<^bsub>L\<^esub>A"
              by (simp add: AL L.sup_upper c(1))
            ultimately show "y \\<^bsub>L\<^esub> f (\\<^bsub>L\<^esub>A)"
              by (meson fps_def AL funcset_mem L.refl L.weak_complete_lattice_axioms assms(2) assms(3) c(1) isotone_def rev_subsetD weak_complete_lattice.sup_closed weak_partial_order.le_cong)
          qed
          thus ?thesis
            by (meson AL funcset_mem L.le_trans L.sup_closed assms(2) assms(3) b(1) b(2) use_iso2)
        qed
   
        show "f x \\<^bsub>L\<^esub> \\<^bsub>L\<^esub>"
          by (simp add: fx)
      qed
  
      let ?L' = "L\ carrier := \?w..\\<^bsub>L\<^esub>\\<^bsub>L\<^esub> \"

      interpret L': weak_complete_lattice ?L'
        by (auto intro: weak_complete_lattice_interval simp add: L.weak_complete_lattice_axioms AL)

      let ?L'' = "L\ carrier := fps L f \"

      show "is_lub ?L'' (LFP\<^bsub>?L'\<^esub> f) A"
      proof (rule least_UpperI, simp_all)
        fix x
        assume x: "x \ Upper ?L'' A"
        have "LFP\<^bsub>?L'\<^esub> f \\<^bsub>?L'\<^esub> x"
        proof (rule L'.LFP_lowerbound, simp_all)
          show "x \ \\\<^bsub>L\<^esub>A..\\<^bsub>L\<^esub>\\<^bsub>L\<^esub>"
            using x by (auto simp add: Upper_def A AL L.at_least_at_most_member L.sup_least rev_subsetD)    
          with x show "f x \\<^bsub>L\<^esub> x"
            by (simp add: Upper_def) (meson L.at_least_at_most_closed L.use_fps L.weak_refl subsetD f_top_chain imageI)
        qed
        thus " LFP\<^bsub>?L'\<^esub> f \\<^bsub>L\<^esub> x"
          by (simp)
      next
        fix x
        assume xA: "x \ A"
        show "x \\<^bsub>L\<^esub> LFP\<^bsub>?L'\<^esub> f"
        proof -
          have "LFP\<^bsub>?L'\<^esub> f \ carrier ?L'"
            by blast
          thus ?thesis
            by (simp, meson AL L.at_least_at_most_closed L.at_least_at_most_lower L.le_trans L.sup_closed L.sup_upper xA subsetCE)
        qed
      next
        show "A \ fps L f"
          by (simp add: A)
      next
        show "LFP\<^bsub>?L'\<^esub> f \ fps L f"
        proof (auto simp add: fps_def)
          have "LFP\<^bsub>?L'\<^esub> f \ carrier ?L'"
            by (rule L'.LFP_closed)
          thus c:"LFP\<^bsub>?L'\<^esub> f \ carrier L"
             by (auto simp add: at_least_at_most_def)
          have "LFP\<^bsub>?L'\<^esub> f .=\<^bsub>?L'\<^esub> f (LFP\<^bsub>?L'\<^esub> f)"
          proof (rule "L'.LFP_weak_unfold", simp_all)
            have "\x. \x \ carrier L; \\<^bsub>L\<^esub>A \\<^bsub>L\<^esub> x\ \ \\<^bsub>L\<^esub>A \\<^bsub>L\<^esub> f x"
              by (meson AL funcset_mem L.le_trans L.sup_closed assms(2) assms(3) pf_w use_iso2)
            with f show "f \ \\\<^bsub>L\<^esub>A..\\<^bsub>L\<^esub>\\<^bsub>L\<^esub> \ \\\<^bsub>L\<^esub>A..\\<^bsub>L\<^esub>\\<^bsub>L\<^esub>"
              by (auto simp add: Pi_def at_least_at_most_def)
            show "Mono\<^bsub>L\carrier := \\\<^bsub>L\<^esub>A..\\<^bsub>L\<^esub>\\<^bsub>L\<^esub>\\<^esub> f"
              using L'.weak_partial_order_axioms assms(3)
              by (auto simp add: isotone_def) (meson L.at_least_at_most_closed subsetCE)
          qed
          thus "f (LFP\<^bsub>?L'\<^esub> f) .=\<^bsub>L\<^esub> LFP\<^bsub>?L'\<^esub> f"
            by (simp add: L.equivalence_axioms funcset_carrier' c assms(2) equivalence.sym)
        qed
      qed
    qed
    show "\i. is_glb (L\carrier := fps L f\) i A"
    proof
      from A have AL: "A \ carrier L"
        by (meson fps_carrier subset_eq)

      let ?w = "\\<^bsub>L\<^esub> A"
      have w: "f (\\<^bsub>L\<^esub>A) \ carrier L"
        by (simp add: AL funcset_carrier' assms(2))

      have pf_w: "f (\\<^bsub>L\<^esub> A) \\<^bsub>L\<^esub> (\\<^bsub>L\<^esub> A)"
        by (simp add: A L.weak_sup_post_fixed_point assms(2) assms(3))

      have f_bot_chain: "f ` \\\<^bsub>L\<^esub>..?w\\<^bsub>L\<^esub> \ \\\<^bsub>L\<^esub>..?w\\<^bsub>L\<^esub>"
      proof (auto simp add: at_least_at_most_def)
        fix x
        assume b: "x \ carrier L" "x \\<^bsub>L\<^esub> \\<^bsub>L\<^esub>A"
        from b show fx: "f x \ carrier L"
          using assms(2) by blast
        show "f x \\<^bsub>L\<^esub> \\<^bsub>L\<^esub>A"
        proof -
          have "f ?w \\<^bsub>L\<^esub> ?w"
          proof (rule_tac L.inf_greatest, simp_all add: AL w)
            fix y
            assume c: "y \ A"
            with assms have "y .=\<^bsub>L\<^esub> f y"
              by (metis (no_types, lifting) A funcset_carrier'[OF assms(2)] L.sym fps_def mem_Collect_eq subset_eq)
            moreover have "\\<^bsub>L\<^esub>A \\<^bsub>L\<^esub> y"
              by (simp add: AL L.inf_lower c)
            ultimately show "f (\\<^bsub>L\<^esub>A) \\<^bsub>L\<^esub> y"
              by (meson AL L.inf_closed L.le_trans c pf_w rev_subsetD w)
          qed
          thus ?thesis
            by (meson AL L.inf_closed L.le_trans assms(3) b(1) b(2) fx use_iso2 w)
        qed
        show "\\<^bsub>L\<^esub> \\<^bsub>L\<^esub> f x"
          by (simp add: fx)
      qed
  
      let ?L' = "L\ carrier := \\\<^bsub>L\<^esub>..?w\\<^bsub>L\<^esub> \"

      interpret L': weak_complete_lattice ?L'
        by (auto intro!: weak_complete_lattice_interval simp add: L.weak_complete_lattice_axioms AL)

      let ?L'' = "L\ carrier := fps L f \"

      show "is_glb ?L'' (GFP\<^bsub>?L'\<^esub> f) A"
      proof (rule greatest_LowerI, simp_all)
        fix x
        assume "x \ Lower ?L'' A"
        then have x: "\y. y \ A \ y \ fps L f \ x \\<^bsub>L\<^esub> y" "x \ fps L f"
          by (auto simp add: Lower_def)
        have "x \\<^bsub>?L'\<^esub> GFP\<^bsub>?L'\<^esub> f"
          unfolding Lower_def
        proof (rule_tac L'.GFP_upperbound; simp)
          show "x \ \\\<^bsub>L\<^esub>..\\<^bsub>L\<^esub>A\\<^bsub>L\<^esub>"
            by (meson x A AL L.at_least_at_most_member L.bottom_lower L.inf_greatest contra_subsetD fps_carrier)
          show "x \\<^bsub>L\<^esub> f x"
            using x by (simp add: funcset_carrier' L.sym assms(2) fps_def)
        qed
        thus "x \\<^bsub>L\<^esub> GFP\<^bsub>?L'\<^esub> f"
          by (simp)
      next
        fix x
        assume xA: "x \ A"
        show "GFP\<^bsub>?L'\<^esub> f \\<^bsub>L\<^esub> x"
        proof -
          have "GFP\<^bsub>?L'\<^esub> f \ carrier ?L'"
            by blast
          thus ?thesis
            by (simp, meson AL L.at_least_at_most_closed L.at_least_at_most_upper L.inf_closed L.inf_lower L.le_trans subsetCE xA)     
        qed
      next
        show "A \ fps L f"
          by (simp add: A)
      next
        show "GFP\<^bsub>?L'\<^esub> f \ fps L f"
        proof (auto simp add: fps_def)
          have "GFP\<^bsub>?L'\<^esub> f \ carrier ?L'"
            by (rule L'.GFP_closed)
          thus c:"GFP\<^bsub>?L'\<^esub> f \ carrier L"
             by (auto simp add: at_least_at_most_def)
          have "GFP\<^bsub>?L'\<^esub> f .=\<^bsub>?L'\<^esub> f (GFP\<^bsub>?L'\<^esub> f)"
          proof (rule "L'.GFP_weak_unfold", simp_all)
            have "\x. \x \ carrier L; x \\<^bsub>L\<^esub> \\<^bsub>L\<^esub>A\ \ f x \\<^bsub>L\<^esub> \\<^bsub>L\<^esub>A"
              by (meson AL funcset_carrier L.inf_closed L.le_trans assms(2) assms(3) pf_w use_iso2)
            with assms(2) show "f \ \\\<^bsub>L\<^esub>..?w\\<^bsub>L\<^esub> \ \\\<^bsub>L\<^esub>..?w\\<^bsub>L\<^esub>"
              by (auto simp add: Pi_def at_least_at_most_def)
            have "\x y. \x \ \\\<^bsub>L\<^esub>..\\<^bsub>L\<^esub>A\\<^bsub>L\<^esub>; y \ \\\<^bsub>L\<^esub>..\\<^bsub>L\<^esub>A\\<^bsub>L\<^esub>; x \\<^bsub>L\<^esub> y\ \ f x \\<^bsub>L\<^esub> f y"
              by (meson L.at_least_at_most_closed subsetD use_iso1  assms(3)) 
            with L'.weak_partial_order_axioms show "Mono\<^bsub>L\carrier := \\\<^bsub>L\<^esub>..?w\\<^bsub>L\<^esub>\\<^esub> f"
              by (auto simp add: isotone_def)
          qed
          thus "f (GFP\<^bsub>?L'\<^esub> f) .=\<^bsub>L\<^esub> GFP\<^bsub>?L'\<^esub> f"
            by (simp add: L.equivalence_axioms funcset_carrier' c assms(2) equivalence.sym)
        qed
      qed
    qed
  qed
qed

theorem Knaster_Tarski_top:
  assumes "weak_complete_lattice L" "isotone L L f" "f \ carrier L \ carrier L"
  shows "\\<^bsub>fpl L f\<^esub> .=\<^bsub>L\<^esub> GFP\<^bsub>L\<^esub> f"
proof -
  interpret L: weak_complete_lattice L
    by (simp add: assms)
  interpret L': weak_complete_lattice "fpl L f"
    by (rule Knaster_Tarski, simp_all add: assms)
  show ?thesis
  proof (rule L.weak_le_antisym, simp_all)
    show "\\<^bsub>fpl L f\<^esub> \\<^bsub>L\<^esub> GFP\<^bsub>L\<^esub> f"
      by (rule L.GFP_greatest_fixed_point, simp_all add: assms L'.top_closed[simplified])
    show "GFP\<^bsub>L\<^esub> f \\<^bsub>L\<^esub> \\<^bsub>fpl L f\<^esub>"
    proof -
      have "GFP\<^bsub>L\<^esub> f \ fps L f"
        by (rule L.GFP_fixed_point, simp_all add: assms)
      hence "GFP\<^bsub>L\<^esub> f \ carrier (fpl L f)"
        by simp
      hence "GFP\<^bsub>L\<^esub> f \\<^bsub>fpl L f\<^esub> \\<^bsub>fpl L f\<^esub>"
        by (rule L'.top_higher)
      thus ?thesis
        by simp
    qed
    show "\\<^bsub>fpl L f\<^esub> \ carrier L"
    proof -
      have "carrier (fpl L f) \ carrier L"
        by (auto simp add: fps_def)
      with L'.top_closed show ?thesis
        by blast
    qed
  qed
qed

theorem Knaster_Tarski_bottom:
  assumes "weak_complete_lattice L" "isotone L L f" "f \ carrier L \ carrier L"
  shows "\\<^bsub>fpl L f\<^esub> .=\<^bsub>L\<^esub> LFP\<^bsub>L\<^esub> f"
proof -
  interpret L: weak_complete_lattice L
    by (simp add: assms)
  interpret L': weak_complete_lattice "fpl L f"
    by (rule Knaster_Tarski, simp_all add: assms)
  show ?thesis
  proof (rule L.weak_le_antisym, simp_all)
    show "LFP\<^bsub>L\<^esub> f \\<^bsub>L\<^esub> \\<^bsub>fpl L f\<^esub>"
      by (rule L.LFP_least_fixed_point, simp_all add: assms L'.bottom_closed[simplified])
    show "\\<^bsub>fpl L f\<^esub> \\<^bsub>L\<^esub> LFP\<^bsub>L\<^esub> f"
    proof -
      have "LFP\<^bsub>L\<^esub> f \ fps L f"
        by (rule L.LFP_fixed_point, simp_all add: assms)
      hence "LFP\<^bsub>L\<^esub> f \ carrier (fpl L f)"
        by simp
      hence "\\<^bsub>fpl L f\<^esub> \\<^bsub>fpl L f\<^esub> LFP\<^bsub>L\<^esub> f"
        by (rule L'.bottom_lower)
      thus ?thesis
        by simp
    qed
    show "\\<^bsub>fpl L f\<^esub> \ carrier L"
    proof -
      have "carrier (fpl L f) \ carrier L"
        by (auto simp add: fps_def)
      with L'.bottom_closed show ?thesis
        by blast
    qed
  qed
qed

text \<open>If a function is both idempotent and isotone then the image of the function forms a complete lattice\<close>
  
theorem Knaster_Tarski_idem:
  assumes "complete_lattice L" "f \ carrier L \ carrier L" "isotone L L f" "idempotent L f"
  shows "complete_lattice (L\carrier := f ` carrier L\)"
proof -
  interpret L: complete_lattice L
    by (simp add: assms)
  have "fps L f = f ` carrier L"
    using L.weak.fps_idem[OF assms(2) assms(4)]
    by (simp add: L.set_eq_is_eq)
  then interpret L': weak_complete_lattice "(L\carrier := f ` carrier L\)"
    by (metis Knaster_Tarski L.weak.weak_complete_lattice_axioms assms(2) assms(3))
  show ?thesis
    using L'.sup_exists L'.inf_exists
    by (unfold_locales, auto simp add: L.eq_is_equal)
qed

theorem Knaster_Tarski_idem_extremes:
  assumes "weak_complete_lattice L" "isotone L L f" "idempotent L f" "f \ carrier L \ carrier L"
  shows "\\<^bsub>fpl L f\<^esub> .=\<^bsub>L\<^esub> f (\\<^bsub>L\<^esub>)" "\\<^bsub>fpl L f\<^esub> .=\<^bsub>L\<^esub> f (\\<^bsub>L\<^esub>)"
proof -
  interpret L: weak_complete_lattice "L"
    by (simp_all add: assms)
  interpret L': weak_complete_lattice "fpl L f"
    by (rule Knaster_Tarski, simp_all add: assms)
  have FA: "fps L f \ carrier L"
    by (auto simp add: fps_def)
  show "\\<^bsub>fpl L f\<^esub> .=\<^bsub>L\<^esub> f (\\<^bsub>L\<^esub>)"
  proof -
    from FA have "\\<^bsub>fpl L f\<^esub> \ carrier L"
    proof -
      have "\\<^bsub>fpl L f\<^esub> \ fps L f"
        using L'.top_closed by auto
      thus ?thesis
        using FA by blast
    qed
    moreover with assms have "f \\<^bsub>L\<^esub> \ carrier L"
      by (auto)

    ultimately show ?thesis
      using L.trans[OF Knaster_Tarski_top[of L f] L.GFP_idem[of f]]
      by (simp_all add: assms)
  qed
  show "\\<^bsub>fpl L f\<^esub> .=\<^bsub>L\<^esub> f (\\<^bsub>L\<^esub>)"
  proof -
    from FA have "\\<^bsub>fpl L f\<^esub> \ carrier L"
    proof -
      have "\\<^bsub>fpl L f\<^esub> \ fps L f"
        using L'.bottom_closed by auto
      thus ?thesis
        using FA by blast
    qed
    moreover with assms have "f \\<^bsub>L\<^esub> \ carrier L"
      by (auto)

    ultimately show ?thesis
      using L.trans[OF Knaster_Tarski_bottom[of L f] L.LFP_idem[of f]]
      by (simp_all add: assms)
  qed
qed

theorem Knaster_Tarski_idem_inf_eq:
  assumes "weak_complete_lattice L" "isotone L L f" "idempotent L f" "f \ carrier L \ carrier L"
          "A \ fps L f"
  shows "\\<^bsub>fpl L f\<^esub> A .=\<^bsub>L\<^esub> f (\\<^bsub>L\<^esub> A)"
proof -
  interpret L: weak_complete_lattice "L"
    by (simp_all add: assms)
  interpret L': weak_complete_lattice "fpl L f"
    by (rule Knaster_Tarski, simp_all add: assms)
  have FA: "fps L f \ carrier L"
    by (auto simp add: fps_def)
  have A: "A \ carrier L"
    using FA assms(5) by blast
  have fA: "f (\\<^bsub>L\<^esub>A) \ fps L f"
    by (metis (no_types, lifting) A L.idempotent L.inf_closed PiE assms(3) assms(4) fps_def mem_Collect_eq)
  have infA: "\\<^bsub>fpl L f\<^esub>A \ fps L f"
    by (rule L'.inf_closed[simplified], simp add: assms)
  show ?thesis
  proof (rule L.weak_le_antisym)
    show ic: "\\<^bsub>fpl L f\<^esub>A \ carrier L"
      using FA infA by blast
    show fc: "f (\\<^bsub>L\<^esub>A) \ carrier L"
      using FA fA by blast
    show "f (\\<^bsub>L\<^esub>A) \\<^bsub>L\<^esub> \\<^bsub>fpl L f\<^esub>A"
    proof -
      have "\x. x \ A \ f (\\<^bsub>L\<^esub>A) \\<^bsub>L\<^esub> x"
        by (meson A FA L.inf_closed L.inf_lower L.le_trans L.weak_sup_post_fixed_point assms(2) assms(4) assms(5) fA subsetCE)
      hence "f (\\<^bsub>L\<^esub>A) \\<^bsub>fpl L f\<^esub> \\<^bsub>fpl L f\<^esub>A"
        by (rule_tac L'.inf_greatest, simp_all add: fA assms(3,5))
      thus ?thesis
        by (simp)
    qed
    show "\\<^bsub>fpl L f\<^esub>A \\<^bsub>L\<^esub> f (\\<^bsub>L\<^esub>A)"
    proof -
      have *: "\\<^bsub>fpl L f\<^esub>A \ carrier L"
        using FA infA by blast
      have "\x. x \ A \ \\<^bsub>fpl L f\<^esub>A \\<^bsub>fpl L f\<^esub> x"
        by (rule L'.inf_lower, simp_all add: assms)
      hence "\\<^bsub>fpl L f\<^esub>A \\<^bsub>L\<^esub> (\\<^bsub>L\<^esub>A)"
        by (rule_tac L.inf_greatest, simp_all add: A *)
      hence 1:"f(\\<^bsub>fpl L f\<^esub>A) \\<^bsub>L\<^esub> f(\\<^bsub>L\<^esub>A)"
        by (metis (no_types, lifting) A FA L.inf_closed assms(2) infA subsetCE use_iso1)
      have 2:"\\<^bsub>fpl L f\<^esub>A \\<^bsub>L\<^esub> f (\\<^bsub>fpl L f\<^esub>A)"
        by (metis (no_types, lifting) FA L.sym L.use_fps L.weak_complete_lattice_axioms PiE assms(4) infA subsetCE weak_complete_lattice_def weak_partial_order.weak_refl)
      show ?thesis  
        using FA fA infA by (auto intro!: L.le_trans[OF 2 1] ic fc, metis FA PiE assms(4) subsetCE)
    qed
  qed
qed  

subsection \<open>Examples\<close>

subsubsection \<open>The Powerset of a Set is a Complete Lattice\<close>

theorem powerset_is_complete_lattice:
  "complete_lattice \carrier = Pow A, eq = (=), le = (\)\"
  (is "complete_lattice ?L")
proof (rule partial_order.complete_latticeI)
  show "partial_order ?L"
    by standard auto
next
  fix B
  assume "B \ carrier ?L"
  then have "least ?L (\ B) (Upper ?L B)"
    by (fastforce intro!: least_UpperI simp: Upper_def)
  then show "\s. least ?L s (Upper ?L B)" ..
next
  fix B
  assume "B \ carrier ?L"
  then have "greatest ?L (\ B \ A) (Lower ?L B)"
    txt \<open>\<^term>\<open>\<Inter> B\<close> is not the infimum of \<^term>\<open>B\<close>:
      \<^term>\<open>\<Inter> {} = UNIV\<close> which is in general bigger than \<^term>\<open>A\<close>! \<close>
    by (fastforce intro!: greatest_LowerI simp: Lower_def)
  then show "\i. greatest ?L i (Lower ?L B)" ..
qed

text \<open>Another example, that of the lattice of subgroups of a group,
  can be found in Group theory (Section~\ref{sec:subgroup-lattice}).\<close>


subsection \<open>Limit preserving functions\<close>

definition weak_sup_pres :: "('a, 'c) gorder_scheme \ ('b, 'd) gorder_scheme \ ('a \ 'b) \ bool" where
"weak_sup_pres X Y f \ complete_lattice X \ complete_lattice Y \ (\ A \ carrier X. A \ {} \ f (\\<^bsub>X\<^esub> A) = (\\<^bsub>Y\<^esub> (f ` A)))"

definition sup_pres :: "('a, 'c) gorder_scheme \ ('b, 'd) gorder_scheme \ ('a \ 'b) \ bool" where
"sup_pres X Y f \ complete_lattice X \ complete_lattice Y \ (\ A \ carrier X. f (\\<^bsub>X\<^esub> A) = (\\<^bsub>Y\<^esub> (f ` A)))"

definition weak_inf_pres :: "('a, 'c) gorder_scheme \ ('b, 'd) gorder_scheme \ ('a \ 'b) \ bool" where
"weak_inf_pres X Y f \ complete_lattice X \ complete_lattice Y \ (\ A \ carrier X. A \ {} \ f (\\<^bsub>X\<^esub> A) = (\\<^bsub>Y\<^esub> (f ` A)))"

definition inf_pres :: "('a, 'c) gorder_scheme \ ('b, 'd) gorder_scheme \ ('a \ 'b) \ bool" where
"inf_pres X Y f \ complete_lattice X \ complete_lattice Y \ (\ A \ carrier X. f (\\<^bsub>X\<^esub> A) = (\\<^bsub>Y\<^esub> (f ` A)))"

lemma weak_sup_pres:
  "sup_pres X Y f \ weak_sup_pres X Y f"
  by (simp add: sup_pres_def weak_sup_pres_def)

lemma weak_inf_pres:
  "inf_pres X Y f \ weak_inf_pres X Y f"
  by (simp add: inf_pres_def weak_inf_pres_def)

lemma sup_pres_is_join_pres:
  assumes "weak_sup_pres X Y f"
  shows "join_pres X Y f"
  using assms by (auto simp: join_pres_def weak_sup_pres_def join_def)

lemma inf_pres_is_meet_pres:
  assumes "weak_inf_pres X Y f"
  shows "meet_pres X Y f"
  using assms by (auto simp: meet_pres_def weak_inf_pres_def meet_def)

end

¤ Dauer der Verarbeitung: 0.50 Sekunden  (vorverarbeitet)  ¤





Download des
Quellennavigators
Download des
sprechenden Kalenders

in der Quellcodebibliothek suchen




Haftungshinweis

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 ist noch experimentell.


Bot Zugriff



                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik