src/HOL/Data_Structures/Braun_Tree.thy
changeset 69198 9218b7652839
parent 69197 50aa773f62d2
child 69200 f2bb47056d8f
equal deleted inserted replaced
69197:50aa773f62d2 69198:9218b7652839
     3 section \<open>Braun Trees\<close>
     3 section \<open>Braun Trees\<close>
     4 
     4 
     5 theory Braun_Tree
     5 theory Braun_Tree
     6 imports "HOL-Library.Tree_Real"
     6 imports "HOL-Library.Tree_Real"
     7 begin
     7 begin
     8 
       
     9 (* FIXME mv *)
       
    10 lemma mod2_iff: "x mod 2 = (if even x then 0 else 1)"
       
    11 by (simp add: odd_iff_mod_2_eq_one)
       
    12 lemma Icc_eq_insert_lb_nat: "m \<le> n \<Longrightarrow> {m..n} = insert m {Suc m..n}"
       
    13 by auto
       
    14 
     8 
    15 text \<open>Braun Trees were studied by Braun and Rem~\cite{BraunRem}
     9 text \<open>Braun Trees were studied by Braun and Rem~\cite{BraunRem}
    16 and later Hoogerwoord~\cite{Hoogerwoord}.\<close>
    10 and later Hoogerwoord~\cite{Hoogerwoord}.\<close>
    17 
    11 
    18 fun braun :: "'a tree \<Rightarrow> bool" where
    12 fun braun :: "'a tree \<Rightarrow> bool" where
   189 proof
   183 proof
   190   let ?a = "(n+1-m + (m+1) mod 2) div 2"
   184   let ?a = "(n+1-m + (m+1) mod 2) div 2"
   191   have "\<exists>j \<in> {1..?a}. i = 2*(j-1) + m + m mod 2" if *: "i \<in> {m..n}" "even i" for i
   185   have "\<exists>j \<in> {1..?a}. i = 2*(j-1) + m + m mod 2" if *: "i \<in> {m..n}" "even i" for i
   192   proof -
   186   proof -
   193     let ?j = "(i - (m + m mod 2)) div 2 + 1"
   187     let ?j = "(i - (m + m mod 2)) div 2 + 1"
   194     have "?j \<in> {1..?a} \<and> i = 2*(?j-1) + m + m mod 2" using * by(auto simp: mod2_iff) presburger+
   188     have "?j \<in> {1..?a} \<and> i = 2*(?j-1) + m + m mod 2" using * by(auto simp: mod2_eq_if) presburger+
   195     thus ?thesis by blast
   189     thus ?thesis by blast
   196   qed
   190   qed
   197   thus "A \<subseteq> ?A" using assms
   191   thus "A \<subseteq> ?A" using assms
   198     by(auto simp: image_iff card_atLeastAtMost_even simp del: atLeastAtMost_iff)
   192     by(auto simp: image_iff card_atLeastAtMost_even simp del: atLeastAtMost_iff)
   199 next
   193 next
   200   let ?a = "(n+1-m + (m+1) mod 2) div 2"
   194   let ?a = "(n+1-m + (m+1) mod 2) div 2"
   201   have 1: "2 * (j - 1) + m + m mod 2 \<in> {m..n}" if *: "j \<in> {1..?a}" for j
   195   have 1: "2 * (j - 1) + m + m mod 2 \<in> {m..n}" if *: "j \<in> {1..?a}" for j
   202     using * by(auto simp: mod2_iff)
   196     using * by(auto simp: mod2_eq_if)
   203   have 2: "even (2 * (j - 1) + m + m mod 2)" for j by presburger
   197   have 2: "even (2 * (j - 1) + m + m mod 2)" for j by presburger
   204   show "?A \<subseteq> A"
   198   show "?A \<subseteq> A"
   205     apply(simp add: assms card_atLeastAtMost_even del: atLeastAtMost_iff One_nat_def)
   199     apply(simp add: assms card_atLeastAtMost_even del: atLeastAtMost_iff One_nat_def)
   206     using 1 2 by blast
   200     using 1 2 by blast
   207 qed
   201 qed
   236   have A: "A = {i \<in> {m..n}. even i}" using assms by auto
   230   have A: "A = {i \<in> {m..n}. even i}" using assms by auto
   237   hence A': "A = (\<lambda>i. 2*(i-1) + m + m mod 2) ` {1..?a}" by(rule compact_ivl_even)
   231   hence A': "A = (\<lambda>i. 2*(i-1) + m + m mod 2) ` {1..?a}" by(rule compact_ivl_even)
   238   have B: "B = {i \<in> {m..n}. odd i}" using assms by auto
   232   have B: "B = {i \<in> {m..n}. odd i}" using assms by auto
   239   hence B': "B = (\<lambda>i. 2*(i-1) + m + (m+1) mod 2) ` {1..?b}" by(rule compact_ivl_odd)
   233   hence B': "B = (\<lambda>i. 2*(i-1) + m + (m+1) mod 2) ` {1..?b}" by(rule compact_ivl_odd)
   240   have "?a = ?b \<or> ?a = ?b+1 \<and> even m \<or> ?a+1 = ?b \<and> odd m"
   234   have "?a = ?b \<or> ?a = ?b+1 \<and> even m \<or> ?a+1 = ?b \<and> odd m"
   241     apply(simp add: Let_def mod2_iff
   235     apply(simp add: Let_def mod2_eq_if
   242       card_atLeastAtMost_even[of m n, simplified A[symmetric]]
   236       card_atLeastAtMost_even[of m n, simplified A[symmetric]]
   243       card_atLeastAtMost_odd[of m n, simplified B[symmetric]] split!: if_splits)
   237       card_atLeastAtMost_odd[of m n, simplified B[symmetric]] split!: if_splits)
   244     by linarith
   238     by linarith
   245   with ab A' B' show ?thesis by simp
   239   with ab A' B' show ?thesis by simp
   246 qed
   240 qed