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 |