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‹Ordering properties›
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)
subsection‹Type 🍋‹nat + nat›\›
definition sum_encode :: "nat + nat ==> nat" where"sum_encode x = (case x of Inl a ==> 2 * a | Inr b ==> Suc (2 * b))"
definition sum_decode :: "nat ==> nat + nat" where"sum_decode n = (if even n then Inl (n div 2) else Inr (n div 2))"
lemma int_decode_inverse [simp]: "int_encode (int_decode n) = n" unfolding int_decode_def int_encode_def using sum_decode_inverse [of n] by (cases "sum_decode n") simp_all
lemma inj_int_encode: "inj_on int_encode A" by (rule inj_on_inverseI) (rule int_encode_inverse)
lemma inj_int_decode: "inj_on int_decode A" by (rule inj_on_inverseI) (rule int_decode_inverse)
lemma surj_int_encode: "surj int_encode" by (rule surjI) (rule int_decode_inverse)
lemma surj_int_decode: "surj int_decode" by (rule surjI) (rule int_encode_inverse)
lemma bij_int_encode: "bij int_encode" by (rule bijI [OF inj_int_encode surj_int_encode])
lemma bij_int_decode: "bij int_decode" by (rule bijI [OF inj_int_decode surj_int_decode])
lemma int_encode_eq: "int_encode x = int_encode y ⟷ x = y" by (rule inj_int_encode [THEN inj_eq])
lemma int_decode_eq: "int_decode x = int_decode y ⟷ x = y" by (rule inj_int_decode [THEN inj_eq])
subsection‹Type 🍋‹nat list›\›
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‹Finite sets of naturals›
subsubsection ‹Preliminaries›
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‹even x ⟷ even y›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 ‹From sets to naturals›
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 ‹Proof of isomorphism›
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
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-04-26)
¤
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.