diff -r b03a36b8d528 -r 99a593b49b04 src/ZF/OrderArith.thy --- a/src/ZF/OrderArith.thy Tue Oct 08 14:09:18 2002 +0200 +++ b/src/ZF/OrderArith.thy Wed Oct 09 11:07:13 2002 +0200 @@ -398,6 +398,61 @@ by (unfold ord_iso_def rvimage_def, blast) +subsection{*Every well-founded relation is a subset of some inverse image of + an ordinal*} + +lemma wf_rvimage_Ord: "Ord(i) \ wf(rvimage(A, f, Memrel(i)))" +by (blast intro: wf_rvimage wf_Memrel) + + +constdefs + wfrank :: "[i,i]=>i" + "wfrank(r,a) == wfrec(r, a, %x f. \y \ r-``{x}. succ(f`y))" + +constdefs + wftype :: "i=>i" + "wftype(r) == \y \ range(r). succ(wfrank(r,y))" + +lemma wfrank: "wf(r) ==> wfrank(r,a) = (\y \ r-``{a}. succ(wfrank(r,y)))" +by (subst wfrank_def [THEN def_wfrec], simp_all) + +lemma Ord_wfrank: "wf(r) ==> Ord(wfrank(r,a))" +apply (rule_tac a=a in wf_induct, assumption) +apply (subst wfrank, assumption) +apply (rule Ord_succ [THEN Ord_UN], blast) +done + +lemma wfrank_lt: "[|wf(r); \ r|] ==> wfrank(r,a) < wfrank(r,b)" +apply (rule_tac a1 = b in wfrank [THEN ssubst], assumption) +apply (rule UN_I [THEN ltI]) +apply (simp add: Ord_wfrank vimage_iff)+ +done + +lemma Ord_wftype: "wf(r) ==> Ord(wftype(r))" +by (simp add: wftype_def Ord_wfrank) + +lemma wftypeI: "\wf(r); x \ field(r)\ \ wfrank(r,x) \ wftype(r)" +apply (simp add: wftype_def) +apply (blast intro: wfrank_lt [THEN ltD]) +done + + +lemma wf_imp_subset_rvimage: + "[|wf(r); r \ A*A|] ==> \i f. Ord(i) & r <= rvimage(A, f, Memrel(i))" +apply (rule_tac x="wftype(r)" in exI) +apply (rule_tac x="\x\A. wfrank(r,x)" in exI) +apply (simp add: Ord_wftype, clarify) +apply (frule subsetD, assumption, clarify) +apply (simp add: rvimage_iff wfrank_lt [THEN ltD]) +apply (blast intro: wftypeI) +done + +theorem wf_iff_subset_rvimage: + "relation(r) ==> wf(r) <-> (\i f A. Ord(i) & r <= rvimage(A, f, Memrel(i)))" +by (blast dest!: relation_field_times_field wf_imp_subset_rvimage + intro: wf_rvimage_Ord [THEN wf_subset]) + + subsection{*Other Results*} lemma wf_times: "A Int B = 0 ==> wf(A*B)"