lemma prod_encode_prod_decode_aux: "prod_encode (prod_decode_aux k m) = triangle k + m" proof (induction k m rule: prod_decode_aux.induct) case (1 k m) thenshow ?case by (simp add: prod_encode_def prod_decode_aux.simps) qed
lemma prod_decode_triangle_add: "prod_decode (triangle k + m) = prod_decode_aux k m" proof (induct k arbitrary: m) case 0 thenshow ?case by (simp add: prod_decode_def) next case (Suc k) thenshow ?case by (metis ab_semigroup_add_class.add_ac(1) add_diff_cancel_left' le_add1 not_less_eq_eq prod_decode_aux.simps triangle_Suc) qed
lemma prod_encode_inverse [simp]: "prod_decode (prod_encode x) = x" unfolding prod_encode_def proof (induct x) case (Pair a b) thenshow ?case by (simp add: prod_decode_triangle_add prod_decode_aux.simps) qed
lemma inj_prod_encode: "inj_on prod_encode A" by (rule inj_on_inverseI) (rule prod_encode_inverse)
lemma inj_prod_decode: "inj_on prod_decode A" by (rule inj_on_inverseI) (rule prod_decode_inverse)
lemma surj_prod_encode: "surj prod_encode" by (rule surjI) (rule prod_decode_inverse)
lemma surj_prod_decode: "surj prod_decode" by (rule surjI) (rule prod_encode_inverse)
lemma bij_prod_encode: "bij prod_encode" by (rule bijI [OF inj_prod_encode surj_prod_encode])
lemma bij_prod_decode: "bij prod_decode" by (rule bijI [OF inj_prod_decode surj_prod_decode])
lemma prod_encode_eq [simp]: "prod_encode x = prod_encode y \ x = y" by (rule inj_prod_encode [THEN inj_eq])
lemma prod_decode_eq [simp]: "prod_decode x = prod_decode y \ x = y" by (rule inj_prod_decode [THEN inj_eq])
text\<open>Ordering properties\<close>
lemma le_prod_encode_1: "a \ prod_encode (a, b)" by (simp add: prod_encode_def)
lemma le_prod_encode_2: "b \ prod_encode (a, b)" by (induct b) (simp_all add: prod_encode_def)
fun list_encode :: "nat list \ nat" where "list_encode [] = 0"
| "list_encode (x # xs) = Suc (prod_encode (x, list_encode xs))"
function list_decode :: "nat \ nat list" where "list_decode 0 = []"
| "list_decode (Suc n) = (case prod_decode n of (x, y) \ x # list_decode y)" by pat_completeness auto
termination list_decode proof - have"\n x y. (x, y) = prod_decode n \ y < Suc n" by (metis le_imp_less_Suc le_prod_encode_2 prod_decode_inverse) thenshow ?thesis using"termination"by blast qed
lemma list_encode_inverse [simp]: "list_decode (list_encode x) = x" by (induct x rule: list_encode.induct) simp_all
lemma list_decode_inverse [simp]: "list_encode (list_decode n) = n" proof (induct n rule: list_decode.induct) case (2 n) thenshow ?case by (metis list_encode.simps(2) list_encode_inverse prod_decode_inverse surj_pair) qed auto
lemma inj_list_encode: "inj_on list_encode A" by (rule inj_on_inverseI) (rule list_encode_inverse)
lemma inj_list_decode: "inj_on list_decode A" by (rule inj_on_inverseI) (rule list_decode_inverse)
lemma surj_list_encode: "surj list_encode" by (rule surjI) (rule list_decode_inverse)
lemma surj_list_decode: "surj list_decode" by (rule surjI) (rule list_encode_inverse)
lemma bij_list_encode: "bij list_encode" by (rule bijI [OF inj_list_encode surj_list_encode])
lemma bij_list_decode: "bij list_decode" by (rule bijI [OF inj_list_decode surj_list_decode])
lemma list_encode_eq: "list_encode x = list_encode y \ x = y" by (rule inj_list_encode [THEN inj_eq])
lemma list_decode_eq: "list_decode x = list_decode y \ x = y" by (rule inj_list_decode [THEN inj_eq])
subsection \<open>Finite sets of naturals\<close>
subsubsection \<open>Preliminaries\<close>
lemma finite_vimage_Suc_iff: "finite (Suc -` F) \ finite F" proof have"F \ insert 0 (Suc ` Suc -` F)" using nat.nchotomy by force moreover assume"finite (Suc -` F)" thenhave"finite (insert 0 (Suc ` Suc -` F))" by blast ultimatelyshow"finite F" using finite_subset by blast qed (force intro: finite_vimageI inj_Suc)
lemma vimage_Suc_insert_0: "Suc -` insert 0 A = Suc -` A" by auto
lemma vimage_Suc_insert_Suc: "Suc -` insert (Suc n) A = insert n (Suc -` A)" by auto
lemma div2_even_ext_nat: fixes x y :: nat assumes"x div 2 = y div 2" and"even x \ even y" shows"x = y" proof - from\<open>even x \<longleftrightarrow> even y\<close> have "x mod 2 = y mod 2" by (simp only: even_iff_mod_2_eq_zero) auto with assms have"x div 2 * 2 + x mod 2 = y div 2 * 2 + y mod 2" by simp thenshow ?thesis by simp qed
subsubsection \<open>From sets to naturals\<close>
definition set_encode :: "nat set \ nat" where"set_encode = sum ((^) 2)"
lemma set_encode_inf: "\ finite A \ set_encode A = 0" by (simp add: set_encode_def)
lemma set_encode_insert [simp]: "finite A \ n \ A \ set_encode (insert n A) = 2^n + set_encode A" by (simp add: set_encode_def)
lemma even_set_encode_iff: "finite A \ even (set_encode A) \ 0 \ A" by (induct set: finite) (auto simp: set_encode_def)
lemma set_encode_vimage_Suc: "set_encode (Suc -` A) = set_encode A div 2" proof (induction A rule: infinite_finite_induct) case (infinite A) thenshow ?case by (simp add: finite_vimage_Suc_iff set_encode_inf) next case (insert x A) show ?case proof (cases x) case 0 with insert show ?thesis by (simp add: even_set_encode_iff vimage_Suc_insert_0) next case (Suc y) with insert show ?thesis by (simp add: finite_vimageI add.commute vimage_Suc_insert_Suc) qed qed auto
lemma set_decode_div_2: "set_decode (x div 2) = Suc -` set_decode x" by auto
lemma set_decode_plus_power_2: "n \ set_decode z \ set_decode (2 ^ n + z) = insert n (set_decode z)" proof (induct n arbitrary: z) case 0 show ?case proof (rule set_eqI) show"q \ set_decode (2 ^ 0 + z) \ q \ insert 0 (set_decode z)" for q by (induct q) (use 0 in simp_all) qed next case (Suc n) show ?case proof (rule set_eqI) show"q \ set_decode (2 ^ Suc n + z) \ q \ insert (Suc n) (set_decode z)" for q by (induct q) (use Suc in simp_all) qed qed
lemma finite_set_decode [simp]: "finite (set_decode n)" proof (induction n rule: less_induct) case (less n) show ?case proof (cases "n = 0") case False thenshow ?thesis using less.IH [of "n div 2"] finite_vimage_Suc_iff set_decode_div_2 by auto qed auto qed
subsubsection \<open>Proof of isomorphism\<close>
lemma set_decode_inverse [simp]: "set_encode (set_decode n) = n" proof (induction n rule: less_induct) case (less n) show ?case proof (cases "n = 0") case False thenhave"set_encode (set_decode (n div 2)) = n div 2" using less.IH by auto thenshow ?thesis by (metis div2_even_ext_nat even_set_encode_iff finite_set_decode set_decode_0 set_decode_div_2 set_encode_div_2) qed auto qed
lemma set_encode_inverse [simp]: "finite A \ set_decode (set_encode A) = A" proof (induction rule: finite_induct) case (insert x A) thenshow ?case by (simp add: set_decode_plus_power_2) qed auto
lemma inj_on_set_encode: "inj_on set_encode (Collect finite)" by (rule inj_on_inverseI [where g = "set_decode"]) simp
lemma set_encode_eq: "finite A \ finite B \ set_encode A = set_encode B \ A = B" by (rule iffI) (simp_all add: inj_onD [OF inj_on_set_encode])
lemma subset_decode_imp_le: assumes"set_decode m \ set_decode n" shows"m \ n" proof - have"n = m + set_encode (set_decode n - set_decode m)" proof - obtain A B where "m = set_encode A""finite A" "n = set_encode B""finite B" by (metis finite_set_decode set_decode_inverse) with assms show ?thesis by auto (simp add: set_encode_def add.commute sum.subset_diff) qed thenshow ?thesis by (metis le_add1) qed
end
¤ 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.0.16Bemerkung:
(vorverarbeitet)
¤
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.