(* Title: HOL/HOLCF/Universal.thy Author: Brian Huffman *)
section‹A universal bifinite domain›
theory Universal imports Bifinite Completion "HOL-Library.Nat_Bijection" begin
unbundle no binomial_syntax
subsection‹Basis for universal domain›
subsubsection ‹Basis datatype›
type_synonym ubasis = nat
definition
node :: "nat ==> ubasis ==> ubasis set ==> ubasis" where "node i a S = Suc (prod_encode (i, prod_encode (a, set_encode S)))"
lemma node_not_0 [simp]: "node i a S ≠ 0" unfolding node_def by simp
lemma node_gt_0 [simp]: "0 < node i a S" unfolding node_def by simp
lemma node_inject [simp]: "[finite S; finite T] ==> node i a S = node j b T ⟷ i = j ∧ a = b ∧ S = T" unfolding node_def by (simp add: prod_encode_eq set_encode_eq)
lemma node_gt0: "i < node i a S" unfolding node_def less_Suc_eq_le by (rule le_prod_encode_1)
lemma node_gt1: "a < node i a S" unfolding node_def less_Suc_eq_le by (rule order_trans [OF le_prod_encode_1 le_prod_encode_2])
lemma nat_less_power2: "n < 2^n" by (fact less_exp)
lemma node_induct: assumes 1: "P 0" assumes 2: "∧i a S. [P a; finite S; ∀b∈S. P b]==> P (node i a S)" shows"P x" apply (induct x rule: nat_less_induct) apply (case_tac n rule: node_cases) apply (simp add: 1) apply (simp add: 2 node_gt1 node_gt2) done
subsubsection ‹Basis ordering›
inductive
ubasis_le :: "nat ==> nat ==> bool" where
ubasis_le_refl: "ubasis_le a a"
| ubasis_le_trans: "[ubasis_le a b; ubasis_le b c]==> ubasis_le a c"
| ubasis_le_lower: "finite S ==> ubasis_le a (node i a S)"
| ubasis_le_upper: "[finite S; b ∈ S; ubasis_le a b]==> ubasis_le (node i a S) b"
function
ubasis_until :: "(ubasis ==> bool) ==> ubasis ==> ubasis" where "ubasis_until P 0 = 0"
| "finite S ==> ubasis_until P (node i a S) = (if P (node i a S) then node i a S else ubasis_until P a)" apply clarify apply (rule_tac x=b in node_cases) apply simp_all done
lemma ubasis_until: "P 0 ==> P (ubasis_until P x)" by (induct x rule: node_induct) simp_all
lemma ubasis_until': "0 < ubasis_until P x ==> P (ubasis_until P x)" by (induct x rule: node_induct) auto
lemma ubasis_until_same: "P x ==> ubasis_until P x = x" by (induct x rule: node_induct) simp_all
lemma ubasis_until_idem: "P 0 ==> ubasis_until P (ubasis_until P x) = ubasis_until P x" by (rule ubasis_until_same [OF ubasis_until])
lemma ubasis_until_0: "∀x. x ≠ 0 ⟶¬ P x ==> ubasis_until P x = 0" by (induct x rule: node_induct) simp_all
lemma ubasis_until_less: "ubasis_le (ubasis_until P x) x" apply (induct x rule: node_induct) apply (simp add: ubasis_le_refl) by (metis ubasis_le.simps ubasis_until.simps(2))
lemma ubasis_until_chain: assumes PQ: "∧x. P x ==> Q x" shows"ubasis_le (ubasis_until P x) (ubasis_until Q x)" apply (induct x rule: node_induct) apply (simp add: ubasis_le_refl) by (metis assms ubasis_until.simps(2) ubasis_until_less)
lemma ubasis_until_mono: assumes"∧i a S b. [finite S; P (node i a S); b ∈ S; ubasis_le a b]==> P b" shows"ubasis_le a b ==> ubasis_le (ubasis_until P a) (ubasis_until P b)" proof (induct set: ubasis_le) case (ubasis_le_refl a) show ?caseby (rule ubasis_le.ubasis_le_refl) next case (ubasis_le_trans a b c) thus ?caseby - (rule ubasis_le.ubasis_le_trans) next case (ubasis_le_lower S a i) thus ?case by (metis ubasis_le.simps ubasis_until.simps(2) ubasis_until_less) next case (ubasis_le_upper S b a i) thus ?case by (metis assms ubasis_le.simps ubasis_until.simps(2) ubasis_until_same) qed
interpretation udom:
ideal_completion ubasis_le udom_principal Rep_udom using type_definition_udom below_udom_def using udom_principal_def ubasis_countable by (rule udom.typedef_ideal_completion)
text‹We use a locale to parameterize the construction over a chain of approx functions on the type to be embedded.›
locale bifinite_approx_chain =
approx_chain approx for approx :: "nat ==> 'a::bifinite → 'a" begin
subsubsection ‹Choosing a maximal element from a finite set›
lemma finite_has_maximal: fixes A :: "'a compact_basis set" shows"[finite A; A ≠ {}]==>∃x∈A. ∀y∈A. x ⊑ y ⟶ x = y" proof (induct rule: finite_ne_induct) case (singleton x) show ?caseby simp next case (insert a A) from‹∃x∈A. ∀y∈A. x ⊑ y ⟶ x = y› obtain x where x: "x ∈ A" and x_eq: "∧y. [y ∈ A; x ⊑ y]==> x = y"by fast show ?case proof (intro bexI ballI impI) fix y assume"y ∈ insert a A"and"(if x ⊑ a then a else x) ⊑ y" thus"(if x ⊑ a then a else x) = y" apply auto apply (frule (1) below_trans) apply (frule (1) x_eq) apply (rule below_antisym, assumption) apply simp apply (erule (1) x_eq) done next show"(if x ⊑ a then a else x) ∈ insert a A" by (simp add: x) qed qed
definition
choose :: "'a compact_basis set ==> 'a compact_basis" where "choose A = (SOME x. x ∈ {x∈A. ∀y∈A. x ⊑ y ⟶ x = y})"
lemma choose_lemma: "[finite A; A ≠ {}]==> choose A ∈ {x∈A. ∀y∈A. x ⊑ y ⟶ x = y}" unfolding choose_def apply (rule someI_ex) apply (frule (1) finite_has_maximal, fast) done
lemma maximal_choose: "[finite A; y ∈ A; choose A ⊑ y]==> choose A = y" apply (cases "A = {}", simp) apply (frule (1) choose_lemma, simp) done
lemma choose_in: "[finite A; A ≠ {}]==> choose A ∈ A" by (frule (1) choose_lemma, simp)
function
choose_pos :: "'a compact_basis set ==> 'a compact_basis ==> nat" where "choose_pos A x = (if finite A ∧ x ∈ A ∧ x ≠ choose A then Suc (choose_pos (A - {choose A}) x) else 0)" by auto
lemma cb_take_less: "cb_take n x ⊑ x" unfolding compact_le_def by (cases n, simp, simp add: Rep_cb_take approx_below)
lemma cb_take_idem: "cb_take n (cb_take n x) = cb_take n x" unfolding Rep_compact_basis_inject [symmetric] by (cases n, simp, simp add: Rep_cb_take approx_idem)
lemma cb_take_mono: "x ⊑ y ==> cb_take n x ⊑ cb_take n y" unfolding compact_le_def by (cases n, simp, simp add: Rep_cb_take monofun_cfun_arg)
lemma cb_take_chain_le: "m ≤ n ==> cb_take m x ⊑ cb_take n x" unfolding compact_le_def apply (cases m, simp, cases n, simp) apply (simp add: Rep_cb_take, rule chain_mono, simp, simp) done
function basis_emb :: "'a compact_basis ==> ubasis" where"basis_emb x = (if x = compact_bot then 0 else node (place x) (basis_emb (sub x)) (basis_emb ` {y. place y < place x ∧ x ⊑ y}))" by simp_all
termination basis_emb by (relation "measure place") (simp_all add: place_sub_less)
declare basis_emb.simps [simp del]
lemma basis_emb_compact_bot [simp]: "basis_emb compact_bot = 0" using basis_emb.simps [of compact_bot] by simp
lemma basis_emb_rec: "basis_emb x = node (place x) (basis_emb (sub x)) (basis_emb ` {y. place y < place x ∧ x ⊑ y})" if"x ≠ compact_bot" using that basis_emb.simps [of x] by simp
lemma basis_emb_eq_0_iff [simp]: "basis_emb x = 0 ⟷ x = compact_bot" by (cases "x = compact_bot") (simp_all add: basis_emb_rec)
lemma fin1: "finite {y. place y < place x ∧ x ⊑ y}" apply (subst Collect_conj_eq) apply (rule finite_Int) apply (rule disjI1) apply (subgoal_tac "finite (place -` {n. n < place x})", simp) apply (rule finite_vimageI [OF _ inj_place]) apply (simp add: lessThan_def [symmetric]) done
lemma fin2: "finite (basis_emb ` {y. place y < place x ∧ x ⊑ y})" by (rule finite_imageI [OF fin1])
lemma basis_emb_mono: "x ⊑ y ==> ubasis_le (basis_emb x) (basis_emb y)" proof (induct "max (place x) (place y)" arbitrary: x y rule: less_induct) case less show ?caseproof (rule linorder_cases) assume"place x < place y" thenhave"rank x < rank y" using‹x ⊑ y›by (rule rank_place_mono) with‹place x 🚫 y›show ?case apply (case_tac "y = compact_bot", simp) apply (simp add: basis_emb.simps [of y]) apply (rule ubasis_le_trans [OF _ ubasis_le_lower [OF fin2]]) apply (rule less) apply (simp add: less_max_iff_disj) apply (erule place_sub_less) apply (erule rank_less_imp_below_sub [OF ‹x ⊑ y›]) done next assume"place x = place y" hence"x = y"by (rule place_eqD) thus ?caseby (simp add: ubasis_le_refl) next assume"place x > place y" with‹x ⊑ y›show ?case apply (case_tac "x = compact_bot", simp add: ubasis_le_minimal) apply (simp add: basis_emb.simps [of x]) apply (rule ubasis_le_upper [OF fin2], simp) apply (rule less) apply (simp add: less_max_iff_disj) apply (erule place_sub_less) apply (erule rev_below_trans) apply (rule sub_below) done qed qed
lemma inj_basis_emb: "inj basis_emb" proof (rule injI) fix x y assume"basis_emb x = basis_emb y" thenshow"x = y" by (cases "x = compact_bot ∨ y = compact_bot") (auto simp add: basis_emb_rec fin2 place_eqD) qed
definition
basis_prj :: "ubasis ==> 'a compact_basis" where "basis_prj x = inv basis_emb (ubasis_until (λx. x ∈ range (basis_emb :: 'a compact_basis ==> ubasis)) x)"
lemma basis_prj_node: "[finite S; node i a S ∉ range (basis_emb :: 'a compact_basis ==> nat)] ==> basis_prj (node i a S) = (basis_prj a :: 'a compact_basis)" unfolding basis_prj_def by simp
lemma node_eq_basis_emb_iff: "finite S ==> node i a S = basis_emb x ⟷ x ≠ compact_bot ∧ i = place x ∧ a = basis_emb (sub x) ∧ S = basis_emb ` {y. place y < place x ∧ x ⊑ y}" apply (cases "x = compact_bot", simp) apply (simp add: basis_emb.simps [of x]) apply (simp add: fin2) done
lemma basis_prj_mono: "ubasis_le a b ==> basis_prj a ⊑ basis_prj b" proof (induct a b rule: ubasis_le.induct) case (ubasis_le_refl a) show ?caseby (rule below_refl) next case (ubasis_le_trans a b c) thus ?caseby - (rule below_trans) next case (ubasis_le_lower S a i) thus ?case apply (cases "node i a S ∈ range (basis_emb :: 'a compact_basis ==> nat)") apply (erule rangeE, rename_tac x) apply (simp add: basis_prj_basis_emb) apply (simp add: node_eq_basis_emb_iff) apply (simp add: basis_prj_basis_emb) apply (rule sub_below) apply (simp add: basis_prj_node) done next case (ubasis_le_upper S b a i) thus ?case apply (cases "node i a S ∈ range (basis_emb :: 'a compact_basis ==> nat)") apply (erule rangeE, rename_tac x) apply (simp add: basis_prj_basis_emb) apply (clarsimp simp add: node_eq_basis_emb_iff) apply (simp add: basis_prj_basis_emb) apply (simp add: basis_prj_node) done qed
lemma ideal_completion: "ideal_completion below Rep_compact_basis (approximants :: 'a ==> _)" proof fix w :: "'a" show"below.ideal (approximants w)" proof (rule below.idealI) have"Abs_compact_basis (approx 0⋅w) ∈ approximants w" by (simp add: approximants_def approx_below) thus"∃x. x ∈ approximants w" .. next fix x y :: "'a compact_basis" assume x: "x ∈ approximants w"and y: "y ∈ approximants w" obtain i where i: "approx i⋅(Rep_compact_basis x) = Rep_compact_basis x" using compact_eq_approx Rep_compact_basis' by fast obtain j where j: "approx j⋅(Rep_compact_basis y) = Rep_compact_basis y" using compact_eq_approx Rep_compact_basis' by fast let ?z = "Abs_compact_basis (approx (max i j)⋅w)" have"?z ∈ approximants w" by (simp add: approximants_def approx_below) moreoverfrom x y have"x ⊑ ?z ∧ y ⊑ ?z" by (simp add: approximants_def compact_le_def)
(metis i j monofun_cfun chain_mono chain_approx max.cobounded1 max.cobounded2) ultimatelyshow"∃z ∈ approximants w. x ⊑ z ∧ y ⊑ z" .. next fix x y :: "'a compact_basis" assume"x ⊑ y""y ∈ approximants w"thus"x ∈ approximants w" unfolding approximants_def compact_le_def by (auto elim: below_trans) qed next fix Y :: "nat ==> 'a" assume"chain Y" thus"approximants (⊔i. Y i) = (∪i. approximants (Y i))" unfolding approximants_def by (auto simp add: compact_below_lub_iff) next fix a :: "'a compact_basis" show"approximants (Rep_compact_basis a) = {b. b ⊑ a}" unfolding approximants_def compact_le_def .. next fix x y :: "'a" assume"approximants x ⊆ approximants y" hence"∀z. compact z ⟶ z ⊑ x ⟶ z ⊑ y" by (simp add: approximants_def subset_eq)
(metis Abs_compact_basis_inverse') hence"(⊔i. approx i⋅x) ⊑ y" by (simp add: lub_below approx_below) thus"x ⊑ y" by (simp add: lub_distribs) next show"∃f::'a compact_basis ==> nat. inj f" by (rule exI, rule inj_place) qed
end
interpretation compact_basis:
ideal_completion below Rep_compact_basis "approximants :: 'a::bifinite ==> 'a compact_basis set" proof - obtain a :: "nat ==> 'a → 'a"where"approx_chain a" using bifinite .. hence"bifinite_approx_chain a" unfolding bifinite_approx_chain_def . thus"ideal_completion below Rep_compact_basis (approximants :: 'a ==> _)" by (rule bifinite_approx_chain.ideal_completion) qed
subsubsection ‹EP-pair from any bifinite domain into \emph{udom}›
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.