| author | wenzelm | 
| Sun, 27 Feb 2000 15:22:14 +0100 | |
| changeset 8302 | da404f79c1fc | 
| parent 6070 | 032babd0120b | 
| child 9548 | 15bee2731e43 | 
| permissions | -rw-r--r-- | 
| 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  | 
||
120  | 
||
| 5137 | 121  | 
Goal "[| m: nat; n: nat; \  | 
| 1606 | 122  | 
\ t = (succ(m)#+succ(m))*(succ(n)#+succ(n)); \  | 
123  | 
\                   t' = t - {<0,0>} - {<succ(m#+m), succ(n#+n)>} |] ==> \
 | 
|
124  | 
\ t' ~: tiling(domino)";  | 
|
| 4152 | 125  | 
by (rtac notI 1);  | 
126  | 
by (dtac tiling_domino_0_1 1);  | 
|
| 1606 | 127  | 
by (subgoal_tac "|evnodd(t',0)| < |evnodd(t',1)|" 1);  | 
| 4091 | 128  | 
by (asm_full_simp_tac (simpset() addsimps [lt_not_refl]) 1);  | 
| 1606 | 129  | 
by (subgoal_tac "t : tiling(domino)" 1);  | 
| 1624 | 130  | 
(*Requires a small simpset that won't move the succ applications*)  | 
| 1606 | 131  | 
by (asm_simp_tac (ZF_ss addsimps [nat_succI, add_type,  | 
| 2469 | 132  | 
dominoes_tile_matrix]) 2);  | 
| 1606 | 133  | 
by (subgoal_tac "(m#+m)#+(n#+n) = (m#+n)#+(m#+n)" 1);  | 
| 4091 | 134  | 
by (asm_simp_tac (simpset() addsimps add_ac) 2);  | 
| 
4723
 
9e2609b1bfb1
Adapted proofs because of new simplification tactics.
 
nipkow 
parents: 
4152 
diff
changeset
 | 
135  | 
by (asm_lr_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";  |