src/ZF/WF.thy
author paulson
Wed, 26 Jun 2002 10:26:46 +0200
changeset 13248 ae66c22ed52e
parent 13219 7e44aa8a276e
child 13252 8c79a0dce4c0
permissions -rw-r--r--
new theorems
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
     1
(*  Title:      ZF/WF.thy
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
1478
2b8c2a7547ab expanded tabs
clasohm
parents: 1401
diff changeset
     3
    Author:     Tobias Nipkow and Lawrence C Paulson
435
ca5356bd315a Addition of cardinals and order types, various tidying
lcp
parents: 124
diff changeset
     4
    Copyright   1994  University of Cambridge
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
Well-founded Recursion
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
     7
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
     8
Derived first for transitive relations, and finally for arbitrary WF relations
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
     9
via wf_trancl and trans_trancl.
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    10
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    11
It is difficult to derive this general case directly, using r^+ instead of
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    12
r.  In is_recfun, the two occurrences of the relation must have the same
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    13
form.  Inserting r^+ in the_recfun or wftrec yields a recursion rule with
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    14
r^+ -`` {a} instead of r-``{a}.  This recursion rule is stronger in
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    15
principle, but harder to use, especially to prove wfrec_eclose_eq in
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    16
epsilon.ML.  Expanding out the definition of wftrec in wfrec would yield
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    17
a mess.
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    20
theory WF = Trancl + mono + equalities:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    21
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    22
constdefs
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    23
  wf           :: "i=>o"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    24
    (*r is a well-founded relation*)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    25
    "wf(r) == ALL Z. Z=0 | (EX x:Z. ALL y. <y,x>:r --> ~ y:Z)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    26
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    27
  wf_on        :: "[i,i]=>o"                      ("wf[_]'(_')")
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    28
    (*r is well-founded on A*)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    29
    "wf_on(A,r) == wf(r Int A*A)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    30
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    31
  is_recfun    :: "[i, i, [i,i]=>i, i] =>o"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    32
    "is_recfun(r,a,H,f) == (f = (lam x: r-``{a}. H(x, restrict(f, r-``{x}))))"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    33
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    34
  the_recfun   :: "[i, i, [i,i]=>i] =>i"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    35
    "the_recfun(r,a,H) == (THE f. is_recfun(r,a,H,f))"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    36
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    37
  wftrec :: "[i, i, [i,i]=>i] =>i"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    38
    "wftrec(r,a,H) == H(a, the_recfun(r,a,H))"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    39
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    40
  wfrec :: "[i, i, [i,i]=>i] =>i"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    41
    (*public version.  Does not require r to be transitive*)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    42
    "wfrec(r,a,H) == wftrec(r^+, a, %x f. H(x, restrict(f,r-``{x})))"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    43
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    44
  wfrec_on     :: "[i, i, i, [i,i]=>i] =>i"       ("wfrec[_]'(_,_,_')")
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    45
    "wfrec[A](r,a,H) == wfrec(r Int A*A, a, H)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    46
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    47
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    48
(*** Well-founded relations ***)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    49
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    50
(** Equivalences between wf and wf_on **)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    51
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    52
lemma wf_imp_wf_on: "wf(r) ==> wf[A](r)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    53
apply (unfold wf_def wf_on_def, clarify) (*needed for blast's efficiency*)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    54
apply blast
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    55
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    56
13248
ae66c22ed52e new theorems
paulson
parents: 13219
diff changeset
    57
lemma wf_on_imp_wf: "[|wf[A](r); r <= A*A|] ==> wf(r)";
ae66c22ed52e new theorems
paulson
parents: 13219
diff changeset
    58
by (simp add: wf_on_def subset_Int_iff)
ae66c22ed52e new theorems
paulson
parents: 13219
diff changeset
    59
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    60
lemma wf_on_field_imp_wf: "wf[field(r)](r) ==> wf(r)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    61
by (unfold wf_def wf_on_def, fast)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    62
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    63
lemma wf_iff_wf_on_field: "wf(r) <-> wf[field(r)](r)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    64
by (blast intro: wf_imp_wf_on wf_on_field_imp_wf)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    65
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    66
lemma wf_on_subset_A: "[| wf[A](r);  B<=A |] ==> wf[B](r)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    67
by (unfold wf_on_def wf_def, fast)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    68
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    69
lemma wf_on_subset_r: "[| wf[A](r); s<=r |] ==> wf[A](s)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    70
by (unfold wf_on_def wf_def, fast)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    71
13217
bc5dc2392578 new theorems
paulson
parents: 13203
diff changeset
    72
lemma wf_subset: "[|wf(s); r<=s|] ==> wf(r)"
bc5dc2392578 new theorems
paulson
parents: 13203
diff changeset
    73
by (simp add: wf_def, fast)
bc5dc2392578 new theorems
paulson
parents: 13203
diff changeset
    74
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    75
(** Introduction rules for wf_on **)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    76
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    77
lemma wf_onI:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    78
(*If every non-empty subset of A has an r-minimal element then wf[A](r).*)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    79
 assumes prem: "!!Z u. [| Z<=A;  u:Z;  ALL x:Z. EX y:Z. <y,x>:r |] ==> False"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    80
 shows         "wf[A](r)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    81
apply (unfold wf_on_def wf_def)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    82
apply (rule equals0I [THEN disjCI, THEN allI])
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    83
apply (rule_tac Z = "Z" in prem, blast+)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    84
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    85
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    86
(*If r allows well-founded induction over A then wf[A](r)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    87
  Premise is equivalent to
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    88
  !!B. ALL x:A. (ALL y. <y,x>: r --> y:B) --> x:B ==> A<=B  *)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    89
lemma wf_onI2:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    90
 assumes prem: "!!y B. [| ALL x:A. (ALL y:A. <y,x>:r --> y:B) --> x:B;   y:A |]
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    91
                       ==> y:B"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    92
 shows         "wf[A](r)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    93
apply (rule wf_onI)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    94
apply (rule_tac c=u in prem [THEN DiffE])
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    95
  prefer 3 apply blast 
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    96
 apply fast+
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    97
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    98
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
    99
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   100
(** Well-founded Induction **)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   101
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   102
(*Consider the least z in domain(r) Un {a} such that P(z) does not hold...*)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   103
lemma wf_induct:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   104
    "[| wf(r);
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   105
        !!x.[| ALL y. <y,x>: r --> P(y) |] ==> P(x)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   106
     |]  ==>  P(a)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   107
apply (unfold wf_def) 
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   108
apply (erule_tac x = "{z:domain (r) Un {a}. ~P (z) }" in allE)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   109
apply blast 
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   110
done
435
ca5356bd315a Addition of cardinals and order types, various tidying
lcp
parents: 124
diff changeset
   111
13203
fac77a839aa2 Tidying up. Mainly moving proofs from Main.thy to other (Isar) theory files.
paulson
parents: 13175
diff changeset
   112
(*fixed up for induct method*)
fac77a839aa2 Tidying up. Mainly moving proofs from Main.thy to other (Isar) theory files.
paulson
parents: 13175
diff changeset
   113
lemmas wf_induct = wf_induct [induct set: wf]
fac77a839aa2 Tidying up. Mainly moving proofs from Main.thy to other (Isar) theory files.
paulson
parents: 13175
diff changeset
   114
  and wf_induct_rule = wf_induct [rule_format, induct set: wf]
fac77a839aa2 Tidying up. Mainly moving proofs from Main.thy to other (Isar) theory files.
paulson
parents: 13175
diff changeset
   115
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   116
(*The form of this rule is designed to match wfI*)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   117
lemma wf_induct2:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   118
    "[| wf(r);  a:A;  field(r)<=A;
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   119
        !!x.[| x: A;  ALL y. <y,x>: r --> P(y) |] ==> P(x) |]
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   120
     ==>  P(a)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   121
apply (erule_tac P="a:A" in rev_mp)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   122
apply (erule_tac a=a in wf_induct, blast) 
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   123
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   124
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   125
lemma field_Int_square: "field(r Int A*A) <= A"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   126
by blast
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   127
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   128
lemma wf_on_induct:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   129
    "[| wf[A](r);  a:A;
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   130
        !!x.[| x: A;  ALL y:A. <y,x>: r --> P(y) |] ==> P(x)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   131
     |]  ==>  P(a)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   132
apply (unfold wf_on_def) 
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   133
apply (erule wf_induct2, assumption)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   134
apply (rule field_Int_square, blast)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   135
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   136
13219
7e44aa8a276e new lemma
paulson
parents: 13217
diff changeset
   137
text{*The assumption @{term "r \<subseteq> A*A"} justifies strengthening the induction
7e44aa8a276e new lemma
paulson
parents: 13217
diff changeset
   138
      hypothesis by removing the restriction to @{term A}.*}
7e44aa8a276e new lemma
paulson
parents: 13217
diff changeset
   139
lemma wf_on_induct2:
7e44aa8a276e new lemma
paulson
parents: 13217
diff changeset
   140
    "[| wf[A](r);  a:A;  r \<subseteq> A*A; 
7e44aa8a276e new lemma
paulson
parents: 13217
diff changeset
   141
        !!x.[| x: A;  ALL y. <y,x>: r --> P(y) |] ==> P(x)
7e44aa8a276e new lemma
paulson
parents: 13217
diff changeset
   142
     |]  ==>  P(a)"
7e44aa8a276e new lemma
paulson
parents: 13217
diff changeset
   143
by (rule wf_on_induct, assumption+, blast)
7e44aa8a276e new lemma
paulson
parents: 13217
diff changeset
   144
13203
fac77a839aa2 Tidying up. Mainly moving proofs from Main.thy to other (Isar) theory files.
paulson
parents: 13175
diff changeset
   145
(*fixed up for induct method*)
fac77a839aa2 Tidying up. Mainly moving proofs from Main.thy to other (Isar) theory files.
paulson
parents: 13175
diff changeset
   146
lemmas wf_on_induct = wf_on_induct [consumes 2, induct set: wf_on]
fac77a839aa2 Tidying up. Mainly moving proofs from Main.thy to other (Isar) theory files.
paulson
parents: 13175
diff changeset
   147
   and wf_on_induct_rule = 
fac77a839aa2 Tidying up. Mainly moving proofs from Main.thy to other (Isar) theory files.
paulson
parents: 13175
diff changeset
   148
	 wf_on_induct [rule_format, consumes 2, induct set: wf_on]
fac77a839aa2 Tidying up. Mainly moving proofs from Main.thy to other (Isar) theory files.
paulson
parents: 13175
diff changeset
   149
fac77a839aa2 Tidying up. Mainly moving proofs from Main.thy to other (Isar) theory files.
paulson
parents: 13175
diff changeset
   150
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   151
(*If r allows well-founded induction then wf(r)*)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   152
lemma wfI:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   153
    "[| field(r)<=A;
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   154
        !!y B. [| ALL x:A. (ALL y:A. <y,x>:r --> y:B) --> x:B;  y:A|]
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   155
               ==> y:B |]
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   156
     ==>  wf(r)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   157
apply (rule wf_on_subset_A [THEN wf_on_field_imp_wf])
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   158
apply (rule wf_onI2)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   159
 prefer 2 apply blast  
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   160
apply blast 
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   161
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   162
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   163
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   164
(*** Properties of well-founded relations ***)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   166
lemma wf_not_refl: "wf(r) ==> <a,a> ~: r"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   167
by (erule_tac a=a in wf_induct, blast)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   168
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   169
lemma wf_not_sym [rule_format]: "wf(r) ==> ALL x. <a,x>:r --> <x,a> ~: r"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   170
by (erule_tac a=a in wf_induct, blast)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   171
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   172
(* [| wf(r);  <a,x> : r;  ~P ==> <x,a> : r |] ==> P *)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   173
lemmas wf_asym = wf_not_sym [THEN swap, standard]
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   174
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   175
lemma wf_on_not_refl: "[| wf[A](r); a: A |] ==> <a,a> ~: r"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   176
apply (erule_tac a=a in wf_on_induct, assumption)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   177
apply blast
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   178
done
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   179
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   180
lemma wf_on_not_sym [rule_format]:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   181
     "[| wf[A](r);  a:A |] ==> ALL b:A. <a,b>:r --> <b,a>~:r"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   182
apply (erule_tac a=a in wf_on_induct, assumption)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   183
apply blast
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   184
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   185
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   186
lemma wf_on_asym:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   187
     "[| wf[A](r);  ~Z ==> <a,b> : r;
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   188
         <b,a> ~: r ==> Z; ~Z ==> a : A; ~Z ==> b : A |] ==> Z"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   189
by (blast dest: wf_on_not_sym); 
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   190
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   191
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   192
(*Needed to prove well_ordI.  Could also reason that wf[A](r) means
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   193
  wf(r Int A*A);  thus wf( (r Int A*A)^+ ) and use wf_not_refl *)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   194
lemma wf_on_chain3:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   195
     "[| wf[A](r); <a,b>:r; <b,c>:r; <c,a>:r; a:A; b:A; c:A |] ==> P"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   196
apply (subgoal_tac "ALL y:A. ALL z:A. <a,y>:r --> <y,z>:r --> <z,a>:r --> P",
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   197
       blast) 
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   198
apply (erule_tac a=a in wf_on_induct, assumption)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   199
apply blast
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   200
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   201
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   202
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   203
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   204
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   205
(*transitive closure of a WF relation is WF provided A is downwards closed*)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   206
lemma wf_on_trancl:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   207
    "[| wf[A](r);  r-``A <= A |] ==> wf[A](r^+)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   208
apply (rule wf_onI2)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   209
apply (frule bspec [THEN mp], assumption+)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   210
apply (erule_tac a = "y" in wf_on_induct, assumption)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   211
apply (blast elim: tranclE, blast) 
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   212
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   213
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   214
lemma wf_trancl: "wf(r) ==> wf(r^+)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   215
apply (simp add: wf_iff_wf_on_field)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   216
apply (rule wf_on_subset_A) 
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   217
 apply (erule wf_on_trancl)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   218
 apply blast 
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   219
apply (rule trancl_type [THEN field_rel_subset])
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   220
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   221
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   222
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   223
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   224
(** r-``{a} is the set of everything under a in r **)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   225
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   226
lemmas underI = vimage_singleton_iff [THEN iffD2, standard]
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   227
lemmas underD = vimage_singleton_iff [THEN iffD1, standard]
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   228
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   229
(** is_recfun **)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   230
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   231
lemma is_recfun_type: "is_recfun(r,a,H,f) ==> f: r-``{a} -> range(f)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   232
apply (unfold is_recfun_def)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   233
apply (erule ssubst)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   234
apply (rule lamI [THEN rangeI, THEN lam_type], assumption)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   235
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   236
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   237
lemma apply_recfun:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   238
    "[| is_recfun(r,a,H,f); <x,a>:r |] ==> f`x = H(x, restrict(f,r-``{x}))"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   239
apply (unfold is_recfun_def) 
13175
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 13165
diff changeset
   240
  txt{*replace f only on the left-hand side*}
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 13165
diff changeset
   241
apply (erule_tac P = "%x.?t(x) = ?u" in ssubst)
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 13165
diff changeset
   242
apply (simp add: underI); 
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   243
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   244
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   245
lemma is_recfun_equal [rule_format]:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   246
     "[| wf(r);  trans(r);  is_recfun(r,a,H,f);  is_recfun(r,b,H,g) |]
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   247
      ==> <x,a>:r --> <x,b>:r --> f`x=g`x"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   248
apply (frule_tac f = "f" in is_recfun_type)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   249
apply (frule_tac f = "g" in is_recfun_type)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   250
apply (simp add: is_recfun_def)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   251
apply (erule_tac a=x in wf_induct)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   252
apply (intro impI)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   253
apply (elim ssubst)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   254
apply (simp (no_asm_simp) add: vimage_singleton_iff restrict_def)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   255
apply (rule_tac t = "%z. H (?x,z) " in subst_context)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   256
apply (subgoal_tac "ALL y : r-``{x}. ALL z. <y,z>:f <-> <y,z>:g")
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   257
 apply (blast dest: transD)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   258
apply (simp add: apply_iff)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   259
apply (blast dest: transD intro: sym)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   260
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   261
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   262
lemma is_recfun_cut:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   263
     "[| wf(r);  trans(r);
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   264
         is_recfun(r,a,H,f);  is_recfun(r,b,H,g);  <b,a>:r |]
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   265
      ==> restrict(f, r-``{b}) = g"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   266
apply (frule_tac f = "f" in is_recfun_type)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   267
apply (rule fun_extension)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   268
  apply (blast dest: transD intro: restrict_type2)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   269
 apply (erule is_recfun_type, simp)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   270
apply (blast dest: transD intro: is_recfun_equal)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   271
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   272
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   273
(*** Main Existence Lemma ***)
435
ca5356bd315a Addition of cardinals and order types, various tidying
lcp
parents: 124
diff changeset
   274
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   275
lemma is_recfun_functional:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   276
     "[| wf(r); trans(r); is_recfun(r,a,H,f); is_recfun(r,a,H,g) |]  ==>  f=g"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   277
by (blast intro: fun_extension is_recfun_type is_recfun_equal)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   278
13248
ae66c22ed52e new theorems
paulson
parents: 13219
diff changeset
   279
lemma the_recfun_eq:
ae66c22ed52e new theorems
paulson
parents: 13219
diff changeset
   280
    "[| is_recfun(r,a,H,f);  wf(r);  trans(r) |] ==> the_recfun(r,a,H) = f"
ae66c22ed52e new theorems
paulson
parents: 13219
diff changeset
   281
apply (unfold the_recfun_def)
ae66c22ed52e new theorems
paulson
parents: 13219
diff changeset
   282
apply (blast intro: is_recfun_functional)
ae66c22ed52e new theorems
paulson
parents: 13219
diff changeset
   283
done
ae66c22ed52e new theorems
paulson
parents: 13219
diff changeset
   284
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   285
(*If some f satisfies is_recfun(r,a,H,-) then so does the_recfun(r,a,H) *)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   286
lemma is_the_recfun:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   287
    "[| is_recfun(r,a,H,f);  wf(r);  trans(r) |]
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   288
     ==> is_recfun(r, a, H, the_recfun(r,a,H))"
13248
ae66c22ed52e new theorems
paulson
parents: 13219
diff changeset
   289
by (simp add: the_recfun_eq)
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   290
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   291
lemma unfold_the_recfun:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   292
     "[| wf(r);  trans(r) |] ==> is_recfun(r, a, H, the_recfun(r,a,H))"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   293
apply (rule_tac a=a in wf_induct, assumption)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   294
apply (rename_tac a1) 
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   295
apply (rule_tac f = "lam y: r-``{a1}. wftrec (r,y,H)" in is_the_recfun)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   296
  apply typecheck
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   297
apply (unfold is_recfun_def wftrec_def)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   298
(*Applying the substitution: must keep the quantified assumption!!*)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   299
apply (rule lam_cong [OF refl]) 
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   300
apply (drule underD) 
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   301
apply (fold is_recfun_def)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   302
apply (rule_tac t = "%z. H(?x,z)" in subst_context)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   303
apply (rule fun_extension)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   304
  apply (blast intro: is_recfun_type)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   305
 apply (rule lam_type [THEN restrict_type2])
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   306
  apply blast
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   307
 apply (blast dest: transD)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   308
apply (frule spec [THEN mp], assumption)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   309
apply (subgoal_tac "<xa,a1> : r")
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   310
 apply (drule_tac x1 = "xa" in spec [THEN mp], assumption)
13175
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 13165
diff changeset
   311
apply (simp add: vimage_singleton_iff 
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   312
                 apply_recfun is_recfun_cut)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   313
apply (blast dest: transD)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   314
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   315
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   316
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   317
(*** Unfolding wftrec ***)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   318
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   319
lemma the_recfun_cut:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   320
     "[| wf(r);  trans(r);  <b,a>:r |]
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   321
      ==> restrict(the_recfun(r,a,H), r-``{b}) = the_recfun(r,b,H)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   322
by (blast intro: is_recfun_cut unfold_the_recfun);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   323
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   324
(*NOT SUITABLE FOR REWRITING: it is recursive!*)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   325
lemma wftrec:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   326
    "[| wf(r);  trans(r) |] ==>
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   327
          wftrec(r,a,H) = H(a, lam x: r-``{a}. wftrec(r,x,H))"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   328
apply (unfold wftrec_def)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   329
apply (subst unfold_the_recfun [unfolded is_recfun_def])
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   330
apply (simp_all add: vimage_singleton_iff [THEN iff_sym] the_recfun_cut)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   331
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   332
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   333
(** Removal of the premise trans(r) **)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   334
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   335
(*NOT SUITABLE FOR REWRITING: it is recursive!*)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   336
lemma wfrec:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   337
    "wf(r) ==> wfrec(r,a,H) = H(a, lam x:r-``{a}. wfrec(r,x,H))"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   338
apply (unfold wfrec_def) 
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   339
apply (erule wf_trancl [THEN wftrec, THEN ssubst])
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   340
 apply (rule trans_trancl)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   341
apply (rule vimage_pair_mono [THEN restrict_lam_eq, THEN subst_context])
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   342
 apply (erule r_into_trancl)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   343
apply (rule subset_refl)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   344
done
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   345
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   346
(*This form avoids giant explosions in proofs.  NOTE USE OF == *)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   347
lemma def_wfrec:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   348
    "[| !!x. h(x)==wfrec(r,x,H);  wf(r) |] ==>
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   349
     h(a) = H(a, lam x: r-``{a}. h(x))"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   350
apply simp
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   351
apply (elim wfrec) 
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   352
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   353
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   354
lemma wfrec_type:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   355
    "[| wf(r);  a:A;  field(r)<=A;
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   356
        !!x u. [| x: A;  u: Pi(r-``{x}, B) |] ==> H(x,u) : B(x)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   357
     |] ==> wfrec(r,a,H) : B(a)"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   358
apply (rule_tac a = "a" in wf_induct2, assumption+)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   359
apply (subst wfrec, assumption)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   360
apply (simp add: lam_type underD)  
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   361
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   362
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   363
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   364
lemma wfrec_on:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   365
 "[| wf[A](r);  a: A |] ==>
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   366
         wfrec[A](r,a,H) = H(a, lam x: (r-``{a}) Int A. wfrec[A](r,x,H))"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   367
apply (unfold wf_on_def wfrec_on_def)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   368
apply (erule wfrec [THEN trans])
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   369
apply (simp add: vimage_Int_square cons_subset_iff)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   370
done
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   371
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   372
(*Minimal-element characterization of well-foundedness*)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   373
lemma wf_eq_minimal:
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   374
     "wf(r) <-> (ALL Q x. x:Q --> (EX z:Q. ALL y. <y,z>:r --> y~:Q))"
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   375
apply (unfold wf_def, blast)
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   376
done
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   377
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   378
ML
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   379
{*
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   380
val wf_def = thm "wf_def";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   381
val wf_on_def = thm "wf_on_def";
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   382
13165
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   383
val wf_imp_wf_on = thm "wf_imp_wf_on";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   384
val wf_on_field_imp_wf = thm "wf_on_field_imp_wf";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   385
val wf_iff_wf_on_field = thm "wf_iff_wf_on_field";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   386
val wf_on_subset_A = thm "wf_on_subset_A";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   387
val wf_on_subset_r = thm "wf_on_subset_r";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   388
val wf_onI = thm "wf_onI";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   389
val wf_onI2 = thm "wf_onI2";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   390
val wf_induct = thm "wf_induct";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   391
val wf_induct2 = thm "wf_induct2";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   392
val field_Int_square = thm "field_Int_square";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   393
val wf_on_induct = thm "wf_on_induct";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   394
val wfI = thm "wfI";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   395
val wf_not_refl = thm "wf_not_refl";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   396
val wf_not_sym = thm "wf_not_sym";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   397
val wf_asym = thm "wf_asym";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   398
val wf_on_not_refl = thm "wf_on_not_refl";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   399
val wf_on_not_sym = thm "wf_on_not_sym";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   400
val wf_on_asym = thm "wf_on_asym";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   401
val wf_on_chain3 = thm "wf_on_chain3";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   402
val wf_on_trancl = thm "wf_on_trancl";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   403
val wf_trancl = thm "wf_trancl";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   404
val underI = thm "underI";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   405
val underD = thm "underD";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   406
val is_recfun_type = thm "is_recfun_type";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   407
val apply_recfun = thm "apply_recfun";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   408
val is_recfun_equal = thm "is_recfun_equal";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   409
val is_recfun_cut = thm "is_recfun_cut";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   410
val is_recfun_functional = thm "is_recfun_functional";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   411
val is_the_recfun = thm "is_the_recfun";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   412
val unfold_the_recfun = thm "unfold_the_recfun";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   413
val the_recfun_cut = thm "the_recfun_cut";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   414
val wftrec = thm "wftrec";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   415
val wfrec = thm "wfrec";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   416
val def_wfrec = thm "def_wfrec";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   417
val wfrec_type = thm "wfrec_type";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   418
val wfrec_on = thm "wfrec_on";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   419
val wf_eq_minimal = thm "wf_eq_minimal";
31d020705aff conversion of equalities and WF to Isar
paulson
parents: 3840
diff changeset
   420
*}
435
ca5356bd315a Addition of cardinals and order types, various tidying
lcp
parents: 124
diff changeset
   421
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   422
end