src/ZF/Induct/Mutil.thy
changeset 12185 54bd9aa3343d
parent 12173 f3f7993ae6da
child 16417 9bc16273c2d4
equal deleted inserted replaced
12184:f4aaa2647fd2 12185:54bd9aa3343d
    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