# HG changeset patch
# User paulson
# Date 1020841696 -7200
# Node ID 0a6fbdedcde2013224bc8ccbb1c6b40a7a456982
# Parent f2b00262bdfc2928e3f1e7c9ce8b09a75f1d732f
Tidied and converted to Isar by lcp
diff -r f2b00262bdfc -r 0a6fbdedcde2 src/HOL/ex/Tarski.thy
--- a/src/HOL/ex/Tarski.thy Tue May 07 19:54:29 2002 +0200
+++ b/src/HOL/ex/Tarski.thy Wed May 08 09:08:16 2002 +0200
@@ -7,17 +7,18 @@
The fixedpoints of a complete lattice themselves form a complete lattice.
Illustrates first-class theories, using the Sigma representation of structures
+
+Tidied and converted to Isar by lcp
*)
-Tarski = Main +
-
+theory Tarski = Main:
record 'a potype =
pset :: "'a set"
order :: "('a * 'a) set"
syntax
- "@pset" :: "'a potype => 'a set" ("_ ." [90] 90)
+ "@pset" :: "'a potype => 'a set" ("_ ." [90] 90)
"@order" :: "'a potype => ('a *'a)set" ("_ ." [90] 90)
translations
@@ -26,31 +27,31 @@
constdefs
monotone :: "['a => 'a, 'a set, ('a *'a)set] => bool"
- "monotone f A r == ! x: A. ! y: A. (x, y): r --> ((f x), (f y)) : r"
+ "monotone f A r == \x\A. \y\A. (x, y): r --> ((f x), (f y)) : r"
least :: "['a => bool, 'a potype] => 'a"
"least P po == @ x. x: po. & P x &
- (! y: po.. P y --> (x,y): po.)"
+ (\y \ po.. P y --> (x,y): po.)"
greatest :: "['a => bool, 'a potype] => 'a"
"greatest P po == @ x. x: po. & P x &
- (! y: po.. P y --> (y,x): po.)"
+ (\y \ po.. P y --> (y,x): po.)"
lub :: "['a set, 'a potype] => 'a"
- "lub S po == least (%x. ! y: S. (y,x): po.) po"
+ "lub S po == least (%x. \y\S. (y,x): po.) po"
glb :: "['a set, 'a potype] => 'a"
- "glb S po == greatest (%x. ! y: S. (x,y): po.) po"
+ "glb S po == greatest (%x. \y\S. (x,y): po.) po"
- islub :: "['a set, 'a potype, 'a] => bool"
- "islub S po == %L. (L: po. & (! y: S. (y,L): po.) &
- (! z:po.. (! y: S. (y,z): po.) --> (L,z): po.))"
+ isLub :: "['a set, 'a potype, 'a] => bool"
+ "isLub S po == %L. (L: po. & (\y\S. (y,L): po.) &
+ (\z\po.. (\y\S. (y,z): po.) --> (L,z): po.))"
- isglb :: "['a set, 'a potype, 'a] => bool"
- "isglb S po == %G. (G: po. & (! y: S. (G,y): po.) &
- (! z: po.. (! y: S. (z,y): po.) --> (z,G): po.))"
+ isGlb :: "['a set, 'a potype, 'a] => bool"
+ "isGlb S po == %G. (G: po. & (\y\S. (G,y): po.) &
+ (\z \ po.. (\y\S. (z,y): po.) --> (z,G): po.))"
- fix :: "[('a => 'a), 'a set] => 'a set"
+ "fix" :: "[('a => 'a), 'a set] => 'a set"
"fix f A == {x. x: A & f x = x}"
interval :: "[('a*'a) set,'a, 'a ] => 'a set"
@@ -70,8 +71,8 @@
CompleteLattice :: "('a potype) set"
"CompleteLattice == {cl. cl: PartialOrder &
- (! S. S <= cl. --> (? L. islub S cl L)) &
- (! S. S <= cl. --> (? G. isglb S cl G))}"
+ (\S. S <= cl. --> (\L. isLub S cl L)) &
+ (\S. S <= cl. --> (\G. isGlb S cl G))}"
CLF :: "('a potype * ('a => 'a)) set"
"CLF == SIGMA cl: CompleteLattice.
@@ -101,41 +102,796 @@
"dual po == (| pset = po., order = converse (po.) |)"
locale PO =
-fixes
- cl :: "'a potype"
- A :: "'a set"
- r :: "('a * 'a) set"
-assumes
- cl_po "cl : PartialOrder"
-defines
- A_def "A == cl."
- r_def "r == cl."
+ fixes cl :: "'a potype"
+ and A :: "'a set"
+ and r :: "('a * 'a) set"
+ assumes cl_po: "cl : PartialOrder"
+ defines A_def: "A == cl."
+ and r_def: "r == cl."
locale CL = PO +
-fixes
-assumes
- cl_co "cl : CompleteLattice"
+ assumes cl_co: "cl : CompleteLattice"
locale CLF = CL +
-fixes
- f :: "'a => 'a"
- P :: "'a set"
-assumes
- f_cl "f : CLF``{cl}"
-defines
- P_def "P == fix f A"
+ fixes f :: "'a => 'a"
+ and P :: "'a set"
+ assumes f_cl: "(cl,f) : CLF" (*was the equivalent "f : CLF``{cl}"*)
+ defines P_def: "P == fix f A"
locale Tarski = CLF +
-fixes
- Y :: "'a set"
- intY1 :: "'a set"
- v :: "'a"
-assumes
- Y_ss "Y <= P"
-defines
- intY1_def "intY1 == interval r (lub Y cl) (Top cl)"
- v_def "v == glb {x. ((%x: intY1. f x) x, x): induced intY1 r & x: intY1}
- (| pset=intY1, order=induced intY1 r|)"
+ fixes Y :: "'a set"
+ and intY1 :: "'a set"
+ and v :: "'a"
+ assumes
+ Y_ss: "Y <= P"
+ defines
+ intY1_def: "intY1 == interval r (lub Y cl) (Top cl)"
+ and v_def: "v == glb {x. ((%x: intY1. f x) x, x): induced intY1 r &
+ x: intY1}
+ (| pset=intY1, order=induced intY1 r|)"
+
+
+
+(* Partial Order *)
+
+lemma (in PO) PO_imp_refl: "refl A r"
+apply (insert cl_po)
+apply (simp add: PartialOrder_def A_def r_def)
+done
+
+lemma (in PO) PO_imp_sym: "antisym r"
+apply (insert cl_po)
+apply (simp add: PartialOrder_def A_def r_def)
+done
+
+lemma (in PO) PO_imp_trans: "trans r"
+apply (insert cl_po)
+apply (simp add: PartialOrder_def A_def r_def)
+done
+
+lemma (in PO) reflE: "[| refl A r; x \ A|] ==> (x, x) \ r"
+apply (insert cl_po)
+apply (simp add: PartialOrder_def refl_def)
+done
+
+lemma (in PO) antisymE: "[| antisym r; (a, b) \ r; (b, a) \ r |] ==> a = b"
+apply (insert cl_po)
+apply (simp add: PartialOrder_def antisym_def)
+done
+
+lemma (in PO) transE: "[| trans r; (a, b) \ r; (b, c) \ r|] ==> (a,c) \ r"
+apply (insert cl_po)
+apply (simp add: PartialOrder_def)
+apply (unfold trans_def, fast)
+done
+
+lemma (in PO) monotoneE:
+ "[| monotone f A r; x \ A; y \ A; (x, y) \ r |] ==> (f x, f y) \ r"
+by (simp add: monotone_def)
+
+lemma (in PO) po_subset_po:
+ "S <= A ==> (| pset = S, order = induced S r |) \ PartialOrder"
+apply (simp (no_asm) add: PartialOrder_def)
+apply auto
+(* refl *)
+apply (simp add: refl_def induced_def)
+apply (blast intro: PO_imp_refl [THEN reflE])
+(* antisym *)
+apply (simp add: antisym_def induced_def)
+apply (blast intro: PO_imp_sym [THEN antisymE])
+(* trans *)
+apply (simp add: trans_def induced_def)
+apply (blast intro: PO_imp_trans [THEN transE])
+done
+
+lemma (in PO) indE: "[| (x, y) \ induced S r; S <= A |] ==> (x, y) \ r"
+by (simp add: add: induced_def)
+
+lemma (in PO) indI: "[| (x, y) \ r; x \ S; y \ S |] ==> (x, y) \ induced S r"
+by (simp add: add: induced_def)
+
+lemma (in CL) CL_imp_ex_isLub: "S <= A ==> \L. isLub S cl L"
+apply (insert cl_co)
+apply (simp add: CompleteLattice_def A_def)
+done
+
+declare (in CL) cl_co [simp]
+
+lemma isLub_lub: "(\L. isLub S cl L) = isLub S cl (lub S cl)"
+by (simp add: lub_def least_def isLub_def some_eq_ex [symmetric])
+
+lemma isGlb_glb: "(\G. isGlb S cl G) = isGlb S cl (glb S cl)"
+by (simp add: glb_def greatest_def isGlb_def some_eq_ex [symmetric])
+
+lemma isGlb_dual_isLub: "isGlb S cl = isLub S (dual cl)"
+by (simp add: isLub_def isGlb_def dual_def converse_def)
+
+lemma isLub_dual_isGlb: "isLub S cl = isGlb S (dual cl)"
+by (simp add: isLub_def isGlb_def dual_def converse_def)
+
+lemma (in PO) dualPO: "dual cl \ PartialOrder"
+apply (insert cl_po)
+apply (simp add: PartialOrder_def dual_def refl_converse
+ trans_converse antisym_converse)
+done
+
+lemma Rdual:
+ "\S. (S <= A -->( \L. isLub S (| pset = A, order = r|) L))
+ ==> \S. (S <= A --> (\G. isGlb S (| pset = A, order = r|) G))"
+apply safe
+apply (rule_tac x = "lub {y. y \ A & (\k \ S. (y, k) \ r)}
+ (|pset = A, order = r|) " in exI)
+apply (drule_tac x = "{y. y \ A & (\k \ S. (y,k) \ r) }" in spec)
+apply (drule mp, fast)
+apply (simp add: isLub_lub isGlb_def)
+apply (simp add: isLub_def, blast)
+done
+
+lemma lub_dual_glb: "lub S cl = glb S (dual cl)"
+by (simp add: lub_def glb_def least_def greatest_def dual_def converse_def)
+
+lemma glb_dual_lub: "glb S cl = lub S (dual cl)"
+by (simp add: lub_def glb_def least_def greatest_def dual_def converse_def)
+
+lemma CL_subset_PO: "CompleteLattice <= PartialOrder"
+by (simp add: PartialOrder_def CompleteLattice_def, fast)
+
+lemmas CL_imp_PO = CL_subset_PO [THEN subsetD]
+
+declare CL_imp_PO [THEN Tarski.PO_imp_refl, simp]
+declare CL_imp_PO [THEN Tarski.PO_imp_sym, simp]
+declare CL_imp_PO [THEN Tarski.PO_imp_trans, simp]
+
+lemma (in CL) CO_refl: "refl A r"
+by (rule PO_imp_refl)
+
+lemma (in CL) CO_antisym: "antisym r"
+by (rule PO_imp_sym)
+
+lemma (in CL) CO_trans: "trans r"
+by (rule PO_imp_trans)
+
+lemma CompleteLatticeI:
+ "[| po \ PartialOrder; (\S. S <= po. --> (\L. isLub S po L));
+ (\S. S <= po. --> (\G. isGlb S po G))|]
+ ==> po \ CompleteLattice"
+apply (unfold CompleteLattice_def, blast)
+done
+
+lemma (in CL) CL_dualCL: "dual cl \ CompleteLattice"
+apply (insert cl_co)
+apply (simp add: CompleteLattice_def dual_def)
+apply (fold dual_def)
+apply (simp add: isLub_dual_isGlb [symmetric] isGlb_dual_isLub [symmetric]
+ dualPO)
+done
+
+lemma (in PO) dualA_iff: "(dual cl.) = cl."
+by (simp add: dual_def)
+
+lemma (in PO) dualr_iff: "((x, y) \ (dual cl.)) = ((y, x) \ cl.)"
+by (simp add: dual_def)
+
+lemma (in PO) monotone_dual:
+ "monotone f (cl.) (cl.) ==> monotone f (dual cl.) (dual cl.)"
+apply (simp add: monotone_def dualA_iff dualr_iff)
+done
+
+lemma (in PO) interval_dual:
+ "[| x \ A; y \ A|] ==> interval r x y = interval (dual cl.) y x"
+apply (simp add: interval_def dualr_iff)
+apply (fold r_def, fast)
+done
+
+lemma (in PO) interval_not_empty:
+ "[| trans r; interval r a b \ {} |] ==> (a, b) \ r"
+apply (simp add: interval_def)
+apply (unfold trans_def, blast)
+done
+
+lemma (in PO) interval_imp_mem: "x \ interval r a b ==> (a, x) \ r"
+by (simp add: interval_def)
+
+lemma (in PO) left_in_interval:
+ "[| a \ A; b \ A; interval r a b \ {} |] ==> a \ interval r a b"
+apply (simp (no_asm_simp) add: interval_def)
+apply (simp add: PO_imp_trans interval_not_empty)
+apply (simp add: PO_imp_refl [THEN reflE])
+done
+
+lemma (in PO) right_in_interval:
+ "[| a \ A; b \ A; interval r a b \ {} |] ==> b \ interval r a b"
+apply (simp (no_asm_simp) add: interval_def)
+apply (simp add: PO_imp_trans interval_not_empty)
+apply (simp add: PO_imp_refl [THEN reflE])
+done
+
+(* sublattice *)
+lemma (in PO) sublattice_imp_CL:
+ "S <<= cl ==> (| pset = S, order = induced S r |) \ CompleteLattice"
+by (simp add: sublattice_def CompleteLattice_def A_def r_def)
+
+lemma (in CL) sublatticeI:
+ "[| S <= A; (| pset = S, order = induced S r |) \ CompleteLattice |]
+ ==> S <<= cl"
+by (simp add: sublattice_def A_def r_def)
+
+(* lub *)
+lemma (in CL) lub_unique: "[| S <= A; isLub S cl x; isLub S cl L|] ==> x = L"
+apply (rule antisymE)
+apply (rule CO_antisym)
+apply (auto simp add: isLub_def r_def)
+done
+
+lemma (in CL) lub_upper: "[|S <= A; x \ S|] ==> (x, lub S cl) \ r"
+apply (rule CL_imp_ex_isLub [THEN exE], assumption)
+apply (unfold lub_def least_def)
+apply (rule some_equality [THEN ssubst])
+ apply (simp add: isLub_def)
+ apply (simp add: lub_unique A_def isLub_def)
+apply (simp add: isLub_def r_def)
+done
+
+lemma (in CL) lub_least:
+ "[| S <= A; L \ A; \x \ S. (x,L) \ r |] ==> (lub S cl, L) \ r"
+apply (rule CL_imp_ex_isLub [THEN exE], assumption)
+apply (unfold lub_def least_def)
+apply (rule_tac s=x in some_equality [THEN ssubst])
+ apply (simp add: isLub_def)
+ apply (simp add: lub_unique A_def isLub_def)
+apply (simp add: isLub_def r_def A_def)
+done
+
+lemma (in CL) lub_in_lattice: "S <= A ==> lub S cl \ A"
+apply (rule CL_imp_ex_isLub [THEN exE], assumption)
+apply (unfold lub_def least_def)
+apply (subst some_equality)
+apply (simp add: isLub_def)
+prefer 2 apply (simp add: isLub_def A_def)
+apply (simp add: lub_unique A_def isLub_def)
+done
+
+lemma (in CL) lubI:
+ "[| S <= A; L \ A; \x \ S. (x,L) \ r;
+ \z \ A. (\y \ S. (y,z) \ r) --> (L,z) \ r |] ==> L = lub S cl"
+apply (rule lub_unique, assumption)
+apply (simp add: isLub_def A_def r_def)
+apply (unfold isLub_def)
+apply (rule conjI)
+apply (fold A_def r_def)
+apply (rule lub_in_lattice, assumption)
+apply (simp add: lub_upper lub_least)
+done
+
+lemma (in CL) lubIa: "[| S <= A; isLub S cl L |] ==> L = lub S cl"
+by (simp add: lubI isLub_def A_def r_def)
+
+lemma (in CL) isLub_in_lattice: "isLub S cl L ==> L \ A"
+by (simp add: isLub_def A_def)
+
+lemma (in CL) isLub_upper: "[|isLub S cl L; y \ S|] ==> (y, L) \ r"
+by (simp add: isLub_def r_def)
+
+lemma (in CL) isLub_least:
+ "[| isLub S cl L; z \ A; \y \ S. (y, z) \ r|] ==> (L, z) \ r"
+by (simp add: isLub_def A_def r_def)
+
+lemma (in CL) isLubI:
+ "[| L \ A; \y \ S. (y, L) \ r;
+ (\z \ A. (\y \ S. (y, z):r) --> (L, z) \ r)|] ==> isLub S cl L"
+by (simp add: isLub_def A_def r_def)
+
+(* glb *)
+lemma (in CL) glb_in_lattice: "S <= A ==> glb S cl \ A"
+apply (subst glb_dual_lub)
+apply (simp add: A_def)
+apply (rule dualA_iff [THEN subst])
+apply (rule Tarski.lub_in_lattice)
+apply (rule dualPO)
+apply (rule CL_dualCL)
+apply (simp add: dualA_iff)
+done
+
+lemma (in CL) glb_lower: "[|S <= A; x \ S|] ==> (glb S cl, x) \ r"
+apply (subst glb_dual_lub)
+apply (simp add: r_def)
+apply (rule dualr_iff [THEN subst])
+apply (rule Tarski.lub_upper [rule_format])
+apply (rule dualPO)
+apply (rule CL_dualCL)
+apply (simp add: dualA_iff A_def, assumption)
+done
+
+(* Reduce the sublattice property by using substructural properties*)
+(* abandoned see Tarski_4.ML *)
+
+lemma (in CLF) [simp]:
+ "f: cl. funcset cl. & monotone f (cl.) (cl.)"
+apply (insert f_cl)
+apply (simp add: CLF_def)
+done
+
+declare (in CLF) f_cl [simp]
+
+
+lemma (in CLF) f_in_funcset: "f \ A funcset A"
+by (simp add: A_def)
+
+lemma (in CLF) monotone_f: "monotone f A r"
+by (simp add: A_def r_def)
+
+lemma (in CLF) CLF_dual: "(cl,f) \ CLF ==> (dual cl, f) \ CLF"
+apply (simp add: CLF_def CL_dualCL monotone_dual)
+apply (simp add: dualA_iff)
+done
+
+(* fixed points *)
+lemma fix_subset: "fix f A <= A"
+by (simp add: fix_def, fast)
+
+lemma fix_imp_eq: "x \ fix f A ==> f x = x"
+by (simp add: fix_def)
+
+lemma fixf_subset:
+ "[| A <= B; x \ fix (%y: A. f y) A |] ==> x \ fix f B"
+apply (simp add: fix_def, auto)
+done
+
+(* lemmas for Tarski, lub *)
+lemma (in CLF) lubH_le_flubH:
+ "H = {x. (x, f x) \ r & x \ A} ==> (lub H cl, f (lub H cl)) \ r"
+apply (rule lub_least, fast)
+apply (rule f_in_funcset [THEN funcset_mem])
+apply (rule lub_in_lattice, fast)
+(* \x:H. (x, f (lub H r)) \ r *)
+apply (rule ballI)
+apply (rule transE)
+apply (rule CO_trans)
+(* instantiates (x, ???z) \ cl. to (x, f x), because of the def of H *)
+apply fast
+(* so it remains to show (f x, f (lub H cl)) \ r *)
+apply (rule_tac f = "f" in monotoneE)
+apply (rule monotone_f, fast)
+apply (rule lub_in_lattice, fast)
+apply (rule lub_upper, fast)
+apply assumption
+done
+
+lemma (in CLF) flubH_le_lubH:
+ "[| H = {x. (x, f x) \ r & x \ A} |] ==> (f (lub H cl), lub H cl) \ r"
+apply (rule lub_upper, fast)
+apply (rule_tac t = "H" in ssubst, assumption)
+apply (rule CollectI)
+apply (rule conjI)
+apply (rule_tac [2] f_in_funcset [THEN funcset_mem])
+apply (rule_tac [2] lub_in_lattice)
+prefer 2 apply fast
+apply (rule_tac f = "f" in monotoneE)
+apply (rule monotone_f)
+ apply (blast intro: lub_in_lattice)
+ apply (blast intro: lub_in_lattice f_in_funcset [THEN funcset_mem])
+apply (simp add: lubH_le_flubH)
+done
+
+lemma (in CLF) lubH_is_fixp:
+ "H = {x. (x, f x) \ r & x \ A} ==> lub H cl \ fix f A"
+apply (simp add: fix_def)
+apply (rule conjI)
+apply (rule lub_in_lattice, fast)
+apply (rule antisymE)
+apply (rule CO_antisym)
+apply (simp add: flubH_le_lubH)
+apply (simp add: lubH_le_flubH)
+done
+
+lemma (in CLF) fix_in_H:
+ "[| H = {x. (x, f x) \ r & x \ A}; x \ P |] ==> x \ H"
+by (simp add: P_def fix_imp_eq [of _ f A] reflE CO_refl
+ fix_subset [of f A, THEN subsetD])
+
+lemma (in CLF) fixf_le_lubH:
+ "H = {x. (x, f x) \ r & x \ A} ==> \x \ fix f A. (x, lub H cl) \ r"
+apply (rule ballI)
+apply (rule lub_upper, fast)
+apply (rule fix_in_H)
+apply (simp_all add: P_def)
+done
+
+lemma (in CLF) lubH_least_fixf:
+ "H = {x. (x, f x) \ r & x \ A}
+ ==> \L. (\y \ fix f A. (y,L) \ r) --> (lub H cl, L) \ r"
+apply (rule allI)
+apply (rule impI)
+apply (erule bspec)
+apply (rule lubH_is_fixp, assumption)
+done
+
+(* Tarski fixpoint theorem 1, first part *)
+lemma (in CLF) T_thm_1_lub: "lub P cl = lub {x. (x, f x) \ r & x \ A} cl"
+apply (rule sym)
+apply (simp add: P_def)
+apply (rule lubI)
+apply (rule fix_subset)
+apply (rule lub_in_lattice, fast)
+apply (simp add: fixf_le_lubH)
+apply (simp add: lubH_least_fixf)
+done
+
+(* Tarski for glb *)
+lemma (in CLF) glbH_is_fixp: "H = {x. (f x, x) \ r & x \ A} ==> glb H cl \ P"
+apply (simp add: glb_dual_lub P_def A_def r_def)
+apply (rule dualA_iff [THEN subst])
+apply (rule Tarski.lubH_is_fixp)
+apply (rule dualPO)
+apply (rule CL_dualCL)
+apply (rule f_cl [THEN CLF_dual])
+apply (simp add: dualr_iff dualA_iff)
+done
+
+lemma (in CLF) T_thm_1_glb: "glb P cl = glb {x. (f x, x) \ r & x \ A} cl"
+apply (simp add: glb_dual_lub P_def A_def r_def)
+apply (rule dualA_iff [THEN subst])
+apply (simp add: Tarski.T_thm_1_lub [of _ f, OF dualPO CL_dualCL]
+ dualPO CL_dualCL CLF_dual dualr_iff)
+done
+
+(* interval *)
+lemma (in CLF) rel_imp_elem: "(x, y) \ r ==> x \ A"
+apply (insert CO_refl)
+apply (simp add: refl_def, blast)
+done
+
+lemma (in CLF) interval_subset: "[| a \ A; b \ A |] ==> interval r a b <= A"
+apply (simp add: interval_def)
+apply (blast intro: rel_imp_elem)
+done
+
+lemma (in CLF) intervalI:
+ "[| (a, x) \ r; (x, b) \ r |] ==> x \ interval r a b"
+apply (simp add: interval_def)
+done
+
+lemma (in CLF) interval_lemma1:
+ "[| S <= interval r a b; x \ S |] ==> (a, x) \ r"
+apply (unfold interval_def, fast)
+done
+
+lemma (in CLF) interval_lemma2:
+ "[| S <= interval r a b; x \ S |] ==> (x, b) \ r"
+apply (unfold interval_def, fast)
+done
+
+lemma (in CLF) a_less_lub:
+ "[| S <= A; S \ {};
+ \x \ S. (a,x) \ r; \y \ S. (y, L) \ r |] ==> (a,L) \ r"
+by (blast intro: transE PO_imp_trans)
+
+lemma (in CLF) glb_less_b:
+ "[| S <= A; S \ {};
+ \x \ S. (x,b) \ r; \y \ S. (G, y) \ r |] ==> (G,b) \ r"
+by (blast intro: transE PO_imp_trans)
+
+lemma (in CLF) S_intv_cl:
+ "[| a \ A; b \ A; S <= interval r a b |]==> S <= A"
+by (simp add: subset_trans [OF _ interval_subset])
+
+lemma (in CLF) L_in_interval:
+ "[| a \ A; b \ A; S <= interval r a b;
+ S \