35 constdefs |
35 constdefs |
36 evnodd :: "[i, i] => i" |
36 evnodd :: "[i, i] => i" |
37 "evnodd(A,b) == {z \<in> A. \<exists>i j. z = <i,j> \<and> (i #+ j) mod 2 = b}" |
37 "evnodd(A,b) == {z \<in> A. \<exists>i j. z = <i,j> \<and> (i #+ j) mod 2 = b}" |
38 |
38 |
39 |
39 |
40 subsubsection {* Basic properties of evnodd *} |
40 subsection {* Basic properties of evnodd *} |
41 |
41 |
42 lemma evnodd_iff: "<i,j>: evnodd(A,b) <-> <i,j>: A & (i#+j) mod 2 = b" |
42 lemma evnodd_iff: "<i,j>: evnodd(A,b) <-> <i,j>: A & (i#+j) mod 2 = b" |
43 by (unfold evnodd_def) blast |
43 by (unfold evnodd_def) blast |
44 |
44 |
45 lemma evnodd_subset: "evnodd(A, b) \<subseteq> A" |
45 lemma evnodd_subset: "evnodd(A, b) \<subseteq> A" |
61 |
61 |
62 lemma evnodd_0 [simp]: "evnodd(0, b) = 0" |
62 lemma evnodd_0 [simp]: "evnodd(0, b) = 0" |
63 by (simp add: evnodd_def) |
63 by (simp add: evnodd_def) |
64 |
64 |
65 |
65 |
66 subsubsection {* Dominoes *} |
66 subsection {* Dominoes *} |
67 |
67 |
68 lemma domino_Finite: "d \<in> domino ==> Finite(d)" |
68 lemma domino_Finite: "d \<in> domino ==> Finite(d)" |
69 by (blast intro!: Finite_cons Finite_0 elim: domino.cases) |
69 by (blast intro!: Finite_cons Finite_0 elim: domino.cases) |
70 |
70 |
71 lemma domino_singleton: "[| d \<in> domino; b<2 |] ==> \<exists>i' j'. evnodd(d,b) = {<i',j'>}" |
71 lemma domino_singleton: |
|
72 "[| d \<in> domino; b<2 |] ==> \<exists>i' j'. evnodd(d,b) = {<i',j'>}" |
72 apply (erule domino.cases) |
73 apply (erule domino.cases) |
73 apply (rule_tac [2] k1 = "i#+j" in mod2_cases [THEN disjE]) |
74 apply (rule_tac [2] k1 = "i#+j" in mod2_cases [THEN disjE]) |
74 apply (rule_tac k1 = "i#+j" in mod2_cases [THEN disjE]) |
75 apply (rule_tac k1 = "i#+j" in mod2_cases [THEN disjE]) |
75 apply (rule add_type | assumption)+ |
76 apply (rule add_type | assumption)+ |
76 (*Four similar cases: case (i#+j) mod 2 = b, 2#-b, ...*) |
77 (*Four similar cases: case (i#+j) mod 2 = b, 2#-b, ...*) |
77 apply (auto simp add: mod_succ succ_neq_self dest: ltD) |
78 apply (auto simp add: mod_succ succ_neq_self dest: ltD) |
78 done |
79 done |
79 |
80 |
80 |
81 |
81 subsubsection {* Tilings *} |
82 subsection {* Tilings *} |
82 |
83 |
83 text {* The union of two disjoint tilings is a tiling *} |
84 text {* The union of two disjoint tilings is a tiling *} |
84 |
85 |
85 lemma tiling_UnI: |
86 lemma tiling_UnI: |
86 "t \<in> tiling(A) ==> u \<in> tiling(A) ==> t Int u = 0 ==> t Un u \<in> tiling(A)" |
87 "t \<in> tiling(A) ==> u \<in> tiling(A) ==> t Int u = 0 ==> t Un u \<in> tiling(A)" |
112 apply (simp add: evnodd_Un Un_cons tiling_domino_Finite |
113 apply (simp add: evnodd_Un Un_cons tiling_domino_Finite |
113 evnodd_subset [THEN subset_Finite] Finite_imp_cardinal_cons) |
114 evnodd_subset [THEN subset_Finite] Finite_imp_cardinal_cons) |
114 apply (blast dest!: evnodd_subset [THEN subsetD] elim: equalityE) |
115 apply (blast dest!: evnodd_subset [THEN subsetD] elim: equalityE) |
115 done |
116 done |
116 |
117 |
117 lemma dominoes_tile_row: "[| i \<in> nat; n \<in> nat |] ==> {i} * (n #+ n) \<in> tiling(domino)" |
118 lemma dominoes_tile_row: |
|
119 "[| i \<in> nat; n \<in> nat |] ==> {i} * (n #+ n) \<in> tiling(domino)" |
118 apply (induct_tac n) |
120 apply (induct_tac n) |
119 apply (simp add: tiling.intros) |
121 apply (simp add: tiling.intros) |
120 apply (simp add: Un_assoc [symmetric] Sigma_succ2) |
122 apply (simp add: Un_assoc [symmetric] Sigma_succ2) |
121 apply (rule tiling.intros) |
123 apply (rule tiling.intros) |
122 prefer 2 apply assumption |
124 prefer 2 apply assumption |
123 apply (rename_tac n') |
125 apply (rename_tac n') |
124 apply (subgoal_tac (*seems the easiest way of turning one to the other*) |
126 apply (subgoal_tac (*seems the easiest way of turning one to the other*) |
125 "{i}*{succ (n'#+n') } Un {i}*{n'#+n'} = {<i,n'#+n'>, <i,succ (n'#+n') >}") |
127 "{i}*{succ (n'#+n') } Un {i}*{n'#+n'} = |
|
128 {<i,n'#+n'>, <i,succ (n'#+n') >}") |
126 prefer 2 apply blast |
129 prefer 2 apply blast |
127 apply (simp add: domino.horiz) |
130 apply (simp add: domino.horiz) |
128 apply (blast elim: mem_irrefl mem_asym) |
131 apply (blast elim: mem_irrefl mem_asym) |
129 done |
132 done |
130 |
133 |
131 lemma dominoes_tile_matrix: "[| m \<in> nat; n \<in> nat |] ==> m * (n #+ n) \<in> tiling(domino)" |
134 lemma dominoes_tile_matrix: |
|
135 "[| m \<in> nat; n \<in> nat |] ==> m * (n #+ n) \<in> tiling(domino)" |
132 apply (induct_tac m) |
136 apply (induct_tac m) |
133 apply (simp add: tiling.intros) |
137 apply (simp add: tiling.intros) |
134 apply (simp add: Sigma_succ1) |
138 apply (simp add: Sigma_succ1) |
135 apply (blast intro: tiling_UnI dominoes_tile_row elim: mem_irrefl) |
139 apply (blast intro: tiling_UnI dominoes_tile_row elim: mem_irrefl) |
136 done |
140 done |
146 apply (drule tiling_domino_0_1) |
150 apply (drule tiling_domino_0_1) |
147 apply (erule_tac x = "|?A|" in eq_lt_E) |
151 apply (erule_tac x = "|?A|" in eq_lt_E) |
148 apply (subgoal_tac "t \<in> tiling (domino)") |
152 apply (subgoal_tac "t \<in> tiling (domino)") |
149 prefer 2 (*Requires a small simpset that won't move the succ applications*) |
153 prefer 2 (*Requires a small simpset that won't move the succ applications*) |
150 apply (simp only: nat_succI add_type dominoes_tile_matrix) |
154 apply (simp only: nat_succI add_type dominoes_tile_matrix) |
151 apply (simp add: evnodd_Diff mod2_add_self mod2_succ_succ tiling_domino_0_1 [symmetric]) |
155 apply (simp add: evnodd_Diff mod2_add_self mod2_succ_succ |
|
156 tiling_domino_0_1 [symmetric]) |
152 apply (rule lt_trans) |
157 apply (rule lt_trans) |
153 apply (rule Finite_imp_cardinal_Diff, |
158 apply (rule Finite_imp_cardinal_Diff, |
154 simp add: tiling_domino_Finite Finite_evnodd Finite_Diff, |
159 simp add: tiling_domino_Finite Finite_evnodd Finite_Diff, |
155 simp add: evnodd_iff nat_0_le [THEN ltD] mod2_add_self)+ |
160 simp add: evnodd_iff nat_0_le [THEN ltD] mod2_add_self)+ |
156 done |
161 done |