src/ZF/Induct/Mutil.thy
author wenzelm
Tue, 13 Nov 2001 22:19:37 +0100
changeset 12173 f3f7993ae6da
parent 12088 6f463d16cbd0
child 12185 54bd9aa3343d
permissions -rw-r--r--
converted;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12173
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
     1
(*  Title:      ZF/Induct/Mutil.thy
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
     2
    ID:         $Id$
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
     4
    Copyright   1996  University of Cambridge
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
     5
*)
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
     6
12173
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
     7
header {* The Mutilated Chess Board Problem, formalized inductively *}
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
     8
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
     9
theory Mutil = Main:
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    10
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    11
text {*
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    12
  Originator is Max Black, according to J A Robinson.  Popularized as
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    13
  the Mutilated Checkerboard Problem by J McCarthy.
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    14
*}
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    15
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    16
consts
12173
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    17
  domino :: i
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    18
  tiling :: "i => i"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    19
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    20
inductive
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    21
  domains "domino" \<subseteq> "Pow(nat \<times> nat)"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    22
  intros
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    23
    horiz: "[| i \<in> nat;  j \<in> nat |] ==> {<i,j>, <i,succ(j)>} \<in> domino"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    24
    vertl: "[| i \<in> nat;  j \<in> nat |] ==> {<i,j>, <succ(i),j>} \<in> domino"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    25
  type_intros empty_subsetI cons_subsetI PowI SigmaI nat_succI
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    26
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    27
inductive
12173
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    28
  domains "tiling(A)" \<subseteq> "Pow(Union(A))"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    29
  intros
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    30
    empty: "0 \<in> tiling(A)"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    31
    Un: "[| a \<in> A;  t \<in> tiling(A);  a Int t = 0 |] ==> a Un t \<in> tiling(A)"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    32
  type_intros empty_subsetI Union_upper Un_least PowI
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    33
  type_elims PowD [elim_format]
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    34
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    35
constdefs
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    36
  evnodd :: "[i, i] => i"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    37
  "evnodd(A,b) == {z \<in> A. \<exists>i j. z = <i,j> \<and> (i #+ j) mod 2 = b}"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    38
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    39
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    40
subsubsection {* Basic properties of evnodd *}
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    41
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    42
lemma evnodd_iff: "<i,j>: evnodd(A,b) <-> <i,j>: A & (i#+j) mod 2 = b"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    43
  by (unfold evnodd_def) blast
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    44
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    45
lemma evnodd_subset: "evnodd(A, b) \<subseteq> A"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    46
  by (unfold evnodd_def) blast
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    47
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    48
lemma Finite_evnodd: "Finite(X) ==> Finite(evnodd(X,b))"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    49
  by (rule lepoll_Finite, rule subset_imp_lepoll, rule evnodd_subset)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    50
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    51
lemma evnodd_Un: "evnodd(A Un B, b) = evnodd(A,b) Un evnodd(B,b)"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    52
  by (simp add: evnodd_def Collect_Un)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    53
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    54
lemma evnodd_Diff: "evnodd(A - B, b) = evnodd(A,b) - evnodd(B,b)"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    55
  by (simp add: evnodd_def Collect_Diff)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    56
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    57
lemma evnodd_cons [simp]:
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    58
  "evnodd(cons(<i,j>,C), b) =
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    59
    (if (i#+j) mod 2 = b then cons(<i,j>, evnodd(C,b)) else evnodd(C,b))"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    60
  by (simp add: evnodd_def Collect_cons)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    61
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    62
lemma evnodd_0 [simp]: "evnodd(0, b) = 0"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    63
  by (simp add: evnodd_def)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    64
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    65
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    66
subsubsection {* Dominoes *}
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    67
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    68
lemma domino_Finite: "d \<in> domino ==> Finite(d)"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    69
  by (blast intro!: Finite_cons Finite_0 elim: domino.cases)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    70
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    71
lemma domino_singleton: "[| d \<in> domino; b<2 |] ==> \<exists>i' j'. evnodd(d,b) = {<i',j'>}"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    72
  apply (erule domino.cases)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    73
   apply (rule_tac [2] k1 = "i#+j" in mod2_cases [THEN disjE])
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    74
     apply (rule_tac k1 = "i#+j" in mod2_cases [THEN disjE])
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    75
       apply (rule add_type | assumption)+
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    76
      (*Four similar cases: case (i#+j) mod 2 = b, 2#-b, ...*)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    77
      apply (auto simp add: mod_succ succ_neq_self dest: ltD)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    78
  done
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    79
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    80
12173
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    81
subsubsection {* Tilings *}
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    82
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    83
text {* The union of two disjoint tilings is a tiling *}
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    84
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    85
lemma tiling_UnI:
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    86
    "t \<in> tiling(A) ==> u \<in> tiling(A) ==> t Int u = 0 ==> t Un u \<in> tiling(A)"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    87
  apply (induct set: tiling)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    88
   apply (simp add: tiling.intros)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    89
  apply (simp add: Un_assoc subset_empty_iff [THEN iff_sym])
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    90
  apply (blast intro: tiling.intros)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    91
  done
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    92
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    93
lemma tiling_domino_Finite: "t \<in> tiling(domino) ==> Finite(t)"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    94
  apply (induct rule: tiling.induct)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    95
   apply (rule Finite_0)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    96
  apply (blast intro!: Finite_Un intro: domino_Finite)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    97
  done
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    98
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    99
lemma tiling_domino_0_1: "t \<in> tiling(domino) ==> |evnodd(t,0)| = |evnodd(t,1)|"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   100
  apply (induct rule: tiling.induct)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   101
   apply (simp add: evnodd_def)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   102
  apply (rule_tac b1 = 0 in domino_singleton [THEN exE])
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   103
    prefer 2
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   104
    apply simp
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   105
   apply assumption
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   106
  apply (rule_tac b1 = 1 in domino_singleton [THEN exE])
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   107
    prefer 2
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   108
    apply simp
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   109
   apply assumption
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   110
  apply safe
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   111
  apply (subgoal_tac "\<forall>p b. p \<in> evnodd (a,b) --> p\<notin>evnodd (t,b)")
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   112
   apply (simp add: evnodd_Un Un_cons tiling_domino_Finite
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   113
     evnodd_subset [THEN subset_Finite] Finite_imp_cardinal_cons)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   114
  apply (blast dest!: evnodd_subset [THEN subsetD] elim: equalityE)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   115
  done
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
   116
12173
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   117
lemma dominoes_tile_row: "[| i \<in> nat;  n \<in> nat |] ==> {i} * (n #+ n) \<in> tiling(domino)"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   118
  apply (induct_tac n)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   119
   apply (simp add: tiling.intros)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   120
  apply (simp add: Un_assoc [symmetric] Sigma_succ2)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   121
  apply (rule tiling.intros)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   122
    prefer 2 apply assumption
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   123
   apply (rename_tac n')
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   124
   apply (subgoal_tac (*seems the easiest way of turning one to the other*)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   125
     "{i}*{succ (n'#+n') } Un {i}*{n'#+n'} = {<i,n'#+n'>, <i,succ (n'#+n') >}")
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   126
    prefer 2 apply blast
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   127
  apply (simp add: domino.horiz)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   128
  apply (blast elim: mem_irrefl mem_asym)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   129
  done
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   130
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   131
lemma dominoes_tile_matrix: "[| m \<in> nat;  n \<in> nat |] ==> m * (n #+ n) \<in> tiling(domino)"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   132
  apply (induct_tac m)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   133
   apply (simp add: tiling.intros)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   134
  apply (simp add: Sigma_succ1)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   135
  apply (blast intro: tiling_UnI dominoes_tile_row elim: mem_irrefl)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   136
  done
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   137
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   138
lemma eq_lt_E: "[| x=y; x<y |] ==> P"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   139
  by auto
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   140
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   141
theorem mutil_not_tiling: "[| m \<in> nat;  n \<in> nat;
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   142
         t = (succ(m)#+succ(m))*(succ(n)#+succ(n));
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   143
         t' = t - {<0,0>} - {<succ(m#+m), succ(n#+n)>} |]
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   144
      ==> t' \<notin> tiling(domino)"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   145
  apply (rule notI)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   146
  apply (drule tiling_domino_0_1)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   147
  apply (erule_tac x = "|?A|" in eq_lt_E)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   148
  apply (subgoal_tac "t \<in> tiling (domino)")
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   149
   prefer 2 (*Requires a small simpset that won't move the succ applications*)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   150
   apply (simp only: nat_succI add_type dominoes_tile_matrix)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   151
  apply (simp add: evnodd_Diff mod2_add_self mod2_succ_succ tiling_domino_0_1 [symmetric])
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   152
  apply (rule lt_trans)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   153
   apply (rule Finite_imp_cardinal_Diff,
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   154
     simp add: tiling_domino_Finite Finite_evnodd Finite_Diff,
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   155
     simp add: evnodd_iff nat_0_le [THEN ltD] mod2_add_self)+
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   156
  done
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
   157
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
   158
end