Imports
import Mathlib.Data.Real.Basic import Mathlib.Tactic import Mathlib.Topology.ContinuousMap.Bounded.Basic

Contraction Mapping

Introduction

This page lays out the Lean formalization code of the Contraction Mapping Theorem and Blackwell's Sufficiency Theorem for bounded continuous functions. A graphical visualization of the relevant mathematical dependencies can be viewed here.

Setup

Tell Lean to interpret any use of X to be of Nonempty, TopologicalSpace type. The curly braces denote the implicit argument and type inferred by Lean.

variable {X : Type*} [Nonempty X] [TopologicalSpace X]

First, we define a structure for a contraction mapping from the space of bounded continuous functions to the space of bounded continuous functions.

Definition: Contraction Mapping

Let B(X) be the space of bounded continuous functions, (B(X), d) be a metric space (d being the sup-norm), and T : B(X) \rightarrow B(X) be a function mapping B(X) to itself. The function T is a contraction mapping if there exists a number \beta \in (0, 1) satisfying d(Tf, Tg) \leq \beta d(f, g)\text{ for all }f, g \in B(X).

open BoundedContinuousFunctionstructure IsContraction (T : BoundedContinuousFunction X BoundedContinuousFunction X ) where β : hβ_gt0 : 0 < β hβ_lt1 : β < 1 h_dist : (f g : X →ᵇ ), dist (T f) (T g) β * dist f g

To prove certain properties of a contraction mapping, it will be helpful to know that contraction mappings are continuous.

Lemma: Contraction Mappings are Continuous

For all f_0 ∈ B(X) and ε > 0 there exists a δ such that whenever f ∈ B(X) such that d(f, f_0) < δ, we have d(Tf, Tf_0) < ε.

Proof.
Fix an arbitrary f_0 ∈ B(X) and ε > 0 and pick δ = ε. Then d(Tf, Tf_0) ≤ β d(f, f_0) ≤ β δ = β ε < ε.

omit [Nonempty X] in lemma IsContractionIsContinuous {T : BoundedContinuousFunction X BoundedContinuousFunction X } (hT : IsContraction T) : Continuous T := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction TContinuous T -- Extract β and its properties from the contraction definition X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:hβ0:0 < βhβ1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f gContinuous T -- Use the metric space ε-δ definition of continuity X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:hβ0:0 < βhβ1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f g (b : X →ᵇ ), ε > 0, δ > 0, (a : X →ᵇ ), dist a b < δ dist (T a) (T b) < ε intro f₀ X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:hβ0:0 < βhβ1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f gf₀:X →ᵇ ε:ε > 0 δ > 0, (a : X →ᵇ ), dist a f₀ < δ dist (T a) (T f₀) < ε X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:hβ0:0 < βhβ1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f gf₀:X →ᵇ ε::ε > 0 δ > 0, (a : X →ᵇ ), dist a f₀ < δ dist (T a) (T f₀) < ε -- Choose δ = ε (implicitly with ε > 0) X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:hβ0:0 < βhβ1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f gf₀:X →ᵇ ε::ε > 0 (a : X →ᵇ ), dist a f₀ < ε dist (T a) (T f₀) < ε intro f X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:hβ0:0 < βhβ1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f gf₀:X →ᵇ ε::ε > 0f:X →ᵇ hs:dist f f₀ < εdist (T f) (T f₀) < ε -- We know dist (T f) (T f₀) ≤ β * dist f f₀ by the definition of a contraction mapping X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:hβ0:0 < βhβ1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f gf₀:X →ᵇ ε::ε > 0f:X →ᵇ hs:dist f f₀ < εh_le:dist (T f) (T f₀) β * dist f f₀dist (T f) (T f₀) < ε -- Since dist f f₀ < ε and β > 0, we have β * dist f f₀ < β * ε X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:hβ0:0 < βhβ1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f gf₀:X →ᵇ ε::ε > 0f:X →ᵇ hs:dist f f₀ < εh_le:dist (T f) (T f₀) β * dist f f₀h1:β * dist f f₀ < β * εdist (T f) (T f₀) < ε -- Since β < 1 and 0 < ε, we have β * ε < 1 * ε X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:hβ0:0 < βhβ1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f gf₀:X →ᵇ ε::ε > 0f:X →ᵇ hs:dist f f₀ < εh_le:dist (T f) (T f₀) β * dist f f₀h1:β * dist f f₀ < β * εh2:β * ε < 1 * εdist (T f) (T f₀) < ε X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:hβ0:0 < βhβ1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f gf₀:X →ᵇ ε::ε > 0f:X →ᵇ hs:dist f f₀ < εh_le:dist (T f) (T f₀) β * dist f f₀h1:β * dist f f₀ < β * εh2:β * ε < εdist (T f) (T f₀) < ε -- Combine the above two remarks to get β * dist f f₀ < ε X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:hβ0:0 < βhβ1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f gf₀:X →ᵇ ε::ε > 0f:X →ᵇ hs:dist f f₀ < εh_le:dist (T f) (T f₀) β * dist f f₀h1:β * dist f f₀ < β * εh2:β * ε < εh_lt:β * dist f f₀ < εdist (T f) (T f₀) < ε -- Conclude that dist (T f) (T f₀) < ε All goals completed! 🐙

Now, we define a fixed point of the operator.

Definition: Fixed Point

def IsFixedPoint (v : BoundedContinuousFunction X ) (T : BoundedContinuousFunction X BoundedContinuousFunction X ) : Prop := T v = v

A final result to help us prove the Contraction Mapping Theorem is a bound on the difference of a sequence defined by the repeated application of the contraction map to an element in our metric space.

Lemma: Bound Difference One

d(T^n v_0, T^{n + 1} v_0) ≤ β^n d(v_0, T v_0) Proof.
We can use induction to prove this result. We can verify that for the base case of n = 1 we have that d(T v_0, T^2 v_0) ≤ β d(v_0, T v_0) using the contraction property of the map. The induction hypothesis is that d(T^k v_0, T^{k + 1} v_0) ≤ β^k d(v_0, T v_0). We verify the induction step by applying the contraction property of the map before invoking the induction hypothesis: d(T^{k + 1} v_0, T^{k + 2} v_0) ≤ β d(T^k v_0, T^{k + 1} v_0) ≤ β β^k d(v_0, T v_0) ≤ β^{k + 1} d(v_0, T v_0).

omit [Nonempty X] in lemma bound_difference_one {T : BoundedContinuousFunction X BoundedContinuousFunction X } (v₀ : BoundedContinuousFunction X ) (hT : IsContraction T): n : , dist (T^[n] v₀) (T^[n + 1] v₀) hT.β^n * dist v₀ (T v₀) := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction T (n : ), dist (T^[n] v₀) (T^[n + 1] v₀) hT.β ^ n * dist v₀ (T v₀) X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ β:hβ_gt0:0 < βhβ_lt1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f g (n : ), dist (T^[n] v₀) (T^[n + 1] v₀) { β := β, hβ_gt0 := hβ_gt0, hβ_lt1 := hβ_lt1, h_dist := h_dist }.β ^ n * dist v₀ (T v₀) -- Extract weak inequalities for β from strict inequalities X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ β:hβ_gt0:0 < βhβ_lt1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f ghβ_ge0:0 β (n : ), dist (T^[n] v₀) (T^[n + 1] v₀) { β := β, hβ_gt0 := hβ_gt0, hβ_lt1 := hβ_lt1, h_dist := h_dist }.β ^ n * dist v₀ (T v₀) X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ β:hβ_gt0:0 < βhβ_lt1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f ghβ_ge0:0 βn:dist (T^[n] v₀) (T^[n + 1] v₀) { β := β, hβ_gt0 := hβ_gt0, hβ_lt1 := hβ_lt1, h_dist := h_dist }.β ^ n * dist v₀ (T v₀) induction n with X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ β:hβ_gt0:0 < βhβ_lt1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f ghβ_ge0:0 βdist (T^[0] v₀) (T^[0 + 1] v₀) { β := β, hβ_gt0 := hβ_gt0, hβ_lt1 := hβ_lt1, h_dist := h_dist }.β ^ 0 * dist v₀ (T v₀) X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ β:hβ_gt0:0 < βhβ_lt1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f ghβ_ge0:0 βdist (T^[0] v₀) (T^[0 + 1] v₀) dist v₀ (T v₀) All goals completed! 🐙 X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ β:hβ_gt0:0 < βhβ_lt1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f ghβ_ge0:0 βk:ih:dist (T^[k] v₀) (T^[k + 1] v₀) { β := β, hβ_gt0 := hβ_gt0, hβ_lt1 := hβ_lt1, h_dist := h_dist }.β ^ k * dist v₀ (T v₀)dist (T^[k + 1] v₀) (T^[k + 1 + 1] v₀) { β := β, hβ_gt0 := hβ_gt0, hβ_lt1 := hβ_lt1, h_dist := h_dist }.β ^ (k + 1) * dist v₀ (T v₀) -- Use `calc` to implement the transitive reasoning from the proof calc dist (T^[k + 1] v₀) (T^[k + 2] v₀) _ = dist (T (T^[k] v₀)) (T (T^[k + 1] v₀)) := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ β:hβ_gt0:0 < βhβ_lt1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f ghβ_ge0:0 βk:ih:dist (T^[k] v₀) (T^[k + 1] v₀) { β := β, hβ_gt0 := hβ_gt0, hβ_lt1 := hβ_lt1, h_dist := h_dist }.β ^ k * dist v₀ (T v₀)dist (T^[k + 1] v₀) (T^[k + 2] v₀) = dist (T (T^[k] v₀)) (T (T^[k + 1] v₀)) simp_rw X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ β:hβ_gt0:0 < βhβ_lt1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f ghβ_ge0:0 βk:ih:dist (T^[k] v₀) (T^[k + 1] v₀) { β := β, hβ_gt0 := hβ_gt0, hβ_lt1 := hβ_lt1, h_dist := h_dist }.β ^ k * dist v₀ (T v₀)dist (T^[k + 1] v₀) (T^[k + 2] v₀) = dist (T (T^[k] v₀)) (T (T^[k + 1] v₀))Function.iterate_succ_apply'] _ β * dist (T^[k] v₀) (T^[k + 1] v₀) := h_dist _ _ _ β * (β^k * dist v₀ (T v₀)) := mul_le_mul_of_nonneg_left ih hβ_ge0 _ = β^(k+1) * dist v₀ (T v₀) := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ β:hβ_gt0:0 < βhβ_lt1:β < 1h_dist: (f g : X →ᵇ ), dist (T f) (T g) β * dist f ghβ_ge0:0 βk:ih:dist (T^[k] v₀) (T^[k + 1] v₀) { β := β, hβ_gt0 := hβ_gt0, hβ_lt1 := hβ_lt1, h_dist := h_dist }.β ^ k * dist v₀ (T v₀)β * (β ^ k * dist v₀ (T v₀)) = β ^ (k + 1) * dist v₀ (T v₀) All goals completed! 🐙

Now, we are ready to prove the Contraction Mapping Theorem.

Theorem: Contraction Mapping Theorem

Let B(X) be a space of bounded continuous functions, (B(X), d) be a complete metric space and suppose that T : B(X) → B(X) is a contraction mapping with modulus β. Then we have the following two properties.

  1. The operator T has exactly one fixed point v^* ∈ B(X).

  2. For any v_0 ∈ B(X), and any $n ∈ ℕ$, we have d(T^n v_0, v^*) ≤ β^n d(v_0, v^*).

Proof.
Take some v_0 \in B(X).

  1. I'll first prove existence of a fixed point. By Lemma: Bound Difference One, we know that d(T^n v_0, T^{n + 1} v_0) ≤ β^n d(v_0, T v_0), which converges to zero. By this geometric bound, the sequence \{T^n v_0\}_{n = 0}^∞ is a Cauchy sequence. By continuity of T, we also know that T v^* := T \lim_{n = 0}^∞ d(T^n v_0, T^{n + 1} v_0) = \lim_{n = 0}^∞ d(T^{n + 1} v_0, T^{n + 2} v_0) = v^*, meaning v^* is a fixed point.

    I'll now prove uniqueness of the fixed point. If there exists another fixed point v', we must have d(v^*, v') =: a > 0. We then reach a contradiction with 0 < a = d(v^*, v') = d(T v^*, T v') ≤ β d(v^*, v') = β a.

  2. We can use induction to prove this second statement. For the base case of n = 0, we trivially have that d(v_0, v^*) ≤ d(v_0, v^*). We can prove the induction step by using the definition of the fixed point and the contraction property of the operator, before invoking the induction hypothesis. d(T^{k + 1} v_0, v^*) = d(T T^k v_0, T v^*) ≤ β d(T^k, v^*) = β · β^k d(v_0, v^*) = β^{k + 1} d(v_0, v^*)

omit [Nonempty X] in theorem ContractionMappingTheorem {T : BoundedContinuousFunction X BoundedContinuousFunction X } (hT : IsContraction T) : (∃! v_star : BoundedContinuousFunction X , IsFixedPoint v_star T) ( v_star : BoundedContinuousFunction X , IsFixedPoint v_star T (v₀ : BoundedContinuousFunction X ) (n : ), dist v_star (T^[n] v₀) hT.β^n * dist v_star v₀) := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction T(∃! v_star, IsFixedPoint v_star T) (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ -- Take $`v_0` by non-emptiness of $`B(X)` X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ (∃! v_star, IsFixedPoint v_star T) (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ -- Add a weak inequality for β from the strict inequality X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.β(∃! v_star, IsFixedPoint v_star T) (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ -- Prove the sequence is Cauchy using our geometric bound have h_cauchy : CauchySeq (fun n => T^[n] v₀) := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction T(∃! v_star, IsFixedPoint v_star T) (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ -- Mathlib provides a tool to deduce Cauchy sequences directly from geometric bounds X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.β (n : ), dist (T^[n] v₀) (T^[n + 1] v₀) dist v₀ (T v₀) * hT.β ^ n X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βn:dist (T^[n] v₀) (T^[n + 1] v₀) dist v₀ (T v₀) * hT.β ^ n calc dist (T^[n] v₀) (T^[n + 1] v₀) _ hT.β^n * dist v₀ (T v₀) := bound_difference_one v₀ hT n _ = dist v₀ (T v₀) * hT.β^n := mul_comm _ _ -- Get v_star from the Cauchy sequence convergence X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀h_converges: x, Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds x)(∃! v_star, IsFixedPoint v_star T) (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)(∃! v_star, IsFixedPoint v_star T) (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ -- Establish that v_star is a fixed point of T (T v_star = v_star) have h_fixed : IsFixedPoint v_star T := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction T(∃! v_star, IsFixedPoint v_star T) (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)T v_star = v_star -- Change the goal to the definition of a fixed point -- We show T v_star = v_star by showing that both sides are limits of T^[n + 1] v₀ have h1 : Filter.Tendsto (fun n => T^[n + 1] v₀) Filter.atTop (nhds (T v_star)) := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction T(∃! v_star, IsFixedPoint v_star T) (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_cont:Continuous TFilter.Tendsto (fun n T^[n + 1] v₀) Filter.atTop (nhds (T v_star)) X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_cont:Continuous Th_tendsto:Filter.Tendsto T (nhds v_star) (nhds (T v_star))Filter.Tendsto (fun n T^[n + 1] v₀) Filter.atTop (nhds (T v_star)) -- Define a convergence neighborhood of the function simp_rw X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_cont:Continuous Th_tendsto:Filter.Tendsto T (nhds v_star) (nhds (T v_star))Filter.Tendsto (fun n T^[n + 1] v₀) Filter.atTop (nhds (T v_star))Function.iterate_succ_apply'] All goals completed! 🐙 -- Chains continuity of T at v_star with the limit of the sequence to get the operator aplied to the converging sequence have h2 : Filter.Tendsto (fun n => T^[n + 1] v₀) Filter.atTop (nhds v_star) := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction T(∃! v_star, IsFixedPoint v_star T) (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ All goals completed! 🐙 -- Apply the lemma backwards ("if") All goals completed! 🐙 -- Combine the parts to solve the main conjunction goal X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star T∃! v_star, IsFixedPoint v_star TX:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star T (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ -- Split up parts (a) and (b) -- (a) X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star T(fun v_star IsFixedPoint v_star T) v_star (y : X →ᵇ ), (fun v_star IsFixedPoint v_star T) y y = v_starX:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star T (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ -- Give v_star as the witness (candidate for unique existence) X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star T(fun v_star IsFixedPoint v_star T) v_starX:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star T (y : X →ᵇ ), (fun v_star IsFixedPoint v_star T) y y = v_starX:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star T (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ -- Split up the unique existence goal -- (i) Prove that there exists a fixed point X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star T (y : X →ᵇ ), (fun v_star IsFixedPoint v_star T) y y = v_starX:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star T (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ -- (ii) Prove that there exists a fixed point intro v_other X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_other:X →ᵇ hv_other:IsFixedPoint v_other Tv_other = v_starX:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star T (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_other:X →ᵇ hv_other:T v_other = v_otherv_other = v_starX:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star T (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ -- Apply the definition of the fixed point X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_other:X →ᵇ hv_other:T v_other = v_otherh_fixed_eq:T v_star = v_starv_other = v_starX:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star T (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ have h_dist_zero : dist v_star v_other = 0 := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction T(∃! v_star, IsFixedPoint v_star T) (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ have h_le : dist v_star v_other hT.β * dist v_star v_other := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction T(∃! v_star, IsFixedPoint v_star T) (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ calc dist v_star v_other _ = dist (T v_star) (T v_other) := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_other:X →ᵇ hv_other:T v_other = v_otherh_fixed_eq:T v_star = v_stardist v_star v_other = dist (T v_star) (T v_other) All goals completed! 🐙 _ hT.β * dist v_star v_other := hT.h_dist v_star v_other X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_other:X →ᵇ hv_other:T v_other = v_otherh_fixed_eq:T v_star = v_starh_le:dist v_star v_other hT.β * dist v_star v_otherh_dis:0 dist v_star v_otherdist v_star v_other = 0 X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_other:X →ᵇ hv_other:T v_other = v_otherh_fixed_eq:T v_star = v_starh_le:dist v_star v_other hT.β * dist v_star v_otherh_dis:0 dist v_star v_otherh_pos:¬dist v_star v_other = 0False X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_other:X →ᵇ hv_other:T v_other = v_otherh_fixed_eq:T v_star = v_starh_le:dist v_star v_other hT.β * dist v_star v_otherh_dis:0 dist v_star v_otherh_pos:¬dist v_star v_other = 0h_gt:0 < dist v_star v_otherFalse -- Combine less than or equal to with not equal to X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_other:X →ᵇ hv_other:T v_other = v_otherh_fixed_eq:T v_star = v_starh_le:dist v_star v_other hT.β * dist v_star v_otherh_dis:0 dist v_star v_otherh_pos:¬dist v_star v_other = 0h_gt:0 < dist v_star v_otherh_lt:hT.β * dist v_star v_other < 1 * dist v_star v_otherFalse X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_other:X →ᵇ hv_other:T v_other = v_otherh_fixed_eq:T v_star = v_starh_le:dist v_star v_other hT.β * dist v_star v_otherh_dis:0 dist v_star v_otherh_pos:¬dist v_star v_other = 0h_gt:0 < dist v_star v_otherh_lt:hT.β * dist v_star v_other < dist v_star v_otherFalse All goals completed! 🐙 X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star T (v_star : X →ᵇ ), IsFixedPoint v_star T (v₀ : X →ᵇ ) (n : ), dist v_star (T^[n] v₀) hT.β ^ n * dist v_star v₀ -- (b) -- use β -- Use the β we have defined as the candidate existence (the witness) -- refine ⟨hβ_gt0, hβ_lt1, ?_⟩ -- Tell Lean to prove the third part now intro v_star' X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_star':X →ᵇ hv_star':IsFixedPoint v_star' T (v₀ : X →ᵇ ) (n : ), dist v_star' (T^[n] v₀) hT.β ^ n * dist v_star' v₀ X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_star':X →ᵇ hv_star':IsFixedPoint v_star' Tv₀':X →ᵇ (n : ), dist v_star' (T^[n] v₀') hT.β ^ n * dist v_star' v₀' X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_star':X →ᵇ hv_star':IsFixedPoint v_star' Tv₀':X →ᵇ n:dist v_star' (T^[n] v₀') hT.β ^ n * dist v_star' v₀' X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_star':X →ᵇ v₀':X →ᵇ n:hv_star':T v_star' = v_star'dist v_star' (T^[n] v₀') hT.β ^ n * dist v_star' v₀' -- Apply the fixed point definition induction n with X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_star':X →ᵇ v₀':X →ᵇ hv_star':T v_star' = v_star'dist v_star' (T^[0] v₀') hT.β ^ 0 * dist v_star' v₀' X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_star':X →ᵇ v₀':X →ᵇ hv_star':T v_star' = v_star'dist v_star' (T^[0] v₀') dist v_star' v₀' All goals completed! 🐙 X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_star':X →ᵇ v₀':X →ᵇ hv_star':T v_star' = v_star'k:ih:dist v_star' (T^[k] v₀') hT.β ^ k * dist v_star' v₀'dist v_star' (T^[k + 1] v₀') hT.β ^ (k + 1) * dist v_star' v₀' calc dist v_star' (T^[k + 1] v₀') _ = dist (T v_star') (T (T^[k] v₀')) := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_star':X →ᵇ v₀':X →ᵇ hv_star':T v_star' = v_star'k:ih:dist v_star' (T^[k] v₀') hT.β ^ k * dist v_star' v₀'dist v_star' (T^[k + 1] v₀') = dist (T v_star') (T (T^[k] v₀')) All goals completed! 🐙 _ hT.β * dist v_star' (T^[k] v₀') := hT.h_dist v_star' (T^[k] v₀') _ hT.β * (hT.β^k * dist v_star' v₀') := mul_le_mul_of_nonneg_left ih hβ_ge0 _ = hT.β^(k + 1) * dist v_star' v₀' := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ hT:IsContraction Tv₀:X →ᵇ hβ_ge0:0 hT.βh_cauchy:CauchySeq fun n T^[n] v₀v_star:X →ᵇ h_lim:Filter.Tendsto (fun n T^[n] v₀) Filter.atTop (nhds v_star)h_fixed:IsFixedPoint v_star Tv_star':X →ᵇ v₀':X →ᵇ hv_star':T v_star' = v_star'k:ih:dist v_star' (T^[k] v₀') hT.β ^ k * dist v_star' v₀'hT.β * (hT.β ^ k * dist v_star' v₀') = hT.β ^ (k + 1) * dist v_star' v₀' All goals completed! 🐙

We can now provide a theorem that will tell us what sufficient conditions are for an operator to be a contraction mapping. That will help one find contraction mappings, for which one can use the results of the Contraction Mapping Theorem.

First, we will need to define two properties an operator can have.

Definition: Monotonicity

An operator T is said to satisfy monotonicity if for all bounded continuous functions f, g : X → ℝ such that f(x) ≤ g(x) ∀ x ∈ X, we have T f(x) ≤ T g(x).

def MonotoneOperator (T : (X →ᵇ ) (X →ᵇ )) : Prop := f g : X →ᵇ , f g T f T g

Definition: Discounting

An operator T is said to satisfy discounting when for all a ∈ ℝ_+, and for all x ∈ X we have that T (f(x) + a) ≤ T f(x) + β a.

def DiscountingOperator (T : (X →ᵇ ) (X →ᵇ )) (β : ) : Prop := 0 < β β < 1 (f : X →ᵇ ) (a : ), 0 a T (f + const X a) T f + const X (β * a)

Theorem: Blackwell's Sufficient Conditions

Let X ⊆ ℝ^L and B(X) be the space of bounded functions f: X → ℝ with d being the sup-norm. Let T : B(X) → B(X) be an operator satisfying the following two conditions.

  1. Monotonicity. If f, g ∈ B(X) are such that f(x) ≤ g(x) for all x ∈ X, then (Tf)(x) ≤ (Tg)(x) for all x ∈ X.

  2. Discounting. Let the function f + a, for f ∈ B(X) and a ∈ ℝ_+, be defined by (f + a)(x) = f(x) + a. There exists β ∈ (0, 1) such that for all f ∈ B(X), 0 ≤ a, and all x ∈ X we have the following. [T(f + a)](x) ≤ [Tf](x) + β a. Proof.
    For f, g ∈ B(X), denote f ≤ g when f(x) ≤ g(x) for all x ∈ X. We must have that for all x ∈ X, we have that f(x) - g(x) ≤ sup_{y ∈ X} \lVert f(y) - g(y) \rVert =: d(f, g). We can therefore write f ≤ g + d(f, g) by the notation introduced at the start of this proof. From monotonicity, we obtain that Tf ≤ T[g + d(f, g)]. As d(f, g) ∈ ℝ_+, we have that Tf ≤ Tg + βd(f, g) for some β ∈ (0, 1). Rearranging yields Tf - Tg ≤ β d(f, g). Repeating this argument while switching positions for f and g yields Tg - Tf ≤ β d(g, f), or -(Tf - Tg) ≤ β d(f, g) by symmetry of the metric. Thus, we obtain the definition of T being a contraction mapping as stated below. sup_{x ∈ X} \lVert (Tf)(x) - (Tg)(x) \rVert = d(Tf, Tg) ≤ β d(f, g).

def blackwell_sufficient_conditions (T : BoundedContinuousFunction X BoundedContinuousFunction X ) (β : ) (h_mono : MonotoneOperator T) (h_disc : DiscountingOperator T β) : IsContraction T where β := β hβ_gt0 := h_disc.1 -- Assign first group hβ_lt1 := h_disc.2.1 -- Assign first of second group h_dist := X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T β (f g : X →ᵇ ), dist (T f) (T g) β * dist f g -- Supply the last property by a proof intro f X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ dist (T f) (T g) β * dist f g -- Transform the sup-norm inequality into a pointwise one X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ (x : X), dist ((T f) x) ((T g) x) β * dist f g X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xdist ((T f) x) ((T g) x) β * dist f g -- Prove that `f ≤ g + dist(f, g)` pointwise have h_le_g : f g + const X (dist f g) := X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T β (f g : X →ᵇ ), dist (T f) (T g) β * dist f g X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xy:X(fun f f.toFun) f y (fun f f.toFun) (g + const X (dist f g)) y -- In `dist f g ≤ C ↔ ∀ (x : α), dist (f x) (g x) ≤ C`, set `C = dist f g` X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xy:Xhy:dist (f y) (g y) dist f g(fun f f.toFun) f y (fun f f.toFun) (g + const X (dist f g)) y X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xy:Xhy:|f y - g y| dist f g(fun f f.toFun) f y (fun f f.toFun) (g + const X (dist f g)) y X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xy:Xhy:|f y - g y| dist f gh_abs:f y - g y |f y - g y|(fun f f.toFun) f y (fun f f.toFun) (g + const X (dist f g)) y X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xy:Xhy:|f y - g y| dist f gh_abs:f y - g y |f y - g y|h_combined:f y - g y dist f g(fun f f.toFun) f y (fun f f.toFun) (g + const X (dist f g)) y X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xy:Xhy:|f y - g y| dist f gh_abs:f y - g y |f y - g y|h_combined:f y - g y dist f gf y g y + dist f g All goals completed! 🐙 -- Apply monotonicity and discounting to get the first bound X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))dist ((T f) x) ((T g) x) β * dist f g X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)dist ((T f) x) ((T g) x) β * dist f g X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)h_combined1:T f T g + const X (β * dist f g)dist ((T f) x) ((T g) x) β * dist f g X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)h_combined1:T f T g + const X (β * dist f g)h_x1:(fun f f.toFun) (T f) x (fun f f.toFun) (T g + const X (β * dist f g)) xdist ((T f) x) ((T g) x) β * dist f g -- Prove that `g ≤ f + dist(g, f))` pointwise have h_le_f : g f + const X (dist g f) := X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T β (f g : X →ᵇ ), dist (T f) (T g) β * dist f g X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)h_combined1:T f T g + const X (β * dist f g)h_x1:(fun f f.toFun) (T f) x (fun f f.toFun) (T g + const X (β * dist f g)) xy:X(fun f f.toFun) g y (fun f f.toFun) (f + const X (dist g f)) y X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)h_combined1:T f T g + const X (β * dist f g)h_x1:(fun f f.toFun) (T f) x (fun f f.toFun) (T g + const X (β * dist f g)) xy:Xhy:dist (g y) (f y) dist g f(fun f f.toFun) g y (fun f f.toFun) (f + const X (dist g f)) y X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)h_combined1:T f T g + const X (β * dist f g)h_x1:(fun f f.toFun) (T f) x (fun f f.toFun) (T g + const X (β * dist f g)) xy:Xhy:|g y - f y| dist g f(fun f f.toFun) g y (fun f f.toFun) (f + const X (dist g f)) y X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)h_combined1:T f T g + const X (β * dist f g)h_x1:(fun f f.toFun) (T f) x (fun f f.toFun) (T g + const X (β * dist f g)) xy:Xhy:|g y - f y| dist g fh_abs:g y - f y |g y - f y|(fun f f.toFun) g y (fun f f.toFun) (f + const X (dist g f)) y X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)h_combined1:T f T g + const X (β * dist f g)h_x1:(fun f f.toFun) (T f) x (fun f f.toFun) (T g + const X (β * dist f g)) xy:Xhy:|g y - f y| dist g fh_abs:g y - f y |g y - f y|h_combined:g y - f y dist g f(fun f f.toFun) g y (fun f f.toFun) (f + const X (dist g f)) y X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)h_combined1:T f T g + const X (β * dist f g)h_x1:(fun f f.toFun) (T f) x (fun f f.toFun) (T g + const X (β * dist f g)) xy:Xhy:|g y - f y| dist g fh_abs:g y - f y |g y - f y|h_combined:g y - f y dist g fg y f y + dist g f All goals completed! 🐙 -- Apply monotonicity and discounting to get the second bound X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)h_combined1:T f T g + const X (β * dist f g)h_x1:(fun f f.toFun) (T f) x (fun f f.toFun) (T g + const X (β * dist f g)) xh_le_f:g f + const X (dist g f)h_T_le2:T g T (f + const X (dist g f))dist ((T f) x) ((T g) x) β * dist f g X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)h_combined1:T f T g + const X (β * dist f g)h_x1:(fun f f.toFun) (T f) x (fun f f.toFun) (T g + const X (β * dist f g)) xh_le_f:g f + const X (dist g f)h_T_le2:T g T (f + const X (dist g f))h_disc2:T (f + const X (dist g f)) T f + const X (β * dist g f)dist ((T f) x) ((T g) x) β * dist f g X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)h_combined1:T f T g + const X (β * dist f g)h_x1:(fun f f.toFun) (T f) x (fun f f.toFun) (T g + const X (β * dist f g)) xh_le_f:g f + const X (dist g f)h_T_le2:T g T (f + const X (dist g f))h_disc2:T (f + const X (dist g f)) T f + const X (β * dist g f)h_combined2:T g T f + const X (β * dist g f)dist ((T f) x) ((T g) x) β * dist f g X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)h_combined1:T f T g + const X (β * dist f g)h_x1:(fun f f.toFun) (T f) x (fun f f.toFun) (T g + const X (β * dist f g)) xh_le_f:g f + const X (dist g f)h_T_le2:T g T (f + const X (dist g f))h_disc2:T (f + const X (dist g f)) T f + const X (β * dist g f)h_combined2:T g T f + const X (β * dist g f)h_x2:(fun f f.toFun) (T g) x (fun f f.toFun) (T f + const X (β * dist g f)) xdist ((T f) x) ((T g) x) β * dist f g -- Reduce the lambda function expressions and the const function expression X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)h_combined1:T f T g + const X (β * dist f g)h_x1:(T f) x (T g) x + β * dist f gh_le_f:g f + const X (dist g f)h_T_le2:T g T (f + const X (dist g f))h_disc2:T (f + const X (dist g f)) T f + const X (β * dist g f)h_combined2:T g T f + const X (β * dist g f)h_x2:(T g) x (T f) x + β * dist g fdist ((T f) x) ((T g) x) β * dist f g -- Apply commutativity of the second inequality to then conclude -- the result using metric properties of ℝ (dist x y = |x - y|) -- and the definition of |x - y| ≤ c → x - y ≤ c ∧ -(x - y) ≤ c X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)h_combined1:T f T g + const X (β * dist f g)h_x1:(T f) x (T g) x + β * dist f gh_le_f:g f + const X (dist g f)h_T_le2:T g T (f + const X (dist g f))h_disc2:T (f + const X (dist g f)) T f + const X (β * dist g f)h_combined2:T g T f + const X (β * dist g f)h_x2:(T g) x (T f) x + β * dist f gdist ((T f) x) ((T g) x) β * dist f g X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)h_combined1:T f T g + const X (β * dist f g)h_x1:(T f) x (T g) x + β * dist f gh_le_f:g f + const X (dist g f)h_T_le2:T g T (f + const X (dist g f))h_disc2:T (f + const X (dist g f)) T f + const X (β * dist g f)h_combined2:T g T f + const X (β * dist g f)h_x2:(T g) x (T f) x + β * dist f g|(T f) x - (T g) x| β * dist f g X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)h_combined1:T f T g + const X (β * dist f g)h_x1:(T f) x - (T g) x β * dist f gh_le_f:g f + const X (dist g f)h_T_le2:T g T (f + const X (dist g f))h_disc2:T (f + const X (dist g f)) T f + const X (β * dist g f)h_combined2:T g T f + const X (β * dist g f)h_x2:(T g) x - (T f) x β * dist f g|(T f) x - (T g) x| β * dist f g X:Type u_1inst✝¹:Nonempty Xinst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ β:h_mono:MonotoneOperator Th_disc:DiscountingOperator T βf:X →ᵇ g:X →ᵇ x:Xh_le_g:f g + const X (dist f g)h_T_le1:T f T (g + const X (dist f g))h_disc1:T (g + const X (dist f g)) T g + const X (β * dist f g)h_combined1:T f T g + const X (β * dist f g)h_x1:(T f) x - (T g) x β * dist f gh_le_f:g f + const X (dist g f)h_T_le2:T g T (f + const X (dist g f))h_disc2:T (f + const X (dist g f)) T f + const X (β * dist g f)h_combined2:T g T f + const X (β * dist g f)h_x2:-((T f) x - (T g) x) β * dist f g|(T f) x - (T g) x| β * dist f g All goals completed! 🐙

Appendix

This appendix contains several results I proved but ended up not needing. The first proves that d(T^{n + k} v_0, T^n v_0) ≤ ∑_{i = 0}^{k - 1} d(T^{n + i} v_0, T^{n + i + 1} v_0), while the second proves that d(T^{n + k} v_0, T^n v_0) ≤ d(T v_0, v_0)) β^n / (1 - β), continuing previously defined notation. Chaining these lemmas together in that order would allow one to conclude that d(T^{n + k} v_0, T^n v_0) ≤ d(T v_0, v_0)) β^n / (1 - β), which provides an alternative avenue to proving (T^{n} v)_{n = 0}^∞ is a Cauchy sequence.

Lemma: Bound Arbitrary Difference Expanded

∀ n, k ∈ ℕ, ∀ v ∈ B(X),\ d(T^n v, T^{n + k} v) ≤ ∑_{i = 1}^k d(T^{n + i - 1} v, T^{n + i} v) Proof.
Apply induction with the triangle inequality. d(T^n v, T^{n + k} v) ≤ d(T^n v, T^{n + 1} v) + d(T^{n + 1} v, T^{n + k} v) From this, it follows that d(T^n v, T^{n + k} v) ≤ d(T^n v, T^{n + 1} v) + d(T^{n + 1} v, T^{n + 2} v) + … + d(T^{n + k - 1} v, T^{n + k} v).

omit [Nonempty X] in lemma bound_difference_arbitrary_expanded {T : BoundedContinuousFunction X BoundedContinuousFunction X } {v₀ : BoundedContinuousFunction X } : (n : ) (k : ), dist (T^[n] v₀) (T^[n + k] v₀) i Finset.range k, dist (T^[n + i] v₀) (T^[n + i + 1] v₀) := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ (n k : ), dist (T^[n] v₀) (T^[n + k] v₀) i Finset.range k, dist (T^[n + i] v₀) (T^[n + i + 1] v₀) intro n X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ n:k:dist (T^[n] v₀) (T^[n + k] v₀) i Finset.range k, dist (T^[n + i] v₀) (T^[n + i + 1] v₀) induction k with X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ n:dist (T^[n] v₀) (T^[n + 0] v₀) i Finset.range 0, dist (T^[n + i] v₀) (T^[n + i + 1] v₀) All goals completed! 🐙 X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ n:k:ih:dist (T^[n] v₀) (T^[n + k] v₀) i Finset.range k, dist (T^[n + i] v₀) (T^[n + i + 1] v₀)dist (T^[n] v₀) (T^[n + (k + 1)] v₀) i Finset.range (k + 1), dist (T^[n + i] v₀) (T^[n + i + 1] v₀) calc dist (T^[n] v₀) (T^[n + k + 1] v₀) _ dist (T^[n] v₀) (T^[n + k] v₀) + dist (T^[n + k] v₀) (T^[n + k + 1] v₀) := -- Apply the triangle inequality dist_triangle _ _ _ _ ( i Finset.range k, dist (T^[n + i] v₀) (T^[n + i + 1] v₀)) + dist (T^[n + k] v₀) (T^[n + k + 1] v₀) := add_le_add_left ih _ _ = i Finset.range (k + 1), dist (T^[n + i] v₀) (T^[n + i + 1] v₀) := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ n:k:ih:dist (T^[n] v₀) (T^[n + k] v₀) i Finset.range k, dist (T^[n + i] v₀) (T^[n + i + 1] v₀) i Finset.range k, dist (T^[n + i] v₀) (T^[n + i + 1] v₀) + dist (T^[n + k] v₀) (T^[n + k + 1] v₀) = i Finset.range (k + 1), dist (T^[n + i] v₀) (T^[n + i + 1] v₀) All goals completed! 🐙

Lemma: Bound Arbitrary Difference Compact

∀ n, k ∈ ℕ, ∀ v ∈ B(X),\ ∑_{i = 1}^k d(T^{n + i - 1} v, T^{n + i} v) ≤ d(v, T v) \frac{β^n}{1 - β}. Proof.
First, apply Lemma: Bound Difference One, to each term in the sum to obtain ∑_{i = 1}^k d(T^{n + i - 1} v, T^{n + i} v) ≤ ∑_{i = 1}^k β^n d(v, Tv). Then, we can collect terms of the geometric sum to obtain the desired result by transitivity. ∑_{i = 1}^k β^n d(v, Tv) = \frac{β^n}{1 - β} d(v, Tv).

omit [Nonempty X] in lemma bound_difference_arbitrary_compact {T : BoundedContinuousFunction X BoundedContinuousFunction X } (v₀ : BoundedContinuousFunction X ) (hT : IsContraction T): (n : ) (k : ), i Finset.range k, dist (T^[n + i] v₀) (T^[n + i + 1] v₀) dist v₀ (T v₀) * hT.β^n / (1 - hT.β):= X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction T (n k : ), i Finset.range k, dist (T^[n + i] v₀) (T^[n + i + 1] v₀) dist v₀ (T v₀) * hT.β ^ n / (1 - hT.β) -- Add weak inequalities for β from strict inequalities X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.β (n k : ), i Finset.range k, dist (T^[n + i] v₀) (T^[n + i + 1] v₀) dist v₀ (T v₀) * hT.β ^ n / (1 - hT.β) X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1 (n k : ), i Finset.range k, dist (T^[n + i] v₀) (T^[n + i + 1] v₀) dist v₀ (T v₀) * hT.β ^ n / (1 - hT.β) intro n X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1n:k: i Finset.range k, dist (T^[n + i] v₀) (T^[n + i + 1] v₀) dist v₀ (T v₀) * hT.β ^ n / (1 - hT.β) -- Chain comparisons to obtain the desired result by transitivity among them calc i Finset.range k, dist (T^[n + i] v₀) (T^[n + i + 1] v₀) _ i Finset.range k, hT.β^(n + i) * dist v₀ (T v₀) := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1n:k: i Finset.range k, dist (T^[n + i] v₀) (T^[n + i + 1] v₀) i Finset.range k, hT.β ^ (n + i) * dist v₀ (T v₀) X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1n:k: i Finset.range k, dist (T^[n + i] v₀) (T^[n + i + 1] v₀) hT.β ^ (n + i) * dist v₀ (T v₀) -- Prove the sum inequality by proving the inequality for each component of the sum intro i X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1n:k:i:_hi:i Finset.range kdist (T^[n + i] v₀) (T^[n + i + 1] v₀) hT.β ^ (n + i) * dist v₀ (T v₀) -- Apply the contraction result All goals completed! 🐙 _ = i Finset.range k, (hT.β^n * dist v₀ (T v₀)) * hT.β^i := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1n:k: i Finset.range k, hT.β ^ (n + i) * dist v₀ (T v₀) = i Finset.range k, hT.β ^ n * dist v₀ (T v₀) * hT.β ^ i -- Prove the two sums are equal by stating each element is equal (`rfl` already proves the indices are the same) X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1n:k: x Finset.range k, hT.β ^ (n + x) * dist v₀ (T v₀) = hT.β ^ n * dist v₀ (T v₀) * hT.β ^ x intro i X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1n:k:i:_hi:i Finset.range khT.β ^ (n + i) * dist v₀ (T v₀) = hT.β ^ n * dist v₀ (T v₀) * hT.β ^ i X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1n:k:i:_hi:i Finset.range khT.β ^ n * hT.β ^ i * dist v₀ (T v₀) = hT.β ^ n * dist v₀ (T v₀) * hT.β ^ i All goals completed! 🐙 _ = (hT.β^n * dist v₀ (T v₀)) * i Finset.range k, hT.β^i := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1n:k: i Finset.range k, hT.β ^ n * dist v₀ (T v₀) * hT.β ^ i = hT.β ^ n * dist v₀ (T v₀) * i Finset.range k, hT.β ^ i All goals completed! 🐙 _ (hT.β^n * dist v₀ (T v₀)) * (1 / (1 - hT.β)) := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1n:k:hT.β ^ n * dist v₀ (T v₀) * i Finset.range k, hT.β ^ i hT.β ^ n * dist v₀ (T v₀) * (1 / (1 - hT.β)) -- Rewrite as geometric sum, providing a proof that $`β ≠ 1` using $`β < 1` X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1n:k:hT.β ^ n * dist v₀ (T v₀) * ((hT.β ^ k - 1) / (hT.β - 1)) hT.β ^ n * dist v₀ (T v₀) * (1 / (1 - hT.β)) -- Flip (β^k - 1) / (β - 1) into (1 - β^k) / (1 - β) X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1n:k:hT.β ^ n * dist v₀ (T v₀) * ((1 - hT.β ^ k) / (1 - hT.β)) hT.β ^ n * dist v₀ (T v₀) * (1 / (1 - hT.β)) X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1n:k:0 1 - hT.βX:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1n:k:1 - hT.β ^ k 1 -- First, prove that 0 ≤ 1 - β -- by applying the `sub_pos` tactic where we take the if direction. `.mp` is for the "if" direction of the logical equality X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1n:k:1 - hT.β ^ k 1 -- Second, prove that 1 - β^k ≤ 1 All goals completed! 🐙 _ = dist v₀ (T v₀) * hT.β^n / (1 - hT.β) := X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1n:k:hT.β ^ n * dist v₀ (T v₀) * (1 / (1 - hT.β)) = dist v₀ (T v₀) * hT.β ^ n / (1 - hT.β) simp_rw X:Type u_1inst✝:TopologicalSpace XT:(X →ᵇ ) X →ᵇ v₀:X →ᵇ hT:IsContraction Thβ_ge0:0 hT.βhβ_le1:hT.β 1n:k:hT.β ^ n * dist v₀ (T v₀) * (1 / (1 - hT.β)) = dist v₀ (T v₀) * hT.β ^ n / (1 - hT.β)div_eq_inv_mul, mul_one] All goals completed! 🐙