TFL/WF1.ML
author paulson
Fri, 18 Oct 1996 12:41:04 +0200
changeset 2112 3902e9af752f
permissions -rw-r--r--
Konrad Slind's TFL
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2112
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     1
(*  Title: 	HOL/WF.ML
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     2
    ID:         $Id$
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     3
    Author: 	Konrad Slind
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     4
    Copyright   1996  TU Munich
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     5
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     6
For WF1.thy.  
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     7
*)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     8
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
     9
open WF1;
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    10
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    11
(* TFL variants *)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    12
goal WF.thy
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    13
    "!R. wf R --> (!P. (!x. (!y. (y,x):R --> P y) --> P x) --> (!x. P x))";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    14
by (strip_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    15
by (res_inst_tac [("r","R"),("P","P"), ("a","x")] wf_induct 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    16
by (assume_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    17
by (fast_tac HOL_cs 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    18
qed"tfl_wf_induct";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    19
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    20
goal WF.thy "!f R. (x,a):R --> (cut f R a)(x) = f(x)";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    21
by (strip_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    22
by (rtac cut_apply 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    23
by (assume_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    24
qed"tfl_cut_apply";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    25
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    26
goal WF.thy "!M R f. (f=wfrec R M) --> wf R --> (!x. f x = M (cut f R x) x)";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    27
by (strip_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    28
by (res_inst_tac [("r","R"), ("H","M"),
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    29
                  ("a","x"), ("f","f")] (eq_reflection RS def_wfrec) 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    30
by (assume_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    31
by (assume_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    32
qed "tfl_wfrec";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    33
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    34
(*----------------------------------------------------------------------------
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    35
 * Proof that the inverse image into a wellfounded relation is wellfounded.
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    36
 * The proof is relatively sloppy - I map to another version of 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    37
 * wellfoundedness (every n.e. set has an R-minimal element) and transport 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    38
 * the proof for that formulation over. I also didn't remember the existence
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    39
 *  of "set_cs" so no doubt the proof can be dramatically shortened!
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    40
 *---------------------------------------------------------------------------*)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    41
goal HOL.thy "(~(!x. P x)) = (? x. ~(P x))";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    42
by (fast_tac HOL_cs 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    43
val th1 = result();
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    44
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    45
goal HOL.thy "(~(? x. P x)) = (!x. ~(P x))";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    46
by (fast_tac HOL_cs 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    47
val th2 = result();
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    48
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    49
goal HOL.thy "(~(x-->y)) = (x & (~ y))";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    50
by (fast_tac HOL_cs 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    51
val th3 = result();
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    52
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    53
goal HOL.thy "((~ x) | y) = (x --> y)";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    54
by (fast_tac HOL_cs 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    55
val th4 = result();
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    56
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    57
goal HOL.thy "(~(x & y)) = ((~ x) | (~ y))";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    58
by (fast_tac HOL_cs 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    59
val th5 = result();
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    60
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    61
goal HOL.thy "(~(x | y)) = ((~ x) & (~ y))";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    62
by (fast_tac HOL_cs 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    63
val th6 = result();
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    64
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    65
goal HOL.thy "(~(~x)) = x";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    66
by (fast_tac HOL_cs 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    67
val th7 = result();
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    68
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    69
(* Using [th1,th2,th3,th4,th5,th6,th7] as rewrites drives negation inwards. *)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    70
val NNF_rews = map (fn th => th RS eq_reflection)[th1,th2,th3,th4,th5,th6,th7];
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    71
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    72
(* The name "contrapos" is already taken. *)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    73
goal HOL.thy "(P --> Q) = ((~ Q) --> (~ P))";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    74
by (fast_tac HOL_cs 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    75
val ol_contrapos = result();
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    76
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    77
(* Maps to another version of wellfoundedness *)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    78
val [p1] = goalw WF.thy [wf_def]
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    79
"wf(R) ==> (!Q. (? x. Q x) --> (? min. Q min & (!b. (b,min):R --> (~ Q b))))";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    80
by (rtac allI 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    81
by (rtac (ol_contrapos RS ssubst) 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    82
by (rewrite_tac NNF_rews);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    83
by (rtac impI 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    84
by (rtac ((p1 RS spec) RS mp) 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    85
by (fast_tac HOL_cs 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    86
val wf_minimal = result();
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    87
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    88
goalw WF.thy [wf_def]
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    89
"(!Q. (? x. Q x) --> (? min. Q min & (!b. (b,min):R --> (~ Q b)))) --> wf R";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    90
by (rtac impI 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    91
by (rtac allI 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    92
by (rtac (ol_contrapos RS ssubst) 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    93
by (rewrite_tac NNF_rews);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    94
by (rtac impI 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    95
by (etac allE 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    96
by (dtac mp 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    97
by (assume_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    98
by (fast_tac HOL_cs 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
    99
val minimal_wf = result();
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   100
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   101
val wf_eq_minimal = 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   102
  standard ((wf_minimal COMP ((minimal_wf RS mp) COMP iffI)) RS sym);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   103
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   104
goalw WF1.thy [inv_image_def,wf_eq_minimal RS eq_reflection] 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   105
"wf(R) --> wf(inv_image R (f::'a=>'b))"; 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   106
by (strip_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   107
by (etac exE 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   108
by (subgoal_tac "? (w::'b). ? (x::'a). Q x & (f x = w)" 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   109
by (rtac exI 2);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   110
by (rtac exI 2);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   111
by (rtac conjI 2);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   112
by (assume_tac 2);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   113
by (rtac refl 2);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   114
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   115
by (etac allE 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   116
by (dtac mp 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   117
by (assume_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   118
by (eres_inst_tac [("P","? min. (? x. Q x & f x = min) & \
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   119
                \ (! b. (b, min) : R --> ~ (? x. Q x & f x = b))")] rev_mp 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   120
by (etac thin_rl 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   121
by (etac thin_rl 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   122
by (rewrite_tac NNF_rews);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   123
by (rtac impI 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   124
by (etac exE 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   125
by (etac conjE 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   126
by (etac exE 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   127
by (rtac exI 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   128
by (etac conjE 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   129
by (rtac conjI 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   130
by (assume_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   131
by (hyp_subst_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   132
by (rtac allI 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   133
by (rtac impI 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   134
by (etac CollectE 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   135
by (etac allE 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   136
by (dtac mp 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   137
by (rewrite_tac[fst_conv RS eq_reflection,snd_conv RS eq_reflection]);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   138
by (assume_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   139
by (fast_tac HOL_cs 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   140
val wf_inv_image = result() RS mp;
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   141
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   142
(* from Nat.ML *)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   143
goalw WF1.thy [wf_def] "wf(pred_nat)";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   144
by (strip_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   145
by (nat_ind_tac "x" 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   146
by (fast_tac (HOL_cs addSEs [mp, pred_natE, Pair_inject, 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   147
                             make_elim Suc_inject]) 2);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   148
by (fast_tac (HOL_cs addSEs [mp, pred_natE, Pair_inject, Zero_neq_Suc]) 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   149
val wf_pred_nat = result();
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   150
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   151
goalw WF1.thy [wf_def,pred_list_def] "wf(pred_list)";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   152
by (strip_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   153
by (List.list.induct_tac "x" 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   154
by (etac allE 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   155
by (etac impE 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   156
by (assume_tac 2);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   157
by (strip_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   158
by (etac CollectE 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   159
by (asm_full_simp_tac (!simpset) 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   160
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   161
by (etac allE 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   162
by (etac impE 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   163
by (assume_tac 2);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   164
by (strip_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   165
by (etac CollectE 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   166
by (etac exE 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   167
by (asm_full_simp_tac (!simpset) 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   168
by (etac conjE 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   169
by (hyp_subst_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   170
by (assume_tac 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   171
qed "wf_pred_list";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   172
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   173
(*----------------------------------------------------------------------------
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   174
 * All measures are wellfounded.
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   175
 *---------------------------------------------------------------------------*)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   176
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   177
goalw WF1.thy [measure_def] "wf (measure f)";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   178
by (rtac wf_inv_image 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   179
by (rtac wf_trancl 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   180
by (rtac wf_pred_nat 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   181
qed "wf_measure";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   182
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   183
(*----------------------------------------------------------------------------
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   184
 * Wellfoundedness of lexicographic combinations
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   185
 *---------------------------------------------------------------------------*)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   186
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   187
val prems = goal Prod.thy "!a b. P((a,b)) ==> !p. P(p)";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   188
by (cut_facts_tac prems 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   189
by (rtac allI 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   190
by (rtac (surjective_pairing RS ssubst) 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   191
by (fast_tac HOL_cs 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   192
qed "split_all_pair";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   193
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   194
val [wfa,wfb] = goalw WF1.thy [wf_def,lex_prod_def]
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   195
 "[| wf(ra); wf(rb) |] ==> wf(ra**rb)";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   196
by (EVERY1 [rtac allI,rtac impI, rtac split_all_pair]);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   197
by (rtac (wfa RS spec RS mp) 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   198
by (EVERY1 [rtac allI,rtac impI]);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   199
by (rtac (wfb RS spec RS mp) 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   200
by (fast_tac (set_cs addSEs [Pair_inject]) 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   201
qed "wf_lex_prod";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   202
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   203
(*----------------------------------------------------------------------------
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   204
 * Wellfoundedness of relational product
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   205
 *---------------------------------------------------------------------------*)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   206
val [wfa,wfb] = goalw WF1.thy [wf_def,rprod_def]
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   207
 "[| wf(ra); wf(rb) |] ==> wf(rprod ra rb)";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   208
by (EVERY1 [rtac allI,rtac impI, rtac split_all_pair]);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   209
by (rtac (wfa RS spec RS mp) 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   210
by (EVERY1 [rtac allI,rtac impI]);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   211
by (rtac (wfb RS spec RS mp) 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   212
by (fast_tac (set_cs addSEs [Pair_inject]) 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   213
qed "wf_rel_prod";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   214
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   215
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   216
(*---------------------------------------------------------------------------
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   217
 * Wellfoundedness of subsets
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   218
 *---------------------------------------------------------------------------*)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   219
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   220
goalw WF1.thy [wf_eq_minimal RS eq_reflection] 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   221
     "wf(r) --> (!x y. (x,y):p --> (x,y):r) --> wf(p)";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   222
by (fast_tac set_cs 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   223
qed "wf_subset";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   224
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   225
(*---------------------------------------------------------------------------
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   226
 * Wellfoundedness of the empty relation.
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   227
 *---------------------------------------------------------------------------*)
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   228
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   229
goalw WF1.thy [wf_eq_minimal RS eq_reflection,emptyr_def] 
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   230
     "wf(emptyr)";
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   231
by (fast_tac set_cs 1);
3902e9af752f Konrad Slind's TFL
paulson
parents:
diff changeset
   232
qed "wf_emptyr";