| 1606 |      1 | (*  Title:      ZF/ex/Mutil
 | 
|  |      2 |     ID:         $Id$
 | 
|  |      3 |     Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
 | 
|  |      4 |     Copyright   1996  University of Cambridge
 | 
|  |      5 | 
 | 
|  |      6 | The Mutilated Checkerboard Problem, formalized inductively
 | 
|  |      7 | *)
 | 
|  |      8 | 
 | 
|  |      9 | open Mutil;
 | 
|  |     10 | 
 | 
|  |     11 | 
 | 
|  |     12 | (** Basic properties of evnodd **)
 | 
|  |     13 | 
 | 
| 5068 |     14 | Goalw [evnodd_def] "<i,j>: evnodd(A,b) <-> <i,j>: A & (i#+j) mod 2 = b";
 | 
| 2875 |     15 | by (Blast_tac 1);
 | 
| 1624 |     16 | qed "evnodd_iff";
 | 
| 1606 |     17 | 
 | 
| 5068 |     18 | Goalw [evnodd_def] "evnodd(A, b) <= A";
 | 
| 2875 |     19 | by (Blast_tac 1);
 | 
| 1606 |     20 | qed "evnodd_subset";
 | 
|  |     21 | 
 | 
|  |     22 | (* Finite(X) ==> Finite(evnodd(X,b)) *)
 | 
|  |     23 | bind_thm("Finite_evnodd", evnodd_subset RS subset_imp_lepoll RS lepoll_Finite);
 | 
|  |     24 | 
 | 
| 5068 |     25 | Goalw [evnodd_def] "evnodd(A Un B, b) = evnodd(A,b) Un evnodd(B,b)";
 | 
| 4091 |     26 | by (simp_tac (simpset() addsimps [Collect_Un]) 1);
 | 
| 1606 |     27 | qed "evnodd_Un";
 | 
|  |     28 | 
 | 
| 5068 |     29 | Goalw [evnodd_def] "evnodd(A - B, b) = evnodd(A,b) - evnodd(B,b)";
 | 
| 4091 |     30 | by (simp_tac (simpset() addsimps [Collect_Diff]) 1);
 | 
| 1606 |     31 | qed "evnodd_Diff";
 | 
|  |     32 | 
 | 
| 5068 |     33 | Goalw [evnodd_def]
 | 
| 1606 |     34 |     "evnodd(cons(<i,j>,C), b) = \
 | 
| 6068 |     35 | \    (if (i#+j) mod 2 = b then cons(<i,j>, evnodd(C,b)) else evnodd(C,b))";
 | 
| 5137 |     36 | by (asm_simp_tac (simpset() addsimps [evnodd_def, Collect_cons]) 1);
 | 
| 1606 |     37 | qed "evnodd_cons";
 | 
|  |     38 | 
 | 
| 5068 |     39 | Goalw [evnodd_def] "evnodd(0, b) = 0";
 | 
| 4091 |     40 | by (simp_tac (simpset() addsimps [evnodd_def]) 1);
 | 
| 1606 |     41 | qed "evnodd_0";
 | 
|  |     42 | 
 | 
| 2469 |     43 | Addsimps [evnodd_cons, evnodd_0];
 | 
| 1606 |     44 | 
 | 
|  |     45 | (*** Dominoes ***)
 | 
|  |     46 | 
 | 
| 5137 |     47 | Goal "d:domino ==> Finite(d)";
 | 
| 4091 |     48 | by (blast_tac (claset() addSIs [Finite_cons, Finite_0] addEs [domino.elim]) 1);
 | 
| 1606 |     49 | qed "domino_Finite";
 | 
|  |     50 | 
 | 
| 5137 |     51 | Goal "[| d:domino; b<2 |] ==> EX i' j'. evnodd(d,b) = {<i',j'>}";
 | 
| 1606 |     52 | by (eresolve_tac [domino.elim] 1);
 | 
|  |     53 | by (res_inst_tac [("k1", "i#+j")] (mod2_cases RS disjE) 2);
 | 
|  |     54 | by (res_inst_tac [("k1", "i#+j")] (mod2_cases RS disjE) 1);
 | 
|  |     55 | by (REPEAT_FIRST (ares_tac [add_type]));
 | 
|  |     56 | (*Four similar cases: case (i#+j) mod 2 = b, 2#-b, ...*)
 | 
| 5137 |     57 | by (REPEAT (asm_simp_tac (simpset() addsimps [mod_succ, succ_neq_self]) 1
 | 
|  |     58 | 	    THEN blast_tac (claset() addDs [ltD]) 1));
 | 
| 1606 |     59 | qed "domino_singleton";
 | 
|  |     60 | 
 | 
|  |     61 | 
 | 
|  |     62 | (*** Tilings ***)
 | 
|  |     63 | 
 | 
|  |     64 | (** The union of two disjoint tilings is a tiling **)
 | 
|  |     65 | 
 | 
| 5137 |     66 | Goal "t: tiling(A) ==> \
 | 
| 1630 |     67 | \              u: tiling(A) --> t Int u = 0 --> t Un u : tiling(A)";
 | 
| 1606 |     68 | by (etac tiling.induct 1);
 | 
| 4091 |     69 | by (simp_tac (simpset() addsimps tiling.intrs) 1);
 | 
|  |     70 | by (asm_full_simp_tac (simpset() addsimps [Un_assoc,
 | 
| 2875 |     71 | 					  subset_empty_iff RS iff_sym]) 1);
 | 
| 4091 |     72 | by (blast_tac (claset() addIs tiling.intrs) 1);
 | 
| 3732 |     73 | qed_spec_mp "tiling_UnI";
 | 
| 1606 |     74 | 
 | 
| 5137 |     75 | Goal "t:tiling(domino) ==> Finite(t)";
 | 
| 1606 |     76 | by (eresolve_tac [tiling.induct] 1);
 | 
| 4152 |     77 | by (rtac Finite_0 1);
 | 
| 4091 |     78 | by (blast_tac (claset() addSIs [Finite_Un] addIs [domino_Finite]) 1);
 | 
| 1606 |     79 | qed "tiling_domino_Finite";
 | 
|  |     80 | 
 | 
| 5137 |     81 | Goal "t: tiling(domino) ==> |evnodd(t,0)| = |evnodd(t,1)|";
 | 
| 1606 |     82 | by (eresolve_tac [tiling.induct] 1);
 | 
| 4091 |     83 | by (simp_tac (simpset() addsimps [evnodd_def]) 1);
 | 
| 1624 |     84 | by (res_inst_tac [("b1","0")] (domino_singleton RS exE) 1);
 | 
| 2469 |     85 | by (Simp_tac 2 THEN assume_tac 1);
 | 
| 1624 |     86 | by (res_inst_tac [("b1","1")] (domino_singleton RS exE) 1);
 | 
| 2469 |     87 | by (Simp_tac 2 THEN assume_tac 1);
 | 
| 5137 |     88 | by Safe_tac;
 | 
|  |     89 | by (subgoal_tac "ALL p b. p:evnodd(a,b) --> p~:evnodd(t,b)" 1);
 | 
|  |     90 | by (asm_simp_tac 
 | 
|  |     91 |     (simpset() addsimps [evnodd_Un, Un_cons, tiling_domino_Finite,
 | 
|  |     92 | 			 evnodd_subset RS subset_Finite,
 | 
|  |     93 | 			 Finite_imp_cardinal_cons]) 1);
 | 
|  |     94 | by (blast_tac (claset() addSDs [evnodd_subset RS subsetD]
 | 
|  |     95 |                         addEs [equalityE]) 1);
 | 
| 1606 |     96 | qed "tiling_domino_0_1";
 | 
|  |     97 | 
 | 
| 5137 |     98 | Goal "[| i: nat;  n: nat |] ==> {i} * (n #+ n) : tiling(domino)";
 | 
| 6070 |     99 | by (induct_tac "n" 1);
 | 
| 4091 |    100 | by (simp_tac (simpset() addsimps tiling.intrs) 1);
 | 
|  |    101 | by (asm_simp_tac (simpset() addsimps [Un_assoc RS sym, Sigma_succ2]) 1);
 | 
| 1606 |    102 | by (resolve_tac tiling.intrs 1);
 | 
|  |    103 | by (assume_tac 2);
 | 
| 6070 |    104 | by (rename_tac "n'" 1);
 | 
| 2469 |    105 | by (subgoal_tac    (*seems the easiest way of turning one to the other*)
 | 
| 6070 |    106 |     "{i}*{succ(n'#+n')} Un {i}*{n'#+n'} = {<i,n'#+n'>, <i,succ(n'#+n')>}" 1);
 | 
| 2875 |    107 | by (Blast_tac 2);
 | 
| 4091 |    108 | by (asm_simp_tac (simpset() addsimps [domino.horiz]) 1);
 | 
|  |    109 | by (blast_tac (claset() addEs [mem_irrefl, mem_asym]) 1);
 | 
| 1606 |    110 | qed "dominoes_tile_row";
 | 
|  |    111 | 
 | 
| 5137 |    112 | Goal "[| m: nat;  n: nat |] ==> m * (n #+ n) : tiling(domino)";
 | 
| 6070 |    113 | by (induct_tac "m" 1);
 | 
| 4091 |    114 | by (simp_tac (simpset() addsimps tiling.intrs) 1);
 | 
|  |    115 | by (asm_simp_tac (simpset() addsimps [Sigma_succ1]) 1);
 | 
|  |    116 | by (blast_tac (claset() addIs [tiling_UnI, dominoes_tile_row] 
 | 
| 1606 |    117 |                     addEs [mem_irrefl]) 1);
 | 
|  |    118 | qed "dominoes_tile_matrix";
 | 
|  |    119 | 
 | 
| 9548 |    120 | Goal "[| x=y; x<y |] ==> P";
 | 
|  |    121 | by Auto_tac;
 | 
|  |    122 | qed "eq_lt_E";
 | 
| 1606 |    123 | 
 | 
| 9548 |    124 | Goal "[| m: nat;  n: nat;                                 \
 | 
|  |    125 | \        t = (succ(m)#+succ(m))*(succ(n)#+succ(n));       \
 | 
|  |    126 | \        t' = t - {<0,0>} - {<succ(m#+m), succ(n#+n)>} |] \
 | 
|  |    127 | \     ==> t' ~: tiling(domino)";
 | 
| 4152 |    128 | by (rtac notI 1);
 | 
|  |    129 | by (dtac tiling_domino_0_1 1);
 | 
| 9548 |    130 | by (eres_inst_tac [("x", "|?A|")] eq_lt_E 1);
 | 
| 1606 |    131 | by (subgoal_tac "t : tiling(domino)" 1);
 | 
| 1624 |    132 | (*Requires a small simpset that won't move the succ applications*)
 | 
| 1606 |    133 | by (asm_simp_tac (ZF_ss addsimps [nat_succI, add_type, 
 | 
| 2469 |    134 |                                   dominoes_tile_matrix]) 2);
 | 
| 9548 |    135 | by (asm_full_simp_tac 
 | 
| 4091 |    136 |     (simpset() addsimps [evnodd_Diff, mod2_add_self,
 | 
| 2469 |    137 |                         mod2_succ_succ, tiling_domino_0_1 RS sym]) 1);
 | 
| 4152 |    138 | by (rtac lt_trans 1);
 | 
| 1606 |    139 | by (REPEAT
 | 
|  |    140 |     (rtac Finite_imp_cardinal_Diff 1 
 | 
|  |    141 |      THEN
 | 
| 4091 |    142 |      asm_simp_tac (simpset() addsimps [tiling_domino_Finite, Finite_evnodd, 
 | 
| 2469 |    143 |                                       Finite_Diff]) 1 
 | 
| 1606 |    144 |      THEN
 | 
| 4091 |    145 |      asm_simp_tac (simpset() addsimps [evnodd_iff, nat_0_le RS ltD, 
 | 
| 2469 |    146 |                                       mod2_add_self]) 1));
 | 
| 1606 |    147 | qed "mutil_not_tiling";
 |