src/ZF/Induct/Mutil.thy
author wenzelm
Wed, 13 Jul 2005 16:07:35 +0200
changeset 16813 67140ae50e77
parent 16417 9bc16273c2d4
child 18415 eb68dc98bda2
permissions -rw-r--r--
removed ad-hoc atp_hook, cal_atp; removed depth_of; tuned;
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
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 12185
diff changeset
     9
theory Mutil imports Main begin
12173
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
12185
wenzelm
parents: 12173
diff changeset
    40
subsection {* Basic properties of evnodd *}
12173
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
12185
wenzelm
parents: 12173
diff changeset
    66
subsection {* Dominoes *}
12173
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
12185
wenzelm
parents: 12173
diff changeset
    71
lemma domino_singleton:
wenzelm
parents: 12173
diff changeset
    72
    "[| d \<in> domino; b<2 |] ==> \<exists>i' j'. evnodd(d,b) = {<i',j'>}"
12173
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    73
  apply (erule domino.cases)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    74
   apply (rule_tac [2] k1 = "i#+j" in mod2_cases [THEN disjE])
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    75
     apply (rule_tac k1 = "i#+j" in mod2_cases [THEN disjE])
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    76
       apply (rule add_type | assumption)+
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    77
      (*Four similar cases: case (i#+j) mod 2 = b, 2#-b, ...*)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    78
      apply (auto simp add: mod_succ succ_neq_self dest: ltD)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    79
  done
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    80
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
    81
12185
wenzelm
parents: 12173
diff changeset
    82
subsection {* Tilings *}
12173
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    83
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    84
text {* The union of two disjoint tilings is a tiling *}
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    85
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    86
lemma tiling_UnI:
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    87
    "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
    88
  apply (induct set: tiling)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    89
   apply (simp add: tiling.intros)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    90
  apply (simp add: Un_assoc subset_empty_iff [THEN iff_sym])
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    91
  apply (blast intro: tiling.intros)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    92
  done
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    93
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    94
lemma tiling_domino_Finite: "t \<in> tiling(domino) ==> Finite(t)"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    95
  apply (induct rule: tiling.induct)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    96
   apply (rule Finite_0)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    97
  apply (blast intro!: Finite_Un intro: domino_Finite)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    98
  done
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
    99
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   100
lemma tiling_domino_0_1: "t \<in> tiling(domino) ==> |evnodd(t,0)| = |evnodd(t,1)|"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   101
  apply (induct rule: tiling.induct)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   102
   apply (simp add: evnodd_def)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   103
  apply (rule_tac b1 = 0 in domino_singleton [THEN exE])
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   104
    prefer 2
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   105
    apply simp
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   106
   apply assumption
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   107
  apply (rule_tac b1 = 1 in domino_singleton [THEN exE])
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   108
    prefer 2
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   109
    apply simp
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   110
   apply assumption
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   111
  apply safe
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   112
  apply (subgoal_tac "\<forall>p b. p \<in> evnodd (a,b) --> p\<notin>evnodd (t,b)")
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   113
   apply (simp add: evnodd_Un Un_cons tiling_domino_Finite
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   114
     evnodd_subset [THEN subset_Finite] Finite_imp_cardinal_cons)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   115
  apply (blast dest!: evnodd_subset [THEN subsetD] elim: equalityE)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   116
  done
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
   117
12185
wenzelm
parents: 12173
diff changeset
   118
lemma dominoes_tile_row:
wenzelm
parents: 12173
diff changeset
   119
    "[| i \<in> nat;  n \<in> nat |] ==> {i} * (n #+ n) \<in> tiling(domino)"
12173
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   120
  apply (induct_tac n)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   121
   apply (simp add: tiling.intros)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   122
  apply (simp add: Un_assoc [symmetric] Sigma_succ2)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   123
  apply (rule tiling.intros)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   124
    prefer 2 apply assumption
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   125
   apply (rename_tac n')
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   126
   apply (subgoal_tac (*seems the easiest way of turning one to the other*)
12185
wenzelm
parents: 12173
diff changeset
   127
     "{i}*{succ (n'#+n') } Un {i}*{n'#+n'} =
wenzelm
parents: 12173
diff changeset
   128
       {<i,n'#+n'>, <i,succ (n'#+n') >}")
12173
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   129
    prefer 2 apply blast
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   130
  apply (simp add: domino.horiz)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   131
  apply (blast elim: mem_irrefl mem_asym)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   132
  done
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   133
12185
wenzelm
parents: 12173
diff changeset
   134
lemma dominoes_tile_matrix:
wenzelm
parents: 12173
diff changeset
   135
    "[| m \<in> nat;  n \<in> nat |] ==> m * (n #+ n) \<in> tiling(domino)"
12173
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   136
  apply (induct_tac m)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   137
   apply (simp add: tiling.intros)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   138
  apply (simp add: Sigma_succ1)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   139
  apply (blast intro: tiling_UnI dominoes_tile_row elim: mem_irrefl)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   140
  done
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   141
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   142
lemma eq_lt_E: "[| x=y; x<y |] ==> P"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   143
  by auto
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   144
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   145
theorem mutil_not_tiling: "[| m \<in> nat;  n \<in> nat;
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   146
         t = (succ(m)#+succ(m))*(succ(n)#+succ(n));
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   147
         t' = t - {<0,0>} - {<succ(m#+m), succ(n#+n)>} |]
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   148
      ==> t' \<notin> tiling(domino)"
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   149
  apply (rule notI)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   150
  apply (drule tiling_domino_0_1)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   151
  apply (erule_tac x = "|?A|" in eq_lt_E)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   152
  apply (subgoal_tac "t \<in> tiling (domino)")
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   153
   prefer 2 (*Requires a small simpset that won't move the succ applications*)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   154
   apply (simp only: nat_succI add_type dominoes_tile_matrix)
12185
wenzelm
parents: 12173
diff changeset
   155
  apply (simp add: evnodd_Diff mod2_add_self mod2_succ_succ
wenzelm
parents: 12173
diff changeset
   156
    tiling_domino_0_1 [symmetric])
12173
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   157
  apply (rule lt_trans)
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   158
   apply (rule Finite_imp_cardinal_Diff,
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   159
     simp add: tiling_domino_Finite Finite_evnodd Finite_Diff,
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   160
     simp add: evnodd_iff nat_0_le [THEN ltD] mod2_add_self)+
f3f7993ae6da converted;
wenzelm
parents: 12088
diff changeset
   161
  done
12088
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
   162
6f463d16cbd0 reorganization of the ZF examples
paulson
parents:
diff changeset
   163
end