(*-------------------------------------------*
| CSP-Prover on Isabelle2004 |
| November 2004 |
| |
| CSP-Prover on Isabelle2005 |
| October 2005 (modified) |
| |
| Yoshinao Isobe (AIST JAPAN) |
*-------------------------------------------*)
theory CMS = Infra:
(*****************************************************************
1. Metric space (MS)
2. Complete metric space (CMS)
3. Contracting map
4. Banach Theorem
*****************************************************************)
axclass ms0 < type
consts
distance :: "'a::ms0 * 'a::ms0 => real" (* Distance function *)
(**********************************************************
metric space (MS)
**********************************************************)
axclass
ms < ms0
positive_ms :
"ALL (x::'a::ms0) (y::'a::ms0). 0 <= distance(x,y)"
diagonal_ms :
"ALL (x::'a::ms0) (y::'a::ms0). (distance(x,y) = 0) = (x = y)"
symmetry_ms :
"ALL (x::'a::ms0) (y::'a::ms0). distance(x,y) = distance(y,x)"
triangle_inequality_ms:
"ALL (x::'a::ms0) (y::'a::ms0) (z::'a::ms0).
distance(x,z) <= distance(x,y)+distance(y,z)"
declare positive_ms [simp]
(*------------------*
| cauchy and limit |
*------------------*)
consts
cauchy :: "'a::ms infinite_seq => bool"
convergeTo :: "'a::ms infinite_seq => 'a::ms => bool"
("_ convergeTo _" [55,55] 55)
hasLimit :: "'a::ms infinite_seq => bool"
Limit :: "'a::ms infinite_seq => 'a::ms"
defs
cauchy_def :"cauchy xs == ALL delta::real.
0 < delta --> (EX n. ALL i j.
((n <= i & n <= j) --> (distance(xs i, xs j) < delta)))"
convergeTo_def :"xs convergeTo x == ALL eps::real. 0 < eps --> (EX n. ALL m.
n <= m --> distance(x, xs m) < eps)"
Limit_def :"Limit xs == THE x. xs convergeTo x"
(*---------*
| mapping |
*---------*)
consts
non_expanding :: "('a::ms => 'b::ms) => bool"
contraction :: "('a::ms => 'b::ms) => bool"
contraction_alpha :: "('a::ms => 'b::ms) => real => bool"
map_alpha :: "('a::ms => 'b::ms) => real => bool"
defs
non_expanding_def :
"non_expanding f == map_alpha f 1"
contraction_def :
"contraction f == EX (alpha::real). contraction_alpha f alpha"
contraction_alpha_def:
"contraction_alpha f alpha == (alpha < 1 & map_alpha f alpha)"
map_alpha_def:
"map_alpha f alpha == (0 <= alpha &
(ALL x y. distance(f x,f y) <= (alpha * distance(x,y))))"
(**********************************************************
small lemmas
**********************************************************)
lemma same_pnt_zero[simp]: "distance((x::'a::ms),x)=0"
by (simp add: diagonal_ms)
lemma diff_pnt_pos_only_if:
"0 < distance(x::'a::ms,y) ==> x ~= y"
apply (case_tac "x = y")
by (simp_all)
lemma diff_pnt_pos_if:
"(x::'a::ms) ~= y ==> 0 < distance(x,y)"
apply (case_tac "distance (x, y) = 0")
apply (simp add: diagonal_ms)
by (simp add: real_less_le)
lemma diff_pnt_pos:
"(0 < distance(x::'a::ms,y)) = (x ~= y)"
apply (rule iffI)
apply (simp add: diff_pnt_pos_only_if)
apply (simp add: diff_pnt_pos_if)
done
(**********************************************************
map
**********************************************************)
(*** contraction_alpha ***)
lemma contraction_alpha_range:
"contraction_alpha f alpha ==> 0 <= alpha & alpha < 1"
by (simp add: contraction_alpha_def map_alpha_def)
(*** contraction --> non expanding ***)
lemma contraction_non_expanding:
"contraction f ==> non_expanding f"
apply (simp add: contraction_def contraction_alpha_def map_alpha_def
non_expanding_def)
apply (elim conjE exE)
apply (intro allI)
apply (drule_tac x="x" in spec)
apply (drule_tac x="y" in spec)
apply (subgoal_tac "alpha * distance (x, y) <= 1 * distance (x, y)")
apply (simp)
by (rule mult_right_mono, simp_all)
(*** composition ***)
(* map_alpha *)
lemma compo_map_alpha:
"[| map_alpha f alpha1 ; map_alpha g alpha2 |]
==> map_alpha (f o g) (alpha1 * alpha2)"
apply (simp add: map_alpha_def)
apply (elim conjE)
apply (insert mult_right_mono[of 0 alpha1 alpha2], simp)
apply (intro allI)
apply (drule_tac x="g x" in spec)
apply (drule_tac x="x" in spec)
apply (drule_tac x="g y" in spec)
apply (drule_tac x="y" in spec)
apply (subgoal_tac
"alpha1 * distance (g x, g y) <= alpha1 * alpha2 * distance (x, y)") (* ...1 *)
apply (simp)
(* 1 *)
by (simp add: real_mult_assoc mult_left_mono)
lemma compo_contra_alpha:
"[| contraction_alpha f alpha1 ; contraction_alpha g alpha2 |]
==> contraction_alpha (f o g) (alpha1 * alpha2)"
apply (simp add: contraction_alpha_def)
apply (simp add: compo_map_alpha)
apply (simp add: map_alpha_def)
apply (case_tac "alpha2 = 0", simp)
apply (insert real_mult_less_mono[of alpha1 "1::real" alpha2 "1::real"])
by (force)
lemma compo_non_expand_map_alpha:
"[| non_expanding f ; map_alpha g alpha |]
==> map_alpha (f o g) alpha"
apply (simp add: non_expanding_def)
apply (insert compo_map_alpha[of f 1 g alpha])
by (simp)
lemma compo_map_alpha_non_expand:
"[| map_alpha f alpha ; non_expanding g |]
==> map_alpha (f o g) alpha"
apply (simp add: non_expanding_def)
apply (insert compo_map_alpha[of f alpha g 1])
by (simp)
lemma compo_non_expand_contra_alpha:
"[| non_expanding f ; contraction_alpha g alpha |]
==> contraction_alpha (f o g) alpha"
apply (simp add: contraction_alpha_def)
by (simp add: compo_non_expand_map_alpha)
lemma compo_contra_alpha_non_expand:
"[| contraction_alpha f alpha ; non_expanding g |]
==> contraction_alpha (f o g) alpha"
apply (simp add: contraction_alpha_def)
by (simp add: compo_map_alpha_non_expand)
lemma compo_non_expand:
"[| non_expanding f ; non_expanding g |]
==> non_expanding (f o g)"
apply (simp add: non_expanding_def)
apply (insert compo_map_alpha[of f 1 g 1])
by (simp)
(**********************************************************
convergeTo
**********************************************************)
(*** The limit is unique ***)
lemma unique_convergence:
"[| xs convergeTo x ; xs convergeTo y |] ==> x = y"
apply (case_tac "x = y")
apply (simp)
apply (simp add: convergeTo_def)
apply (drule_tac x="distance (x, y) /2" in spec)
apply (drule_tac x="distance (x, y) /2" in spec)
apply (simp add: diff_pnt_pos)
apply (elim exE)
apply (rename_tac n m)
apply (drule_tac x="max n m" in spec)
apply (drule_tac x="max n m" in spec)
apply (simp add: le_maxI1 le_maxI2)
apply (insert triangle_inequality_ms)
apply (drule_tac x="x" in spec)
apply (drule_tac x="xs (max n m)" in spec)
apply (drule_tac x="y" in spec)
apply (simp add: symmetry_ms)
done
(*** Convergence implies cauchy seq***)
lemma convergece_cauchy: "xs convergeTo x ==> cauchy xs"
apply (simp add: cauchy_def)
apply (intro allI impI)
apply (simp add: convergeTo_def)
apply (drule_tac x="delta/2" in spec)
apply (simp)
apply (erule exE)
apply (rule_tac x="n" in exI)
apply (intro allI impI)
apply (frule_tac x="i" in spec)
apply (drule_tac x="j" in spec)
apply (simp)
apply (insert triangle_inequality_ms)
apply (drule_tac x="xs i" in spec)
apply (drule_tac x="x" in spec)
apply (drule_tac x="xs j" in spec)
apply (simp add: symmetry_ms)
done
(**********************************************************
Complete metric space (CMS)
**********************************************************)
axclass
cms < ms
complete_ms: "ALL xs. cauchy xs --> (EX x. xs convergeTo x)"
(**********************************************************
CMS lemmas
**********************************************************)
lemma convergeTo_to_Limit :
"cauchy (xs::'a::cms infinite_seq)
==> (xs convergeTo x) = (x = Limit xs)"
apply (simp add: Limit_def)
apply (rule iffI)
apply (rule sym)
apply (rule the_equality)
apply (simp)
apply (simp add: unique_convergence)
apply (simp)
apply (insert complete_ms)
apply (drule_tac x="xs" in spec, simp)
apply (erule exE)
apply (rule theI[of "(%x. xs convergeTo x)"])
apply (simp)
apply (simp add: unique_convergence)
done
lemma Limit_to_convergeTo:
"cauchy (xs::'a::cms infinite_seq)
==> (x = Limit xs) = (xs convergeTo x)"
by (simp add: convergeTo_to_Limit)
lemma Limit_to_convergeTo_sym:
"cauchy (xs::'a::cms infinite_seq)
==> (Limit xs = x) = (xs convergeTo x)"
apply (simp add: convergeTo_to_Limit)
by (fast)
lemmas Limit_iff = Limit_to_convergeTo Limit_to_convergeTo_sym
lemma Limit_is:
"cauchy (xs::'a::cms infinite_seq) ==> xs convergeTo Limit xs"
by (simp add: convergeTo_to_Limit)
(**********************************************************
Banach Theory
**********************************************************)
(*** step 1 (cauchy) ***)
lemma Banach_lm_contraction:
"[| contraction_alpha f alpha ; ALL i. xs (Suc i) = f(xs i) |]
==> distance(xs n, f(xs n)) <= alpha^n * distance(xs 0, f(xs 0))"
apply (induct_tac n)
apply (simp)
apply (simp)
apply (simp add: contraction_alpha_def map_alpha_def)
apply (elim conjE)
apply (drule_tac x="0" in spec) (* for convenienec *)
apply (drule_tac x="xs n" in spec)
apply (drule_tac x="f (xs n)" in spec)
apply (subgoal_tac "alpha * distance (xs n, f (xs n))
<= alpha * (alpha ^ n * distance (xs 0, f (xs 0)))")
apply (simp)
apply (rule mult_left_mono)
by (simp_all)
lemma Banach_lm_triangle:
"distance((xs::'a::cms infinite_seq) r, xs (r+n)) <=
prog_sum0 n (%m. distance(xs (r+m-(1::nat)), xs (r+m)))"
apply (induct_tac n)
apply (simp)
apply (simp)
apply (insert triangle_inequality_ms)
apply (drule_tac x="xs r" in spec)
apply (drule_tac x="xs (r + n)" in spec)
apply (drule_tac x="xs (Suc (r + n))" in spec)
apply (simp)
done
lemma Banach_lm_geo_prog_sum:
"[| contraction_alpha f alpha ; (ALL i. xs (Suc i) = f(xs i)) |]
==> prog_sum0 n (%m::nat. distance(xs (r+m-(1::nat)), xs (r+m)))
<= prog_sum r (r+n) (geo_prop (distance(xs 0, xs 1)) alpha)"
apply (induct_tac n)
apply (simp add: prog_sum_def)
apply (simp add: prog_sum_def)
apply (subgoal_tac
"distance (xs (r + n), f (xs (r + n)))
<= geo_prop (distance (xs 0, f (xs 0))) alpha (Suc (r + n))")
apply (simp)
apply (insert Banach_lm_contraction[of f alpha xs])
apply (simp add: geo_prop_def)
done
lemma Banach_lm_ineq:
"[| contraction_alpha f alpha ;
(ALL i. (xs::'a::cms infinite_seq) (Suc i) = f(xs i)) |]
==> distance(xs r, xs (r+n)) <=
distance (xs 0, f(xs 0)) * alpha^r / (1-alpha)"
apply (insert Banach_lm_triangle[of xs r n])
apply (insert Banach_lm_geo_prog_sum[of f "alpha" xs n r])
apply (insert geo_prog_sum_infinite_div
[of "distance (xs 0, xs 1)" "alpha" r "r+n"])
by (simp add: contraction_alpha_def map_alpha_def)
lemma Banach_lm_cauchy_lm_pos_distance:
"[| contraction_alpha f alpha ;
ALL i. (xs::'a::cms infinite_seq) (Suc i) = f(xs i) ;
0 < delta ; 0 < distance (xs 0, f(xs 0)) |]
==> (EX n. ALL m. distance (xs n, xs (n+m)) < delta)"
apply (insert pow_convergence[of
"alpha" "delta*(1-alpha)/distance (xs 0, f(xs 0))"])
apply (simp add: contraction_alpha_range)
apply (subgoal_tac "0 < delta * (1 - alpha) / distance (xs 0, f (xs 0))")
apply (simp)
apply (elim conjE exE)
apply (rule_tac x="n" in exI)
apply (rule allI)
(* give a subgoal to use transitivity *)
apply (subgoal_tac
"distance (xs n, xs (n + m))
<= distance (xs 0, f (xs 0)) * alpha ^ n / (1 - alpha) &
distance (xs 0, f (xs 0)) * alpha ^ n / (1 - alpha)
< delta")
apply (erule conjE, simp)
apply (simp add: Banach_lm_ineq)
apply (simp_all add: zero_le_power real_mult_div_commute
contraction_alpha_def map_alpha_def)
(* contraction_alpha_range did not work well here *)
done
lemma Banach_lm_cauchy_lm_zero_distance:
"[| contraction_alpha f alpha ;
ALL i. (xs::'a::cms infinite_seq) (Suc i) = f(xs i) ;
0 < delta ; distance (xs 0, f(xs 0)) = 0 |]
==> (EX n. ALL m. distance (xs n, xs (n+m)) < delta)"
apply (simp add: diagonal_ms)
apply (rule_tac x="0" in exI)
apply (rule allI)
apply (subgoal_tac "distance (xs 0, xs m) <= 0", simp)
by (insert Banach_lm_ineq[of f "alpha" "xs" 0], simp)
lemma Banach_lm_cauchy_lm:
"[| contraction_alpha f alpha ;
ALL i. (xs::'a::cms infinite_seq) (Suc i) = f(xs i) ; 0 < delta |]
==> (EX n. ALL m. distance (xs n, xs (n+m)) < delta)"
apply (case_tac "0 < distance (xs 0, f(xs 0))")
apply (simp add: Banach_lm_cauchy_lm_pos_distance)
apply (case_tac "distance (xs 0, f(xs 0)) = 0")
apply (simp add: Banach_lm_cauchy_lm_zero_distance)
apply (insert positive_ms)
apply (drule_tac x="xs 0" in spec)
apply (drule_tac x="f(xs 0)" in spec)
by (simp)
lemma Banach_lm_cauchy:
"[| contraction_alpha f alpha ;
ALL i. (xs::'a::cms infinite_seq) (Suc i) = f(xs i) |]
==> cauchy xs"
apply (simp add: cauchy_def)
apply (intro allI impI)
apply (subgoal_tac "EX n. ALL m. distance (xs n, xs (n + m)) < delta/2")
apply (erule exE)
apply (rule_tac x="n" in exI)
apply (intro allI impI)
apply (drule_tac x="0" in spec) (* dummy *)
apply (frule_tac x="i-n" in spec)
apply (drule_tac x="j-n" in spec)
apply (simp)
apply (insert triangle_inequality_ms)
apply (drule_tac x="xs i" in spec)
apply (drule_tac x="xs n" in spec)
apply (drule_tac x="xs j" in spec)
apply (simp add: symmetry_ms)
apply (rule Banach_lm_cauchy_lm)
by (auto)
(*** step 2 (converge to a fixpoint) ***)
lemma Banach_lm_converge:
"[| contraction_alpha f alpha ;
ALL i. (xs::'a::cms infinite_seq) (Suc i) = f(xs i) |]
==> EX x. xs convergeTo x"
by (simp add: Banach_lm_cauchy complete_ms)
lemma Banach_lm_fixpoint_lm:
"[| contraction_alpha f alpha ;
ALL i. (xs::'a::cms infinite_seq) (Suc i) = f(xs i) ;
xs convergeTo y ; 0 < eps |]
==> distance(y, f y) < eps"
apply (simp add: convergeTo_def)
apply (rotate_tac 2)
apply (drule_tac x="eps/2" in spec)
apply (simp)
apply (erule exE)
apply (rotate_tac -1)
apply (frule_tac x="n" in spec)
apply (drule_tac x="Suc n" in spec)
apply (simp)
apply (insert triangle_inequality_ms)
apply (drule_tac x="y" in spec)
apply (drule_tac x="xs (Suc n)" in spec)
apply (drule_tac x="f y" in spec)
apply (simp add: contraction_alpha_def map_alpha_def)
apply (elim conjE)
apply (rotate_tac -1)
apply (drule_tac x="xs n" in spec)
apply (drule_tac x="y" in spec)
apply (insert symmetry_ms)
apply (drule_tac x="xs n" in spec)
apply (drule_tac x="y" in spec)
apply (simp)
apply (subgoal_tac "alpha * distance (y, xs n) <= 1 * distance (y, xs n)")
apply (simp)
apply (rule mult_right_mono)
by (simp_all)
lemma Banach_lm_fixpoint:
"[| contraction_alpha f alpha ;
ALL i. (xs::'a::cms infinite_seq) (Suc i) = f(xs i) ;
xs convergeTo y |]
==> y = f y"
apply (case_tac "0 < distance(y, f y)")
apply (insert Banach_lm_fixpoint_lm[of f alpha xs y "distance (y, f y)"])
apply (simp)
apply (case_tac "0 = distance(y, f y)")
apply (simp add: diagonal_ms)
(* distance(y, f y) < 0 *)
apply (insert positive_ms)
apply (drule_tac x="y" in spec)
apply (drule_tac x="f y" in spec)
apply (simp)
done
(*** step 3 (unique fixpoint) ***)
lemma Banach_lm_unique_lm:
"[| contraction_alpha f alpha ;
ALL i. (xs::'a::cms infinite_seq) (Suc i) = f(xs i) ;
y = f y ; z = f z |]
==> distance(y, z) <= alpha * distance(y, z)"
apply (simp add: contraction_alpha_def map_alpha_def)
apply (elim conjE)
apply (drule_tac x="y" in spec)
apply (drule_tac x="z" in spec)
apply (simp)
done
lemma Banach_lm_unique:
"[| contraction_alpha f alpha ;
ALL i. (xs::'a::cms infinite_seq) (Suc i) = f(xs i) ;
y = f y ; z = f z |]
==> y = z"
apply (case_tac "0 < distance(y, z)")
apply (insert Banach_lm_unique_lm[of f alpha xs y z])
apply (simp add: contraction_alpha_def)
apply (insert mult_less_cancel_right[of alpha "distance (y, z)" 1])
apply (simp)
apply (case_tac "0 = distance(y, z)")
apply (simp add: diagonal_ms)
(* distance(y, Z) < 0 *)
apply (simp add: real_less_le)
done
(*** final step (Banach Theory) ***)
(*------------------*
| Banach lm |
*------------------*)
theorem Banach_thm_xs:
"[| contraction f ;
ALL i. (xs::'a::cms infinite_seq) (Suc i) = f(xs i) |]
==> (EX y. (xs convergeTo y & y isUFP f))"
apply (simp add: contraction_def)
apply (erule exE)
apply (subgoal_tac "EX y. xs convergeTo y")
apply (erule exE)
apply (rule_tac x="y" in exI)
apply (simp)
apply (subgoal_tac "y = f y")
apply (simp add: isUFP_def)
apply (intro allI impI)
apply (rule Banach_lm_unique[of f _ xs])
apply (simp_all)
apply (simp add: Banach_lm_fixpoint)
apply (simp add: Banach_lm_converge)
done
(*-------------------*
| Banach |
*-------------------*)
theorem Banach_thm:
"contraction (f::('a::cms => 'a))
==> f hasUFP & (%n. (f^n) x0) convergeTo UFP f"
apply (subgoal_tac "f hasUFP", simp)
apply (insert Banach_thm_xs[of f "(%n. ((f^n) x0))"])
apply (simp)
apply (elim conjE exE)
apply (insert UFP_is[of f], simp)
apply (subgoal_tac "y = UFP f", simp)
apply (simp add: UFP_unique)
apply (simp add: hasUFP_def)
apply (erule exE)
apply (rule_tac x="y" in exI, simp)
done
(*------------------*
| Banach existency |
*------------------*)
theorem Banach_thm_EX: "contraction (f::('a::cms => 'a)) ==> f hasUFP"
by (simp add: Banach_thm)
end
lemma same_pnt_zero:
distance (x, x) = 0
lemma diff_pnt_pos_only_if:
0 < distance (x, y) ==> x ≠ y
lemma diff_pnt_pos_if:
x ≠ y ==> 0 < distance (x, y)
lemma diff_pnt_pos:
(0 < distance (x, y)) = (x ≠ y)
lemma contraction_alpha_range:
contraction_alpha f alpha ==> 0 ≤ alpha ∧ alpha < 1
lemma contraction_non_expanding:
contraction f ==> non_expanding f
lemma compo_map_alpha:
[| map_alpha f alpha1.0; map_alpha g alpha2.0 |] ==> map_alpha (f o g) (alpha1.0 * alpha2.0)
lemma compo_contra_alpha:
[| contraction_alpha f alpha1.0; contraction_alpha g alpha2.0 |] ==> contraction_alpha (f o g) (alpha1.0 * alpha2.0)
lemma compo_non_expand_map_alpha:
[| non_expanding f; map_alpha g alpha |] ==> map_alpha (f o g) alpha
lemma compo_map_alpha_non_expand:
[| map_alpha f alpha; non_expanding g |] ==> map_alpha (f o g) alpha
lemma compo_non_expand_contra_alpha:
[| non_expanding f; contraction_alpha g alpha |] ==> contraction_alpha (f o g) alpha
lemma compo_contra_alpha_non_expand:
[| contraction_alpha f alpha; non_expanding g |] ==> contraction_alpha (f o g) alpha
lemma compo_non_expand:
[| non_expanding f; non_expanding g |] ==> non_expanding (f o g)
lemma unique_convergence:
[| xs convergeTo x; xs convergeTo y |] ==> x = y
lemma convergece_cauchy:
xs convergeTo x ==> cauchy xs
lemma convergeTo_to_Limit:
cauchy xs ==> xs convergeTo x = (x = Limit xs)
lemma Limit_to_convergeTo:
cauchy xs ==> (x = Limit xs) = xs convergeTo x
lemma Limit_to_convergeTo_sym:
cauchy xs ==> (Limit xs = x) = xs convergeTo x
lemmas Limit_iff:
cauchy xs ==> (x = Limit xs) = xs convergeTo x
cauchy xs ==> (Limit xs = x) = xs convergeTo x
lemmas Limit_iff:
cauchy xs ==> (x = Limit xs) = xs convergeTo x
cauchy xs ==> (Limit xs = x) = xs convergeTo x
lemma Limit_is:
cauchy xs ==> xs convergeTo Limit xs
lemma Banach_lm_contraction:
[| contraction_alpha f alpha; ∀i. xs (Suc i) = f (xs i) |] ==> distance (xs n, f (xs n)) ≤ alpha ^ n * distance (xs 0, f (xs 0))
lemma Banach_lm_triangle:
distance (xs r, xs (r + n)) ≤ prog_sum0 n (%m. distance (xs (r + m - 1), xs (r + m)))
lemma Banach_lm_geo_prog_sum:
[| contraction_alpha f alpha; ∀i. xs (Suc i) = f (xs i) |] ==> prog_sum0 n (%m. distance (xs (r + m - 1), xs (r + m))) ≤ prog_sum r (r + n) (geo_prop (distance (xs 0, xs 1)) alpha)
lemma Banach_lm_ineq:
[| contraction_alpha f alpha; ∀i. xs (Suc i) = f (xs i) |] ==> distance (xs r, xs (r + n)) ≤ distance (xs 0, f (xs 0)) * alpha ^ r / (1 - alpha)
lemma Banach_lm_cauchy_lm_pos_distance:
[| contraction_alpha f alpha; ∀i. xs (Suc i) = f (xs i); 0 < delta; 0 < distance (xs 0, f (xs 0)) |] ==> ∃n. ∀m. distance (xs n, xs (n + m)) < delta
lemma Banach_lm_cauchy_lm_zero_distance:
[| contraction_alpha f alpha; ∀i. xs (Suc i) = f (xs i); 0 < delta; distance (xs 0, f (xs 0)) = 0 |] ==> ∃n. ∀m. distance (xs n, xs (n + m)) < delta
lemma Banach_lm_cauchy_lm:
[| contraction_alpha f alpha; ∀i. xs (Suc i) = f (xs i); 0 < delta |] ==> ∃n. ∀m. distance (xs n, xs (n + m)) < delta
lemma Banach_lm_cauchy:
[| contraction_alpha f alpha; ∀i. xs (Suc i) = f (xs i) |] ==> cauchy xs
lemma Banach_lm_converge:
[| contraction_alpha f alpha; ∀i. xs (Suc i) = f (xs i) |] ==> ∃x. xs convergeTo x
lemma Banach_lm_fixpoint_lm:
[| contraction_alpha f alpha; ∀i. xs (Suc i) = f (xs i); xs convergeTo y; 0 < eps |] ==> distance (y, f y) < eps
lemma Banach_lm_fixpoint:
[| contraction_alpha f alpha; ∀i. xs (Suc i) = f (xs i); xs convergeTo y |] ==> y = f y
lemma Banach_lm_unique_lm:
[| contraction_alpha f alpha; ∀i. xs (Suc i) = f (xs i); y = f y; z = f z |] ==> distance (y, z) ≤ alpha * distance (y, z)
lemma Banach_lm_unique:
[| contraction_alpha f alpha; ∀i. xs (Suc i) = f (xs i); y = f y; z = f z |] ==> y = z
theorem Banach_thm_xs:
[| contraction f; ∀i. xs (Suc i) = f (xs i) |] ==> ∃y. xs convergeTo y ∧ y isUFP f
theorem Banach_thm:
contraction f ==> f hasUFP ∧ (%n. (f ^ n) x0.0) convergeTo UFP f
theorem Banach_thm_EX:
contraction f ==> f hasUFP