src/ZF/upair.ML
author lcp
Fri, 17 Sep 1993 16:16:38 +0200
changeset 6 8ce8c4d13d4d
parent 0 a5a9c433f639
child 14 1c0926788772
permissions -rw-r--r--
Installation of new simplifier for ZF. Deleted all congruence rules not involving local assumptions. NB the congruence rules for Sigma and Pi (dependent type constructions) cause difficulties and are not used by default.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	ZF/upair
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     3
    Author: 	Lawrence C Paulson, Cambridge University Computer Laboratory
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1991  University of Cambridge
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
UNORDERED pairs in Zermelo-Fraenkel Set Theory 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
Observe the order of dependence:
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
    Upair is defined in terms of Replace
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
    Un is defined in terms of Upair and Union (similarly for Int)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
    cons is defined in terms of Upair and Un
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
    Ordered pairs and descriptions are defined using cons ("set notation")
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
(*** Lemmas about power sets  ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
val Pow_bottom = empty_subsetI RS PowI;		(* 0 : Pow(B) *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
val Pow_top = subset_refl RS PowI;		(* A : Pow(A) *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
val Pow_neq_0 = Pow_top RSN (2,equals0D);	(* Pow(a)=0 ==> P *) 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
(*** Unordered pairs - Upair ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
val pairing = prove_goalw ZF.thy [Upair_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
    "c : Upair(a,b) <-> (c=a | c=b)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
 (fn _ => [ (fast_tac (lemmas_cs addEs [Pow_neq_0, sym RS Pow_neq_0]) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
val UpairI1 = prove_goal ZF.thy "a : Upair(a,b)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
 (fn _ => [ (rtac (refl RS disjI1 RS (pairing RS iffD2)) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
val UpairI2 = prove_goal ZF.thy "b : Upair(a,b)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
 (fn _ => [ (rtac (refl RS disjI2 RS (pairing RS iffD2)) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
val UpairE = prove_goal ZF.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
    "[| a : Upair(b,c);  a=b ==> P;  a=c ==> P |] ==> P"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
 (fn major::prems=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
  [ (rtac (major RS (pairing RS iffD1 RS disjE)) 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
    (REPEAT (eresolve_tac prems 1)) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
(*** Rules for binary union -- Un -- defined via Upair ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
val UnI1 = prove_goalw ZF.thy [Un_def] "c : A ==> c : A Un B"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
 (fn [prem]=> [ (rtac (prem RS (UpairI1 RS UnionI)) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
val UnI2 = prove_goalw ZF.thy [Un_def] "c : B ==> c : A Un B"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
 (fn [prem]=> [ (rtac (prem RS (UpairI2 RS UnionI)) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
val UnE = prove_goalw ZF.thy [Un_def] 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
    "[| c : A Un B;  c:A ==> P;  c:B ==> P |] ==> P"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
 (fn major::prems=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
  [ (rtac (major RS UnionE) 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
    (etac UpairE 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
    (REPEAT (EVERY1 [resolve_tac prems, etac subst, assume_tac])) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
val Un_iff = prove_goal ZF.thy "c : A Un B <-> (c:A | c:B)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
 (fn _ => [ (fast_tac (lemmas_cs addIs [UnI1,UnI2] addSEs [UnE]) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
(*Classical introduction rule: no commitment to A vs B*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
val UnCI = prove_goal ZF.thy "(~c : B ==> c : A) ==> c : A Un B"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
 (fn [prem]=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
  [ (rtac (disjCI RS (Un_iff RS iffD2)) 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
    (etac prem 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
(*** Rules for small intersection -- Int -- defined via Upair ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
val IntI = prove_goalw ZF.thy [Int_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
    "[| c : A;  c : B |] ==> c : A Int B"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
 (fn prems=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
  [ (REPEAT (resolve_tac (prems @ [UpairI1,InterI]) 1
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
     ORELSE eresolve_tac [UpairE, ssubst] 1)) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    72
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    73
val IntD1 = prove_goalw ZF.thy [Int_def] "c : A Int B ==> c : A"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
 (fn [major]=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
  [ (rtac (UpairI1 RS (major RS InterD)) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    76
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    77
val IntD2 = prove_goalw ZF.thy [Int_def] "c : A Int B ==> c : B"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    78
 (fn [major]=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
  [ (rtac (UpairI2 RS (major RS InterD)) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    81
val IntE = prove_goal ZF.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    82
    "[| c : A Int B;  [| c:A; c:B |] ==> P |] ==> P"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    83
 (fn prems=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    84
  [ (resolve_tac prems 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
    (REPEAT (resolve_tac (prems RL [IntD1,IntD2]) 1)) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    87
val Int_iff = prove_goal ZF.thy "c : A Int B <-> (c:A & c:B)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
 (fn _ => [ (fast_tac (lemmas_cs addSIs [IntI] addSEs [IntE]) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    90
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
(*** Rules for set difference -- defined via Upair ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    92
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
val DiffI = prove_goalw ZF.thy [Diff_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    94
    "[| c : A;  ~ c : B |] ==> c : A - B"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    95
 (fn prems=> [ (REPEAT (resolve_tac (prems @ [CollectI]) 1)) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
val DiffD1 = prove_goalw ZF.thy [Diff_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    98
    "c : A - B ==> c : A"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
 (fn [major]=> [ (rtac (major RS CollectD1) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   101
val DiffD2 = prove_goalw ZF.thy [Diff_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
    "[| c : A - B;  c : B |] ==> P"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
 (fn [major,minor]=> [ (rtac (minor RS (major RS CollectD2 RS notE)) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
val DiffE = prove_goal ZF.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
    "[| c : A - B;  [| c:A; ~ c:B |] ==> P |] ==> P"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
 (fn prems=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   108
  [ (resolve_tac prems 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   109
    (REPEAT (ares_tac (prems RL [DiffD1, DiffD2 RS notI]) 1)) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   110
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   111
val Diff_iff = prove_goal ZF.thy "c : A-B <-> (c:A & ~ c:B)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   112
 (fn _ => [ (fast_tac (lemmas_cs addSIs [DiffI] addSEs [DiffE]) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   113
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
(*** Rules for cons -- defined via Un and Upair ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   115
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   116
val consI1 = prove_goalw ZF.thy [cons_def] "a : cons(a,B)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   117
 (fn _ => [ (rtac (UpairI1 RS UnI1) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   118
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   119
val consI2 = prove_goalw ZF.thy [cons_def] "a : B ==> a : cons(b,B)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   120
 (fn [prem]=> [ (rtac (prem RS UnI2) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   121
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   122
val consE = prove_goalw ZF.thy [cons_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   123
    "[| a : cons(b,A);  a=b ==> P;  a:A ==> P |] ==> P"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   124
 (fn major::prems=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   125
  [ (rtac (major RS UnE) 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   126
    (REPEAT (eresolve_tac (prems @ [UpairE]) 1)) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   127
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   128
val cons_iff = prove_goal ZF.thy "a : cons(b,A) <-> (a=b | a:A)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   129
 (fn _ => [ (fast_tac (lemmas_cs addIs [consI1,consI2] addSEs [consE]) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   130
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   131
(*Classical introduction rule*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   132
val consCI = prove_goal ZF.thy "(~ a:B ==> a=b) ==> a: cons(b,B)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   133
 (fn [prem]=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   134
  [ (rtac (disjCI RS (cons_iff RS iffD2)) 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   135
    (etac prem 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   136
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   137
(*** Singletons - using cons ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   138
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   139
val singletonI = prove_goal ZF.thy "a : {a}"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   140
 (fn _=> [ (rtac consI1 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   141
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   142
val singletonE = prove_goal ZF.thy "[| a: {b};  a=b ==> P |] ==> P"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   143
 (fn major::prems=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   144
  [ (rtac (major RS consE) 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   145
    (REPEAT (eresolve_tac (prems @ [emptyE]) 1)) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   146
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   147
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   148
(*** Rules for Descriptions ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   149
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   150
val the_equality = prove_goalw ZF.thy [the_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   151
    "[| P(a);  !!x. P(x) ==> x=a |] ==> (THE x. P(x)) = a"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   152
 (fn prems=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   153
  [ (fast_tac (lemmas_cs addIs ([equalityI,singletonI]@prems) 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   154
	                 addEs (prems RL [subst])) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   155
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   156
(* Only use this if you already know EX!x. P(x) *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   157
val the_equality2 = prove_goal ZF.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   158
    "[| EX! x. P(x);  P(a) |] ==> (THE x. P(x)) = a"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   159
 (fn major::prems=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   160
  [ (rtac the_equality 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   161
    (rtac (major RS ex1_equalsE) 2),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   162
    (REPEAT (ares_tac prems 1)) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   163
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   164
val theI = prove_goal ZF.thy "EX! x. P(x) ==> P(THE x. P(x))"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   165
 (fn [major]=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   166
  [ (rtac (major RS ex1E) 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   167
    (resolve_tac [major RS the_equality2 RS ssubst] 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   168
    (REPEAT (assume_tac 1)) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   169
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   170
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   171
(*** if -- a conditional expression for formulae ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   172
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   173
goalw ZF.thy [if_def] "if(True,a,b) = a";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   174
by (fast_tac (lemmas_cs addIs [the_equality]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   175
val if_true = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   176
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   177
goalw ZF.thy [if_def] "if(False,a,b) = b";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   178
by (fast_tac (lemmas_cs addIs [the_equality]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   179
val if_false = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   180
6
8ce8c4d13d4d Installation of new simplifier for ZF. Deleted all congruence rules not
lcp
parents: 0
diff changeset
   181
(*Never use with case splitting, or if P is known to be true or false*)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   182
val prems = goalw ZF.thy [if_def]
6
8ce8c4d13d4d Installation of new simplifier for ZF. Deleted all congruence rules not
lcp
parents: 0
diff changeset
   183
    "[| P<->Q;  Q ==> a=c;  ~Q ==> b=d |] ==> if(P,a,b) = if(Q,c,d)";
8ce8c4d13d4d Installation of new simplifier for ZF. Deleted all congruence rules not
lcp
parents: 0
diff changeset
   184
by (simp_tac (FOL_ss addsimps prems addcongs [conj_cong]) 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   185
val if_cong = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   186
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   187
(*Not needed for rewriting, since P would rewrite to True anyway*)
6
8ce8c4d13d4d Installation of new simplifier for ZF. Deleted all congruence rules not
lcp
parents: 0
diff changeset
   188
goalw ZF.thy [if_def] "!!P. P ==> if(P,a,b) = a";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   189
by (fast_tac (lemmas_cs addSIs [the_equality]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   190
val if_P = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   191
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   192
(*Not needed for rewriting, since P would rewrite to False anyway*)
6
8ce8c4d13d4d Installation of new simplifier for ZF. Deleted all congruence rules not
lcp
parents: 0
diff changeset
   193
goalw ZF.thy [if_def] "!!P. ~P ==> if(P,a,b) = b";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   194
by (fast_tac (lemmas_cs addSIs [the_equality]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   195
val if_not_P = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   196
6
8ce8c4d13d4d Installation of new simplifier for ZF. Deleted all congruence rules not
lcp
parents: 0
diff changeset
   197
val if_ss = FOL_ss addsimps  [if_true,if_false];
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   198
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   199
val expand_if = prove_goal ZF.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   200
    "P(if(Q,x,y)) <-> ((Q --> P(x)) & (~Q --> P(y)))"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   201
 (fn _=> [ (res_inst_tac [("Q","Q")] (excluded_middle RS disjE) 1),
6
8ce8c4d13d4d Installation of new simplifier for ZF. Deleted all congruence rules not
lcp
parents: 0
diff changeset
   202
	   (asm_simp_tac if_ss 1),
8ce8c4d13d4d Installation of new simplifier for ZF. Deleted all congruence rules not
lcp
parents: 0
diff changeset
   203
	   (asm_simp_tac if_ss 1) ]);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   204
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   205
val prems = goal ZF.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   206
    "[| P ==> a: A;  ~P ==> b: A |] ==> if(P,a,b): A";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   207
by (res_inst_tac [("Q","P")] (excluded_middle RS disjE) 1);
6
8ce8c4d13d4d Installation of new simplifier for ZF. Deleted all congruence rules not
lcp
parents: 0
diff changeset
   208
by (ALLGOALS (asm_simp_tac (if_ss addsimps prems)));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   209
val if_type = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   210
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   211
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   212
(*** Foundation lemmas ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   213
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   214
val mem_anti_sym = prove_goal ZF.thy "[| a:b;  b:a |] ==> P"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   215
 (fn prems=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   216
  [ (rtac disjE 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   217
    (res_inst_tac [("A","{a,b}")] foundation 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   218
    (etac equals0D 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   219
    (rtac consI1 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   220
    (fast_tac (lemmas_cs addIs (prems@[consI1,consI2]) 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   221
		         addSEs [consE,equalityE]) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   222
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   223
val mem_anti_refl = prove_goal ZF.thy "a:a ==> P"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   224
 (fn [major]=> [ (rtac (major RS (major RS mem_anti_sym)) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   225
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   226
val mem_not_refl = prove_goal ZF.thy "~ a:a"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   227
 (K [ (rtac notI 1), (etac mem_anti_refl 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   228
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   229
(*** Rules for succ ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   230
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   231
val succI1 = prove_goalw ZF.thy [succ_def] "i : succ(i)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   232
 (fn _=> [ (rtac consI1 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   233
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   234
val succI2 = prove_goalw ZF.thy [succ_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   235
    "i : j ==> i : succ(j)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   236
 (fn [prem]=> [ (rtac (prem RS consI2) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   237
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   238
(*Classical introduction rule*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   239
val succCI = prove_goalw ZF.thy [succ_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   240
   "(~ i:j ==> i=j) ==> i: succ(j)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   241
 (fn prems=> [ (rtac consCI 1), (eresolve_tac prems 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   242
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   243
val succE = prove_goalw ZF.thy [succ_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   244
    "[| i : succ(j);  i=j ==> P;  i:j ==> P |] ==> P"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   245
 (fn major::prems=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   246
  [ (rtac (major RS consE) 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   247
    (REPEAT (eresolve_tac prems 1)) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   248
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   249
val succ_neq_0 = prove_goal ZF.thy "succ(n)=0 ==> P"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   250
 (fn [major]=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   251
  [ (rtac (major RS equalityD1 RS subsetD RS emptyE) 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   252
    (rtac succI1 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   253
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   254
(*Useful for rewriting*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   255
val succ_not_0 = prove_goal ZF.thy "~ succ(n)=0"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   256
 (fn _=> [ (rtac notI 1), (etac succ_neq_0 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   257
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   258
(* succ(c) <= B ==> c : B *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   259
val succ_subsetD = succI1 RSN (2,subsetD);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   260
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   261
val succ_inject = prove_goal ZF.thy "succ(m) = succ(n) ==> m=n"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   262
 (fn [major]=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   263
  [ (rtac (major RS equalityE) 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   264
    (REPEAT (eresolve_tac [asm_rl, sym, succE, make_elim succ_subsetD,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   265
			   mem_anti_sym] 1)) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   266
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   267
val succ_inject_iff = prove_goal ZF.thy "succ(m) = succ(n) <-> m=n"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   268
 (fn _=> [ (fast_tac (FOL_cs addSEs [succ_inject]) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   269
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   270
(*UpairI1/2 should become UpairCI;  mem_anti_refl as a hazE? *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   271
val upair_cs = lemmas_cs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   272
  addSIs [singletonI, DiffI, IntI, UnCI, consCI, succCI, UpairI1,UpairI2]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   273
  addSEs [singletonE, DiffE, IntE, UnE, consE, succE, UpairE];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   274