src/ZF/upair.ML
author clasohm
Thu, 16 Sep 1993 12:20:38 +0200
changeset 0 a5a9c433f639
child 6 8ce8c4d13d4d
permissions -rw-r--r--
Initial revision
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
val the_cong = prove_goalw ZF.thy [the_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   171
    "[| !!y. P(y) <-> Q(y) |] ==> (THE x. P(x)) = (THE x. Q(x))"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   172
 (fn prems=> [ (prove_cong_tac (prems@[Replace_cong]) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   173
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   174
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   175
(*** if -- a conditional expression for formulae ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   176
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   177
goalw ZF.thy [if_def] "if(True,a,b) = a";
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_true = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   180
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   181
goalw ZF.thy [if_def] "if(False,a,b) = b";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   182
by (fast_tac (lemmas_cs addIs [the_equality]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   183
val if_false = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   184
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   185
val prems = goalw ZF.thy [if_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   186
    "[| P<->Q;  a=c;  b=d |] ==> if(P,a,b) = if(Q,c,d)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   187
by (REPEAT (resolve_tac (prems@[refl,the_cong]@FOL_congs) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   188
val if_cong = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   189
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   190
(*Not needed for rewriting, since P would rewrite to True anyway*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   191
val prems = goalw ZF.thy [if_def] "P ==> if(P,a,b) = a";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   192
by (cut_facts_tac prems 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   193
by (fast_tac (lemmas_cs addSIs [the_equality]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   194
val if_P = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   195
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   196
(*Not needed for rewriting, since P would rewrite to False anyway*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   197
val prems = goalw ZF.thy [if_def] "~P ==> if(P,a,b) = b";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   198
by (cut_facts_tac prems 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   199
by (fast_tac (lemmas_cs addSIs [the_equality]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   200
val if_not_P = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   201
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   202
val if_ss =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   203
    FOL_ss addcongs (if_cong :: mk_typed_congs ZF.thy [("P", "i=>o")]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   204
			      @ basic_ZF_congs)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   205
	   addrews  [if_true,if_false];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   206
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   207
val expand_if = prove_goal ZF.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   208
    "P(if(Q,x,y)) <-> ((Q --> P(x)) & (~Q --> P(y)))"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   209
 (fn _=> [ (res_inst_tac [("Q","Q")] (excluded_middle RS disjE) 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   210
	   (ASM_SIMP_TAC if_ss 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   211
	   (ASM_SIMP_TAC if_ss 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   212
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   213
val prems = goal ZF.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   214
    "[| P ==> a: A;  ~P ==> b: A |] ==> if(P,a,b): A";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   215
by (res_inst_tac [("Q","P")] (excluded_middle RS disjE) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   216
by (ALLGOALS (ASM_SIMP_TAC (if_ss addrews prems)));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   217
val if_type = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   218
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   219
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   220
(*** Foundation lemmas ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   221
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   222
val mem_anti_sym = prove_goal ZF.thy "[| a:b;  b:a |] ==> P"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   223
 (fn prems=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   224
  [ (rtac disjE 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   225
    (res_inst_tac [("A","{a,b}")] foundation 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   226
    (etac equals0D 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   227
    (rtac consI1 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   228
    (fast_tac (lemmas_cs addIs (prems@[consI1,consI2]) 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   229
		         addSEs [consE,equalityE]) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   230
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   231
val mem_anti_refl = prove_goal ZF.thy "a:a ==> P"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   232
 (fn [major]=> [ (rtac (major RS (major RS mem_anti_sym)) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   233
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   234
val mem_not_refl = prove_goal ZF.thy "~ a:a"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   235
 (K [ (rtac notI 1), (etac mem_anti_refl 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   236
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   237
(*** Rules for succ ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   238
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   239
val succI1 = prove_goalw ZF.thy [succ_def] "i : succ(i)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   240
 (fn _=> [ (rtac consI1 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   241
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   242
val succI2 = prove_goalw ZF.thy [succ_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   243
    "i : j ==> i : succ(j)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   244
 (fn [prem]=> [ (rtac (prem RS consI2) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   245
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   246
(*Classical introduction rule*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   247
val succCI = prove_goalw ZF.thy [succ_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   248
   "(~ i:j ==> i=j) ==> i: succ(j)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   249
 (fn prems=> [ (rtac consCI 1), (eresolve_tac prems 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   250
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   251
val succE = prove_goalw ZF.thy [succ_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   252
    "[| i : succ(j);  i=j ==> P;  i:j ==> P |] ==> P"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   253
 (fn major::prems=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   254
  [ (rtac (major RS consE) 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   255
    (REPEAT (eresolve_tac prems 1)) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   256
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   257
val succ_neq_0 = prove_goal ZF.thy "succ(n)=0 ==> P"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   258
 (fn [major]=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   259
  [ (rtac (major RS equalityD1 RS subsetD RS emptyE) 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   260
    (rtac succI1 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   261
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   262
(*Useful for rewriting*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   263
val succ_not_0 = prove_goal ZF.thy "~ succ(n)=0"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   264
 (fn _=> [ (rtac notI 1), (etac succ_neq_0 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   265
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   266
(* succ(c) <= B ==> c : B *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   267
val succ_subsetD = succI1 RSN (2,subsetD);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   268
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   269
val succ_inject = prove_goal ZF.thy "succ(m) = succ(n) ==> m=n"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   270
 (fn [major]=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   271
  [ (rtac (major RS equalityE) 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   272
    (REPEAT (eresolve_tac [asm_rl, sym, succE, make_elim succ_subsetD,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   273
			   mem_anti_sym] 1)) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   274
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   275
val succ_inject_iff = prove_goal ZF.thy "succ(m) = succ(n) <-> m=n"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   276
 (fn _=> [ (fast_tac (FOL_cs addSEs [succ_inject]) 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   277
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   278
(*UpairI1/2 should become UpairCI;  mem_anti_refl as a hazE? *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   279
val upair_cs = lemmas_cs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   280
  addSIs [singletonI, DiffI, IntI, UnCI, consCI, succCI, UpairI1,UpairI2]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   281
  addSEs [singletonE, DiffE, IntE, UnE, consE, succE, UpairE];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   282