Up to index of Isabelle/HOL/HOL-Complex/CSP
theory Infra_order (*-------------------------------------------*
| CSP-Prover on Isabelle2004 |
| November 2004 |
| June 2005 (modified) |
| July 2005 (modified) |
| |
| CSP-Prover on Isabelle2005 |
| October 2005 (modified) |
| |
| Yoshinao Isobe (AIST JAPAN) |
*-------------------------------------------*)
theory Infra_order
imports Infra_common
begin
(*****************************************************
order
*****************************************************)
lemma order_antisymE:
"[| (a::'a::order) = b ; [| a <= b ; b <= a |] ==> P |] ==> P"
apply (simp)
done
(*****************************************************
Upper Bound and Lower Bound
*****************************************************)
consts
isUB :: "'a::order => 'a::order set => bool" ("_ isUB _" [55,55] 55)
isLUB :: "'a::order => 'a::order set => bool" ("_ isLUB _"[55,55] 55)
isLB :: "'a::order => 'a::order set => bool" ("_ isLB _" [55,55] 55)
isGLB :: "'a::order => 'a::order set => bool" ("_ isGLB _"[55,55] 55)
defs
isUB_def : "x isUB X == ALL y. y:X --> y <= x"
isLUB_def : "x isLUB X == (x isUB X) & (ALL y. y isUB X --> x <= y)"
isLB_def : "x isLB X == ALL y. y:X --> x <= y"
isGLB_def : "x isGLB X == (x isLB X) & (ALL y. y isLB X --> y <= x)"
consts
hasLUB :: "'a::order set => bool" ("_ hasLUB" [1000] 55)
hasGLB :: "'a::order set => bool" ("_ hasGLB" [1000] 55)
defs
hasLUB_def: "X hasLUB == (EX x. x isLUB X)"
hasGLB_def: "X hasGLB == (EX x. x isGLB X)"
consts
LUB :: "'a::order set => 'a::order"
GLB :: "'a::order set => 'a::order"
defs
LUB_def : "LUB X == if (X hasLUB) then THE x. (x isLUB X) else the None"
GLB_def : "GLB X == if (X hasGLB) then THE x. (x isGLB X) else the None"
(*** LUB is unique ***)
lemma LUB_unique : "[| x isLUB X ; y isLUB X |] ==> x = y"
apply (unfold isLUB_def)
apply (elim conjE)
apply (drule_tac x="y" in spec)
apply (drule_tac x="x" in spec)
by (simp)
(*** GLB is unique ***)
lemma GLB_unique : "[| x isGLB X ; y isGLB X |] ==> x = y"
apply (unfold isGLB_def)
apply (elim conjE)
apply (drule_tac x="y" in spec)
apply (drule_tac x="x" in spec)
by (simp)
(*-----------------------*
| the LUB |
*-----------------------*)
lemma isLUB_to_LUB : "X hasLUB ==> x isLUB X = (x = LUB X)"
apply (simp add: LUB_def)
apply (rule iffI)
apply (rule sym)
apply (rule the_equality)
apply (simp)
apply (simp add: LUB_unique)
apply (simp add: hasLUB_def)
apply (erule exE)
apply (rule theI[of "(%x. x isLUB X)"])
apply (simp)
apply (simp add: LUB_unique)
done
lemmas LUB_to_isLUB = isLUB_to_LUB[THEN sym]
lemma LUB_to_isLUB_sym :
"X hasLUB ==> (LUB X = x) = x isLUB X"
by (auto simp add: isLUB_to_LUB)
lemmas LUB_iff = LUB_to_isLUB LUB_to_isLUB_sym
lemma LUB_is: "X hasLUB ==> (LUB X) isLUB X"
apply (insert LUB_to_isLUB[of X "LUB X"])
by (simp)
lemma isLUB_LUB : "x isLUB X ==> (LUB X = x)"
apply (subgoal_tac "X hasLUB")
apply (simp add: LUB_iff)
apply (simp add: hasLUB_def)
apply (rule_tac x="x" in exI, simp)
done
(*-----------------------*
| the GLB |
*-----------------------*)
lemma isGLB_to_GLB : "X hasGLB ==> x isGLB X = (x = GLB X)"
apply (simp add: GLB_def)
apply (rule iffI)
apply (rule sym)
apply (rule the_equality)
apply (simp)
apply (simp add: GLB_unique)
apply (simp add: hasGLB_def)
apply (erule exE)
apply (rule theI[of "(%x. x isGLB X)"])
apply (simp)
apply (simp add: GLB_unique)
done
lemmas GLB_to_isGLB = isGLB_to_GLB[THEN sym]
lemma GLB_to_isGLB_sym :
"X hasGLB ==> (GLB X = x) = x isGLB X"
by (auto simp add: isGLB_to_GLB)
lemmas GLB_iff = GLB_to_isGLB GLB_to_isGLB_sym
lemma GLB_is: "X hasGLB ==> (GLB X) isGLB X"
apply (insert GLB_to_isGLB[of X "GLB X"])
by (simp)
lemma isGLB_GLB : "x isGLB X ==> (GLB X = x)"
apply (subgoal_tac "X hasGLB")
apply (simp add: GLB_iff)
apply (simp add: hasGLB_def)
apply (rule_tac x="x" in exI, simp)
done
(*-----------------------*
| LUB subset |
*-----------------------*)
lemma isLUB_subset : "[| x isLUB X ; y isLUB Y ; X <= Y |] ==> x <= y"
apply (simp add: isLUB_def)
apply (elim conjE)
apply (drule_tac x="y" in spec)
apply (rotate_tac -1)
apply (drule mp)
apply (simp add: isUB_def)
apply (intro allI impI)
apply (rotate_tac 2)
apply (drule_tac x="ya" in spec)
apply (force)
by (simp)
(*-----------------------*
| GLB subset |
*-----------------------*)
lemma isGLB_subset : "[| x isGLB X ; y isGLB Y ; X <= Y |] ==> y <= x"
apply (simp add: isGLB_def)
apply (elim conjE)
apply (drule_tac x="y" in spec)
apply (rotate_tac -1)
apply (drule mp)
apply (simp add: isLB_def)
apply (intro allI impI)
apply (rotate_tac 2)
apply (drule_tac x="ya" in spec)
apply (force)
by (simp)
(*--------------------------*
| GLB exists for nat set |
*--------------------------*)
lemma EX_GLB_nat_lm:
"ALL m m'. m' <= m & m' : (X::nat set) --> (EX n. n isGLB X & n:X)"
apply (rule allI)
apply (induct_tac m)
(* base *)
apply (intro allI impI)
apply (rule_tac x="0" in exI)
apply (erule conjE)
apply (simp add: isGLB_def isLB_def)
apply (intro allI impI)
apply (drule_tac x="0" in spec)
apply (simp)
(* step *)
apply (intro allI impI)
apply (case_tac "EX m''. m'' <= n & m'':X")
apply (erule exE)
apply (drule_tac x="m''" in spec)
apply (simp)
apply (rule_tac x="m'" in exI)
apply (simp add: isGLB_def isLB_def)
apply (intro allI impI)
apply (case_tac "y < m'")
apply (drule_tac x="y" in spec)
by (auto)
(*** EX ***)
lemma EX_GLB_nat:
"(X::nat set) ~= {} ==> (EX n. n isGLB X & n:X)"
apply (subgoal_tac "EX m. m:X")
apply (erule exE)
apply (insert EX_GLB_nat_lm[of X])
apply (drule_tac x="m" in spec)
apply (drule_tac x="m" in spec)
apply (simp)
by (auto)
(*--------------------------*
| LUB is least |
*--------------------------*)
lemma LUB_least: "[| ALL x:X. x <= Y ; X hasLUB |]==> LUB X <= Y"
apply (insert LUB_is[of X])
apply (simp add: isLUB_def)
apply (elim conjE)
apply (drule_tac x="Y" in spec)
apply (simp add: isUB_def)
done
(*--------------------------*
| GLB is great |
*--------------------------*)
lemma GLB_great: "[| ALL x:X. Y <= x ; X hasGLB |]==> Y <= GLB X"
apply (insert GLB_is[of X])
apply (simp add: isGLB_def)
apply (elim conjE)
apply (drule_tac x="Y" in spec)
apply (simp add: isLB_def)
done
(*--------------------------*
| Union isLUB |
*--------------------------*)
(* Union X is an upper bound of X *)
lemma Union_isUB : "(Union X) isUB X"
apply (simp add: isUB_def)
apply (simp add: subset_iff)
apply (intro allI impI)
apply (rule_tac x=y in bexI)
by (auto)
(* UnionT Ts is the least upper bound of Ts *)
lemma Union_isLUB : "Union X isLUB X"
apply (simp add: isLUB_def Union_isUB)
apply (simp add: isUB_def)
apply (simp add: subset_iff)
apply (intro allI impI)
apply (erule bexE)
apply (drule_tac x="Xa" in spec)
by (simp)
(* the least upper bound of X is Union X *)
lemma isLUB_Union_only_if: "x isLUB X ==> x = Union X"
apply (insert Union_isLUB[of X])
apply (rule LUB_unique)
by (simp_all)
(* iff *)
lemma isLUB_Union : "(x isLUB X) = (x = Union X)"
apply (rule iffI)
apply (simp add: isLUB_Union_only_if)
apply (simp add: Union_isLUB)
done
(* LUB is Union X *)
lemma LUB_Union : "LUB X = Union X"
by (simp add: isLUB_LUB Union_isLUB)
(*****************************************************
MIN and MAX
*****************************************************)
consts
isMAX :: "'a::order => 'a::order set => bool" ("_ isMAX _"[55,55] 55)
isMIN :: "'a::order => 'a::order set => bool" ("_ isMIN _"[55,55] 55)
defs
isMAX_def : "x isMAX X == (x isUB X) & (x : X)"
isMIN_def : "x isMIN X == (x isLB X) & (x : X)"
consts
hasMAX :: "'a::order set => bool" ("_ hasMAX" [1000] 55)
hasMIN :: "'a::order set => bool" ("_ hasMIN" [1000] 55)
defs
hasMAX_def: "X hasMAX == (EX x. x isMAX X)"
hasMIN_def: "X hasMIN == (EX x. x isMIN X)"
consts
MAX :: "'a::order set => 'a::order"
MIN :: "'a::order set => 'a::order"
defs
MAX_def : "MAX X == if (X hasMAX) then THE x. (x isMAX X) else the None"
MIN_def : "MIN X == if (X hasMIN) then THE x. (x isMIN X) else the None"
(*** MAX is unique ***)
lemma MAX_unique : "[| x isMAX X ; y isMAX X |] ==> x = y"
apply (unfold isMAX_def isUB_def)
apply (elim conjE)
apply (drule_tac x="y" in spec)
apply (drule_tac x="x" in spec)
by (simp)
(*** MIN is unique ***)
lemma MIN_unique : "[| x isMIN X ; y isMIN X |] ==> x = y"
apply (unfold isMIN_def isLB_def)
apply (elim conjE)
apply (drule_tac x="y" in spec)
apply (drule_tac x="x" in spec)
by (simp)
(*-----------------------*
| the MAX |
*-----------------------*)
lemma isMAX_to_MAX : "X hasMAX ==> x isMAX X = (x = MAX X)"
apply (simp add: MAX_def)
apply (rule iffI)
apply (rule sym)
apply (rule the_equality)
apply (simp)
apply (simp add: MAX_unique)
apply (simp add: hasMAX_def)
apply (erule exE)
apply (rule theI[of "(%x. x isMAX X)"])
apply (simp)
apply (simp add: MAX_unique)
done
lemmas MAX_to_isMAX = isMAX_to_MAX[THEN sym]
lemma MAX_to_isMAX_sym :
"X hasMAX ==> (MAX X = x) = x isMAX X"
by (auto simp add: isMAX_to_MAX)
lemmas MAX_iff = MAX_to_isMAX MAX_to_isMAX_sym
(*-----------------------*
| the MIN |
*-----------------------*)
lemma isMIN_to_MIN : "X hasMIN ==> x isMIN X = (x = MIN X)"
apply (simp add: MIN_def)
apply (rule iffI)
apply (rule sym)
apply (rule the_equality)
apply (simp)
apply (simp add: MIN_unique)
apply (simp add: hasMIN_def)
apply (erule exE)
apply (rule theI[of "(%x. x isMIN X)"])
apply (simp)
apply (simp add: MIN_unique)
done
lemmas MIN_to_isMIN = isMIN_to_MIN[THEN sym]
lemma MIN_to_isMIN_sym :
"X hasMIN ==> (MIN X = x) = x isMIN X"
by (auto simp add: isMIN_to_MIN)
lemmas MIN_iff = MIN_to_isMIN MIN_to_isMIN_sym
(*-----------------------*
| MAX subset |
*-----------------------*)
lemma isMAX_subset : "[| x isMAX X ; y isMAX Y ; X <= Y |] ==> x <= y"
apply (simp add: isMAX_def isUB_def)
apply (elim conjE)
apply (rotate_tac 3)
apply (drule_tac x="x" in spec)
by (force)
(*-----------------------*
| MIN subset |
*-----------------------*)
lemma isMIN_subset : "[| x isMIN X ; y isMIN Y ; X <= Y |] ==> y <= x"
apply (simp add: isMIN_def isLB_def)
apply (elim conjE)
apply (rotate_tac 3)
apply (drule_tac x="x" in spec)
by (force)
(*--------------------------*
| MIN exists for nat set |
*--------------------------*)
lemma EX_MIN_nat_lm:
"ALL m m'. m' <= m & m' : (X::nat set) --> (EX n. n isMIN X)"
apply (rule allI)
apply (induct_tac m)
(* base *)
apply (intro allI impI)
apply (rule_tac x="0" in exI)
apply (erule conjE)
apply (simp add: isMIN_def isLB_def)
(* step *)
apply (intro allI impI)
apply (case_tac "EX m''. m'' <= n & m'':X")
apply (erule exE)
apply (drule_tac x="m''" in spec)
apply (simp)
apply (rule_tac x="m'" in exI)
apply (simp add: isMIN_def isLB_def)
apply (intro allI impI)
apply (case_tac "y < m'")
apply (drule_tac x="y" in spec)
by (auto)
(*** EX ***)
lemma EX_MIN_nat:
"(X::nat set) ~= {} ==> EX n. n isMIN X"
apply (subgoal_tac "EX m. m:X")
apply (erule exE)
apply (insert EX_MIN_nat_lm[of X])
apply (drule_tac x="m" in spec)
apply (drule_tac x="m" in spec)
apply (simp)
by (auto)
(*****************************************************
Fixed Point
*****************************************************)
consts
isUFP :: "'a => ('a => 'a ) => bool" (infixl "isUFP" 55)
isLFP :: "'a::order => ('a::order => 'a::order) => bool" (infixl "isLFP" 55)
isGFP :: "'a::order => ('a::order => 'a::order) => bool" (infixl "isGFP" 55)
defs
isUFP_def : "x isUFP f == (x = f x & (ALL y. y = f y --> x = y))"
isLFP_def : "x isLFP f == (x = f x & (ALL y. y = f y --> x <= y))"
isGFP_def : "x isGFP f == (x = f x & (ALL y. y = f y --> y <= x))"
consts
hasUFP:: "('a => 'a ) => bool" ("_ hasUFP" [1000] 55)
hasLFP:: "('a::order => 'a::order) => bool" ("_ hasLFP" [1000] 55)
hasGFP:: "('a::order => 'a::order) => bool" ("_ hasGFP" [1000] 55)
defs
hasUFP_def: "f hasUFP == (EX x. x isUFP f)"
hasLFP_def: "f hasLFP == (EX x. x isLFP f)"
hasGFP_def: "f hasGFP == (EX x. x isGFP f)"
consts
UFP :: "('a => 'a ) => 'a"
LFP :: "('a::order => 'a::order) => 'a::order"
GFP :: "('a::order => 'a::order) => 'a::order"
defs
UFP_def : "UFP f == if (f hasUFP) then (THE x. x isUFP f) else the None"
LFP_def : "LFP f == if (f hasLFP) then (THE x. x isLFP f) else the None"
GFP_def : "GFP f == if (f hasGFP) then (THE x. x isGFP f) else the None"
(*******************************
lemmas
*******************************)
(*** UFP is unique ***)
lemma UFP_unique : "[| x isUFP f ; y isUFP f |] ==> x = y"
by (simp add: isUFP_def)
(*** LFP is unique ***)
lemma LFP_unique : "[| x isLFP f ; y isLFP f |] ==> x = y"
apply (unfold isLFP_def)
apply (erule conjE)+
apply (drule_tac x="y" in spec)
apply (drule_tac x="x" in spec)
by (simp)
(*** GFP is unique ***)
lemma GFP_unique : "[| x isGFP f ; y isGFP f |] ==> x = y"
apply (unfold isGFP_def)
apply (erule conjE)+
apply (drule_tac x="y" in spec)
apply (drule_tac x="x" in spec)
by (simp)
(*-----------------------*
| the UFP |
*-----------------------*)
lemma isUFP_to_UFP : "f hasUFP ==> x isUFP f = (x = UFP f)"
apply (simp add: UFP_def)
apply (rule iffI)
apply (rule sym)
apply (rule the_equality)
apply (simp)
apply (simp add: UFP_unique)
apply (simp add: hasUFP_def)
apply (erule exE)
apply (rule theI[of "(%x. x isUFP f)"])
apply (simp)
apply (simp add: UFP_unique)
done
lemmas UFP_to_isUFP = isUFP_to_UFP[THEN sym]
lemma UFP_to_isUFP_sym :
"f hasUFP ==> (UFP f = x) = x isUFP f"
by (auto simp add: isUFP_to_UFP)
lemmas UFP_iff = UFP_to_isUFP UFP_to_isUFP_sym
(*** UFP is ***)
lemma UFP_is : "f hasUFP ==> (UFP f) isUFP f"
by (simp add: isUFP_to_UFP)
lemma isUFP_UFP : "x isUFP f ==> (UFP f = x)"
apply (subgoal_tac "f hasUFP")
apply (simp add: UFP_iff)
apply (simp add: hasUFP_def)
apply (rule_tac x="x" in exI, simp)
done
(*** UFP is fixed point ***)
lemma UFP_fp_lm : "[| f hasUFP ; x = UFP f |] ==> f x = x"
apply (simp add: UFP_iff)
apply (simp add: isUFP_def)
done
lemma UFP_fp : "f hasUFP ==> f (UFP f) = UFP f"
by (simp add: UFP_fp_lm)
(*** unique solution ***)
lemma hasUFP_unique_solution :
"[| f hasUFP ; f x = x ; f y = y |] ==> x = y"
apply (simp add: hasUFP_def)
apply (erule exE)
apply (simp add: isUFP_def)
apply (erule conjE)
apply (frule_tac x="x" in spec)
apply (drule_tac x="y" in spec)
apply (simp)
done
(*-----------------------*
| the LFP |
*-----------------------*)
lemma isLFP_to_LFP : "f hasLFP ==> x isLFP f = (x = LFP f)"
apply (simp add: LFP_def)
apply (rule iffI)
apply (rule sym)
apply (rule the_equality)
apply (simp)
apply (simp add: LFP_unique)
apply (simp add: hasLFP_def)
apply (erule exE)
apply (rule theI[of "(%x. x isLFP f)"])
apply (simp)
apply (simp add: LFP_unique)
done
lemmas LFP_to_isLFP = isLFP_to_LFP[THEN sym]
lemma LFP_to_isLFP_sym :
"f hasLFP ==> (LFP f = x) = x isLFP f"
by (auto simp add: isLFP_to_LFP)
lemmas LFP_iff = LFP_to_isLFP LFP_to_isLFP_sym
(*** LFP is ***)
lemma LFP_is : "f hasLFP ==> (LFP f) isLFP f"
by (simp add: isLFP_to_LFP)
lemma isLFP_LFP : "x isLFP f ==> (LFP f = x)"
apply (subgoal_tac "f hasLFP")
apply (simp add: LFP_iff)
apply (simp add: hasLFP_def)
apply (rule_tac x="x" in exI, simp)
done
(*** LFP is fixed point ***)
lemma LFP_fp_lm : "[| f hasLFP ; x = LFP f |] ==> f x = x"
apply (simp add: LFP_iff)
apply (simp add: isLFP_def)
done
lemma LFP_fp : "f hasLFP ==> f (LFP f) = LFP f"
by (simp add: LFP_fp_lm)
(*** LFP is least ***)
lemma LFP_least : "[| f hasLFP ; f x = x |] ==> LFP f <= x"
apply (insert LFP_is[of f])
apply (simp add: isLFP_def)
done
(*-----------------------*
| the GFP |
*-----------------------*)
lemma isGFP_to_GFP : "f hasGFP ==> x isGFP f = (x = GFP f)"
apply (simp add: GFP_def)
apply (rule iffI)
apply (rule sym)
apply (rule the_equality)
apply (simp)
apply (simp add: GFP_unique)
apply (simp add: hasGFP_def)
apply (erule exE)
apply (rule theI[of "(%x. x isGFP f)"])
apply (simp)
apply (simp add: GFP_unique)
done
lemmas GFP_to_isGFP = isGFP_to_GFP[THEN sym]
lemma GFP_to_isGFP_sym :
"f hasGFP ==> (GFP f = x) = x isGFP f"
by (auto simp add: isGFP_to_GFP)
lemmas GFP_iff = GFP_to_isGFP GFP_to_isGFP_sym
(*** GFP is ***)
lemma GFP_is : "f hasGFP ==> (GFP f) isGFP f"
by (simp add: isGFP_to_GFP)
lemma isGFP_GFP : "x isGFP f ==> (GFP f = x)"
apply (subgoal_tac "f hasGFP")
apply (simp add: GFP_iff)
apply (simp add: hasGFP_def)
apply (rule_tac x="x" in exI, simp)
done
(*** GFP is fixed point ***)
lemma GFP_fp_lm : "[| f hasGFP ; x = GFP f |] ==> f x = x"
apply (simp add: GFP_iff)
apply (simp add: isGFP_def)
done
lemma GFP_fp : "f hasGFP ==> f (GFP f) = GFP f"
by (simp add: GFP_fp_lm)
(*** GFP is greatest ***)
lemma GFP_greatest : "[| f hasGFP ; f x = x |] ==> x <= GFP f"
apply (insert GFP_is[of f])
apply (simp add: isGFP_def)
done
(*-----------------------*
| UFP --> LFP |
*-----------------------*)
lemma hasUFP_hasLFP: "f hasUFP ==> f hasLFP"
apply (simp add: hasUFP_def hasLFP_def)
apply (simp add: isUFP_def isLFP_def)
by (auto)
lemma hasUFP_LFP_UFP: "f hasUFP ==> LFP f = UFP f"
apply (simp add: isUFP_to_UFP[THEN sym])
apply (insert LFP_is[of f])
apply (simp add: hasUFP_hasLFP)
apply (simp add: hasUFP_def)
apply (simp add: isUFP_def isLFP_def)
apply (intro allI impI)
apply (elim conjE exE)
apply (rotate_tac -1)
apply (frule_tac x="y" in spec)
apply (drule_tac x="LFP f" in spec)
by (simp)
(*-----------------------*
| UFP --> GFP |
*-----------------------*)
lemma hasUFP_hasGFP: "f hasUFP ==> f hasGFP"
apply (simp add: hasUFP_def hasGFP_def)
apply (simp add: isUFP_def isGFP_def)
by (auto)
lemma hasUFP_GFP_UFP: "f hasUFP ==> GFP f = UFP f"
apply (simp add: isUFP_to_UFP[THEN sym])
apply (insert GFP_is[of f])
apply (simp add: hasUFP_hasGFP)
apply (simp add: hasUFP_def)
apply (simp add: isUFP_def isGFP_def)
apply (intro allI impI)
apply (elim conjE exE)
apply (rotate_tac -1)
apply (frule_tac x="y" in spec)
apply (drule_tac x="GFP f" in spec)
by (simp)
end
lemma order_antisymE:
[| a = b; [| a ≤ b; b ≤ a |] ==> P |] ==> P
lemma LUB_unique:
[| x isLUB X; y isLUB X |] ==> x = y
lemma GLB_unique:
[| x isGLB X; y isGLB X |] ==> x = y
lemma isLUB_to_LUB:
X hasLUB ==> x isLUB X = (x = LUB X)
lemma LUB_to_isLUB:
X1 hasLUB ==> (x1 = LUB X1) = x1 isLUB X1
lemma LUB_to_isLUB_sym:
X hasLUB ==> (LUB X = x) = x isLUB X
lemma LUB_iff:
X hasLUB ==> (x = LUB X) = x isLUB X
X hasLUB ==> (LUB X = x) = x isLUB X
lemma LUB_is:
X hasLUB ==> LUB X isLUB X
lemma isLUB_LUB:
x isLUB X ==> LUB X = x
lemma isGLB_to_GLB:
X hasGLB ==> x isGLB X = (x = GLB X)
lemma GLB_to_isGLB:
X1 hasGLB ==> (x1 = GLB X1) = x1 isGLB X1
lemma GLB_to_isGLB_sym:
X hasGLB ==> (GLB X = x) = x isGLB X
lemma GLB_iff:
X hasGLB ==> (x = GLB X) = x isGLB X
X hasGLB ==> (GLB X = x) = x isGLB X
lemma GLB_is:
X hasGLB ==> GLB X isGLB X
lemma isGLB_GLB:
x isGLB X ==> GLB X = x
lemma isLUB_subset:
[| x isLUB X; y isLUB Y; X ⊆ Y |] ==> x ≤ y
lemma isGLB_subset:
[| x isGLB X; y isGLB Y; X ⊆ Y |] ==> y ≤ x
lemma EX_GLB_nat_lm:
∀m m'. m' ≤ m ∧ m' ∈ X --> (∃n. n isGLB X ∧ n ∈ X)
lemma EX_GLB_nat:
X ≠ {} ==> ∃n. n isGLB X ∧ n ∈ X
lemma LUB_least:
[| ∀x∈X. x ≤ Y; X hasLUB |] ==> LUB X ≤ Y
lemma GLB_great:
[| ∀x∈X. Y ≤ x; X hasGLB |] ==> Y ≤ GLB X
lemma Union_isUB:
Union X isUB X
lemma Union_isLUB:
Union X isLUB X
lemma isLUB_Union_only_if:
x isLUB X ==> x = Union X
lemma isLUB_Union:
x isLUB X = (x = Union X)
lemma LUB_Union:
LUB X = Union X
lemma MAX_unique:
[| x isMAX X; y isMAX X |] ==> x = y
lemma MIN_unique:
[| x isMIN X; y isMIN X |] ==> x = y
lemma isMAX_to_MAX:
X hasMAX ==> x isMAX X = (x = MAX X)
lemma MAX_to_isMAX:
X1 hasMAX ==> (x1 = MAX X1) = x1 isMAX X1
lemma MAX_to_isMAX_sym:
X hasMAX ==> (MAX X = x) = x isMAX X
lemma MAX_iff:
X hasMAX ==> (x = MAX X) = x isMAX X
X hasMAX ==> (MAX X = x) = x isMAX X
lemma isMIN_to_MIN:
X hasMIN ==> x isMIN X = (x = MIN X)
lemma MIN_to_isMIN:
X1 hasMIN ==> (x1 = MIN X1) = x1 isMIN X1
lemma MIN_to_isMIN_sym:
X hasMIN ==> (MIN X = x) = x isMIN X
lemma MIN_iff:
X hasMIN ==> (x = MIN X) = x isMIN X
X hasMIN ==> (MIN X = x) = x isMIN X
lemma isMAX_subset:
[| x isMAX X; y isMAX Y; X ⊆ Y |] ==> x ≤ y
lemma isMIN_subset:
[| x isMIN X; y isMIN Y; X ⊆ Y |] ==> y ≤ x
lemma EX_MIN_nat_lm:
∀m m'. m' ≤ m ∧ m' ∈ X --> (∃n. n isMIN X)
lemma EX_MIN_nat:
X ≠ {} ==> ∃n. n isMIN X
lemma UFP_unique:
[| x isUFP f; y isUFP f |] ==> x = y
lemma LFP_unique:
[| x isLFP f; y isLFP f |] ==> x = y
lemma GFP_unique:
[| x isGFP f; y isGFP f |] ==> x = y
lemma isUFP_to_UFP:
f hasUFP ==> x isUFP f = (x = UFP f)
lemma UFP_to_isUFP:
f1 hasUFP ==> (x1 = UFP f1) = x1 isUFP f1
lemma UFP_to_isUFP_sym:
f hasUFP ==> (UFP f = x) = x isUFP f
lemma UFP_iff:
f hasUFP ==> (x = UFP f) = x isUFP f
f hasUFP ==> (UFP f = x) = x isUFP f
lemma UFP_is:
f hasUFP ==> UFP f isUFP f
lemma isUFP_UFP:
x isUFP f ==> UFP f = x
lemma UFP_fp_lm:
[| f hasUFP; x = UFP f |] ==> f x = x
lemma UFP_fp:
f hasUFP ==> f (UFP f) = UFP f
lemma hasUFP_unique_solution:
[| f hasUFP; f x = x; f y = y |] ==> x = y
lemma isLFP_to_LFP:
f hasLFP ==> x isLFP f = (x = LFP f)
lemma LFP_to_isLFP:
f1 hasLFP ==> (x1 = LFP f1) = x1 isLFP f1
lemma LFP_to_isLFP_sym:
f hasLFP ==> (LFP f = x) = x isLFP f
lemma LFP_iff:
f hasLFP ==> (x = LFP f) = x isLFP f
f hasLFP ==> (LFP f = x) = x isLFP f
lemma LFP_is:
f hasLFP ==> LFP f isLFP f
lemma isLFP_LFP:
x isLFP f ==> LFP f = x
lemma LFP_fp_lm:
[| f hasLFP; x = LFP f |] ==> f x = x
lemma LFP_fp:
f hasLFP ==> f (LFP f) = LFP f
lemma LFP_least:
[| f hasLFP; f x = x |] ==> LFP f ≤ x
lemma isGFP_to_GFP:
f hasGFP ==> x isGFP f = (x = GFP f)
lemma GFP_to_isGFP:
f1 hasGFP ==> (x1 = GFP f1) = x1 isGFP f1
lemma GFP_to_isGFP_sym:
f hasGFP ==> (GFP f = x) = x isGFP f
lemma GFP_iff:
f hasGFP ==> (x = GFP f) = x isGFP f
f hasGFP ==> (GFP f = x) = x isGFP f
lemma GFP_is:
f hasGFP ==> GFP f isGFP f
lemma isGFP_GFP:
x isGFP f ==> GFP f = x
lemma GFP_fp_lm:
[| f hasGFP; x = GFP f |] ==> f x = x
lemma GFP_fp:
f hasGFP ==> f (GFP f) = GFP f
lemma GFP_greatest:
[| f hasGFP; f x = x |] ==> x ≤ GFP f
lemma hasUFP_hasLFP:
f hasUFP ==> f hasLFP
lemma hasUFP_LFP_UFP:
f hasUFP ==> LFP f = UFP f
lemma hasUFP_hasGFP:
f hasUFP ==> f hasGFP
lemma hasUFP_GFP_UFP:
f hasUFP ==> GFP f = UFP f