# HG changeset patch # User wenzelm # Date 1451837987 -3600 # Node ID 2c9f68fbf047fa898014c73e31eaa3c682fc0d86 # Parent 75a7db3cae7ed3211154cbdd3b96e51ad3599504 tuned whitespace; diff -r 75a7db3cae7e -r 2c9f68fbf047 src/HOL/Library/Nat_Bijection.thy --- a/src/HOL/Library/Nat_Bijection.thy Sat Jan 02 21:33:57 2016 +0100 +++ b/src/HOL/Library/Nat_Bijection.thy Sun Jan 03 17:19:47 2016 +0100 @@ -16,10 +16,8 @@ text "Triangle numbers: 0, 1, 3, 6, 10, 15, ..." -definition - triangle :: "nat \ nat" -where - "triangle n = n * Suc n div 2" +definition triangle :: "nat \ nat" + where "triangle n = (n * Suc n) div 2" lemma triangle_0 [simp]: "triangle 0 = 0" unfolding triangle_def by simp @@ -27,25 +25,20 @@ lemma triangle_Suc [simp]: "triangle (Suc n) = triangle n + Suc n" unfolding triangle_def by simp -definition - prod_encode :: "nat \ nat \ nat" -where - "prod_encode = (\(m, n). triangle (m + n) + m)" +definition prod_encode :: "nat \ nat \ nat" + where "prod_encode = (\(m, n). triangle (m + n) + m)" text \In this auxiliary function, @{term "triangle k + m"} is an invariant.\ -fun - prod_decode_aux :: "nat \ nat \ nat \ nat" +fun prod_decode_aux :: "nat \ nat \ nat \ nat" where "prod_decode_aux k m = (if m \ k then (m, k - m) else prod_decode_aux (Suc k) (m - Suc k))" declare prod_decode_aux.simps [simp del] -definition - prod_decode :: "nat \ nat \ nat" -where - "prod_decode = prod_decode_aux 0" +definition prod_decode :: "nat \ nat \ nat" + where "prod_decode = prod_decode_aux 0" lemma prod_encode_prod_decode_aux: "prod_encode (prod_decode_aux k m) = triangle k + m" @@ -57,8 +50,7 @@ lemma prod_decode_inverse [simp]: "prod_encode (prod_decode n) = n" unfolding prod_decode_def by (simp add: prod_encode_prod_decode_aux) -lemma prod_decode_triangle_add: - "prod_decode (triangle k + m) = prod_decode_aux k m" +lemma prod_decode_triangle_add: "prod_decode (triangle k + m) = prod_decode_aux k m" apply (induct k arbitrary: m) apply (simp add: prod_decode_def) apply (simp only: triangle_Suc add.assoc) @@ -96,6 +88,7 @@ lemma prod_decode_eq: "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)" @@ -107,13 +100,11 @@ subsection \Type @{typ "nat + nat"}\ -definition - sum_encode :: "nat + 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" +definition sum_decode :: "nat \ nat + nat" where "sum_decode n = (if even n then Inl (n div 2) else Inr (n div 2))" @@ -151,13 +142,11 @@ subsection \Type @{typ "int"}\ -definition - int_encode :: "int \ nat" +definition int_encode :: "int \ nat" where "int_encode i = sum_encode (if 0 \ i then Inl (nat i) else Inr (nat (- i - 1)))" -definition - int_decode :: "nat \ int" +definition int_decode :: "nat \ int" where "int_decode n = (case sum_decode n of Inl a \ int a | Inr b \ - int b - 1)" @@ -195,14 +184,12 @@ subsection \Type @{typ "nat list"}\ -fun - list_encode :: "nat list \ nat" +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" +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)" @@ -285,10 +272,8 @@ subsubsection \From sets to naturals\ -definition - set_encode :: "nat set \ nat" -where - "set_encode = setsum (op ^ 2)" +definition set_encode :: "nat set \ nat" + where "set_encode = setsum (op ^ 2)" lemma set_encode_empty [simp]: "set_encode {} = 0" by (simp add: set_encode_def) @@ -314,12 +299,11 @@ lemmas set_encode_div_2 = set_encode_vimage_Suc [symmetric] + subsubsection \From naturals to sets\ -definition - set_decode :: "nat \ nat set" -where - "set_decode x = {n. odd (x div 2 ^ n)}" +definition set_decode :: "nat \ nat set" + where "set_decode x = {n. odd (x div 2 ^ n)}" lemma set_decode_0 [simp]: "0 \ set_decode x \ odd x" by (simp add: set_decode_def) @@ -358,6 +342,7 @@ apply (simp add: finite_vimage_Suc_iff) done + subsubsection \Proof of isomorphism\ lemma set_decode_inverse [simp]: "set_encode (set_decode n) = n" @@ -381,7 +366,9 @@ "\finite A; finite B\ \ set_encode A = set_encode B \ A = B" by (rule iffI, simp add: inj_onD [OF inj_on_set_encode], simp) -lemma subset_decode_imp_le: assumes "set_decode m \ set_decode n" shows "m \ n" +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 -