Changes
33 changed files (+3549/-3502)
-
-
@@ -21,7 +21,7 @@ endexample (x y z : ℝ) (h₀ : x ≤ y) (h₁ : y ≤ z) : x ≤ z := by apply le_trans · apply h₀ . apply h₁ · apply h₁ example (x y z : ℝ) (h₀ : x ≤ y) (h₁ : y ≤ z) : x ≤ z := by apply le_trans h₀
-
-
-
@@ -25,7 +25,7 @@ example : x < |y| → x < y ∨ x < -y := byrcases le_or_gt 0 y with h | h · rw [abs_of_nonneg h] intro h; left; exact h . rw [abs_of_neg h] · rw [abs_of_neg h] intro h; right; exact h example : x < |y| → x < y ∨ x < -y := by
-
@@ -81,13 +81,13 @@ example {x : ℝ} (h : x ≠ 0) : x < 0 ∨ x > 0 := by· left exact xlt · contradiction . right; exact xgt · right; exact xgt example {m n k : ℕ} (h : m ∣ n ∨ m ∣ k) : m ∣ n * k := by rcases h with ⟨a, rfl⟩ | ⟨b, rfl⟩ · rw [mul_assoc] apply dvd_mul_right . rw [mul_comm, mul_assoc] · rw [mul_comm, mul_assoc] apply dvd_mul_right example {z : ℝ} (h : ∃ x y, z = x ^ 2 + y ^ 2 ∨ z = x ^ 2 + y ^ 2 + 1) : z ≥ 0 := by
-
@@ -115,7 +115,7 @@ example (P : Prop) : ¬¬P → P := byintro h cases em P · assumption . contradiction · contradiction example (P : Prop) : ¬¬P → P := by intro h
-
-
-
@@ -12,20 +12,20 @@ namespace MyAbstheorem le_abs_self (x : ℝ) : x ≤ |x| := by rcases le_or_gt 0 x with h | h · rw [abs_of_nonneg h] . rw [abs_of_neg h] · rw [abs_of_neg h] linarith theorem neg_le_abs_self (x : ℝ) : -x ≤ |x| := by rcases le_or_gt 0 x with h | h · rw [abs_of_nonneg h] linarith . rw [abs_of_neg h] · rw [abs_of_neg h] theorem abs_add (x y : ℝ) : |x + y| ≤ |x| + |y| := by rcases le_or_gt 0 (x + y) with h | h · rw [abs_of_nonneg h] linarith [le_abs_self x, le_abs_self y] . rw [abs_of_neg h] · rw [abs_of_neg h] linarith [neg_le_abs_self x, neg_le_abs_self y] theorem lt_abs : x < |y| ↔ x < y ∨ x < -y := by
-
@@ -35,19 +35,19 @@ theorem lt_abs : x < |y| ↔ x < y ∨ x < -y := by· intro h' left exact h' . intro h' · intro h' rcases h' with h' | h' · exact h' . linarith · linarith rw [abs_of_neg h] constructor · intro h' right exact h' . intro h' · intro h' rcases h' with h' | h' · linarith . exact h' · exact h' theorem abs_lt : |x| < y ↔ -y < x ∧ x < y := by rcases le_or_gt 0 x with h | h
-
@@ -57,16 +57,16 @@ theorem abs_lt : |x| < y ↔ -y < x ∧ x < y := byconstructor · linarith exact h' . intro h' · intro h' rcases h' with ⟨h1, h2⟩ exact h2 . rw [abs_of_neg h] · rw [abs_of_neg h] constructor · intro h' constructor · linarith . linarith . intro h' · linarith · intro h' linarith end MyAbs
-
@@ -84,7 +84,7 @@ example {x : ℝ} (h : x ^ 2 = 1) : x = 1 ∨ x = -1 := byrcases eq_zero_or_eq_zero_of_mul_eq_zero h'' with h1 | h1 · right exact eq_neg_iff_add_eq_zero.mpr h1 . left · left exact eq_of_sub_eq_zero h1 example {x y : ℝ} (h : x ^ 2 = y ^ 2) : x = y ∨ x = -y := by
-
@@ -95,7 +95,7 @@ example {x y : ℝ} (h : x ^ 2 = y ^ 2) : x = y ∨ x = -y := byrcases eq_zero_or_eq_zero_of_mul_eq_zero h'' with h1 | h1 · right exact eq_neg_iff_add_eq_zero.mpr h1 . left · left exact eq_of_sub_eq_zero h1 section
-
@@ -110,7 +110,7 @@ example (h : x ^ 2 = 1) : x = 1 ∨ x = -1 := byrcases eq_zero_or_eq_zero_of_mul_eq_zero h'' with h1 | h1 · right exact eq_neg_iff_add_eq_zero.mpr h1 . left · left exact eq_of_sub_eq_zero h1 example (h : x ^ 2 = y ^ 2) : x = y ∨ x = -y := by
-
@@ -121,7 +121,7 @@ example (h : x ^ 2 = y ^ 2) : x = y ∨ x = -y := byrcases eq_zero_or_eq_zero_of_mul_eq_zero h'' with h1 | h1 · right exact eq_neg_iff_add_eq_zero.mpr h1 . left · left exact eq_of_sub_eq_zero h1 end
-
@@ -132,10 +132,10 @@ example (P Q : Prop) : P → Q ↔ ¬P ∨ Q := byby_cases h' : P · right exact h h' . left · left exact h' rintro (h | h) · intro h' exact absurd h' h . intro · intro exact h
-
-
-
@@ -34,14 +34,14 @@ example : s ∩ (t ∪ u) ⊆ s ∩ t ∪ s ∩ u := by· left show x ∈ s ∩ t exact ⟨xs, xt⟩ . right · right show x ∈ s ∩ u exact ⟨xs, xu⟩ example : s ∩ (t ∪ u) ⊆ s ∩ t ∪ s ∩ u := by rintro x ⟨xs, xt | xu⟩ · left; exact ⟨xs, xt⟩ . right; exact ⟨xs, xu⟩ · right; exact ⟨xs, xu⟩ example : s ∩ t ∪ s ∩ u ⊆ s ∩ (t ∪ u) := by sorry
-
@@ -56,7 +56,7 @@ example : (s \ t) \ u ⊆ s \ (t ∪ u) := by-- x ∈ t ∨ x ∈ u rcases xtu with xt | xu · show False; exact xnt xt . show False; exact xnu xu · show False; exact xnu xu example : (s \ t) \ u ⊆ s \ (t ∪ u) := by rintro x ⟨⟨xs, xnt⟩, xnu⟩
-
@@ -70,7 +70,7 @@ example : s ∩ t = t ∩ s := bysimp only [mem_inter_iff] constructor · rintro ⟨xs, xt⟩; exact ⟨xt, xs⟩ . rintro ⟨xt, xs⟩; exact ⟨xs, xt⟩ · rintro ⟨xt, xs⟩; exact ⟨xs, xt⟩ example : s ∩ t = t ∩ s := Set.ext fun x ↦ ⟨fun ⟨xs, xt⟩ ↦ ⟨xt, xs⟩, fun ⟨xt, xs⟩ ↦ ⟨xs, xt⟩⟩
-
@@ -80,7 +80,7 @@ example : s ∩ t = t ∩ s := by ext x; simp [and_comm]example : s ∩ t = t ∩ s := by apply Subset.antisymm · rintro x ⟨xs, xt⟩; exact ⟨xt, xs⟩ . rintro x ⟨xt, xs⟩; exact ⟨xs, xt⟩ · rintro x ⟨xt, xs⟩; exact ⟨xs, xt⟩ example : s ∩ t = t ∩ s := Subset.antisymm sorry sorry
-
-
-
@@ -10,7 +10,7 @@ open Setexample : s ∩ t ∪ s ∩ u ⊆ s ∩ (t ∪ u) := by rintro x (⟨xs, xt⟩ | ⟨xs, xu⟩) · use xs; left; exact xt . use xs; right; exact xu · use xs; right; exact xu example : s \ (t ∪ u) ⊆ (s \ t) \ u := by rintro x ⟨xs, xntu⟩
-
@@ -29,20 +29,20 @@ example : s ∩ (s ∪ t) = s := byext x; constructor · rintro ⟨xs, _⟩ exact xs . intro xs · intro xs use xs; left; exact xs example : s ∪ s ∩ t = s := by ext x; constructor · rintro (xs | ⟨xs, xt⟩) <;> exact xs . intro xs; left; exact xs · intro xs; left; exact xs example : s \ t ∪ t = s ∪ t := by ext x; constructor · rintro (⟨xs, nxt⟩ | xt) · left exact xs . right · right exact xt by_cases h : x ∈ t · intro
-
@@ -61,7 +61,7 @@ example : s \ t ∪ t \ s = (s ∪ t) \ (s ∩ t) := byexact xs rintro ⟨_, xt⟩ contradiction . constructor · constructor right exact xt rintro ⟨xs, _⟩
-
@@ -72,7 +72,7 @@ example : s \ t ∪ t \ s = (s ∪ t) \ (s ∩ t) := byintro xt apply nxst constructor <;> assumption . right; use xt; intro xs · right; use xt; intro xs apply nxst constructor <;> assumption
-
-
-
@@ -55,28 +55,28 @@ example : f ⁻¹' (u ∪ v) = f ⁻¹' u ∪ f ⁻¹' v := byexample : f '' (s ∩ t) ⊆ f '' s ∩ f '' t := by rintro y ⟨x, ⟨xs, xt⟩, rfl⟩ constructor . use x, xs . use x, xt · use x, xs · use x, xt example (h : Injective f) : f '' s ∩ f '' t ⊆ f '' (s ∩ t) := by rintro y ⟨⟨x₁, x₁s, rfl⟩, ⟨x₂, x₂t, fx₂eq⟩⟩ use x₁ constructor . use x₁s · use x₁s rw [← h fx₂eq] exact x₂t . rfl · rfl example : f '' s \ f '' t ⊆ f '' (s \ t) := by rintro y ⟨⟨x₁, x₁s, rfl⟩, h⟩ use x₁ constructor . constructor . exact x₁s . intro h' · constructor · exact x₁s · intro h' apply h use x₁, h' . rfl · rfl example : f ⁻¹' u \ f ⁻¹' v ⊆ f ⁻¹' (u \ v) := fun x ↦ id
-
-
-
@@ -47,7 +47,7 @@ theorem primes_infinite : ∀ n, ∃ p > n, Nat.Prime p := byhave : 2 ≤ Nat.factorial (n + 1) + 1 := by sorry rcases exists_prime_factor this with ⟨p, pp, pdvd⟩ refine' ⟨p, _, pp⟩ refine ⟨p, ?_, pp⟩ show p > n by_contra ple push_neg at ple
-
-
-
@@ -36,7 +36,7 @@ theorem primes_infinite : ∀ n, ∃ p > n, Nat.Prime p := byapply Nat.succ_le_succ exact Nat.succ_le_of_lt (Nat.factorial_pos _) rcases exists_prime_factor this with ⟨p, pp, pdvd⟩ refine' ⟨p, _, pp⟩ refine ⟨p, ?_, pp⟩ show p > n by_contra ple push_neg at ple
-
-
-
@@ -94,7 +94,7 @@ example {u : ℕ → X} (hu : Tendsto u atTop (𝓝 a)) {s : Set X} (hs : ∀ n,rw [Metric.mem_closure_iff] intro ε ε_pos rcases hu ε ε_pos with ⟨N, hN⟩ refine' ⟨u N, hs _, _⟩ refine ⟨u N, hs _, ?_⟩ rw [dist_comm] exact hN N le_rfl
-
@@ -288,7 +288,7 @@ example [CompleteSpace X] (f : ℕ → Set X) (ho : ∀ n, IsOpen (f n)) (hd :rw [dist_comm] at xy obtain ⟨r, rpos, hr⟩ : ∃ r > 0, closedBall y r ⊆ f n := nhds_basis_closedBall.mem_iff.1 (isOpen_iff_mem_nhds.1 (ho n) y ys) refine' ⟨y, min (min (δ / 2) r) (B (n + 1)), _, _, fun z hz ↦ ⟨_, _⟩⟩ refine ⟨y, min (min (δ / 2) r) (B (n + 1)), ?_, ?_, fun z hz ↦ ⟨?_, ?_⟩⟩ show 0 < min (min (δ / 2) r) (B (n + 1)) exact lt_min (lt_min (half_pos δpos) rpos) (Bpos (n + 1)) show min (min (δ / 2) r) (B (n + 1)) ≤ B (n + 1)
-
@@ -309,7 +309,7 @@ example [CompleteSpace X] (f : ℕ → Set X) (ho : ∀ n, IsOpen (f n)) (hd :_ ≤ r := (min_le_left _ _).trans (min_le_right _ _) ) choose! center radius Hpos HB Hball using this refine' fun x ↦ (mem_closure_iff_nhds_basis nhds_basis_closedBall).2 fun ε εpos ↦ _ refine fun x ↦ (mem_closure_iff_nhds_basis nhds_basis_closedBall).2 fun ε εpos ↦ ?_ /- `ε` is positive. We have to find a point in the ball of radius `ε` around `x` belonging to all `f n`. For this, we construct inductively a sequence `F n = (c n, r n)` such that the closed ball `closedBall (c n) (r n)` is included in the previous ball and in `f n`, and such that
-
@@ -351,13 +351,13 @@ example [CompleteSpace X] (f : ℕ → Set X) (ho : ∀ n, IsOpen (f n)) (hd :use y have I : ∀ n, ∀ m ≥ n, closedBall (c m) (r m) ⊆ closedBall (c n) (r n) := by intro n refine' Nat.le_induction _ fun m hnm h ↦ _ refine Nat.le_induction ?_ fun m hnm h ↦ ?_ · exact Subset.rfl · exact (incl m).trans (Set.inter_subset_left.trans h) have yball : ∀ n, y ∈ closedBall (c n) (r n) := by intro n refine' isClosed_ball.mem_of_tendsto ylim _ refine' (Filter.eventually_ge_atTop n).mono fun m hm ↦ _ refine isClosed_ball.mem_of_tendsto ylim ?_ refine (Filter.eventually_ge_atTop n).mono fun m hm ↦ ?_ exact I n m hm (mem_closedBall_self (rpos _).le) constructor · suffices ∀ n, y ∈ f n by rwa [Set.mem_iInter]
-
-
-
@@ -56,7 +56,7 @@ example {α : Type*} (n : α → Filter α) (H₀ : ∀ a, pure a ≤ n a)(H : ∀ a : α, ∀ p : α → Prop, (∀ᶠ x in n a, p x) → ∀ᶠ y in n a, ∀ᶠ x in n y, p x) : ∀ a, ∀ s ∈ n a, ∃ t ∈ n a, t ⊆ s ∧ ∀ a' ∈ t, s ∈ n a' := by intro a s s_in refine' ⟨{ y | s ∈ n y }, H a (fun x ↦ x ∈ s) s_in, _, by tauto⟩ refine ⟨{ y | s ∈ n y }, H a (fun x ↦ x ∈ s) s_in, ?_, by tauto⟩ rintro y (hy : s ∈ n y) exact H₀ y hy
-
@@ -172,7 +172,7 @@ example [TopologicalSpace Y] {f : X → Y} (hf : Continuous f) {s : Set X} (hs :rwa [map_eq, inf_of_le_right F_le] have Hle : 𝓟 s ⊓ comap f F ≤ 𝓟 s := inf_le_left rcases hs Hle with ⟨x, x_in, hx⟩ refine' ⟨f x, mem_image_of_mem f x_in, _⟩ refine ⟨f x, mem_image_of_mem f x_in, ?_⟩ apply hx.map hf.continuousAt rw [Tendsto, map_eq] exact inf_le_right
-
-
-
@@ -106,7 +106,7 @@ example {ι : Type*} [CompleteSpace E] {g : ι → E →L[𝕜] F} (h : ∀ x,have real_norm_le : ∀ z ∈ ball x ε, ∀ (i : ι), ‖g i z‖ ≤ m sorry have εk_pos : 0 < ε / ‖k‖ := sorry refine' ⟨(m + m : ℕ) / (ε / ‖k‖), fun i ↦ ContinuousLinearMap.opNorm_le_of_shell ε_pos _ hk _⟩ refine ⟨(m + m : ℕ) / (ε / ‖k‖), fun i ↦ ContinuousLinearMap.opNorm_le_of_shell ε_pos ?_ hk ?_⟩ sorry sorry
-
-
-
@@ -28,7 +28,7 @@ example {ι : Type*} [CompleteSpace E] {g : ι → E →L[𝕜] F} (h : ∀ x,isClosed_iInter fun i ↦ isClosed_le (g i).cont.norm continuous_const -- the union is the entire space; this is where we use `h` have hU : (⋃ n : ℕ, e n) = univ := by refine' eq_univ_of_forall fun x ↦ _ refine eq_univ_of_forall fun x ↦ ?_ rcases h x with ⟨C, hC⟩ obtain ⟨m, hm⟩ := exists_nat_ge C exact ⟨e m, mem_range_self m, mem_iInter.mpr fun i ↦ le_trans (hC i) hm⟩
-
@@ -43,7 +43,7 @@ example {ι : Type*} [CompleteSpace E] {g : ι → E →L[𝕜] F} (h : ∀ x,replace hz := mem_iInter.mp (interior_iInter_subset _ (hε hz)) i apply interior_subset hz have εk_pos : 0 < ε / ‖k‖ := div_pos ε_pos (zero_lt_one.trans hk) refine' ⟨(m + m : ℕ) / (ε / ‖k‖), fun i ↦ ContinuousLinearMap.opNorm_le_of_shell ε_pos _ hk _⟩ refine ⟨(m + m : ℕ) / (ε / ‖k‖), fun i ↦ ContinuousLinearMap.opNorm_le_of_shell ε_pos ?_ hk ?_⟩ · exact div_nonneg (Nat.cast_nonneg _) εk_pos.le intro y le_y y_lt calc
-
-
-
@@ -1,4 +1,4 @@# Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. config: dfa3c760a9c309561b2de03685612f6b config: 641199866dfd7d43f34ecf960cb67cbc tags: 645f666f9bcd5a90fca523b33c5a78b7
-
-
-
@@ -18,7 +18,7 @@<script src="_static/jquery.js?v=5d32c60e"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/documentation_options.js?v=2709fde1"></script> <script src="_static/doctools.js?v=888ff710"></script> <script src="_static/doctools.js?v=9a2dae69"></script> <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script src="_static/js/theme.js"></script> <link rel="index" title="Index" href="genindex.html" />
-
@@ -161,7 +161,7 @@ which is why we suggested making a copy.)</p><p>We intend for you to work on the exercises in the <code class="docutils literal notranslate"><span class="pre">MIL</span></code> folder while reading the textbook, which contains explanations, instructions, and hints. The text will often include examples, like this one:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#eval</span> <span class="s2">"Hello, World!"</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#eval</span><span class="w"> </span><span class="s2">"Hello, World!"</span> </pre></div> </div> <p>You should be able to find the corresponding example in the associated
-
@@ -188,35 +188,35 @@ known as <em>dependent type theory</em>.</p>print it. Some expressions have types like <cite>ℕ</cite> or <cite>ℕ → ℕ</cite>. These are mathematical objects.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="mi">2</span> <span class="bp">+</span> <span class="mi">2</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">2</span> <span class="kd">def</span> <span class="n">f</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:=</span> <span class="n">x</span> <span class="bp">+</span> <span class="mi">3</span> <span class="kd">def</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">3</span> <span class="k">#check</span> <span class="n">f</span> <span class="k">#check</span><span class="w"> </span><span class="n">f</span> </pre></div> </div> <p>Some expressions have type <cite>Prop</cite>. These are mathematical statements.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="mi">2</span> <span class="bp">+</span> <span class="mi">2</span> <span class="bp">=</span> <span class="mi">4</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">4</span> <span class="kd">def</span> <span class="n">FermatLastTheorem</span> <span class="o">:=</span> <span class="bp">∀</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">,</span> <span class="n">n</span> <span class="bp">></span> <span class="mi">2</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">y</span> <span class="bp">*</span> <span class="n">z</span> <span class="bp">≠</span> <span class="mi">0</span> <span class="bp">→</span> <span class="n">x</span> <span class="bp">^</span> <span class="n">n</span> <span class="bp">+</span> <span class="n">y</span> <span class="bp">^</span> <span class="n">n</span> <span class="bp">≠</span> <span class="n">z</span> <span class="bp">^</span> <span class="n">n</span> <span class="kd">def</span><span class="w"> </span><span class="n">FermatLastTheorem</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">n</span> <span class="k">#check</span> <span class="n">FermatLastTheorem</span> <span class="k">#check</span><span class="w"> </span><span class="n">FermatLastTheorem</span> </pre></div> </div> <p>Some expressions have a type, <cite>P</cite>, where <cite>P</cite> itself has type <cite>Prop</cite>. Such an expression is a proof of the proposition <cite>P</cite>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">easy</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">+</span> <span class="mi">2</span> <span class="bp">=</span> <span class="mi">4</span> <span class="o">:=</span> <span class="n">rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">easy</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="k">#check</span> <span class="n">easy</span> <span class="k">#check</span><span class="w"> </span><span class="n">easy</span> <span class="kd">theorem</span> <span class="n">hard</span> <span class="o">:</span> <span class="n">FermatLastTheorem</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">hard</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FermatLastTheorem</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> <span class="k">#check</span> <span class="n">hard</span> <span class="k">#check</span><span class="w"> </span><span class="n">hard</span> </pre></div> </div> <p>If you manage to construct an expression of type <code class="docutils literal notranslate"><span class="pre">FermatLastTheorem</span></code> and
-
@@ -245,27 +245,27 @@ we can write down the expressions themselvesor we can provide Lean with <em>instructions</em> as to how to construct them. For example, the following expression represents a proof of the fact that if <code class="docutils literal notranslate"><span class="pre">n</span></code> is even then so is <code class="docutils literal notranslate"><span class="pre">m</span> <span class="pre">*</span> <span class="pre">n</span></code>:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">,</span> <span class="n">Even</span> <span class="n">n</span> <span class="bp">→</span> <span class="n">Even</span> <span class="o">(</span><span class="n">m</span> <span class="bp">*</span> <span class="n">n</span><span class="o">)</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">m</span> <span class="n">n</span> <span class="o">⟨</span><span class="n">k</span><span class="o">,</span> <span class="o">(</span><span class="n">hk</span> <span class="o">:</span> <span class="n">n</span> <span class="bp">=</span> <span class="n">k</span> <span class="bp">+</span> <span class="n">k</span><span class="o">)⟩</span> <span class="bp">↦</span> <span class="k">have</span> <span class="n">hmn</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">=</span> <span class="n">m</span> <span class="bp">*</span> <span class="n">k</span> <span class="bp">+</span> <span class="n">m</span> <span class="bp">*</span> <span class="n">k</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">hk</span><span class="o">,</span> <span class="n">mul_add</span><span class="o">]</span> <span class="k">show</span> <span class="bp">∃</span> <span class="n">l</span><span class="o">,</span> <span class="n">m</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">=</span> <span class="n">l</span> <span class="bp">+</span> <span class="n">l</span> <span class="k">from</span> <span class="o">⟨</span><span class="n">_</span><span class="o">,</span> <span class="n">hmn</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat</span><span class="o">,</span><span class="w"> </span><span class="n">Even</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Even</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">⟨</span><span class="n">k</span><span class="o">,</span><span class="w"> </span><span class="o">(</span><span class="n">hk</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">k</span><span class="o">)⟩</span><span class="w"> </span><span class="bp">↦</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">hmn</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">hk</span><span class="o">,</span><span class="w"> </span><span class="n">mul_add</span><span class="o">]</span> <span class="w"> </span><span class="k">show</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">l</span><span class="o">,</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="o">⟨</span><span class="n">_</span><span class="o">,</span><span class="w"> </span><span class="n">hmn</span><span class="o">⟩</span> </pre></div> </div> <p>The <em>proof term</em> can be compressed to a single line:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">,</span> <span class="n">Even</span> <span class="n">n</span> <span class="bp">→</span> <span class="n">Even</span> <span class="o">(</span><span class="n">m</span> <span class="bp">*</span> <span class="n">n</span><span class="o">)</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">m</span> <span class="n">n</span> <span class="o">⟨</span><span class="n">k</span><span class="o">,</span> <span class="n">hk</span><span class="o">⟩</span> <span class="bp">↦</span> <span class="o">⟨</span><span class="n">m</span> <span class="bp">*</span> <span class="n">k</span><span class="o">,</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">hk</span><span class="o">,</span> <span class="n">mul_add</span><span class="o">]⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat</span><span class="o">,</span><span class="w"> </span><span class="n">Even</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Even</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="k">fun</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">⟨</span><span class="n">k</span><span class="o">,</span><span class="w"> </span><span class="n">hk</span><span class="o">⟩</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">⟨</span><span class="n">m</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">k</span><span class="o">,</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">hk</span><span class="o">,</span><span class="w"> </span><span class="n">mul_add</span><span class="o">]⟩</span> </pre></div> </div> <p>The following is, instead, a <em>tactic-style</em> proof of the same theorem, where lines starting with <code class="docutils literal notranslate"><span class="pre">--</span></code> are comments, hence ignored by Lean:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">,</span> <span class="n">Even</span> <span class="n">n</span> <span class="bp">→</span> <span class="n">Even</span> <span class="o">(</span><span class="n">m</span> <span class="bp">*</span> <span class="n">n</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="c1">-- Say m and n are natural numbers, and assume n=2*k.</span> <span class="n">rintro</span> <span class="n">m</span> <span class="n">n</span> <span class="o">⟨</span><span class="n">k</span><span class="o">,</span> <span class="n">hk</span><span class="o">⟩</span> <span class="c1">-- We need to prove m*n is twice a natural number. Let's show it's twice m*k.</span> <span class="n">use</span> <span class="n">m</span> <span class="bp">*</span> <span class="n">k</span> <span class="c1">-- Substitute for n,</span> <span class="n">rw</span> <span class="o">[</span><span class="n">hk</span><span class="o">]</span> <span class="c1">-- and now it's obvious.</span> <span class="n">ring</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat</span><span class="o">,</span><span class="w"> </span><span class="n">Even</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Even</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="c1">-- Say m and n are natural numbers, and assume n=2*k.</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">⟨</span><span class="n">k</span><span class="o">,</span><span class="w"> </span><span class="n">hk</span><span class="o">⟩</span> <span class="w"> </span><span class="c1">-- We need to prove m*n is twice a natural number. Let's show it's twice m*k.</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">k</span> <span class="w"> </span><span class="c1">-- Substitute for n,</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">hk</span><span class="o">]</span> <span class="w"> </span><span class="c1">-- and now it's obvious.</span> <span class="w"> </span><span class="n">ring</span> </pre></div> </div> <p>As you enter each line of such a proof in VS Code,
-
@@ -297,8 +297,8 @@ We will also see that, conversely,it is often useful to insert a short proof term in the middle of a tactic proof. That said, in this book, our emphasis will be on the use of tactics.</p> <p>In our example, the tactic proof can also be reduced to a one-liner:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">,</span> <span class="n">Even</span> <span class="n">n</span> <span class="bp">→</span> <span class="n">Even</span> <span class="o">(</span><span class="n">m</span> <span class="bp">*</span> <span class="n">n</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rintro</span> <span class="n">m</span> <span class="n">n</span> <span class="o">⟨</span><span class="n">k</span><span class="o">,</span> <span class="n">hk</span><span class="o">⟩</span><span class="bp">;</span> <span class="n">use</span> <span class="n">m</span> <span class="bp">*</span> <span class="n">k</span><span class="bp">;</span> <span class="n">rw</span> <span class="o">[</span><span class="n">hk</span><span class="o">]</span><span class="bp">;</span> <span class="n">ring</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat</span><span class="o">,</span><span class="w"> </span><span class="n">Even</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Even</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">⟨</span><span class="n">k</span><span class="o">,</span><span class="w"> </span><span class="n">hk</span><span class="o">⟩</span><span class="bp">;</span><span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">k</span><span class="bp">;</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">hk</span><span class="o">]</span><span class="bp">;</span><span class="w"> </span><span class="n">ring</span> </pre></div> </div> <p>Here we have used tactics to carry out small proof steps.
-
@@ -307,8 +307,8 @@ and justify longer calculations and bigger inferential steps.For example, we can invoke Lean’s simplifier with specific rules for simplifying statements about parity to prove our theorem automatically.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">,</span> <span class="n">Even</span> <span class="n">n</span> <span class="bp">→</span> <span class="n">Even</span> <span class="o">(</span><span class="n">m</span> <span class="bp">*</span> <span class="n">n</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intros</span><span class="bp">;</span> <span class="n">simp</span> <span class="o">[</span><span class="bp">*</span><span class="o">,</span> <span class="n">parity_simps</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat</span><span class="o">,</span><span class="w"> </span><span class="n">Even</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Even</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intros</span><span class="bp">;</span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="bp">*</span><span class="o">,</span><span class="w"> </span><span class="n">parity_simps</span><span class="o">]</span> </pre></div> </div> <p>Another big difference between the two introductions is that
-
-
-
@@ -18,7 +18,7 @@<script src="_static/jquery.js?v=5d32c60e"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/documentation_options.js?v=2709fde1"></script> <script src="_static/doctools.js?v=888ff710"></script> <script src="_static/doctools.js?v=9a2dae69"></script> <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script>
-
@@ -124,9 +124,9 @@ so the left-hand side of <code class="docutils literal notranslate"><span class=However, it is generally good style to be mindful of Lean’s notational conventions and leave out parentheses when Lean does as well.</p> <p>Let’s try out <code class="docutils literal notranslate"><span class="pre">rw</span></code>.</p> <div class="highlight-lean notranslate" id="index-1"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">b</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">c</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mul_comm</span> <span class="n">a</span> <span class="n">b</span><span class="o">]</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mul_assoc</span> <span class="n">b</span> <span class="n">a</span> <span class="n">c</span><span class="o">]</span> <div class="highlight-lean notranslate" id="index-1"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mul_comm</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="o">]</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mul_assoc</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">c</span><span class="o">]</span> </pre></div> </div> <p>The <code class="docutils literal notranslate"><span class="pre">import</span></code> lines at the beginning of the associated examples file
-
@@ -150,12 +150,12 @@ Lean reports on the current <em>proof state</em> in theAs you move your cursor past each step of the proof, you can see the state change. A typical proof state in Lean might look as follows:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span> <span class="n">goal</span> <span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">,</span> <span class="n">h₁</span> <span class="o">:</span> <span class="n">Prime</span> <span class="n">x</span><span class="o">,</span> <span class="n">h₂</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">Even</span> <span class="n">x</span><span class="o">,</span> <span class="n">h₃</span> <span class="o">:</span> <span class="n">y</span> <span class="bp">></span> <span class="n">x</span> <span class="bp">⊢</span> <span class="n">y</span> <span class="bp">≥</span> <span class="mi">4</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="mi">1</span><span class="w"> </span><span class="n">goal</span> <span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span> <span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Prime</span><span class="w"> </span><span class="n">x</span><span class="o">,</span> <span class="n">h₂</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">Even</span><span class="w"> </span><span class="n">x</span><span class="o">,</span> <span class="n">h₃</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="n">x</span> <span class="bp">⊢</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="mi">4</span> </pre></div> </div> <p>The lines before the one that begins with <code class="docutils literal notranslate"><span class="pre">⊢</span></code> denote the <em>context</em>:
-
@@ -182,20 +182,20 @@ For example, <code class="docutils literal notranslate"><span class="pre">rw</spreplaces <code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre">*</span> <span class="pre">(b</span> <span class="pre">*</span> <span class="pre">c)</span></code> by <code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre">*</span> <span class="pre">b</span> <span class="pre">*</span> <span class="pre">c</span></code> in the current goal. Note that the left-pointing arrow refers to going from right to left in the identity provided by <code class="docutils literal notranslate"><span class="pre">mul_assoc</span></code>, it has nothing to do with the left or right side of the goal.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">b</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">c</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="o">(</span><span class="n">b</span> <span class="bp">*</span> <span class="n">c</span><span class="o">)</span> <span class="bp">=</span> <span class="n">b</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">c</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>You can also use identities like <code class="docutils literal notranslate"><span class="pre">mul_assoc</span></code> and <code class="docutils literal notranslate"><span class="pre">mul_comm</span></code> without arguments. In this case, the rewrite tactic tries to match the left-hand side with an expression in the goal, using the first pattern it finds.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">*</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mul_assoc</span><span class="o">]</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mul_comm</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mul_assoc</span><span class="o">]</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mul_comm</span><span class="o">]</span> </pre></div> </div> <p>You can also provide <em>partial</em> information.
-
@@ -204,43 +204,43 @@ For example, <code class="docutils literal notranslate"><span class="pre">mul_coTry doing the first of these examples without providing any arguments at all, and the second with only one argument.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="o">(</span><span class="n">b</span> <span class="bp">*</span> <span class="n">c</span><span class="o">)</span> <span class="bp">=</span> <span class="n">b</span> <span class="bp">*</span> <span class="o">(</span><span class="n">c</span> <span class="bp">*</span> <span class="n">a</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="o">(</span><span class="n">b</span> <span class="bp">*</span> <span class="n">c</span><span class="o">)</span> <span class="bp">=</span> <span class="n">b</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">c</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>You can also use <code class="docutils literal notranslate"><span class="pre">rw</span></code> with facts from the local context.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="n">d</span> <span class="n">e</span> <span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">c</span> <span class="bp">*</span> <span class="n">d</span><span class="o">)</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="n">e</span> <span class="bp">=</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="o">(</span><span class="n">b</span> <span class="bp">*</span> <span class="n">e</span><span class="o">)</span> <span class="bp">=</span> <span class="n">c</span> <span class="bp">*</span> <span class="o">(</span><span class="n">d</span> <span class="bp">*</span> <span class="n">f</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">h'</span><span class="o">]</span> <span class="n">rw</span> <span class="o">[</span><span class="bp">←</span> <span class="n">mul_assoc</span><span class="o">]</span> <span class="n">rw</span> <span class="o">[</span><span class="n">h</span><span class="o">]</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mul_assoc</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">e</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">d</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">h'</span><span class="o">]</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="bp">←</span><span class="w"> </span><span class="n">mul_assoc</span><span class="o">]</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">h</span><span class="o">]</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mul_assoc</span><span class="o">]</span> </pre></div> </div> <p>Try these, using the theorem <code class="docutils literal notranslate"><span class="pre">sub_self</span></code> for the second one:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="n">d</span> <span class="n">e</span> <span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">e</span> <span class="bp">*</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">*</span> <span class="n">d</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">e</span> <span class="bp">*</span> <span class="n">f</span> <span class="bp">*</span> <span class="n">d</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="n">d</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">hyp</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">-</span> <span class="n">d</span><span class="o">)</span> <span class="o">(</span><span class="n">hyp'</span> <span class="o">:</span> <span class="n">d</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hyp</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">d</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hyp'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Multiple rewrite commands can be carried out with a single command, by listing the relevant identities separated by commas inside the square brackets.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="n">d</span> <span class="n">e</span> <span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">c</span> <span class="bp">*</span> <span class="n">d</span><span class="o">)</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="n">e</span> <span class="bp">=</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="o">(</span><span class="n">b</span> <span class="bp">*</span> <span class="n">e</span><span class="o">)</span> <span class="bp">=</span> <span class="n">c</span> <span class="bp">*</span> <span class="o">(</span><span class="n">d</span> <span class="bp">*</span> <span class="n">f</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">h'</span><span class="o">,</span> <span class="bp">←</span> <span class="n">mul_assoc</span><span class="o">,</span> <span class="n">h</span><span class="o">,</span> <span class="n">mul_assoc</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">e</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">d</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">h'</span><span class="o">,</span><span class="w"> </span><span class="bp">←</span><span class="w"> </span><span class="n">mul_assoc</span><span class="o">,</span><span class="w"> </span><span class="n">h</span><span class="o">,</span><span class="w"> </span><span class="n">mul_assoc</span><span class="o">]</span> </pre></div> </div> <p>You still see the incremental progress by placing the cursor after a comma in any list of rewrites.</p> <p>Another trick is that we can declare variables once and for all outside an example or theorem. Lean then includes them automatically.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="n">d</span> <span class="n">e</span> <span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">c</span> <span class="bp">*</span> <span class="n">d</span><span class="o">)</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="n">e</span> <span class="bp">=</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="o">(</span><span class="n">b</span> <span class="bp">*</span> <span class="n">e</span><span class="o">)</span> <span class="bp">=</span> <span class="n">c</span> <span class="bp">*</span> <span class="o">(</span><span class="n">d</span> <span class="bp">*</span> <span class="n">f</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">h'</span><span class="o">,</span> <span class="bp">←</span> <span class="n">mul_assoc</span><span class="o">,</span> <span class="n">h</span><span class="o">,</span> <span class="n">mul_assoc</span><span class="o">]</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">e</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">d</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">h'</span><span class="o">,</span><span class="w"> </span><span class="bp">←</span><span class="w"> </span><span class="n">mul_assoc</span><span class="o">,</span><span class="w"> </span><span class="n">h</span><span class="o">,</span><span class="w"> </span><span class="n">mul_assoc</span><span class="o">]</span> </pre></div> </div> <p>Inspection of the tactic state at the beginning of the above proof
-
@@ -250,16 +250,16 @@ in a <code class="docutils literal notranslate"><span class="pre">section</span>Finally, recall from the introduction that Lean provides us with a command to determine the type of an expression:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">section</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span> <span class="k">#check</span> <span class="n">a</span> <span class="k">#check</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="k">#check</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="k">#check</span> <span class="n">mul_comm</span> <span class="n">a</span> <span class="n">b</span> <span class="k">#check</span> <span class="o">(</span><span class="n">mul_comm</span> <span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">a</span><span class="o">)</span> <span class="k">#check</span> <span class="n">mul_assoc</span> <span class="n">c</span> <span class="n">a</span> <span class="n">b</span> <span class="k">#check</span> <span class="n">mul_comm</span> <span class="n">a</span> <span class="k">#check</span> <span class="n">mul_comm</span> <span class="k">#check</span><span class="w"> </span><span class="n">a</span> <span class="k">#check</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="n">mul_comm</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">mul_comm</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="n">mul_assoc</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span> <span class="k">#check</span><span class="w"> </span><span class="n">mul_comm</span><span class="w"> </span><span class="n">a</span> <span class="k">#check</span><span class="w"> </span><span class="n">mul_comm</span> <span class="kd">end</span> </pre></div>
-
@@ -279,10 +279,10 @@ that <code class="docutils literal notranslate"><span class="pre">2</span> <spanexpress the distributivity of multiplication over addition, and the theorem <code class="docutils literal notranslate"><span class="pre">add_assoc</span></code> expresses the associativity of addition. Use the <code class="docutils literal notranslate"><span class="pre">#check</span></code> command to see the precise statements.</p> <div class="highlight-lean notranslate" id="index-3"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="mi">2</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mul_add</span><span class="o">,</span> <span class="n">add_mul</span><span class="o">,</span> <span class="n">add_mul</span><span class="o">]</span> <span class="n">rw</span> <span class="o">[</span><span class="bp">←</span> <span class="n">add_assoc</span><span class="o">,</span> <span class="n">add_assoc</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">a</span><span class="o">)]</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mul_comm</span> <span class="n">b</span> <span class="n">a</span><span class="o">,</span> <span class="bp">←</span> <span class="n">two_mul</span><span class="o">]</span> <div class="highlight-lean notranslate" id="index-3"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mul_add</span><span class="o">,</span><span class="w"> </span><span class="n">add_mul</span><span class="o">,</span><span class="w"> </span><span class="n">add_mul</span><span class="o">]</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="bp">←</span><span class="w"> </span><span class="n">add_assoc</span><span class="o">,</span><span class="w"> </span><span class="n">add_assoc</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="o">)]</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mul_comm</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="bp">←</span><span class="w"> </span><span class="n">two_mul</span><span class="o">]</span> </pre></div> </div> <p>Whereas it is possible to figure out what it going on in this proof
-
@@ -290,14 +290,14 @@ by stepping through it in the editor,it is hard to read on its own. Lean provides a more structured way of writing proofs like this using the <code class="docutils literal notranslate"><span class="pre">calc</span></code> keyword.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="mi">2</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">b</span> <span class="o">:=</span> <span class="k">calc</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mul_add</span><span class="o">,</span> <span class="n">add_mul</span><span class="o">,</span> <span class="n">add_mul</span><span class="o">]</span> <span class="n">_</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="o">(</span><span class="n">b</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="bp">←</span> <span class="n">add_assoc</span><span class="o">,</span> <span class="n">add_assoc</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">a</span><span class="o">)]</span> <span class="n">_</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="mi">2</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mul_comm</span> <span class="n">b</span> <span class="n">a</span><span class="o">,</span> <span class="bp">←</span> <span class="n">two_mul</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="k">calc</span> <span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mul_add</span><span class="o">,</span><span class="w"> </span><span class="n">add_mul</span><span class="o">,</span><span class="w"> </span><span class="n">add_mul</span><span class="o">]</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="bp">←</span><span class="w"> </span><span class="n">add_assoc</span><span class="o">,</span><span class="w"> </span><span class="n">add_assoc</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="o">)]</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mul_comm</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="bp">←</span><span class="w"> </span><span class="n">two_mul</span><span class="o">]</span> </pre></div> </div> <p>Notice that the proof does <em>not</em> begin with <code class="docutils literal notranslate"><span class="pre">by</span></code>:
-
@@ -314,44 +314,44 @@ try changing the indentation in the proof above to see what happens.</p>using the <code class="docutils literal notranslate"><span class="pre">sorry</span></code> tactic for justification, make sure Lean accepts the expression modulo these, and then justify the individual steps using tactics.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="mi">2</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">b</span> <span class="o">:=</span> <span class="k">calc</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">_</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="o">(</span><span class="n">b</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">_</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="mi">2</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="k">calc</span> <span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Try proving the following identity using both a pure <code class="docutils literal notranslate"><span class="pre">rw</span></code> proof and a more structured <code class="docutils literal notranslate"><span class="pre">calc</span></code> proof:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">c</span> <span class="bp">+</span> <span class="n">d</span><span class="o">)</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">d</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">d</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">c</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">d</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>The following exercise is a little more challenging. You can use the theorems listed underneath.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">-</span> <span class="n">b</span><span class="o">)</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">-</span> <span class="n">b</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="k">#check</span> <span class="n">pow_two</span> <span class="n">a</span> <span class="k">#check</span> <span class="n">mul_sub</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="k">#check</span> <span class="n">add_mul</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="k">#check</span> <span class="n">add_sub</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="k">#check</span> <span class="n">sub_sub</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="k">#check</span> <span class="n">add_zero</span> <span class="n">a</span> <span class="k">#check</span><span class="w"> </span><span class="n">pow_two</span><span class="w"> </span><span class="n">a</span> <span class="k">#check</span><span class="w"> </span><span class="n">mul_sub</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span> <span class="k">#check</span><span class="w"> </span><span class="n">add_mul</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span> <span class="k">#check</span><span class="w"> </span><span class="n">add_sub</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span> <span class="k">#check</span><span class="w"> </span><span class="n">sub_sub</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span> <span class="k">#check</span><span class="w"> </span><span class="n">add_zero</span><span class="w"> </span><span class="n">a</span> </pre></div> </div> <p id="index-4">We can also perform rewriting in an assumption in the context. For example, <code class="docutils literal notranslate"><span class="pre">rw</span> <span class="pre">[mul_comm</span> <span class="pre">a</span> <span class="pre">b]</span> <span class="pre">at</span> <span class="pre">hyp</span></code> replaces <code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre">*</span> <span class="pre">b</span></code> by <code class="docutils literal notranslate"><span class="pre">b</span> <span class="pre">*</span> <span class="pre">a</span></code> in the assumption <code class="docutils literal notranslate"><span class="pre">hyp</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="n">d</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">hyp</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">d</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="o">(</span><span class="n">hyp'</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">d</span><span class="o">)</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">=</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">d</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">hyp'</span><span class="o">]</span> <span class="n">at</span> <span class="n">hyp</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mul_comm</span> <span class="n">d</span> <span class="n">a</span><span class="o">]</span> <span class="n">at</span> <span class="n">hyp</span> <span class="n">rw</span> <span class="o">[</span><span class="bp">←</span> <span class="n">two_mul</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">d</span><span class="o">)]</span> <span class="n">at</span> <span class="n">hyp</span> <span class="n">rw</span> <span class="o">[</span><span class="bp">←</span> <span class="n">mul_assoc</span> <span class="mi">2</span> <span class="n">a</span> <span class="n">d</span><span class="o">]</span> <span class="n">at</span> <span class="n">hyp</span> <span class="n">exact</span> <span class="n">hyp</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hyp</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hyp'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">hyp'</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">hyp</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mul_comm</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="n">a</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">hyp</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="bp">←</span><span class="w"> </span><span class="n">two_mul</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="o">)]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">hyp</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="bp">←</span><span class="w"> </span><span class="n">mul_assoc</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">d</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">hyp</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">hyp</span> </pre></div> </div> <p id="index-5">In the last step, the <code class="docutils literal notranslate"><span class="pre">exact</span></code> tactic can use <code class="docutils literal notranslate"><span class="pre">hyp</span></code> to solve the goal
-
@@ -360,18 +360,18 @@ because at that point <code class="docutils literal notranslate"><span class="pruseful bit of automation with a <code class="docutils literal notranslate"><span class="pre">ring</span></code> tactic, which is designed to prove identities in any commutative ring as long as they follow purely from the ring axioms, without using any local assumption.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">b</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">c</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ring</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">ring</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="mi">2</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ring</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">ring</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">-</span> <span class="n">b</span><span class="o">)</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">-</span> <span class="n">b</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ring</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">ring</span> <span class="kd">example</span> <span class="o">(</span><span class="n">hyp</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">d</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="o">(</span><span class="n">hyp'</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">d</span><span class="o">)</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">=</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">d</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">hyp</span><span class="o">,</span> <span class="n">hyp'</span><span class="o">]</span> <span class="n">ring</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">hyp</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hyp'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">hyp</span><span class="o">,</span><span class="w"> </span><span class="n">hyp'</span><span class="o">]</span> <span class="w"> </span><span class="n">ring</span> </pre></div> </div> <p>The <code class="docutils literal notranslate"><span class="pre">ring</span></code> tactic is imported indirectly when we
-
@@ -386,9 +386,9 @@ structures.</p>Possible matches are enumerated starting with 1, so in the following example, <code class="docutils literal notranslate"><span class="pre">nth_rw</span> <span class="pre">2</span> <span class="pre">[h]</span></code> replaces the second occurrence of <code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre">+</span> <span class="pre">b</span></code> with <code class="docutils literal notranslate"><span class="pre">c</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">c</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">c</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">nth_rw</span> <span class="mi">2</span> <span class="o">[</span><span class="n">h</span><span class="o">]</span> <span class="n">rw</span> <span class="o">[</span><span class="n">add_mul</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">nth_rw</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">[</span><span class="n">h</span><span class="o">]</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">add_mul</span><span class="o">]</span> </pre></div> </div> </section>
-
@@ -405,17 +405,17 @@ and multiplication distributes over addition.</p></li></ul> <p>In Lean, the collection of objects is represented as a <em>type</em>, <code class="docutils literal notranslate"><span class="pre">R</span></code>. The ring axioms are as follows:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">(</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">R</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">Ring</span><span class="w"> </span><span class="n">R</span><span class="o">]</span> <span class="k">#check</span> <span class="o">(</span><span class="n">add_assoc</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">R</span><span class="o">,</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">+</span> <span class="o">(</span><span class="n">b</span> <span class="bp">+</span> <span class="n">c</span><span class="o">))</span> <span class="k">#check</span> <span class="o">(</span><span class="n">add_comm</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">R</span><span class="o">,</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">a</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">zero_add</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="o">:</span> <span class="n">R</span><span class="o">,</span> <span class="mi">0</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">a</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">add_left_neg</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="o">:</span> <span class="n">R</span><span class="o">,</span> <span class="bp">-</span><span class="n">a</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp">=</span> <span class="mi">0</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">mul_assoc</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">R</span><span class="o">,</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="o">(</span><span class="n">b</span> <span class="bp">*</span> <span class="n">c</span><span class="o">))</span> <span class="k">#check</span> <span class="o">(</span><span class="n">mul_one</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="o">:</span> <span class="n">R</span><span class="o">,</span> <span class="n">a</span> <span class="bp">*</span> <span class="mi">1</span> <span class="bp">=</span> <span class="n">a</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">one_mul</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="o">:</span> <span class="n">R</span><span class="o">,</span> <span class="mi">1</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">a</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">mul_add</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">R</span><span class="o">,</span> <span class="n">a</span> <span class="bp">*</span> <span class="o">(</span><span class="n">b</span> <span class="bp">+</span> <span class="n">c</span><span class="o">)</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">c</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">add_mul</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">R</span><span class="o">,</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">c</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">add_assoc</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="o">))</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">add_comm</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">zero_add</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">,</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">add_left_neg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">,</span><span class="w"> </span><span class="bp">-</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">mul_assoc</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="o">))</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">mul_one</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">one_mul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">,</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">mul_add</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">add_mul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">,</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> </pre></div> </div> <p>You will learn more about the square brackets in the first line later,
-
@@ -452,18 +452,18 @@ form a ring in which commutativity usually fails. If we declare <code class="doc<em>commutative</em> ring, in fact, all the theorems in the last section continue to hold when we replace <code class="docutils literal notranslate"><span class="pre">ℝ</span></code> by <code class="docutils literal notranslate"><span class="pre">R</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">(</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="n">d</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">b</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">c</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ring</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">ring</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="mi">2</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ring</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">ring</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">-</span> <span class="n">b</span><span class="o">)</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">-</span> <span class="n">b</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ring</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">ring</span> <span class="kd">example</span> <span class="o">(</span><span class="n">hyp</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">d</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="o">(</span><span class="n">hyp'</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">d</span><span class="o">)</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">=</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">d</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">hyp</span><span class="o">,</span> <span class="n">hyp'</span><span class="o">]</span> <span class="n">ring</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">hyp</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hyp'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">hyp</span><span class="o">,</span><span class="w"> </span><span class="n">hyp'</span><span class="o">]</span> <span class="w"> </span><span class="n">ring</span> </pre></div> </div> <p>We leave it to you to check that all the other proofs go through unchanged.
-
@@ -492,17 +492,17 @@ in the next example we put our versions of the librarytheorems in a new namespace called <code class="docutils literal notranslate"><span class="pre">MyRing.</span></code></p> <p>The next example shows that we do not need <code class="docutils literal notranslate"><span class="pre">add_zero</span></code> or <code class="docutils literal notranslate"><span class="pre">add_right_neg</span></code> as ring axioms, because they follow from the other axioms.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">namespace</span> <span class="n">MyRing</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">R</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">namespace</span><span class="w"> </span><span class="n">MyRing</span> <span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Ring</span><span class="w"> </span><span class="n">R</span><span class="o">]</span> <span class="kd">theorem</span> <span class="n">add_zero</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">+</span> <span class="mi">0</span> <span class="bp">=</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">add_comm</span><span class="o">,</span> <span class="n">zero_add</span><span class="o">]</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">add_zero</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">add_comm</span><span class="o">,</span><span class="w"> </span><span class="n">zero_add</span><span class="o">]</span> <span class="kd">theorem</span> <span class="n">add_right_neg</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">+</span> <span class="bp">-</span><span class="n">a</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">add_comm</span><span class="o">,</span> <span class="n">add_left_neg</span><span class="o">]</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">add_right_neg</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="bp">-</span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">add_comm</span><span class="o">,</span><span class="w"> </span><span class="n">add_left_neg</span><span class="o">]</span> <span class="k">#check</span> <span class="n">MyRing.add_zero</span> <span class="k">#check</span> <span class="n">add_zero</span> <span class="k">#check</span><span class="w"> </span><span class="n">MyRing.add_zero</span> <span class="k">#check</span><span class="w"> </span><span class="n">add_zero</span> <span class="kd">end</span> <span class="n">MyRing</span> <span class="kd">end</span><span class="w"> </span><span class="n">MyRing</span> </pre></div> </div> <p>The net effect is that we can temporarily reprove a theorem in the library,
-
@@ -517,21 +517,21 @@ This declares <code class="docutils literal notranslate"><span class="pre">R</spWe will explain what this means in a moment, but don’t worry about it in the meanwhile.)</p> <p>Here is a useful theorem:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">neg_add_cancel_left</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="bp">-</span><span class="n">a</span> <span class="bp">+</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">=</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="bp">←</span> <span class="n">add_assoc</span><span class="o">,</span> <span class="n">add_left_neg</span><span class="o">,</span> <span class="n">zero_add</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">neg_add_cancel_left</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">-</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="bp">←</span><span class="w"> </span><span class="n">add_assoc</span><span class="o">,</span><span class="w"> </span><span class="n">add_left_neg</span><span class="o">,</span><span class="w"> </span><span class="n">zero_add</span><span class="o">]</span> </pre></div> </div> <p>Prove the companion version:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">add_neg_cancel_right</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">+</span> <span class="bp">-</span><span class="n">b</span> <span class="bp">=</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">add_neg_cancel_right</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="bp">-</span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Use these to prove the following:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">add_left_cancel</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">R</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">c</span><span class="o">)</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">c</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">add_left_cancel</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">theorem</span> <span class="n">add_right_cancel</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">R</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">c</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">c</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">add_right_cancel</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>With enough planning, you can do each of them with three rewrites.</p>
-
@@ -559,10 +559,10 @@ So, given the statement of the theorem above,the correct expression is simply <code class="docutils literal notranslate"><span class="pre">add_left_cancel</span> <span class="pre">h</span></code>.</p> <p>To illustrate, let us show that <code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre">*</span> <span class="pre">0</span> <span class="pre">=</span> <span class="pre">0</span></code> follows from the ring axioms.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">mul_zero</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="mi">0</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">have</span> <span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="mi">0</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp">*</span> <span class="mi">0</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="mi">0</span> <span class="bp">+</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="bp">←</span> <span class="n">mul_add</span><span class="o">,</span> <span class="n">add_zero</span><span class="o">,</span> <span class="n">add_zero</span><span class="o">]</span> <span class="n">rw</span> <span class="o">[</span><span class="n">add_left_cancel</span> <span class="n">h</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">mul_zero</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="bp">←</span><span class="w"> </span><span class="n">mul_add</span><span class="o">,</span><span class="w"> </span><span class="n">add_zero</span><span class="o">,</span><span class="w"> </span><span class="n">add_zero</span><span class="o">]</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">add_left_cancel</span><span class="w"> </span><span class="n">h</span><span class="o">]</span> </pre></div> </div> <p id="index-11">We have used a new trick!
-
@@ -592,26 +592,26 @@ than <code class="docutils literal notranslate"><span class="pre">apply</span></human readers and easier to maintain when the library evolves.</p> <p>Remember that multiplication is not assumed to be commutative, so the following theorem also requires some work.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">zero_mul</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">zero_mul</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>By now, you should also be able replace each <code class="docutils literal notranslate"><span class="pre">sorry</span></code> in the next exercise with a proof, still using only facts about rings that we have established in this section.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">neg_eq_of_add_eq_zero</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">R</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">=</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="bp">-</span><span class="n">a</span> <span class="bp">=</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">neg_eq_of_add_eq_zero</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">-</span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">theorem</span> <span class="n">eq_neg_of_add_eq_zero</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">R</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">=</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">=</span> <span class="bp">-</span><span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">eq_neg_of_add_eq_zero</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">-</span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">theorem</span> <span class="n">neg_zero</span> <span class="o">:</span> <span class="o">(</span><span class="bp">-</span><span class="mi">0</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">neg_eq_of_add_eq_zero</span> <span class="n">rw</span> <span class="o">[</span><span class="n">add_zero</span><span class="o">]</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">neg_zero</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">-</span><span class="mi">0</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">neg_eq_of_add_eq_zero</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">add_zero</span><span class="o">]</span> <span class="kd">theorem</span> <span class="n">neg_neg</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="bp">-</span> <span class="bp">-</span><span class="n">a</span> <span class="bp">=</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">neg_neg</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="bp">-</span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>We had to use the annotation <code class="docutils literal notranslate"><span class="pre">(-0</span> <span class="pre">:</span> <span class="pre">R)</span></code> instead of <code class="docutils literal notranslate"><span class="pre">0</span></code> in the third theorem
-
@@ -620,16 +620,16 @@ it is impossible for Lean to infer which <code class="docutils literal notranslaand by default it would be interpreted as a natural number.</p> <p>In Lean, subtraction in a ring is provably equal to addition of the additive inverse.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">-</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">+</span> <span class="bp">-</span><span class="n">b</span> <span class="o">:=</span> <span class="n">sub_eq_add_neg</span> <span class="n">a</span> <span class="n">b</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="bp">-</span><span class="n">b</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">sub_eq_add_neg</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span> </pre></div> </div> <p>On the real numbers, it is <em>defined</em> that way:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">-</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">+</span> <span class="bp">-</span><span class="n">b</span> <span class="o">:=</span> <span class="n">rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="bp">-</span><span class="n">b</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">-</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">+</span> <span class="bp">-</span><span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="bp">-</span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p id="index-13">The proof term <code class="docutils literal notranslate"><span class="pre">rfl</span></code> is short for “reflexivity”.
-
@@ -644,8 +644,8 @@ but in some contexts, when dealing with the real numbers,you can use the two sides of the equation interchangeably. For example, you now have enough information to prove the theorem <code class="docutils literal notranslate"><span class="pre">self_sub</span></code> from the last section:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">self_sub</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">-</span> <span class="n">a</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">self_sub</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Show that you can prove this using <code class="docutils literal notranslate"><span class="pre">rw</span></code>,
-
@@ -656,11 +656,11 @@ using either <code class="docutils literal notranslate"><span class="pre">apply<With a bit of effort, you can use that to prove the theorem <code class="docutils literal notranslate"><span class="pre">two_mul</span></code> from the last section:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">one_add_one_eq_two</span> <span class="o">:</span> <span class="mi">1</span> <span class="bp">+</span> <span class="mi">1</span> <span class="bp">=</span> <span class="o">(</span><span class="mi">2</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">norm_num</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">one_add_one_eq_two</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="mi">2</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">norm_num</span> <span class="kd">theorem</span> <span class="n">two_mul</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">two_mul</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p id="index-14">We close this section by noting that some of the facts about
-
@@ -668,11 +668,11 @@ addition and negation that we established above do notneed the full strength of the ring axioms, or even commutativity of addition. The weaker notion of a <em>group</em> can be axiomatized as follows:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">(</span><span class="n">A</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="o">[</span><span class="n">AddGroup</span> <span class="n">A</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">A</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">AddGroup</span><span class="w"> </span><span class="n">A</span><span class="o">]</span> <span class="k">#check</span> <span class="o">(</span><span class="n">add_assoc</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">A</span><span class="o">,</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">+</span> <span class="o">(</span><span class="n">b</span> <span class="bp">+</span> <span class="n">c</span><span class="o">))</span> <span class="k">#check</span> <span class="o">(</span><span class="n">zero_add</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="o">:</span> <span class="n">A</span><span class="o">,</span> <span class="mi">0</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">a</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">add_left_neg</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="o">:</span> <span class="n">A</span><span class="o">,</span> <span class="bp">-</span><span class="n">a</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp">=</span> <span class="mi">0</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">add_assoc</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">A</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="o">))</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">zero_add</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">A</span><span class="o">,</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">add_left_neg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">A</span><span class="o">,</span><span class="w"> </span><span class="bp">-</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span> </pre></div> </div> <p>It is conventional to use additive notation when
-
@@ -681,25 +681,25 @@ and multiplicative notation otherwise.So Lean defines a multiplicative version as well as the additive version (and also their abelian variants, <code class="docutils literal notranslate"><span class="pre">AddCommGroup</span></code> and <code class="docutils literal notranslate"><span class="pre">CommGroup</span></code>).</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span> <span class="k">#check</span> <span class="o">(</span><span class="n">mul_assoc</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">G</span><span class="o">,</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="o">(</span><span class="n">b</span> <span class="bp">*</span> <span class="n">c</span><span class="o">))</span> <span class="k">#check</span> <span class="o">(</span><span class="n">one_mul</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="o">:</span> <span class="n">G</span><span class="o">,</span> <span class="mi">1</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">a</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">mul_left_inv</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="o">:</span> <span class="n">G</span><span class="o">,</span> <span class="n">a</span><span class="bp">⁻¹</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">=</span> <span class="mi">1</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">mul_assoc</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="o">))</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">one_mul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">,</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">mul_left_inv</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span> </pre></div> </div> <p>If you are feeling cocky, try proving the following facts about groups, using only these axioms. You will need to prove a number of helper lemmas along the way. The proofs we have carried out in this section provide some hints.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">mul_right_inv</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">a</span><span class="bp">⁻¹</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">mul_right_inv</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">theorem</span> <span class="n">mul_one</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="mi">1</span> <span class="bp">=</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">mul_one</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">theorem</span> <span class="n">mul_inv_rev</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span><span class="bp">⁻¹</span> <span class="bp">=</span> <span class="n">b</span><span class="bp">⁻¹</span> <span class="bp">*</span> <span class="n">a</span><span class="bp">⁻¹</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">mul_inv_rev</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="bp">⁻¹</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p id="index-15">Explicitly invoking those lemmas is tedious, so Mathlib provides
-
@@ -722,8 +722,8 @@ We have already seen that theorems can be applied to arguments and hypotheses,and that the <code class="docutils literal notranslate"><span class="pre">apply</span></code> and <code class="docutils literal notranslate"><span class="pre">exact</span></code> tactics can be used to solve goals. In this section, we will make good use of these tools.</p> <p>Consider the library theorems <code class="docutils literal notranslate"><span class="pre">le_refl</span></code> and <code class="docutils literal notranslate"><span class="pre">le_trans</span></code>:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="o">(</span><span class="n">le_refl</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">,</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">a</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">le_trans</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">→</span> <span class="n">b</span> <span class="bp">≤</span> <span class="n">c</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">c</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">le_refl</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">le_trans</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> </pre></div> </div> <p>As we explain in more detail in <a class="reference internal" href="C03_Logic.html#implication-and-the-universal-quantifier"><span class="std std-numref">Section 3.1</span></a>,
-
@@ -736,13 +736,13 @@ Rather, it expects to infer them from the context in which they are used.For example, when hypotheses <code class="docutils literal notranslate"><span class="pre">h</span> <span class="pre">:</span> <span class="pre">a</span> <span class="pre">≤</span> <span class="pre">b</span></code> and <code class="docutils literal notranslate"><span class="pre">h'</span> <span class="pre">:</span> <span class="pre">b</span> <span class="pre">≤</span> <span class="pre">c</span></code> are in the context, all the following work:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span><span class="o">)</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">≤</span> <span class="n">c</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">le_refl</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="o">:</span> <span class="n">Real</span><span class="o">,</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">a</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">le_refl</span> <span class="n">a</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">a</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">le_trans</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">→</span> <span class="n">b</span> <span class="bp">≤</span> <span class="n">c</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">c</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">le_trans</span> <span class="n">h</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">≤</span> <span class="n">c</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">c</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">le_trans</span> <span class="n">h</span> <span class="n">h'</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">c</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">le_refl</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Real</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">le_refl</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">le_trans</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">le_trans</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">le_trans</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> </pre></div> </div> <p id="index-17">The <code class="docutils literal notranslate"><span class="pre">apply</span></code> tactic takes a proof of a general statement or implication,
-
@@ -752,23 +752,23 @@ If the given proof matches the goal exactly(modulo <em>definitional</em> equality), you can use the <code class="docutils literal notranslate"><span class="pre">exact</span></code> tactic instead of <code class="docutils literal notranslate"><span class="pre">apply</span></code>. So, all of these work:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">h₀</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span><span class="o">)</span> <span class="o">(</span><span class="n">h₁</span> <span class="o">:</span> <span class="n">y</span> <span class="bp">≤</span> <span class="n">z</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">z</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">le_trans</span> <span class="bp">·</span> <span class="n">apply</span> <span class="n">h₀</span> <span class="bp">.</span> <span class="n">apply</span> <span class="n">h₁</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">z</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">le_trans</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">h₀</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">h₁</span> <span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">h₀</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span><span class="o">)</span> <span class="o">(</span><span class="n">h₁</span> <span class="o">:</span> <span class="n">y</span> <span class="bp">≤</span> <span class="n">z</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">z</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">le_trans</span> <span class="n">h₀</span> <span class="n">apply</span> <span class="n">h₁</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">z</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">le_trans</span><span class="w"> </span><span class="n">h₀</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">h₁</span> <span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">h₀</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span><span class="o">)</span> <span class="o">(</span><span class="n">h₁</span> <span class="o">:</span> <span class="n">y</span> <span class="bp">≤</span> <span class="n">z</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">z</span> <span class="o">:=</span> <span class="n">le_trans</span> <span class="n">h₀</span> <span class="n">h₁</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">z</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">le_trans</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h₁</span> <span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">le_refl</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">le_refl</span> <span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">le_refl</span> <span class="n">x</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">le_refl</span><span class="w"> </span><span class="n">x</span> </pre></div> </div> <p>In the first example, applying <code class="docutils literal notranslate"><span class="pre">le_trans</span></code>
-
@@ -783,26 +783,26 @@ In the fourth example and in the last example,we avoid going into tactic mode entirely: <code class="docutils literal notranslate"><span class="pre">le_trans</span> <span class="pre">h₀</span> <span class="pre">h₁</span></code> and <code class="docutils literal notranslate"><span class="pre">le_refl</span> <span class="pre">x</span></code> are the proof terms we need.</p> <p>Here are a few more library theorems:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="o">(</span><span class="n">le_refl</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span><span class="o">,</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">a</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">le_trans</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">→</span> <span class="n">b</span> <span class="bp">≤</span> <span class="n">c</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">c</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">lt_of_le_of_lt</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">→</span> <span class="n">b</span> <span class="bp"><</span> <span class="n">c</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">c</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">lt_of_lt_of_le</span> <span class="o">:</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">b</span> <span class="bp">→</span> <span class="n">b</span> <span class="bp">≤</span> <span class="n">c</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">c</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">lt_trans</span> <span class="o">:</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">b</span> <span class="bp">→</span> <span class="n">b</span> <span class="bp"><</span> <span class="n">c</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">c</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">le_refl</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">le_trans</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">lt_of_le_of_lt</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">lt_of_lt_of_le</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">lt_trans</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> </pre></div> </div> <p>Use them together with <code class="docutils literal notranslate"><span class="pre">apply</span></code> and <code class="docutils literal notranslate"><span class="pre">exact</span></code> to prove the following:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h₀</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span><span class="o">)</span> <span class="o">(</span><span class="n">h₁</span> <span class="o">:</span> <span class="n">b</span> <span class="bp"><</span> <span class="n">c</span><span class="o">)</span> <span class="o">(</span><span class="n">h₂</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">≤</span> <span class="n">d</span><span class="o">)</span> <span class="o">(</span><span class="n">h₃</span> <span class="o">:</span> <span class="n">d</span> <span class="bp"><</span> <span class="n">e</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">e</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₂</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">d</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₃</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">e</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p id="index-18">In fact, Lean has a tactic that does this sort of thing automatically:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h₀</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span><span class="o">)</span> <span class="o">(</span><span class="n">h₁</span> <span class="o">:</span> <span class="n">b</span> <span class="bp"><</span> <span class="n">c</span><span class="o">)</span> <span class="o">(</span><span class="n">h₂</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">≤</span> <span class="n">d</span><span class="o">)</span> <span class="o">(</span><span class="n">h₃</span> <span class="o">:</span> <span class="n">d</span> <span class="bp"><</span> <span class="n">e</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">e</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">linarith</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₂</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">d</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₃</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">e</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">linarith</span> </pre></div> </div> <p>The <code class="docutils literal notranslate"><span class="pre">linarith</span></code> tactic is designed to handle <em>linear arithmetic</em>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">≤</span> <span class="mi">3</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="mi">1</span> <span class="bp">≤</span> <span class="n">a</span><span class="o">)</span> <span class="o">(</span><span class="n">h''</span> <span class="o">:</span> <span class="n">d</span> <span class="bp">=</span> <span class="mi">2</span><span class="o">)</span> <span class="o">:</span> <span class="n">d</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp">≤</span> <span class="mi">5</span> <span class="bp">*</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">linarith</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h''</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">linarith</span> </pre></div> </div> <p>In addition to equations and inequalities in the context,
-
@@ -816,28 +816,28 @@ applying a fact or theorem <code class="docutils literal notranslate"><span clasParentheses are only needed for compound arguments, as in <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">(x</span> <span class="pre">+</span> <span class="pre">y)</span></code>. Without the parentheses, <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">x</span> <span class="pre">+</span> <span class="pre">y</span></code> would be parsed as <code class="docutils literal notranslate"><span class="pre">(f</span> <span class="pre">x)</span> <span class="pre">+</span> <span class="pre">y</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="mi">1</span> <span class="bp">≤</span> <span class="n">a</span><span class="o">)</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">≤</span> <span class="n">c</span><span class="o">)</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">exp</span> <span class="n">b</span> <span class="bp">≤</span> <span class="mi">3</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">exp</span> <span class="n">c</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">linarith</span> <span class="o">[</span><span class="n">exp_le_exp.mpr</span> <span class="n">h'</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">linarith</span><span class="w"> </span><span class="o">[</span><span class="n">exp_le_exp.mpr</span><span class="w"> </span><span class="n">h'</span><span class="o">]</span> </pre></div> </div> <p id="index-19">Here are some more theorems in the library that can be used to establish inequalities on the real numbers.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="o">(</span><span class="n">exp_le_exp</span> <span class="o">:</span> <span class="n">exp</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">exp</span> <span class="n">b</span> <span class="bp">↔</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">exp_lt_exp</span> <span class="o">:</span> <span class="n">exp</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">exp</span> <span class="n">b</span> <span class="bp">↔</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">b</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">log_le_log</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">a</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">→</span> <span class="n">log</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">log</span> <span class="n">b</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">log_lt_log</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">a</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">b</span> <span class="bp">→</span> <span class="n">log</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">log</span> <span class="n">b</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">add_le_add</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">→</span> <span class="n">c</span> <span class="bp">≤</span> <span class="n">d</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">c</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">d</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">add_le_add_left</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">→</span> <span class="bp">∀</span> <span class="n">c</span><span class="o">,</span> <span class="n">c</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">c</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">add_le_add_right</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">→</span> <span class="bp">∀</span> <span class="n">c</span><span class="o">,</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">c</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">c</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">add_lt_add_of_le_of_lt</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">→</span> <span class="n">c</span> <span class="bp"><</span> <span class="n">d</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">c</span> <span class="bp"><</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">d</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">add_lt_add_of_lt_of_le</span> <span class="o">:</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">b</span> <span class="bp">→</span> <span class="n">c</span> <span class="bp">≤</span> <span class="n">d</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">c</span> <span class="bp"><</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">d</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">add_lt_add_left</span> <span class="o">:</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">b</span> <span class="bp">→</span> <span class="bp">∀</span> <span class="n">c</span><span class="o">,</span> <span class="n">c</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">c</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">add_lt_add_right</span> <span class="o">:</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">b</span> <span class="bp">→</span> <span class="bp">∀</span> <span class="n">c</span><span class="o">,</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">c</span> <span class="bp"><</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">c</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">add_nonneg</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">a</span> <span class="bp">→</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">→</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">add_pos</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">a</span> <span class="bp">→</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">b</span> <span class="bp">→</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">add_pos_of_pos_of_nonneg</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">a</span> <span class="bp">→</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">→</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">exp_pos</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span><span class="o">,</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">exp</span> <span class="n">a</span><span class="o">)</span> <span class="k">#check</span> <span class="n">add_le_add_left</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">exp_le_exp</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">exp_lt_exp</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">log_le_log</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">log</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">log</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">log_lt_log</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">log</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">log</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">add_le_add</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">d</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">add_le_add_left</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">c</span><span class="o">,</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">add_le_add_right</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">c</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">add_lt_add_of_le_of_lt</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">d</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">add_lt_add_of_lt_of_le</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">d</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">add_lt_add_left</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">c</span><span class="o">,</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">add_lt_add_right</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">c</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">add_nonneg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">add_pos</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">add_pos_of_pos_of_nonneg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">exp_pos</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="n">a</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="n">add_le_add_left</span> </pre></div> </div> <p>Some of the theorems, <code class="docutils literal notranslate"><span class="pre">exp_le_exp</span></code>, <code class="docutils literal notranslate"><span class="pre">exp_lt_exp</span></code>
-
@@ -847,9 +847,9 @@ phrase “if and only if.”We will discuss this connective in greater detail in the next chapter. Such a theorem can be used with <code class="docutils literal notranslate"><span class="pre">rw</span></code> to rewrite a goal to an equivalent one:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="n">exp</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">exp</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">exp_le_exp</span><span class="o">]</span> <span class="n">exact</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">exp_le_exp</span><span class="o">]</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>In this section, however, we will use the fact that if <code class="docutils literal notranslate"><span class="pre">h</span> <span class="pre">:</span> <span class="pre">A</span> <span class="pre">↔</span> <span class="pre">B</span></code>
-
@@ -861,11 +861,11 @@ Here, <code class="docutils literal notranslate"><span class="pre">mp</span></coYou can also use <code class="docutils literal notranslate"><span class="pre">h.1</span></code> and <code class="docutils literal notranslate"><span class="pre">h.2</span></code> for <code class="docutils literal notranslate"><span class="pre">h.mp</span></code> and <code class="docutils literal notranslate"><span class="pre">h.mpr</span></code>, respectively, if you prefer. Thus the following proof works:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h₀</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span><span class="o">)</span> <span class="o">(</span><span class="n">h₁</span> <span class="o">:</span> <span class="n">c</span> <span class="bp"><</span> <span class="n">d</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">exp</span> <span class="n">c</span> <span class="bp">+</span> <span class="n">e</span> <span class="bp"><</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">exp</span> <span class="n">d</span> <span class="bp">+</span> <span class="n">e</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">add_lt_add_of_lt_of_le</span> <span class="bp">·</span> <span class="n">apply</span> <span class="n">add_lt_add_of_le_of_lt</span> <span class="n">h₀</span> <span class="n">apply</span> <span class="n">exp_lt_exp.mpr</span> <span class="n">h₁</span> <span class="n">apply</span> <span class="n">le_refl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">d</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">add_lt_add_of_lt_of_le</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">add_lt_add_of_le_of_lt</span><span class="w"> </span><span class="n">h₀</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">exp_lt_exp.mpr</span><span class="w"> </span><span class="n">h₁</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">le_refl</span> </pre></div> </div> <p>The first line, <code class="docutils literal notranslate"><span class="pre">apply</span> <span class="pre">add_lt_add_of_lt_of_le</span></code>,
-
@@ -875,14 +875,14 @@ proof of the first from the proof of the second.</p><p id="index-20">Try the following examples on your own. The example in the middle shows you that the <code class="docutils literal notranslate"><span class="pre">norm_num</span></code> tactic can be used to solve concrete numeric goals.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h₀</span> <span class="o">:</span> <span class="n">d</span> <span class="bp">≤</span> <span class="n">e</span><span class="o">)</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">+</span> <span class="n">exp</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">d</span><span class="o">)</span> <span class="bp">≤</span> <span class="n">c</span> <span class="bp">+</span> <span class="n">exp</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">e</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">e</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">d</span><span class="o">)</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">e</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="mi">0</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="bp"><</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">norm_num</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="mi">0</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="n">log</span> <span class="o">(</span><span class="mi">1</span> <span class="bp">+</span> <span class="n">exp</span> <span class="n">a</span><span class="o">)</span> <span class="bp">≤</span> <span class="n">log</span> <span class="o">(</span><span class="mi">1</span> <span class="bp">+</span> <span class="n">exp</span> <span class="n">b</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">have</span> <span class="n">h₀</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="mi">1</span> <span class="bp">+</span> <span class="n">exp</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">apply</span> <span class="n">log_le_log</span> <span class="n">h₀</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">log</span><span class="w"> </span><span class="o">(</span><span class="mi">1</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">log</span><span class="w"> </span><span class="o">(</span><span class="mi">1</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">log_le_log</span><span class="w"> </span><span class="n">h₀</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>From these examples, it should be clear that being able to
-
@@ -912,9 +912,9 @@ and you can find similar theorems nearby.</p></li><li><p>You can use the <code class="docutils literal notranslate"><span class="pre">apply?</span></code> tactic, which tries to find the relevant theorem in the library.</p></li> </ul> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">a</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="c1">-- apply?</span> <span class="n">exact</span> <span class="n">sq_nonneg</span> <span class="n">a</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="c1">-- apply?</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">sq_nonneg</span><span class="w"> </span><span class="n">a</span> </pre></div> </div> <p>To try out <code class="docutils literal notranslate"><span class="pre">apply?</span></code> in this example,
-
@@ -922,23 +922,23 @@ delete the <code class="docutils literal notranslate"><span class="pre">exact</sUsing these tricks, see if you can find what you need to do the next example:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">-</span> <span class="n">exp</span> <span class="n">b</span> <span class="bp">≤</span> <span class="n">c</span> <span class="bp">-</span> <span class="n">exp</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Using the same tricks, confirm that <code class="docutils literal notranslate"><span class="pre">linarith</span></code> instead of <code class="docutils literal notranslate"><span class="pre">apply?</span></code> can also finish the job.</p> <p>Here is another example of an inequality:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">≤</span> <span class="n">a</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">have</span> <span class="n">h</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">a</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">-</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">^</span> <span class="mi">2</span> <span class="k">calc</span> <span class="n">a</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">-</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">=</span> <span class="o">(</span><span class="n">a</span> <span class="bp">-</span> <span class="n">b</span><span class="o">)</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ring</span> <span class="n">_</span> <span class="bp">≥</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">pow_two_nonneg</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span> <span class="w"> </span><span class="k">calc</span> <span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">ring</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">pow_two_nonneg</span> <span class="k">calc</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">=</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">+</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ring</span> <span class="n">_</span> <span class="bp">≤</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">+</span> <span class="o">(</span><span class="n">a</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">-</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="o">:=</span> <span class="n">add_le_add</span> <span class="o">(</span><span class="n">le_refl</span> <span class="n">_</span><span class="o">)</span> <span class="n">h</span> <span class="n">_</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ring</span> <span class="w"> </span><span class="k">calc</span> <span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">ring</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">add_le_add</span><span class="w"> </span><span class="o">(</span><span class="n">le_refl</span><span class="w"> </span><span class="n">_</span><span class="o">)</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">ring</span> </pre></div> </div> <p>Mathlib tends to put spaces around binary operations like <code class="docutils literal notranslate"><span class="pre">*</span></code> and <code class="docutils literal notranslate"><span class="pre">^</span></code>,
-
@@ -958,22 +958,22 @@ we can simply write the proof term <code class="docutils literal notranslate"><sout the hypothesis <code class="docutils literal notranslate"><span class="pre">h</span></code>. Once we have it, the second calculation involves only linear arithmetic, and <code class="docutils literal notranslate"><span class="pre">linarith</span></code> can handle it:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">≤</span> <span class="n">a</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">have</span> <span class="n">h</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">a</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">-</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">^</span> <span class="mi">2</span> <span class="k">calc</span> <span class="n">a</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">-</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">=</span> <span class="o">(</span><span class="n">a</span> <span class="bp">-</span> <span class="n">b</span><span class="o">)</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ring</span> <span class="n">_</span> <span class="bp">≥</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">pow_two_nonneg</span> <span class="n">linarith</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span> <span class="w"> </span><span class="k">calc</span> <span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">ring</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">pow_two_nonneg</span> <span class="w"> </span><span class="n">linarith</span> </pre></div> </div> <p>How nice! We challenge you to use these ideas to prove the following theorem. You can use the theorem <code class="docutils literal notranslate"><span class="pre">abs_le'.mpr</span></code>. You will also need the <code class="docutils literal notranslate"><span class="pre">constructor</span></code> tactic to split a conjunction to two goals; see <a class="reference internal" href="C03_Logic.html#conjunction-and-biimplication"><span class="std std-numref">Section 3.4</span></a>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="bp">|</span><span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="bp">|</span> <span class="bp">≤</span> <span class="o">(</span><span class="n">a</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">|</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="bp">|</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="k">#check</span> <span class="n">abs_le'.mpr</span> <span class="k">#check</span><span class="w"> </span><span class="n">abs_le'.mpr</span> </pre></div> </div> <p>If you managed to solve this, congratulations!
-
@@ -983,9 +983,9 @@ You are well on your way to becoming a master formalizer.</p><span id="more-on-order-and-divisibility"></span><h2><span class="section-number">2.4. </span>More examples using apply and rw<a class="headerlink" href="#more-examples-using-apply-and-rw" title="Link to this heading"></a></h2> <p id="index-21">The <code class="docutils literal notranslate"><span class="pre">min</span></code> function on the real numbers is uniquely characterized by the following three facts:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="o">(</span><span class="n">min_le_left</span> <span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">min</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">≤</span> <span class="n">a</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">min_le_right</span> <span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">min</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">≤</span> <span class="n">b</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">le_min</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">≤</span> <span class="n">a</span> <span class="bp">→</span> <span class="n">c</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">→</span> <span class="n">c</span> <span class="bp">≤</span> <span class="n">min</span> <span class="n">a</span> <span class="n">b</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">min_le_left</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">min_le_right</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">le_min</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> </pre></div> </div> <p>Can you guess the names of the theorems that characterize
-
@@ -1010,16 +1010,16 @@ With time, these conventions will become second nature.</p>real numbers are equal if each is less than or equal to the other. Using this and the facts above, we can show that <code class="docutils literal notranslate"><span class="pre">min</span></code> is commutative:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">min</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">min</span> <span class="n">b</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">le_antisymm</span> <span class="bp">·</span> <span class="k">show</span> <span class="n">min</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">≤</span> <span class="n">min</span> <span class="n">b</span> <span class="n">a</span> <span class="n">apply</span> <span class="n">le_min</span> <span class="bp">·</span> <span class="n">apply</span> <span class="n">min_le_right</span> <span class="n">apply</span> <span class="n">min_le_left</span> <span class="bp">·</span> <span class="k">show</span> <span class="n">min</span> <span class="n">b</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">min</span> <span class="n">a</span> <span class="n">b</span> <span class="n">apply</span> <span class="n">le_min</span> <span class="bp">·</span> <span class="n">apply</span> <span class="n">min_le_right</span> <span class="n">apply</span> <span class="n">min_le_left</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">le_antisymm</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="k">show</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">a</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">le_min</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">min_le_right</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">min_le_left</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="k">show</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">le_min</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">min_le_right</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">min_le_left</span> </pre></div> </div> <p id="index-22">Here we have used dots to separate proofs of
-
@@ -1039,15 +1039,15 @@ but using them makes the proof easier to read and maintain.</p>To foreshadow skills you will learn later on, we note that one way to avoid the repetition is to state a local lemma and then use it:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">min</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">min</span> <span class="n">b</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">have</span> <span class="n">h</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">,</span> <span class="n">min</span> <span class="n">x</span> <span class="n">y</span> <span class="bp">≤</span> <span class="n">min</span> <span class="n">y</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">x</span> <span class="n">y</span> <span class="n">apply</span> <span class="n">le_min</span> <span class="n">apply</span> <span class="n">min_le_right</span> <span class="n">apply</span> <span class="n">min_le_left</span> <span class="n">apply</span> <span class="n">le_antisymm</span> <span class="n">apply</span> <span class="n">h</span> <span class="n">apply</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">,</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">le_min</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">min_le_right</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">min_le_left</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">le_antisymm</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>We will say more about the universal quantifier in
-
@@ -1062,20 +1062,20 @@ uses <code class="docutils literal notranslate"><span class="pre">h</span> <span<p id="index-23">Another solution is to use the <code class="docutils literal notranslate"><span class="pre">repeat</span></code> tactic, which applies a tactic (or a block) as many times as it can.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">min</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">min</span> <span class="n">b</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">le_antisymm</span> <span class="n">repeat</span> <span class="n">apply</span> <span class="n">le_min</span> <span class="n">apply</span> <span class="n">min_le_right</span> <span class="n">apply</span> <span class="n">min_le_left</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">le_antisymm</span> <span class="w"> </span><span class="n">repeat</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">le_min</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">min_le_right</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">min_le_left</span> </pre></div> </div> <p>We encourage you to prove the following as exercises. You can use either of the tricks just described to shorten the first.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">max</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">max</span> <span class="n">b</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">min</span> <span class="o">(</span><span class="n">min</span> <span class="n">a</span> <span class="n">b</span><span class="o">)</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">min</span> <span class="n">a</span> <span class="o">(</span><span class="n">min</span> <span class="n">b</span> <span class="n">c</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">max</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">max</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="o">(</span><span class="n">min</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">(</span><span class="n">min</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Of course, you are welcome to prove the associativity of <code class="docutils literal notranslate"><span class="pre">max</span></code> as well.</p>
-
@@ -1098,10 +1098,10 @@ and in the second case, we have <code class="docutils literal notranslate"><spanWe will learn how to reason by cases in <a class="reference internal" href="C03_Logic.html#disjunction"><span class="std std-numref">Section 3.5</span></a>, but for now we will stick to examples that don’t require the case split.</p> <p>Here is one such example:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">aux</span> <span class="o">:</span> <span class="n">min</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">c</span> <span class="bp">≤</span> <span class="n">min</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">c</span><span class="o">)</span> <span class="o">(</span><span class="n">b</span> <span class="bp">+</span> <span class="n">c</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">min</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">min</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">c</span><span class="o">)</span> <span class="o">(</span><span class="n">b</span> <span class="bp">+</span> <span class="n">c</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">aux</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">min</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>It is clear that <code class="docutils literal notranslate"><span class="pre">aux</span></code> provides one of the two inequalities
-
@@ -1112,12 +1112,12 @@ As a hint, you can use the theorem <code class="docutils literal notranslate"><sand the <code class="docutils literal notranslate"><span class="pre">linarith</span></code> tactic.</p> <p id="index-24">Lean’s naming convention is made manifest in the library’s name for the triangle inequality:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="o">(</span><span class="n">abs_add</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">,</span> <span class="bp">|</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="bp">|</span> <span class="bp">≤</span> <span class="bp">|</span><span class="n">a</span><span class="bp">|</span> <span class="bp">+</span> <span class="bp">|</span><span class="n">b</span><span class="bp">|</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">abs_add</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">,</span><span class="w"> </span><span class="bp">|</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="bp">|</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="bp">|</span><span class="n">a</span><span class="bp">|</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="bp">|</span><span class="n">b</span><span class="bp">|</span><span class="o">)</span> </pre></div> </div> <p>Use it to prove the following variant, using also <code class="docutils literal notranslate"><span class="pre">add_sub_cancel_right</span></code>:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="bp">|</span><span class="n">a</span><span class="bp">|</span> <span class="bp">-</span> <span class="bp">|</span><span class="n">b</span><span class="bp">|</span> <span class="bp">≤</span> <span class="bp">|</span><span class="n">a</span> <span class="bp">-</span> <span class="n">b</span><span class="bp">|</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">|</span><span class="n">a</span><span class="bp">|</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="bp">|</span><span class="n">b</span><span class="bp">|</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="bp">|</span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="bp">|</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">end</span> </pre></div> </div>
-
@@ -1132,15 +1132,15 @@ Rather, it is a unicode character obtained bytyping <code class="docutils literal notranslate"><span class="pre">\|</span></code> in VS Code. By convention, Mathlib uses <code class="docutils literal notranslate"><span class="pre">dvd</span></code> to refer to it in theorem names.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h₀</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∣</span> <span class="n">y</span><span class="o">)</span> <span class="o">(</span><span class="n">h₁</span> <span class="o">:</span> <span class="n">y</span> <span class="bp">∣</span> <span class="n">z</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∣</span> <span class="n">z</span> <span class="o">:=</span> <span class="n">dvd_trans</span> <span class="n">h₀</span> <span class="n">h₁</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">z</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">dvd_trans</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h₁</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∣</span> <span class="n">y</span> <span class="bp">*</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">z</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">dvd_mul_of_dvd_left</span> <span class="n">apply</span> <span class="n">dvd_mul_left</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">dvd_mul_of_dvd_left</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">dvd_mul_left</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∣</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">dvd_mul_left</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">dvd_mul_left</span> </pre></div> </div> <p>In the last example, the exponent is a natural
-
@@ -1149,8 +1149,8 @@ forces Lean to expand the definition of <code class="docutils literal notranslat<code class="docutils literal notranslate"><span class="pre">x^1</span> <span class="pre">*</span> <span class="pre">x</span></code>. See if you can guess the names of the theorems you need to prove the following:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∣</span> <span class="n">w</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∣</span> <span class="n">y</span> <span class="bp">*</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">z</span><span class="o">)</span> <span class="bp">+</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">w</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">w</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">z</span><span class="o">)</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">end</span> </pre></div> </div>
-
@@ -1159,18 +1159,18 @@ you need to prove the following:</p>are analogous to <code class="docutils literal notranslate"><span class="pre">min</span></code> and <code class="docutils literal notranslate"><span class="pre">max</span></code>. Since every number divides <code class="docutils literal notranslate"><span class="pre">0</span></code>, <code class="docutils literal notranslate"><span class="pre">0</span></code> is really the greatest element with respect to divisibility:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">(</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">Nat.gcd_zero_right</span> <span class="n">n</span> <span class="o">:</span> <span class="n">Nat.gcd</span> <span class="n">n</span> <span class="mi">0</span> <span class="bp">=</span> <span class="n">n</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">Nat.gcd_zero_left</span> <span class="n">n</span> <span class="o">:</span> <span class="n">Nat.gcd</span> <span class="mi">0</span> <span class="n">n</span> <span class="bp">=</span> <span class="n">n</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">Nat.lcm_zero_right</span> <span class="n">n</span> <span class="o">:</span> <span class="n">Nat.lcm</span> <span class="n">n</span> <span class="mi">0</span> <span class="bp">=</span> <span class="mi">0</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">Nat.lcm_zero_left</span> <span class="n">n</span> <span class="o">:</span> <span class="n">Nat.lcm</span> <span class="mi">0</span> <span class="n">n</span> <span class="bp">=</span> <span class="mi">0</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">Nat.gcd_zero_right</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.gcd</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">n</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">Nat.gcd_zero_left</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.gcd</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">n</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">Nat.lcm_zero_right</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.lcm</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">Nat.lcm_zero_left</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.lcm</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span> </pre></div> </div> <p>See if you can guess the names of the theorems you will need to prove the following:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">Nat.gcd</span> <span class="n">m</span> <span class="n">n</span> <span class="bp">=</span> <span class="n">Nat.gcd</span> <span class="n">n</span> <span class="n">m</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.gcd</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">Nat.gcd</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Hint: you can use <code class="docutils literal notranslate"><span class="pre">dvd_antisymm</span></code>, but if you do, Lean will
-
@@ -1192,13 +1192,13 @@ For example, a <em>partial order</em> consists of a set with abinary relation that is reflexive, transitive, and antisymmetric. like <code class="docutils literal notranslate"><span class="pre">≤</span></code> on the real numbers. Lean knows about partial orders:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">PartialOrder</span> <span class="n">α</span><span class="o">]</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">PartialOrder</span><span class="w"> </span><span class="n">α</span><span class="o">]</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="k">#check</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="k">#check</span> <span class="o">(</span><span class="n">le_refl</span> <span class="n">x</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">x</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">le_trans</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">→</span> <span class="n">y</span> <span class="bp">≤</span> <span class="n">z</span> <span class="bp">→</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">z</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">le_antisymm</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">→</span> <span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span> <span class="bp">→</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">y</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">le_refl</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">le_trans</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">z</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">le_antisymm</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">y</span><span class="o">)</span> </pre></div> </div> <p>Here we are adopting the Mathlib convention of using
-
@@ -1217,14 +1217,14 @@ which acts somewhat like <code class="docutils literal notranslate"><span class=Saying that <code class="docutils literal notranslate"><span class="pre">x</span></code> is less than <code class="docutils literal notranslate"><span class="pre">y</span></code> in this order is equivalent to saying that it is less-than-or-equal to <code class="docutils literal notranslate"><span class="pre">y</span></code> and not equal to <code class="docutils literal notranslate"><span class="pre">y</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">y</span> <span class="k">#check</span> <span class="o">(</span><span class="n">lt_irrefl</span> <span class="n">x</span> <span class="o">:</span> <span class="bp">¬</span> <span class="o">(</span><span class="n">x</span> <span class="bp"><</span> <span class="n">x</span><span class="o">))</span> <span class="k">#check</span> <span class="o">(</span><span class="n">lt_trans</span> <span class="o">:</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">y</span> <span class="bp">→</span> <span class="n">y</span> <span class="bp"><</span> <span class="n">z</span> <span class="bp">→</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">z</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">lt_of_le_of_lt</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">→</span> <span class="n">y</span> <span class="bp"><</span> <span class="n">z</span> <span class="bp">→</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">z</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">lt_of_lt_of_le</span> <span class="o">:</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">y</span> <span class="bp">→</span> <span class="n">y</span> <span class="bp">≤</span> <span class="n">z</span> <span class="bp">→</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">z</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">lt_irrefl</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">x</span><span class="o">))</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">lt_trans</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">z</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">lt_of_le_of_lt</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">z</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">lt_of_lt_of_le</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">z</span><span class="o">)</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">y</span> <span class="bp">↔</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span> <span class="o">:=</span> <span class="n">lt_iff_le_and_ne</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">lt_iff_le_and_ne</span> </pre></div> </div> <p>In this example, the symbol <code class="docutils literal notranslate"><span class="pre">∧</span></code> stands for “and,”
-
@@ -1236,17 +1236,17 @@ has the properties indicated.</p><p id="index-28">A <em>lattice</em> is a structure that extends a partial order with operations <code class="docutils literal notranslate"><span class="pre">⊓</span></code> and <code class="docutils literal notranslate"><span class="pre">⊔</span></code> that are analogous to <code class="docutils literal notranslate"><span class="pre">min</span></code> and <code class="docutils literal notranslate"><span class="pre">max</span></code> on the real numbers:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Lattice</span> <span class="n">α</span><span class="o">]</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Lattice</span><span class="w"> </span><span class="n">α</span><span class="o">]</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="k">#check</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="n">y</span> <span class="k">#check</span> <span class="o">(</span><span class="n">inf_le_left</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">inf_le_right</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="n">y</span> <span class="bp">≤</span> <span class="n">y</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">le_inf</span> <span class="o">:</span> <span class="n">z</span> <span class="bp">≤</span> <span class="n">x</span> <span class="bp">→</span> <span class="n">z</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">→</span> <span class="n">z</span> <span class="bp">≤</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="n">y</span><span class="o">)</span> <span class="k">#check</span> <span class="n">x</span> <span class="bp">⊔</span> <span class="n">y</span> <span class="k">#check</span> <span class="o">(</span><span class="n">le_sup_left</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">x</span> <span class="bp">⊔</span> <span class="n">y</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">le_sup_right</span> <span class="o">:</span> <span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span> <span class="bp">⊔</span> <span class="n">y</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">sup_le</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">z</span> <span class="bp">→</span> <span class="n">y</span> <span class="bp">≤</span> <span class="n">z</span> <span class="bp">→</span> <span class="n">x</span> <span class="bp">⊔</span> <span class="n">y</span> <span class="bp">≤</span> <span class="n">z</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">y</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">inf_le_left</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">inf_le_right</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">le_inf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">y</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">y</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">le_sup_left</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">y</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">le_sup_right</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">y</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">sup_le</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">z</span><span class="o">)</span> </pre></div> </div> <p>The characterizations of <code class="docutils literal notranslate"><span class="pre">⊓</span></code> and <code class="docutils literal notranslate"><span class="pre">⊔</span></code> justify calling them
-
@@ -1301,28 +1301,28 @@ which takes <code class="docutils literal notranslate"><span class="pre">y</spanOf course you can also avoid this issue by providing directly a full proof such as <code class="docutils literal notranslate"><span class="pre">exact</span> <span class="pre">le_trans</span> <span class="pre">inf_le_left</span> <span class="pre">inf_le_right</span></code>, but this requires a lot more planning.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="n">y</span> <span class="bp">=</span> <span class="n">y</span> <span class="bp">⊓</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="n">y</span> <span class="bp">⊓</span> <span class="n">z</span> <span class="bp">=</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="o">(</span><span class="n">y</span> <span class="bp">⊓</span> <span class="n">z</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="o">(</span><span class="n">y</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">z</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">⊔</span> <span class="n">y</span> <span class="bp">=</span> <span class="n">y</span> <span class="bp">⊔</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">⊔</span> <span class="n">y</span> <span class="bp">⊔</span> <span class="n">z</span> <span class="bp">=</span> <span class="n">x</span> <span class="bp">⊔</span> <span class="o">(</span><span class="n">y</span> <span class="bp">⊔</span> <span class="n">z</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="o">(</span><span class="n">y</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">z</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>You can find these theorems in the Mathlib as <code class="docutils literal notranslate"><span class="pre">inf_comm</span></code>, <code class="docutils literal notranslate"><span class="pre">inf_assoc</span></code>, <code class="docutils literal notranslate"><span class="pre">sup_comm</span></code>, and <code class="docutils literal notranslate"><span class="pre">sup_assoc</span></code>, respectively.</p> <p>Another good exercise is to prove the <em>absorption laws</em> using only those axioms:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">absorb1</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="o">(</span><span class="n">x</span> <span class="bp">⊔</span> <span class="n">y</span><span class="o">)</span> <span class="bp">=</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">absorb1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">theorem</span> <span class="n">absorb2</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">⊔</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="n">y</span> <span class="bp">=</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">absorb2</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>These can be found in Mathlib with the names <code class="docutils literal notranslate"><span class="pre">inf_sup_self</span></code> and <code class="docutils literal notranslate"><span class="pre">sup_inf_self</span></code>.</p>
-
@@ -1330,13 +1330,13 @@ using only those axioms:</p><code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">⊓</span> <span class="pre">(y</span> <span class="pre">⊔</span> <span class="pre">z)</span> <span class="pre">=</span> <span class="pre">(x</span> <span class="pre">⊓</span> <span class="pre">y)</span> <span class="pre">⊔</span> <span class="pre">(x</span> <span class="pre">⊓</span> <span class="pre">z)</span></code> and <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">⊔</span> <span class="pre">(y</span> <span class="pre">⊓</span> <span class="pre">z)</span> <span class="pre">=</span> <span class="pre">(x</span> <span class="pre">⊔</span> <span class="pre">y)</span> <span class="pre">⊓</span> <span class="pre">(x</span> <span class="pre">⊔</span> <span class="pre">z)</span></code> is called a <em>distributive lattice</em>. Lean knows about these too:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">DistribLattice</span> <span class="n">α</span><span class="o">]</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">DistribLattice</span><span class="w"> </span><span class="n">α</span><span class="o">]</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">inf_sup_left</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="o">(</span><span class="n">y</span> <span class="bp">⊔</span> <span class="n">z</span><span class="o">)</span> <span class="bp">=</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="n">y</span> <span class="bp">⊔</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="n">z</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">inf_sup_right</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="o">(</span><span class="n">x</span> <span class="bp">⊔</span> <span class="n">y</span><span class="o">)</span> <span class="bp">⊓</span> <span class="n">z</span> <span class="bp">=</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="n">z</span> <span class="bp">⊔</span> <span class="n">y</span> <span class="bp">⊓</span> <span class="n">z</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">sup_inf_left</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">⊔</span> <span class="n">y</span> <span class="bp">⊓</span> <span class="n">z</span> <span class="bp">=</span> <span class="o">(</span><span class="n">x</span> <span class="bp">⊔</span> <span class="n">y</span><span class="o">)</span> <span class="bp">⊓</span> <span class="o">(</span><span class="n">x</span> <span class="bp">⊔</span> <span class="n">z</span><span class="o">))</span> <span class="k">#check</span> <span class="o">(</span><span class="n">sup_inf_right</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="n">y</span> <span class="bp">⊔</span> <span class="n">z</span> <span class="bp">=</span> <span class="o">(</span><span class="n">x</span> <span class="bp">⊔</span> <span class="n">z</span><span class="o">)</span> <span class="bp">⊓</span> <span class="o">(</span><span class="n">y</span> <span class="bp">⊔</span> <span class="n">z</span><span class="o">))</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">inf_sup_left</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="o">(</span><span class="n">y</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">z</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">z</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">inf_sup_right</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">z</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">sup_inf_left</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">z</span><span class="o">))</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">sup_inf_right</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">z</span><span class="o">)</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="o">(</span><span class="n">y</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">z</span><span class="o">))</span> </pre></div> </div> <p>The left and right versions are easily shown to be
-
@@ -1347,14 +1347,14 @@ by providing an explicit description of anondistributive lattice with finitely many elements. It is also a good exercise to show that in any lattice, either distributivity law implies the other:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Lattice</span> <span class="n">α</span><span class="o">]</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Lattice</span><span class="w"> </span><span class="n">α</span><span class="o">]</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="o">(</span><span class="n">y</span> <span class="bp">⊔</span> <span class="n">z</span><span class="o">)</span> <span class="bp">=</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="n">y</span> <span class="bp">⊔</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="n">z</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">⊔</span> <span class="n">b</span> <span class="bp">⊓</span> <span class="n">c</span> <span class="bp">=</span> <span class="o">(</span><span class="n">a</span> <span class="bp">⊔</span> <span class="n">b</span><span class="o">)</span> <span class="bp">⊓</span> <span class="o">(</span><span class="n">a</span> <span class="bp">⊔</span> <span class="n">c</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="o">(</span><span class="n">y</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">z</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">z</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">x</span> <span class="bp">⊔</span> <span class="n">y</span> <span class="bp">⊓</span> <span class="n">z</span> <span class="bp">=</span> <span class="o">(</span><span class="n">x</span> <span class="bp">⊔</span> <span class="n">y</span><span class="o">)</span> <span class="bp">⊓</span> <span class="o">(</span><span class="n">x</span> <span class="bp">⊔</span> <span class="n">z</span><span class="o">))</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">⊓</span> <span class="o">(</span><span class="n">b</span> <span class="bp">⊔</span> <span class="n">c</span><span class="o">)</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">⊓</span> <span class="n">b</span> <span class="bp">⊔</span> <span class="n">a</span> <span class="bp">⊓</span> <span class="n">c</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">z</span><span class="o">))</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>It is possible to combine axiomatic structures into larger ones.
-
@@ -1362,16 +1362,16 @@ For example, a <em>strict ordered ring</em> consists of a commutative ring togetwith a partial order on the carrier satisfying additional axioms that say that the ring operations are compatible with the order:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">StrictOrderedRing</span> <span class="n">R</span><span class="o">]</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">StrictOrderedRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">add_le_add_left</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">→</span> <span class="bp">∀</span> <span class="n">c</span><span class="o">,</span> <span class="n">c</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">c</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">mul_pos</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">a</span> <span class="bp">→</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">b</span> <span class="bp">→</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">add_le_add_left</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">c</span><span class="o">,</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">mul_pos</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> </pre></div> </div> <p><a class="reference internal" href="C03_Logic.html#logic"><span class="std std-numref">Chapter 3</span></a> will provide the means to derive the following from <code class="docutils literal notranslate"><span class="pre">mul_pos</span></code> and the definition of <code class="docutils literal notranslate"><span class="pre"><</span></code>:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="o">(</span><span class="n">mul_nonneg</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">a</span> <span class="bp">→</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">→</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">mul_nonneg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> </pre></div> </div> <p>It is then an extended exercise to show that many common facts
-
@@ -1380,14 +1380,14 @@ numbers hold generically for any ordered ring.Here are a couple of examples you can try, using only properties of rings, partial orders, and the facts enumerated in the last two examples:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">-</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span><span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">-</span> <span class="n">a</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span><span class="o">)</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">c</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">c</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p id="index-30">Finally, here is one last example.
-
@@ -1395,19 +1395,19 @@ A <em>metric space</em> consists of a set equipped with a notion ofdistance, <code class="docutils literal notranslate"><span class="pre">dist</span> <span class="pre">x</span> <span class="pre">y</span></code>, mapping any pair of elements to a real number. The distance function is assumed to satisfy the following axioms:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">X</span><span class="o">]</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">X</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">dist_self</span> <span class="n">x</span> <span class="o">:</span> <span class="n">dist</span> <span class="n">x</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">0</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">dist_comm</span> <span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">dist</span> <span class="n">x</span> <span class="n">y</span> <span class="bp">=</span> <span class="n">dist</span> <span class="n">y</span> <span class="n">x</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">dist_triangle</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">dist</span> <span class="n">x</span> <span class="n">z</span> <span class="bp">≤</span> <span class="n">dist</span> <span class="n">x</span> <span class="n">y</span> <span class="bp">+</span> <span class="n">dist</span> <span class="n">y</span> <span class="n">z</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">dist_self</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">dist_comm</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">x</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">dist_triangle</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="o">)</span> </pre></div> </div> <p>Having mastered this section, you can show that it follows from these axioms that distances are always nonnegative:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">X</span><span class="o">)</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">dist</span> <span class="n">x</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>We recommend making use of the theorem <code class="docutils literal notranslate"><span class="pre">nonneg_of_mul_nonneg_left</span></code>.
-
-
-
@@ -18,7 +18,7 @@<script src="_static/jquery.js?v=5d32c60e"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/documentation_options.js?v=2709fde1"></script> <script src="_static/doctools.js?v=888ff710"></script> <script src="_static/doctools.js?v=9a2dae69"></script> <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script>
-
@@ -110,13 +110,13 @@ that are built up in this way.</p><section id="implication-and-the-universal-quantifier"> <span id="id2"></span><h2><span class="section-number">3.1. </span>Implication and the Universal Quantifier<a class="headerlink" href="#implication-and-the-universal-quantifier" title="Link to this heading"></a></h2> <p>Consider the statement after the <code class="docutils literal notranslate"><span class="pre">#check</span></code>:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="bp">∀</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">,</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">x</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">x</span><span class="bp">|</span> <span class="bp">=</span> <span class="n">x</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">,</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="bp">|</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span> </pre></div> </div> <p>In words, we would say “for every real number <code class="docutils literal notranslate"><span class="pre">x</span></code>, if <code class="docutils literal notranslate"><span class="pre">0</span> <span class="pre">≤</span> <span class="pre">x</span></code> then the absolute value of <code class="docutils literal notranslate"><span class="pre">x</span></code> equals <code class="docutils literal notranslate"><span class="pre">x</span></code>”. We can also have more complicated statements like:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="bp">∀</span> <span class="n">x</span> <span class="n">y</span> <span class="n">ε</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">,</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">ε</span> <span class="bp">→</span> <span class="n">ε</span> <span class="bp">≤</span> <span class="mi">1</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">x</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">y</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">,</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">|</span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span> </pre></div> </div> <p>In words, we would say “for every <code class="docutils literal notranslate"><span class="pre">x</span></code>, <code class="docutils literal notranslate"><span class="pre">y</span></code>, and <code class="docutils literal notranslate"><span class="pre">ε</span></code>,
-
@@ -137,17 +137,17 @@ In particular, if you have proved a theorem of that form,you can apply it to objects and hypotheses in the same way. We will use as an example the following statement that we will help you to prove a bit later:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">my_lemma</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="n">y</span> <span class="n">ε</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">,</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">ε</span> <span class="bp">→</span> <span class="n">ε</span> <span class="bp">≤</span> <span class="mi">1</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">x</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">y</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">my_lemma</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">,</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">|</span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kn">section</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">δ</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">h₀</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">δ</span><span class="o">)</span> <span class="o">(</span><span class="n">h₁</span> <span class="o">:</span> <span class="n">δ</span> <span class="bp">≤</span> <span class="mi">1</span><span class="o">)</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">ha</span> <span class="o">:</span> <span class="bp">|</span><span class="n">a</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">δ</span><span class="o">)</span> <span class="o">(</span><span class="n">hb</span> <span class="o">:</span> <span class="bp">|</span><span class="n">b</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">δ</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">δ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">h₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">δ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">δ</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">ha</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">|</span><span class="n">a</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">δ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hb</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">|</span><span class="n">b</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">δ</span><span class="o">)</span> <span class="k">#check</span> <span class="n">my_lemma</span> <span class="n">a</span> <span class="n">b</span> <span class="n">δ</span> <span class="k">#check</span> <span class="n">my_lemma</span> <span class="n">a</span> <span class="n">b</span> <span class="n">δ</span> <span class="n">h₀</span> <span class="n">h₁</span> <span class="k">#check</span> <span class="n">my_lemma</span> <span class="n">a</span> <span class="n">b</span> <span class="n">δ</span> <span class="n">h₀</span> <span class="n">h₁</span> <span class="n">ha</span> <span class="n">hb</span> <span class="k">#check</span><span class="w"> </span><span class="n">my_lemma</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">δ</span> <span class="k">#check</span><span class="w"> </span><span class="n">my_lemma</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">δ</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h₁</span> <span class="k">#check</span><span class="w"> </span><span class="n">my_lemma</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">δ</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h₁</span><span class="w"> </span><span class="n">ha</span><span class="w"> </span><span class="n">hb</span> <span class="kd">end</span> </pre></div>
-
@@ -157,15 +157,15 @@ to use curly brackets to make quantified variables implicitwhen they can be inferred from subsequent hypotheses. When we do that, we can just apply a lemma to the hypotheses without mentioning the objects.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">my_lemma2</span> <span class="o">:</span> <span class="bp">∀</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="n">ε</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">},</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">ε</span> <span class="bp">→</span> <span class="n">ε</span> <span class="bp">≤</span> <span class="mi">1</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">x</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">y</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">my_lemma2</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">},</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">|</span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kn">section</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">δ</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">h₀</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">δ</span><span class="o">)</span> <span class="o">(</span><span class="n">h₁</span> <span class="o">:</span> <span class="n">δ</span> <span class="bp">≤</span> <span class="mi">1</span><span class="o">)</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">ha</span> <span class="o">:</span> <span class="bp">|</span><span class="n">a</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">δ</span><span class="o">)</span> <span class="o">(</span><span class="n">hb</span> <span class="o">:</span> <span class="bp">|</span><span class="n">b</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">δ</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">δ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">h₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">δ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">δ</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">ha</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">|</span><span class="n">a</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">δ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hb</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">|</span><span class="n">b</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">δ</span><span class="o">)</span> <span class="k">#check</span> <span class="n">my_lemma2</span> <span class="n">h₀</span> <span class="n">h₁</span> <span class="n">ha</span> <span class="n">hb</span> <span class="k">#check</span><span class="w"> </span><span class="n">my_lemma2</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h₁</span><span class="w"> </span><span class="n">ha</span><span class="w"> </span><span class="n">hb</span> <span class="kd">end</span> </pre></div>
-
@@ -177,10 +177,10 @@ you are left with new goals that require you to proveeach of the hypotheses.</p> <p id="index-0">To prove a statement like this, use the <code class="docutils literal notranslate"><span class="pre">intro</span></code> tactic. Take a look at what it does in this example:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">my_lemma3</span> <span class="o">:</span> <span class="bp">∀</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="n">ε</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">},</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">ε</span> <span class="bp">→</span> <span class="n">ε</span> <span class="bp">≤</span> <span class="mi">1</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">x</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">y</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">x</span> <span class="n">y</span> <span class="n">ε</span> <span class="n">epos</span> <span class="n">ele1</span> <span class="n">xlt</span> <span class="n">ylt</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">my_lemma3</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">},</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">|</span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="n">epos</span><span class="w"> </span><span class="n">ele1</span><span class="w"> </span><span class="n">xlt</span><span class="w"> </span><span class="n">ylt</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>We can use any names we want for the universally quantified variables;
-
@@ -198,14 +198,14 @@ as we did in the last section.In a moment, we will see why it is sometimes necessary to introduce variables and hypotheses after the proof begins.</p> <p>To help you prove the lemma, we will start you off:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">my_lemma4</span> <span class="o">:</span> <span class="bp">∀</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="n">ε</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">},</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">ε</span> <span class="bp">→</span> <span class="n">ε</span> <span class="bp">≤</span> <span class="mi">1</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">x</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">y</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">x</span> <span class="n">y</span> <span class="n">ε</span> <span class="n">epos</span> <span class="n">ele1</span> <span class="n">xlt</span> <span class="n">ylt</span> <span class="k">calc</span> <span class="bp">|</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="bp">|</span> <span class="bp">=</span> <span class="bp">|</span><span class="n">x</span><span class="bp">|</span> <span class="bp">*</span> <span class="bp">|</span><span class="n">y</span><span class="bp">|</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">_</span> <span class="bp">≤</span> <span class="bp">|</span><span class="n">x</span><span class="bp">|</span> <span class="bp">*</span> <span class="n">ε</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">_</span> <span class="bp"><</span> <span class="mi">1</span> <span class="bp">*</span> <span class="n">ε</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">_</span> <span class="bp">=</span> <span class="n">ε</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">my_lemma4</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">},</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">|</span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="n">epos</span><span class="w"> </span><span class="n">ele1</span><span class="w"> </span><span class="n">xlt</span><span class="w"> </span><span class="n">ylt</span> <span class="w"> </span><span class="k">calc</span> <span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="bp">|</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="bp">|</span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="bp">|</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Finish the proof using the theorems
-
@@ -226,22 +226,22 @@ The first says that <code class="docutils literal notranslate"><span class="pre"values of <code class="docutils literal notranslate"><span class="pre">f</span></code>, and the second says that <code class="docutils literal notranslate"><span class="pre">a</span></code> is a lower bound on the values of <code class="docutils literal notranslate"><span class="pre">f</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">FnUb</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="kt">Prop</span> <span class="o">:=</span> <span class="bp">∀</span> <span class="n">x</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">a</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">FnUb</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Prop</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span> <span class="kd">def</span> <span class="n">FnLb</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="kt">Prop</span> <span class="o">:=</span> <span class="bp">∀</span> <span class="n">x</span><span class="o">,</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">f</span> <span class="n">x</span> <span class="kd">def</span><span class="w"> </span><span class="n">FnLb</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Prop</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span> </pre></div> </div> <p id="index-1">In the next example, <code class="docutils literal notranslate"><span class="pre">fun</span> <span class="pre">x</span> <span class="pre">↦</span> <span class="pre">f</span> <span class="pre">x</span> <span class="pre">+</span> <span class="pre">g</span> <span class="pre">x</span></code> is the function that maps <code class="docutils literal notranslate"><span class="pre">x</span></code> to <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">x</span> <span class="pre">+</span> <span class="pre">g</span> <span class="pre">x</span></code>. Going from the expression <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">x</span> <span class="pre">+</span> <span class="pre">g</span> <span class="pre">x</span></code> to this function is called a lambda abstraction in type theory.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">hfa</span> <span class="o">:</span> <span class="n">FnUb</span> <span class="n">f</span> <span class="n">a</span><span class="o">)</span> <span class="o">(</span><span class="n">hgb</span> <span class="o">:</span> <span class="n">FnUb</span> <span class="n">g</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnUb</span> <span class="o">(</span><span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">x</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">x</span> <span class="n">dsimp</span> <span class="n">apply</span> <span class="n">add_le_add</span> <span class="n">apply</span> <span class="n">hfa</span> <span class="n">apply</span> <span class="n">hgb</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">hfa</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnUb</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hgb</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnUb</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnUb</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">dsimp</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">add_le_add</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">hfa</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">hgb</span> </pre></div> </div> <p id="index-2">Applying <code class="docutils literal notranslate"><span class="pre">intro</span></code> to the goal <code class="docutils literal notranslate"><span class="pre">FnUb</span> <span class="pre">(fun</span> <span class="pre">x</span> <span class="pre">↦</span> <span class="pre">f</span> <span class="pre">x</span> <span class="pre">+</span> <span class="pre">g</span> <span class="pre">x)</span> <span class="pre">(a</span> <span class="pre">+</span> <span class="pre">b)</span></code>
-
@@ -264,15 +264,15 @@ and gives you more control over how the goal is transformed.</p>The last two <code class="docutils literal notranslate"><span class="pre">apply</span></code> commands force Lean to unfold the definitions of <code class="docutils literal notranslate"><span class="pre">FnUb</span></code> in the hypotheses. Try carrying out similar proofs of these:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">hfa</span> <span class="o">:</span> <span class="n">FnLb</span> <span class="n">f</span> <span class="n">a</span><span class="o">)</span> <span class="o">(</span><span class="n">hgb</span> <span class="o">:</span> <span class="n">FnLb</span> <span class="n">g</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnLb</span> <span class="o">(</span><span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">x</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">hfa</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnLb</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hgb</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnLb</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnLb</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">nnf</span> <span class="o">:</span> <span class="n">FnLb</span> <span class="n">f</span> <span class="mi">0</span><span class="o">)</span> <span class="o">(</span><span class="n">nng</span> <span class="o">:</span> <span class="n">FnLb</span> <span class="n">g</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnLb</span> <span class="o">(</span><span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">g</span> <span class="n">x</span><span class="o">)</span> <span class="mi">0</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">nnf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnLb</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">nng</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnLb</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnLb</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">hfa</span> <span class="o">:</span> <span class="n">FnUb</span> <span class="n">f</span> <span class="n">a</span><span class="o">)</span> <span class="o">(</span><span class="n">hgb</span> <span class="o">:</span> <span class="n">FnUb</span> <span class="n">g</span> <span class="n">b</span><span class="o">)</span> <span class="o">(</span><span class="n">nng</span> <span class="o">:</span> <span class="n">FnLb</span> <span class="n">g</span> <span class="mi">0</span><span class="o">)</span> <span class="o">(</span><span class="n">nna</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">a</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnUb</span> <span class="o">(</span><span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">g</span> <span class="n">x</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">hfa</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnUb</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hgb</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnUb</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">nng</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnLb</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">nna</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">FnUb</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Even though we have defined <code class="docutils literal notranslate"><span class="pre">FnUb</span></code> and <code class="docutils literal notranslate"><span class="pre">FnLb</span></code> for functions
-
@@ -288,15 +288,15 @@ but it is worth knowing that the natural numbers, integers, rationals,and real numbers are all instances. So if we prove the theorem <code class="docutils literal notranslate"><span class="pre">fnUb_add</span></code> at that level of generality, it will apply in all these instances.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">OrderedCancelAddCommMonoid</span> <span class="n">R</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">OrderedCancelAddCommMonoid</span><span class="w"> </span><span class="n">R</span><span class="o">]</span> <span class="k">#check</span> <span class="n">add_le_add</span> <span class="k">#check</span><span class="w"> </span><span class="n">add_le_add</span> <span class="kd">def</span> <span class="n">FnUb'</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="kt">Prop</span> <span class="o">:=</span> <span class="bp">∀</span> <span class="n">x</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">a</span> <span class="kd">def</span><span class="w"> </span><span class="n">FnUb'</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Prop</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span> <span class="kd">theorem</span> <span class="n">fnUb_add</span> <span class="o">{</span><span class="n">f</span> <span class="n">g</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">R</span><span class="o">}</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">R</span><span class="o">}</span> <span class="o">(</span><span class="n">hfa</span> <span class="o">:</span> <span class="n">FnUb'</span> <span class="n">f</span> <span class="n">a</span><span class="o">)</span> <span class="o">(</span><span class="n">hgb</span> <span class="o">:</span> <span class="n">FnUb'</span> <span class="n">g</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnUb'</span> <span class="o">(</span><span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">x</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">add_le_add</span> <span class="o">(</span><span class="n">hfa</span> <span class="n">x</span><span class="o">)</span> <span class="o">(</span><span class="n">hgb</span> <span class="n">x</span><span class="o">)</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">fnUb_add</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">R</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hfa</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnUb'</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hgb</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnUb'</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">FnUb'</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">add_le_add</span><span class="w"> </span><span class="o">(</span><span class="n">hfa</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hgb</span><span class="w"> </span><span class="n">x</span><span class="o">)</span> </pre></div> </div> <p>You have already seen square brackets like these in
-
@@ -309,8 +309,8 @@ that work at a high level of generality.</p><p id="index-3">For another example of a hidden universal quantifier, Mathlib defines a predicate <code class="docutils literal notranslate"><span class="pre">Monotone</span></code>, which says that a function is nondecreasing in its arguments:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">Monotone</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∀</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span><span class="o">},</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">→</span> <span class="n">f</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">f</span> <span class="n">b</span> <span class="o">:=</span> <span class="bp">@</span><span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Monotone</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="o">},</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="bp">@</span><span class="n">h</span> </pre></div> </div> <p>The property <code class="docutils literal notranslate"><span class="pre">Monotone</span> <span class="pre">f</span></code> is defined to be exactly the expression
-
@@ -326,11 +326,11 @@ and then apply the resulting expression to the goal.Or you can apply it to the goal and let Lean help you work backwards by displaying the remaining hypotheses as new subgoals.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">mf</span> <span class="o">:</span> <span class="n">Monotone</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">mg</span> <span class="o">:</span> <span class="n">Monotone</span> <span class="n">g</span><span class="o">)</span> <span class="o">:</span> <span class="n">Monotone</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">a</span> <span class="n">b</span> <span class="n">aleb</span> <span class="n">apply</span> <span class="n">add_le_add</span> <span class="n">apply</span> <span class="n">mf</span> <span class="n">aleb</span> <span class="n">apply</span> <span class="n">mg</span> <span class="n">aleb</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">mf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Monotone</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">mg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Monotone</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Monotone</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">aleb</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">add_le_add</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">mf</span><span class="w"> </span><span class="n">aleb</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">mg</span><span class="w"> </span><span class="n">aleb</span> </pre></div> </div> <p>When a proof is this short, it is often convenient
-
@@ -346,8 +346,8 @@ So the <code class="docutils literal notranslate"><span class="pre">intro</span>corresponds to the lambda abstraction in the next proof term. The <code class="docutils literal notranslate"><span class="pre">apply</span></code> commands then correspond to building the application of the theorem to its arguments.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">mf</span> <span class="o">:</span> <span class="n">Monotone</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">mg</span> <span class="o">:</span> <span class="n">Monotone</span> <span class="n">g</span><span class="o">)</span> <span class="o">:</span> <span class="n">Monotone</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">x</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">a</span> <span class="n">b</span> <span class="n">aleb</span> <span class="bp">↦</span> <span class="n">add_le_add</span> <span class="o">(</span><span class="n">mf</span> <span class="n">aleb</span><span class="o">)</span> <span class="o">(</span><span class="n">mg</span> <span class="n">aleb</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">mf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Monotone</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">mg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Monotone</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Monotone</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">aleb</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">add_le_add</span><span class="w"> </span><span class="o">(</span><span class="n">mf</span><span class="w"> </span><span class="n">aleb</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">mg</span><span class="w"> </span><span class="n">aleb</span><span class="o">)</span> </pre></div> </div> <p>Here is a useful trick: if you start writing
-
@@ -361,11 +361,11 @@ hover over the squiggly error marker,Lean will show you the goal that the remaining expression has to solve.</p> <p>Try proving these, with either tactics or proof terms:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">c</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">mf</span> <span class="o">:</span> <span class="n">Monotone</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">nnc</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">c</span><span class="o">)</span> <span class="o">:</span> <span class="n">Monotone</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">c</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">x</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">mf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Monotone</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">nnc</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Monotone</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">mf</span> <span class="o">:</span> <span class="n">Monotone</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">mg</span> <span class="o">:</span> <span class="n">Monotone</span> <span class="n">g</span><span class="o">)</span> <span class="o">:</span> <span class="n">Monotone</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="o">(</span><span class="n">g</span> <span class="n">x</span><span class="o">)</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">mf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Monotone</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">mg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Monotone</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Monotone</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Here are some more examples.
-
@@ -376,27 +376,27 @@ and <em>odd</em> if <span class="math notranslate nohighlight">\(f(-x) = -f(x)\)The following example defines these two notions formally and establishes one fact about them. You can complete the proofs of the others.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">FnEven</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="kt">Prop</span> <span class="o">:=</span> <span class="bp">∀</span> <span class="n">x</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">f</span> <span class="o">(</span><span class="bp">-</span><span class="n">x</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">FnEven</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Prop</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="bp">-</span><span class="n">x</span><span class="o">)</span> <span class="kd">def</span> <span class="n">FnOdd</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="kt">Prop</span> <span class="o">:=</span> <span class="bp">∀</span> <span class="n">x</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">=</span> <span class="bp">-</span><span class="n">f</span> <span class="o">(</span><span class="bp">-</span><span class="n">x</span><span class="o">)</span> <span class="kd">def</span><span class="w"> </span><span class="n">FnOdd</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Prop</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">-</span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="bp">-</span><span class="n">x</span><span class="o">)</span> <span class="kd">example</span> <span class="o">(</span><span class="n">ef</span> <span class="o">:</span> <span class="n">FnEven</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">eg</span> <span class="o">:</span> <span class="n">FnEven</span> <span class="n">g</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnEven</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">x</span> <span class="k">calc</span> <span class="o">(</span><span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">x</span><span class="o">)</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="n">_</span> <span class="bp">=</span> <span class="n">f</span> <span class="o">(</span><span class="bp">-</span><span class="n">x</span><span class="o">)</span> <span class="bp">+</span> <span class="n">g</span> <span class="o">(</span><span class="bp">-</span><span class="n">x</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">ef</span><span class="o">,</span> <span class="n">eg</span><span class="o">]</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">ef</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnEven</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">eg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnEven</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnEven</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="k">calc</span> <span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">rfl</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="bp">-</span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">(</span><span class="bp">-</span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">ef</span><span class="o">,</span><span class="w"> </span><span class="n">eg</span><span class="o">]</span> <span class="kd">example</span> <span class="o">(</span><span class="n">of</span> <span class="o">:</span> <span class="n">FnOdd</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">og</span> <span class="o">:</span> <span class="n">FnOdd</span> <span class="n">g</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnEven</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">g</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">of</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnOdd</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">og</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnOdd</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnEven</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">ef</span> <span class="o">:</span> <span class="n">FnEven</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">og</span> <span class="o">:</span> <span class="n">FnOdd</span> <span class="n">g</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnOdd</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">g</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">ef</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnEven</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">og</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnOdd</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnOdd</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">ef</span> <span class="o">:</span> <span class="n">FnEven</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">og</span> <span class="o">:</span> <span class="n">FnOdd</span> <span class="n">g</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnEven</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="o">(</span><span class="n">g</span> <span class="n">x</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">ef</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnEven</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">og</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnOdd</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnEven</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p id="index-4">The first proof can be shortened using <code class="docutils literal notranslate"><span class="pre">dsimp</span></code> or <code class="docutils literal notranslate"><span class="pre">change</span></code>
-
@@ -436,16 +436,16 @@ we can write <code class="docutils literal notranslate"><span class="pre">h</spaThe following example provides a tactic proof and a proof term justifying the reflexivity of the subset relation, and asks you to do the same for transitivity.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">(</span><span class="n">r</span> <span class="n">s</span> <span class="n">t</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">α</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">⊆</span> <span class="n">s</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">x</span> <span class="n">xs</span> <span class="n">exact</span> <span class="n">xs</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">xs</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">xs</span> <span class="kd">theorem</span> <span class="n">Subset.refl</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">⊆</span> <span class="n">s</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">x</span> <span class="n">xs</span> <span class="bp">↦</span> <span class="n">xs</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">Subset.refl</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">xs</span> <span class="kd">theorem</span> <span class="n">Subset.trans</span> <span class="o">:</span> <span class="n">r</span> <span class="bp">⊆</span> <span class="n">s</span> <span class="bp">→</span> <span class="n">s</span> <span class="bp">⊆</span> <span class="n">t</span> <span class="bp">→</span> <span class="n">r</span> <span class="bp">⊆</span> <span class="n">t</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">Subset.trans</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Just as we defined <code class="docutils literal notranslate"><span class="pre">FnUb</span></code> for functions,
-
@@ -456,14 +456,14 @@ has an order associated with it.In the next example, we ask you to prove that if <code class="docutils literal notranslate"><span class="pre">a</span></code> is a bound on <code class="docutils literal notranslate"><span class="pre">s</span></code> and <code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre">≤</span> <span class="pre">b</span></code>, then <code class="docutils literal notranslate"><span class="pre">b</span></code> is a bound on <code class="docutils literal notranslate"><span class="pre">s</span></code> as well.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">PartialOrder</span> <span class="n">α</span><span class="o">]</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">α</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">PartialOrder</span><span class="w"> </span><span class="n">α</span><span class="o">]</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="kd">def</span> <span class="n">SetUb</span> <span class="o">(</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">α</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <span class="o">:=</span> <span class="bp">∀</span> <span class="n">x</span><span class="o">,</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s</span> <span class="bp">→</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">a</span> <span class="kd">def</span><span class="w"> </span><span class="n">SetUb</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">SetUb</span> <span class="n">s</span> <span class="n">a</span><span class="o">)</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="n">SetUb</span> <span class="n">s</span> <span class="n">b</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">SetUb</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">SetUb</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p id="index-5">We close this section with one last important example.
-
@@ -478,22 +478,22 @@ We then ask you to show that multiplication by a nonzeroconstant is also injective, using the lemma name in the example as a source of inspiration. Recall you should use Ctrl-space completion after guessing the beginning of a lemma name.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">Function</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">Function</span> <span class="kd">example</span> <span class="o">(</span><span class="n">c</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">Injective</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">c</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">x₁</span> <span class="n">x₂</span> <span class="n">h'</span> <span class="n">exact</span> <span class="o">(</span><span class="n">add_left_inj</span> <span class="n">c</span><span class="o">)</span><span class="bp">.</span><span class="n">mp</span> <span class="n">h'</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Injective</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x₁</span><span class="w"> </span><span class="n">x₂</span><span class="w"> </span><span class="n">h'</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">(</span><span class="n">add_left_inj</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="bp">.</span><span class="n">mp</span><span class="w"> </span><span class="n">h'</span> <span class="kd">example</span> <span class="o">{</span><span class="n">c</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="n">Injective</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">c</span> <span class="bp">*</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Injective</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Finally, show that the composition of two injective functions is injective:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">{</span><span class="n">β</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">{</span><span class="n">γ</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">g</span> <span class="o">:</span> <span class="n">β</span> <span class="bp">→</span> <span class="n">γ</span><span class="o">}</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">β</span><span class="o">}</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">β</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">γ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">γ</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">β</span><span class="o">}</span> <span class="kd">example</span> <span class="o">(</span><span class="n">injg</span> <span class="o">:</span> <span class="n">Injective</span> <span class="n">g</span><span class="o">)</span> <span class="o">(</span><span class="n">injf</span> <span class="o">:</span> <span class="n">Injective</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">Injective</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">g</span> <span class="o">(</span><span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">injg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Injective</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">injf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Injective</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Injective</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> </section>
-
@@ -514,29 +514,29 @@ and the <code class="docutils literal notranslate"><span class="pre">norm_num</sGiven a goal that begins with an existential quantifier, the <code class="docutils literal notranslate"><span class="pre">use</span></code> tactic is used to provide the object, leaving the goal of proving the property.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">,</span> <span class="mi">2</span> <span class="bp"><</span> <span class="n">x</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp"><</span> <span class="mi">3</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">use</span> <span class="mi">5</span> <span class="bp">/</span> <span class="mi">2</span> <span class="n">norm_num</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">,</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span> <span class="w"> </span><span class="n">norm_num</span> </pre></div> </div> <p>You can give the <code class="docutils literal notranslate"><span class="pre">use</span></code> tactic proofs as well as data:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">,</span> <span class="mi">2</span> <span class="bp"><</span> <span class="n">x</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp"><</span> <span class="mi">3</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">have</span> <span class="n">h1</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp"><</span> <span class="o">(</span><span class="mi">5</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">norm_num</span> <span class="k">have</span> <span class="n">h2</span> <span class="o">:</span> <span class="o">(</span><span class="mi">5</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">2</span> <span class="bp"><</span> <span class="mi">3</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">norm_num</span> <span class="n">use</span> <span class="mi">5</span> <span class="bp">/</span> <span class="mi">2</span><span class="o">,</span> <span class="n">h1</span><span class="o">,</span> <span class="n">h2</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">,</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="o">(</span><span class="mi">5</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h2</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="mi">5</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="o">,</span><span class="w"> </span><span class="n">h1</span><span class="o">,</span><span class="w"> </span><span class="n">h2</span> </pre></div> </div> <p>In fact, the <code class="docutils literal notranslate"><span class="pre">use</span></code> tactic automatically tries to use available assumptions as well.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">,</span> <span class="mi">2</span> <span class="bp"><</span> <span class="n">x</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp"><</span> <span class="mi">3</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">have</span> <span class="n">h</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp"><</span> <span class="o">(</span><span class="mi">5</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">2</span> <span class="bp">∧</span> <span class="o">(</span><span class="mi">5</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">2</span> <span class="bp"><</span> <span class="mi">3</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">norm_num</span> <span class="n">use</span> <span class="mi">5</span> <span class="bp">/</span> <span class="mi">2</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">,</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="o">(</span><span class="mi">5</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="o">(</span><span class="mi">5</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span> </pre></div> </div> <p id="index-7">Alternatively, we can use Lean’s <em>anonymous constructor</em> notation to construct a proof of an existential quantifier.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">,</span> <span class="mi">2</span> <span class="bp"><</span> <span class="n">x</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp"><</span> <span class="mi">3</span> <span class="o">:=</span> <span class="k">have</span> <span class="n">h</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp"><</span> <span class="o">(</span><span class="mi">5</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">2</span> <span class="bp">∧</span> <span class="o">(</span><span class="mi">5</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">2</span> <span class="bp"><</span> <span class="mi">3</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">norm_num</span> <span class="o">⟨</span><span class="mi">5</span> <span class="bp">/</span> <span class="mi">2</span><span class="o">,</span> <span class="n">h</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">,</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="o">(</span><span class="mi">5</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="o">(</span><span class="mi">5</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span> <span class="w"> </span><span class="o">⟨</span><span class="mi">5</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="o">,</span><span class="w"> </span><span class="n">h</span><span class="o">⟩</span> </pre></div> </div> <p>Notice that there is no <code class="docutils literal notranslate"><span class="pre">by</span></code>; here we are giving an explicit proof term.
-
@@ -546,8 +546,8 @@ tell Lean to put together the given data usingwhatever construction is appropriate for the current goal. We can use the notation without going first into tactic mode:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">,</span> <span class="mi">2</span> <span class="bp"><</span> <span class="n">x</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp"><</span> <span class="mi">3</span> <span class="o">:=</span> <span class="o">⟨</span><span class="mi">5</span> <span class="bp">/</span> <span class="mi">2</span><span class="o">,</span> <span class="kd">by</span> <span class="n">norm_num</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">,</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="mi">5</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="o">,</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span><span class="o">⟩</span> </pre></div> </div> <p>So now we know how to <em>prove</em> an exists statement.
-
@@ -561,29 +561,29 @@ which say that <code class="docutils literal notranslate"><span class="pre">a</srespectively. We can use the existential quantifier to say that “<code class="docutils literal notranslate"><span class="pre">f</span></code> is bounded” without specifying the bound:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">FnUb</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="kt">Prop</span> <span class="o">:=</span> <span class="bp">∀</span> <span class="n">x</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">a</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">FnUb</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Prop</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span> <span class="kd">def</span> <span class="n">FnLb</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="kt">Prop</span> <span class="o">:=</span> <span class="bp">∀</span> <span class="n">x</span><span class="o">,</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">f</span> <span class="n">x</span> <span class="kd">def</span><span class="w"> </span><span class="n">FnLb</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Prop</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span> <span class="kd">def</span> <span class="n">FnHasUb</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:=</span> <span class="bp">∃</span> <span class="n">a</span><span class="o">,</span> <span class="n">FnUb</span> <span class="n">f</span> <span class="n">a</span> <span class="kd">def</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">FnUb</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span> <span class="kd">def</span> <span class="n">FnHasLb</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:=</span> <span class="bp">∃</span> <span class="n">a</span><span class="o">,</span> <span class="n">FnLb</span> <span class="n">f</span> <span class="n">a</span> <span class="kd">def</span><span class="w"> </span><span class="n">FnHasLb</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">FnLb</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span> </pre></div> </div> <p>We can use the theorem <code class="docutils literal notranslate"><span class="pre">FnUb_add</span></code> from the last section to prove that if <code class="docutils literal notranslate"><span class="pre">f</span></code> and <code class="docutils literal notranslate"><span class="pre">g</span></code> have upper bounds, then so does <code class="docutils literal notranslate"><span class="pre">fun</span> <span class="pre">x</span> <span class="pre">↦</span> <span class="pre">f</span> <span class="pre">x</span> <span class="pre">+</span> <span class="pre">g</span> <span class="pre">x</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">f</span> <span class="n">g</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span> <span class="kd">example</span> <span class="o">(</span><span class="n">ubf</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">ubg</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="n">g</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rcases</span> <span class="n">ubf</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">a</span><span class="o">,</span> <span class="n">ubfa</span><span class="o">⟩</span> <span class="n">rcases</span> <span class="n">ubg</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">b</span><span class="o">,</span> <span class="n">ubgb</span><span class="o">⟩</span> <span class="n">use</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="n">apply</span> <span class="n">fnUb_add</span> <span class="n">ubfa</span> <span class="n">ubgb</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">ubf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">ubg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">ubf</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">ubfa</span><span class="o">⟩</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">ubg</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">ubgb</span><span class="o">⟩</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">fnUb_add</span><span class="w"> </span><span class="n">ubfa</span><span class="w"> </span><span class="n">ubgb</span> </pre></div> </div> <p id="index-8">The <code class="docutils literal notranslate"><span class="pre">rcases</span></code> tactic unpacks the information
-
@@ -611,35 +611,35 @@ from the last section into named theorems,as we did with <code class="docutils literal notranslate"><span class="pre">fn_ub_add</span></code>, or you can insert the arguments directly into the proofs.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">lbf</span> <span class="o">:</span> <span class="n">FnHasLb</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">lbg</span> <span class="o">:</span> <span class="n">FnHasLb</span> <span class="n">g</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnHasLb</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">lbf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasLb</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">lbg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasLb</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasLb</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">{</span><span class="n">c</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">ubf</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">≥</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">c</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">ubf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p id="index-9">The “r” in <code class="docutils literal notranslate"><span class="pre">rcases</span></code> stands for “recursive,” because it allows us to use arbitrarily complex patterns to unpack nested data. The <code class="docutils literal notranslate"><span class="pre">rintro</span></code> tactic is a combination of <code class="docutils literal notranslate"><span class="pre">intro</span></code> and <code class="docutils literal notranslate"><span class="pre">rcases</span></code>:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="n">f</span> <span class="bp">→</span> <span class="n">FnHasUb</span> <span class="n">g</span> <span class="bp">→</span> <span class="n">FnHasUb</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rintro</span> <span class="o">⟨</span><span class="n">a</span><span class="o">,</span> <span class="n">ubfa</span><span class="o">⟩</span> <span class="o">⟨</span><span class="n">b</span><span class="o">,</span> <span class="n">ubgb</span><span class="o">⟩</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">,</span> <span class="n">fnUb_add</span> <span class="n">ubfa</span> <span class="n">ubgb</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="o">⟨</span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">ubfa</span><span class="o">⟩</span><span class="w"> </span><span class="o">⟨</span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">ubgb</span><span class="o">⟩</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">fnUb_add</span><span class="w"> </span><span class="n">ubfa</span><span class="w"> </span><span class="n">ubgb</span><span class="o">⟩</span> </pre></div> </div> <p>In fact, Lean also supports a pattern-matching fun in expressions and proof terms:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="n">f</span> <span class="bp">→</span> <span class="n">FnHasUb</span> <span class="n">g</span> <span class="bp">→</span> <span class="n">FnHasUb</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">x</span> <span class="o">:=</span> <span class="k">fun</span> <span class="o">⟨</span><span class="n">a</span><span class="o">,</span> <span class="n">ubfa</span><span class="o">⟩</span> <span class="o">⟨</span><span class="n">b</span><span class="o">,</span> <span class="n">ubgb</span><span class="o">⟩</span> <span class="bp">↦</span> <span class="o">⟨</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">,</span> <span class="n">fnUb_add</span> <span class="n">ubfa</span> <span class="n">ubgb</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="o">⟨</span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">ubfa</span><span class="o">⟩</span><span class="w"> </span><span class="o">⟨</span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">ubgb</span><span class="o">⟩</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">⟨</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">fnUb_add</span><span class="w"> </span><span class="n">ubfa</span><span class="w"> </span><span class="n">ubgb</span><span class="o">⟩</span> </pre></div> </div> <p>The task of unpacking information in a hypothesis is so important that Lean and Mathlib provide a number of ways to do it. For example, the <code class="docutils literal notranslate"><span class="pre">obtain</span></code> tactic provides suggestive syntax:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">ubf</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">ubg</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="n">g</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">obtain</span> <span class="o">⟨</span><span class="n">a</span><span class="o">,</span> <span class="n">ubfa</span><span class="o">⟩</span> <span class="o">:=</span> <span class="n">ubf</span> <span class="n">obtain</span> <span class="o">⟨</span><span class="n">b</span><span class="o">,</span> <span class="n">ubgb</span><span class="o">⟩</span> <span class="o">:=</span> <span class="n">ubg</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">,</span> <span class="n">fnUb_add</span> <span class="n">ubfa</span> <span class="n">ubgb</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">ubf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">ubg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">obtain</span><span class="w"> </span><span class="o">⟨</span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">ubfa</span><span class="o">⟩</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">ubf</span> <span class="w"> </span><span class="n">obtain</span><span class="w"> </span><span class="o">⟨</span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">ubgb</span><span class="o">⟩</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">ubg</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">fnUb_add</span><span class="w"> </span><span class="n">ubfa</span><span class="w"> </span><span class="n">ubgb</span><span class="o">⟩</span> </pre></div> </div> <p>Think of the first <code class="docutils literal notranslate"><span class="pre">obtain</span></code> instruction as matching the “contents” of <code class="docutils literal notranslate"><span class="pre">ubf</span></code>
-
@@ -649,29 +649,29 @@ there is a small difference in that <code class="docutils literal notranslate"><when it is done, whereas it is still present after <code class="docutils literal notranslate"><span class="pre">obtain</span></code>.</p> <p>Lean also supports syntax that is similar to that used in other functional programming languages:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">ubf</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">ubg</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="n">g</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">cases</span> <span class="n">ubf</span> <span class="n">case</span> <span class="n">intro</span> <span class="n">a</span> <span class="n">ubfa</span> <span class="bp">=></span> <span class="n">cases</span> <span class="n">ubg</span> <span class="n">case</span> <span class="n">intro</span> <span class="n">b</span> <span class="n">ubgb</span> <span class="bp">=></span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">,</span> <span class="n">fnUb_add</span> <span class="n">ubfa</span> <span class="n">ubgb</span><span class="o">⟩</span> <span class="kd">example</span> <span class="o">(</span><span class="n">ubf</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">ubg</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="n">g</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">cases</span> <span class="n">ubf</span> <span class="n">next</span> <span class="n">a</span> <span class="n">ubfa</span> <span class="bp">=></span> <span class="n">cases</span> <span class="n">ubg</span> <span class="n">next</span> <span class="n">b</span> <span class="n">ubgb</span> <span class="bp">=></span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">,</span> <span class="n">fnUb_add</span> <span class="n">ubfa</span> <span class="n">ubgb</span><span class="o">⟩</span> <span class="kd">example</span> <span class="o">(</span><span class="n">ubf</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">ubg</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="n">g</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">match</span> <span class="n">ubf</span><span class="o">,</span> <span class="n">ubg</span> <span class="k">with</span> <span class="bp">|</span> <span class="o">⟨</span><span class="n">a</span><span class="o">,</span> <span class="n">ubfa</span><span class="o">⟩,</span> <span class="o">⟨</span><span class="n">b</span><span class="o">,</span> <span class="n">ubgb</span><span class="o">⟩</span> <span class="bp">=></span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">,</span> <span class="n">fnUb_add</span> <span class="n">ubfa</span> <span class="n">ubgb</span><span class="o">⟩</span> <span class="kd">example</span> <span class="o">(</span><span class="n">ubf</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">ubg</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="n">g</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">x</span> <span class="o">:=</span> <span class="k">match</span> <span class="n">ubf</span><span class="o">,</span> <span class="n">ubg</span> <span class="k">with</span> <span class="bp">|</span> <span class="o">⟨</span><span class="n">a</span><span class="o">,</span> <span class="n">ubfa</span><span class="o">⟩,</span> <span class="o">⟨</span><span class="n">b</span><span class="o">,</span> <span class="n">ubgb</span><span class="o">⟩</span> <span class="bp">=></span> <span class="o">⟨</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">,</span> <span class="n">fnUb_add</span> <span class="n">ubfa</span> <span class="n">ubgb</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">ubf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">ubg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">cases</span><span class="w"> </span><span class="n">ubf</span> <span class="w"> </span><span class="n">case</span><span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">ubfa</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="n">cases</span><span class="w"> </span><span class="n">ubg</span> <span class="w"> </span><span class="n">case</span><span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">ubgb</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">fnUb_add</span><span class="w"> </span><span class="n">ubfa</span><span class="w"> </span><span class="n">ubgb</span><span class="o">⟩</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">ubf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">ubg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">cases</span><span class="w"> </span><span class="n">ubf</span> <span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">ubfa</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="n">cases</span><span class="w"> </span><span class="n">ubg</span> <span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">ubgb</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">fnUb_add</span><span class="w"> </span><span class="n">ubfa</span><span class="w"> </span><span class="n">ubgb</span><span class="o">⟩</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">ubf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">ubg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">match</span><span class="w"> </span><span class="n">ubf</span><span class="o">,</span><span class="w"> </span><span class="n">ubg</span><span class="w"> </span><span class="k">with</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="o">⟨</span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">ubfa</span><span class="o">⟩,</span><span class="w"> </span><span class="o">⟨</span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">ubgb</span><span class="o">⟩</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">fnUb_add</span><span class="w"> </span><span class="n">ubfa</span><span class="w"> </span><span class="n">ubgb</span><span class="o">⟩</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">ubf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">ubg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="k">match</span><span class="w"> </span><span class="n">ubf</span><span class="o">,</span><span class="w"> </span><span class="n">ubg</span><span class="w"> </span><span class="k">with</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="o">⟨</span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">ubfa</span><span class="o">⟩,</span><span class="w"> </span><span class="o">⟨</span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">ubgb</span><span class="o">⟩</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="o">⟨</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">fnUb_add</span><span class="w"> </span><span class="n">ubfa</span><span class="w"> </span><span class="n">ubgb</span><span class="o">⟩</span> </pre></div> </div> <p>In the first example, if you put your cursor after <code class="docutils literal notranslate"><span class="pre">cases</span> <span class="pre">ubf</span></code>,
-
@@ -701,18 +701,18 @@ quantifiers at once.We then provide the magic values needed to express <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">*</span> <span class="pre">y</span></code> as a sum of squares as a list to the <code class="docutils literal notranslate"><span class="pre">use</span></code> statement, and we use <code class="docutils literal notranslate"><span class="pre">ring</span></code> to verify that they work.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">α</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">α</span><span class="o">]</span> <span class="kd">def</span> <span class="n">SumOfSquares</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <span class="o">:=</span> <span class="bp">∃</span> <span class="n">a</span> <span class="n">b</span><span class="o">,</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">^</span> <span class="mi">2</span> <span class="kd">def</span><span class="w"> </span><span class="n">SumOfSquares</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span> <span class="kd">theorem</span> <span class="n">sumOfSquares_mul</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">α</span><span class="o">}</span> <span class="o">(</span><span class="n">sosx</span> <span class="o">:</span> <span class="n">SumOfSquares</span> <span class="n">x</span><span class="o">)</span> <span class="o">(</span><span class="n">sosy</span> <span class="o">:</span> <span class="n">SumOfSquares</span> <span class="n">y</span><span class="o">)</span> <span class="o">:</span> <span class="n">SumOfSquares</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rcases</span> <span class="n">sosx</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">a</span><span class="o">,</span> <span class="n">b</span><span class="o">,</span> <span class="n">xeq</span><span class="o">⟩</span> <span class="n">rcases</span> <span class="n">sosy</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">c</span><span class="o">,</span> <span class="n">d</span><span class="o">,</span> <span class="n">yeq</span><span class="o">⟩</span> <span class="n">rw</span> <span class="o">[</span><span class="n">xeq</span><span class="o">,</span> <span class="n">yeq</span><span class="o">]</span> <span class="n">use</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">-</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">d</span><span class="o">,</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">d</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">c</span> <span class="n">ring</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">sumOfSquares_mul</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">sosx</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">SumOfSquares</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">sosy</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">SumOfSquares</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">SumOfSquares</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">sosx</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">xeq</span><span class="o">⟩</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">sosy</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">c</span><span class="o">,</span><span class="w"> </span><span class="n">d</span><span class="o">,</span><span class="w"> </span><span class="n">yeq</span><span class="o">⟩</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">xeq</span><span class="o">,</span><span class="w"> </span><span class="n">yeq</span><span class="o">]</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span> <span class="w"> </span><span class="n">ring</span> </pre></div> </div> <p>This proof doesn’t provide much insight,
-
@@ -742,23 +742,23 @@ an abbreviation:if you use the keyword <code class="docutils literal notranslate"><span class="pre">rfl</span></code> in place of a new identifier, <code class="docutils literal notranslate"><span class="pre">rcases</span></code> does the rewriting automatically (this trick doesn’t work with pattern-matching lambdas).</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">sumOfSquares_mul'</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">α</span><span class="o">}</span> <span class="o">(</span><span class="n">sosx</span> <span class="o">:</span> <span class="n">SumOfSquares</span> <span class="n">x</span><span class="o">)</span> <span class="o">(</span><span class="n">sosy</span> <span class="o">:</span> <span class="n">SumOfSquares</span> <span class="n">y</span><span class="o">)</span> <span class="o">:</span> <span class="n">SumOfSquares</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rcases</span> <span class="n">sosx</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">a</span><span class="o">,</span> <span class="n">b</span><span class="o">,</span> <span class="n">rfl</span><span class="o">⟩</span> <span class="n">rcases</span> <span class="n">sosy</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">c</span><span class="o">,</span> <span class="n">d</span><span class="o">,</span> <span class="n">rfl</span><span class="o">⟩</span> <span class="n">use</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">-</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">d</span><span class="o">,</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">d</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">c</span> <span class="n">ring</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">sumOfSquares_mul'</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">sosx</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">SumOfSquares</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">sosy</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">SumOfSquares</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">SumOfSquares</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">sosx</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">rfl</span><span class="o">⟩</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">sosy</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">c</span><span class="o">,</span><span class="w"> </span><span class="n">d</span><span class="o">,</span><span class="w"> </span><span class="n">rfl</span><span class="o">⟩</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span> <span class="w"> </span><span class="n">ring</span> </pre></div> </div> <p>As with the universal quantifier, you can find existential quantifiers hidden all over if you know how to spot them. For example, divisibility is implicitly an “exists” statement.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">divab</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">∣</span> <span class="n">b</span><span class="o">)</span> <span class="o">(</span><span class="n">divbc</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">∣</span> <span class="n">c</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">∣</span> <span class="n">c</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rcases</span> <span class="n">divab</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">d</span><span class="o">,</span> <span class="n">beq</span><span class="o">⟩</span> <span class="n">rcases</span> <span class="n">divbc</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">e</span><span class="o">,</span> <span class="n">ceq</span><span class="o">⟩</span> <span class="n">rw</span> <span class="o">[</span><span class="n">ceq</span><span class="o">,</span> <span class="n">beq</span><span class="o">]</span> <span class="n">use</span> <span class="n">d</span> <span class="bp">*</span> <span class="n">e</span><span class="bp">;</span> <span class="n">ring</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">divab</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">divbc</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">divab</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">d</span><span class="o">,</span><span class="w"> </span><span class="n">beq</span><span class="o">⟩</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">divbc</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">e</span><span class="o">,</span><span class="w"> </span><span class="n">ceq</span><span class="o">⟩</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">ceq</span><span class="o">,</span><span class="w"> </span><span class="n">beq</span><span class="o">]</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">e</span><span class="bp">;</span><span class="w"> </span><span class="n">ring</span> </pre></div> </div> <p>And once again, this provides a nice setting for using
-
@@ -766,8 +766,8 @@ For example, divisibility is implicitly an “exists” statement.</p>Try it out in the proof above. It feels pretty good!</p> <p>Then try proving the following:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">divab</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">∣</span> <span class="n">b</span><span class="o">)</span> <span class="o">(</span><span class="n">divac</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">∣</span> <span class="n">c</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">∣</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">c</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">divab</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">divac</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p id="index-10">For another important example, a function <span class="math notranslate nohighlight">\(f : \alpha \to \beta\)</span>
-
@@ -778,43 +778,43 @@ such that <span class="math notranslate nohighlight">\(f(x) = y\)</span>.Notice that this statement includes both a universal and an existential quantifier, which explains why the next example makes use of both <code class="docutils literal notranslate"><span class="pre">intro</span></code> and <code class="docutils literal notranslate"><span class="pre">use</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">c</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">:</span> <span class="n">Surjective</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">c</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">x</span> <span class="n">use</span> <span class="n">x</span> <span class="bp">-</span> <span class="n">c</span> <span class="n">dsimp</span><span class="bp">;</span> <span class="n">ring</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Surjective</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">c</span> <span class="w"> </span><span class="n">dsimp</span><span class="bp">;</span><span class="w"> </span><span class="n">ring</span> </pre></div> </div> <p>Try this example yourself using the theorem <code class="docutils literal notranslate"><span class="pre">mul_div_cancel₀</span></code>.:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">c</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="n">Surjective</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">c</span> <span class="bp">*</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Surjective</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p id="index-11">At this point, it is worth mentioning that there is a tactic, <code class="docutils literal notranslate"><span class="pre">field_simp</span></code>, that will often clear denominators in a useful way. It can be used in conjunction with the <code class="docutils literal notranslate"><span class="pre">ring</span></code> tactic.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">-</span> <span class="n">y</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">-</span> <span class="n">y</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="bp">/</span> <span class="o">(</span><span class="n">x</span> <span class="bp">-</span> <span class="n">y</span><span class="o">)</span> <span class="bp">=</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">field_simp</span> <span class="o">[</span><span class="n">h</span><span class="o">]</span> <span class="n">ring</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">field_simp</span><span class="w"> </span><span class="o">[</span><span class="n">h</span><span class="o">]</span> <span class="w"> </span><span class="n">ring</span> </pre></div> </div> <p>The next example uses a surjectivity hypothesis by applying it to a suitable value. Note that you can use <code class="docutils literal notranslate"><span class="pre">rcases</span></code> with any expression, not just a hypothesis.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">Surjective</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">=</span> <span class="mi">4</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rcases</span> <span class="n">h</span> <span class="mi">2</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">x</span><span class="o">,</span> <span class="n">hx</span><span class="o">⟩</span> <span class="n">use</span> <span class="n">x</span> <span class="n">rw</span> <span class="o">[</span><span class="n">hx</span><span class="o">]</span> <span class="n">norm_num</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Surjective</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">hx</span><span class="o">⟩</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">hx</span><span class="o">]</span> <span class="w"> </span><span class="n">norm_num</span> </pre></div> </div> <p>See if you can use these methods to show that the composition of surjective functions is surjective.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">{</span><span class="n">β</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">{</span><span class="n">γ</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">g</span> <span class="o">:</span> <span class="n">β</span> <span class="bp">→</span> <span class="n">γ</span><span class="o">}</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">β</span><span class="o">}</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">β</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">γ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">γ</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">β</span><span class="o">}</span> <span class="kd">example</span> <span class="o">(</span><span class="n">surjg</span> <span class="o">:</span> <span class="n">Surjective</span> <span class="n">g</span><span class="o">)</span> <span class="o">(</span><span class="n">surjf</span> <span class="o">:</span> <span class="n">Surjective</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">Surjective</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">g</span> <span class="o">(</span><span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">surjg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Surjective</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">surjf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Surjective</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Surjective</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> </section>
-
@@ -840,10 +840,10 @@ which says that we have <code class="docutils literal notranslate"><span class="The asymmetry principle <code class="docutils literal notranslate"><span class="pre">lt_asymm</span></code> says that we have <code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre"><</span> <span class="pre">b</span> <span class="pre">→</span> <span class="pre">¬</span> <span class="pre">b</span> <span class="pre"><</span> <span class="pre">a</span></code>. Let’s show that <code class="docutils literal notranslate"><span class="pre">lt_asymm</span></code> follows from <code class="docutils literal notranslate"><span class="pre">lt_irrefl</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">b</span> <span class="bp"><</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">h'</span> <span class="k">have</span> <span class="o">:</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">a</span> <span class="o">:=</span> <span class="n">lt_trans</span> <span class="n">h</span> <span class="n">h'</span> <span class="n">apply</span> <span class="n">lt_irrefl</span> <span class="n">a</span> <span class="n">this</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">b</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h'</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">lt_trans</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="n">h'</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">lt_irrefl</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">this</span> </pre></div> </div> <p id="index-12">This example introduces a couple of new tricks.
-
@@ -860,41 +860,41 @@ by applying <code class="docutils literal notranslate"><span class="pre">lt_irre<p>Here is another example, which uses the predicate <code class="docutils literal notranslate"><span class="pre">FnHasUb</span></code> defined in the last section, which says that a function has an upper bound.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">x</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">></span> <span class="n">a</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">FnHasUb</span> <span class="n">f</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">fnub</span> <span class="n">rcases</span> <span class="n">fnub</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">a</span><span class="o">,</span> <span class="n">fnuba</span><span class="o">⟩</span> <span class="n">rcases</span> <span class="n">h</span> <span class="n">a</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">x</span><span class="o">,</span> <span class="n">hx</span><span class="o">⟩</span> <span class="k">have</span> <span class="o">:</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">a</span> <span class="o">:=</span> <span class="n">fnuba</span> <span class="n">x</span> <span class="n">linarith</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">fnub</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">fnub</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">fnuba</span><span class="o">⟩</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">hx</span><span class="o">⟩</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">fnuba</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">linarith</span> </pre></div> </div> <p>Remember that it is often convenient to use <code class="docutils literal notranslate"><span class="pre">linarith</span></code> when a goal follows from linear equations and inequalities that are in the context.</p> <p>See if you can prove these in a similar way:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">x</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">a</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">FnHasLb</span> <span class="n">f</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">FnHasLb</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">FnHasUb</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">x</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">FnHasUb</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Mathlib offers a number of useful theorems for relating orders and negations:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="o">(</span><span class="n">not_le_of_gt</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">></span> <span class="n">b</span> <span class="bp">→</span> <span class="bp">¬</span><span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">not_lt_of_ge</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≥</span> <span class="n">b</span> <span class="bp">→</span> <span class="bp">¬</span><span class="n">a</span> <span class="bp"><</span> <span class="n">b</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">lt_of_not_ge</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">a</span> <span class="bp">≥</span> <span class="n">b</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">b</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">le_of_not_gt</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">a</span> <span class="bp">></span> <span class="n">b</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">not_le_of_gt</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">¬</span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">not_lt_of_ge</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">¬</span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">lt_of_not_ge</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">a</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">le_of_not_gt</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">a</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> </pre></div> </div> <p>Recall the predicate <code class="docutils literal notranslate"><span class="pre">Monotone</span> <span class="pre">f</span></code>, which says that <code class="docutils literal notranslate"><span class="pre">f</span></code> is nondecreasing. Use some of the theorems just enumerated to prove the following:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">Monotone</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="n">f</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">f</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Monotone</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span><span class="o">)</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="n">f</span> <span class="n">b</span> <span class="bp"><</span> <span class="n">f</span> <span class="n">a</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">Monotone</span> <span class="n">f</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">Monotone</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>We can show that the first example in the last snippet
-
@@ -902,12 +902,12 @@ cannot be proved if we replace <code class="docutils literal notranslate"><spanNotice that we can prove the negation of a universally quantified statement by giving a counterexample. Complete the proof.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="bp">¬∀</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">},</span> <span class="n">Monotone</span> <span class="n">f</span> <span class="bp">→</span> <span class="bp">∀</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span><span class="o">},</span> <span class="n">f</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">f</span> <span class="n">b</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">h</span> <span class="k">let</span> <span class="n">f</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">↦</span> <span class="o">(</span><span class="mi">0</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="k">have</span> <span class="n">monof</span> <span class="o">:</span> <span class="n">Monotone</span> <span class="n">f</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="n">h'</span> <span class="o">:</span> <span class="n">f</span> <span class="mi">1</span> <span class="bp">≤</span> <span class="n">f</span> <span class="mi">0</span> <span class="o">:=</span> <span class="n">le_refl</span> <span class="n">_</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬∀</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">},</span><span class="w"> </span><span class="n">Monotone</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="o">},</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">(</span><span class="mi">0</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">monof</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Monotone</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">le_refl</span><span class="w"> </span><span class="n">_</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p id="index-13">This example introduces the <code class="docutils literal notranslate"><span class="pre">let</span></code> tactic,
-
@@ -919,8 +919,8 @@ Lean will unfold the definition of <code class="docutils literal notranslate"><sIn particular, when we prove <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">1</span> <span class="pre">≤</span> <span class="pre">f</span> <span class="pre">0</span></code> with <code class="docutils literal notranslate"><span class="pre">le_refl</span></code>, Lean reduces <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">1</span></code> and <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">0</span></code> to <code class="docutils literal notranslate"><span class="pre">0</span></code>.</p> <p>Use <code class="docutils literal notranslate"><span class="pre">le_of_not_gt</span></code> to prove the following:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">ε</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Implicit in many of the proofs we have just done
-
@@ -933,19 +933,19 @@ is equivalent to saying that something fails to have property <code class="docutIn other words, all four of the following implications are valid (but one of them cannot be proved with what we explained so far):</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">(</span><span class="n">P</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="kt">Prop</span><span class="o">)</span> <span class="o">(</span><span class="n">Q</span> <span class="o">:</span> <span class="kt">Prop</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">P</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="kt">Prop</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">Q</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Prop</span><span class="o">)</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">¬∃</span> <span class="n">x</span><span class="o">,</span> <span class="n">P</span> <span class="n">x</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span><span class="o">,</span> <span class="bp">¬</span><span class="n">P</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬∃</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="bp">¬</span><span class="n">P</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span><span class="o">,</span> <span class="bp">¬</span><span class="n">P</span> <span class="n">x</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬∃</span> <span class="n">x</span><span class="o">,</span> <span class="n">P</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="bp">¬</span><span class="n">P</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬∃</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">¬∀</span> <span class="n">x</span><span class="o">,</span> <span class="n">P</span> <span class="n">x</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span><span class="o">,</span> <span class="bp">¬</span><span class="n">P</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬∀</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="bp">¬</span><span class="n">P</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span><span class="o">,</span> <span class="bp">¬</span><span class="n">P</span> <span class="n">x</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬∀</span> <span class="n">x</span><span class="o">,</span> <span class="n">P</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="bp">¬</span><span class="n">P</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬∀</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>The first, second, and fourth are straightforward to
-
@@ -957,13 +957,13 @@ from the fact that its nonexistence is contradictory.This is an instance of <em>classical</em> mathematical reasoning. We can use proof by contradiction to prove the third implication as follows.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">¬∀</span> <span class="n">x</span><span class="o">,</span> <span class="n">P</span> <span class="n">x</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span><span class="o">,</span> <span class="bp">¬</span><span class="n">P</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">by_contra</span> <span class="n">h'</span> <span class="n">apply</span> <span class="n">h</span> <span class="n">intro</span> <span class="n">x</span> <span class="k">show</span> <span class="n">P</span> <span class="n">x</span> <span class="n">by_contra</span> <span class="n">h''</span> <span class="n">exact</span> <span class="n">h'</span> <span class="o">⟨</span><span class="n">x</span><span class="o">,</span> <span class="n">h''</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬∀</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="bp">¬</span><span class="n">P</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">by_contra</span><span class="w"> </span><span class="n">h'</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="k">show</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">by_contra</span><span class="w"> </span><span class="n">h''</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h'</span><span class="w"> </span><span class="o">⟨</span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">h''</span><span class="o">⟩</span> </pre></div> </div> <p id="index-14">Make sure you understand how this works.
-
@@ -976,18 +976,18 @@ Confirm that you can prove the forward directionof this equivalence using <code class="docutils literal notranslate"><span class="pre">by_contra</span></code>, while the reverse direction follows from the ordinary rules for negation.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">¬¬</span><span class="n">Q</span><span class="o">)</span> <span class="o">:</span> <span class="n">Q</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬¬</span><span class="n">Q</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Q</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">Q</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬¬</span><span class="n">Q</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Q</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬¬</span><span class="n">Q</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Use proof by contradiction to establish the following, which is the converse of one of the implications we proved above. (Hint: use <code class="docutils literal notranslate"><span class="pre">intro</span></code> first.)</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">FnHasUb</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">x</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">></span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p id="index-15">It is often tedious to work with compound statements with
-
@@ -998,14 +998,14 @@ has been pushed inward.To facilitate this, Mathlib offers a <code class="docutils literal notranslate"><span class="pre">push_neg</span></code> tactic, which restates the goal in this way. The command <code class="docutils literal notranslate"><span class="pre">push_neg</span> <span class="pre">at</span> <span class="pre">h</span></code> restates the hypothesis <code class="docutils literal notranslate"><span class="pre">h</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">¬∀</span> <span class="n">a</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">x</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">></span> <span class="n">a</span><span class="o">)</span> <span class="o">:</span> <span class="n">FnHasUb</span> <span class="n">f</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">push_neg</span> <span class="n">at</span> <span class="n">h</span> <span class="n">exact</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬∀</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">push_neg</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">FnHasUb</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">x</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">></span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">dsimp</span> <span class="n">only</span> <span class="o">[</span><span class="n">FnHasUb</span><span class="o">,</span> <span class="n">FnUb</span><span class="o">]</span> <span class="n">at</span> <span class="n">h</span> <span class="n">push_neg</span> <span class="n">at</span> <span class="n">h</span> <span class="n">exact</span> <span class="n">h</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">dsimp</span><span class="w"> </span><span class="n">only</span><span class="w"> </span><span class="o">[</span><span class="n">FnHasUb</span><span class="o">,</span><span class="w"> </span><span class="n">FnUb</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">push_neg</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>In the second example, we use dsimp to
-
@@ -1020,8 +1020,8 @@ Without even knowing how to use the conjunctionsymbol, you should be able to use <code class="docutils literal notranslate"><span class="pre">push_neg</span></code> to prove the following:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">Monotone</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span> <span class="n">y</span><span class="o">,</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="n">f</span> <span class="n">y</span> <span class="bp"><</span> <span class="n">f</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">Monotone</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="o">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p id="index-16">Mathlib also has a tactic, <code class="docutils literal notranslate"><span class="pre">contrapose</span></code>,
-
@@ -1033,14 +1033,14 @@ hypothesis <code class="docutils literal notranslate"><span class="pre">h</span>Using <code class="docutils literal notranslate"><span class="pre">contrapose!</span></code> instead of <code class="docutils literal notranslate"><span class="pre">contrapose</span></code> applies <code class="docutils literal notranslate"><span class="pre">push_neg</span></code> to the goal and the relevant hypothesis as well.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">FnHasUb</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">x</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">></span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">contrapose</span><span class="bp">!</span> <span class="n">h</span> <span class="n">exact</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">FnHasUb</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">contrapose</span><span class="bp">!</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h</span> <span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">ε</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">contrapose</span><span class="bp">!</span> <span class="n">h</span> <span class="n">use</span> <span class="n">x</span> <span class="bp">/</span> <span class="mi">2</span> <span class="n">constructor</span> <span class="bp"><;></span> <span class="n">linarith</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">ε</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">contrapose</span><span class="bp">!</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span> <span class="w"> </span><span class="n">constructor</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">linarith</span> </pre></div> </div> <p>We have not yet explained the <code class="docutils literal notranslate"><span class="pre">constructor</span></code> command
-
@@ -1062,16 +1062,16 @@ establishes the goal so we can move on to the next one.<a class="reference internal" href="#disjunction"><span class="std std-numref">Section 3.5</span></a>.)</p> <p id="index-17">Lean provides a number of ways of closing a goal once a contradiction has been reached.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">></span> <span class="mi">37</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">exfalso</span> <span class="n">apply</span> <span class="n">lt_irrefl</span> <span class="mi">0</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">37</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">exfalso</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">lt_irrefl</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">h</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">></span> <span class="mi">37</span> <span class="o">:=</span> <span class="n">absurd</span> <span class="n">h</span> <span class="o">(</span><span class="n">lt_irrefl</span> <span class="mi">0</span><span class="o">)</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">37</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">absurd</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">(</span><span class="n">lt_irrefl</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">></span> <span class="mi">37</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">have</span> <span class="n">h'</span> <span class="o">:</span> <span class="bp">¬</span><span class="mi">0</span> <span class="bp"><</span> <span class="mi">0</span> <span class="o">:=</span> <span class="n">lt_irrefl</span> <span class="mi">0</span> <span class="n">contradiction</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">37</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">lt_irrefl</span><span class="w"> </span><span class="mi">0</span> <span class="w"> </span><span class="n">contradiction</span> </pre></div> </div> <p>The <code class="docutils literal notranslate"><span class="pre">exfalso</span></code> tactic replaces the current goal with
-
@@ -1090,12 +1090,12 @@ is used to express “and.”The <code class="docutils literal notranslate"><span class="pre">constructor</span></code> tactic allows you to prove a statement of the form <code class="docutils literal notranslate"><span class="pre">A</span> <span class="pre">∧</span> <span class="pre">B</span></code> by proving <code class="docutils literal notranslate"><span class="pre">A</span></code> and then proving <code class="docutils literal notranslate"><span class="pre">B</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h₀</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span><span class="o">)</span> <span class="o">(</span><span class="n">h₁</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">constructor</span> <span class="bp">·</span> <span class="n">assumption</span> <span class="n">intro</span> <span class="n">h</span> <span class="n">apply</span> <span class="n">h₁</span> <span class="n">rw</span> <span class="o">[</span><span class="n">h</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">constructor</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">assumption</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">h₁</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">h</span><span class="o">]</span> </pre></div> </div> <p id="index-19">In this example, the <code class="docutils literal notranslate"><span class="pre">assumption</span></code> tactic
-
@@ -1108,14 +1108,14 @@ angle brackets.The first is a slick proof-term version of the previous proof, which drops into tactic mode at the keyword <code class="docutils literal notranslate"><span class="pre">by</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h₀</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span><span class="o">)</span> <span class="o">(</span><span class="n">h₁</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span> <span class="o">:=</span> <span class="o">⟨</span><span class="n">h₀</span><span class="o">,</span> <span class="k">fun</span> <span class="n">h</span> <span class="bp">↦</span> <span class="n">h₁</span> <span class="o">(</span><span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">h</span><span class="o">])⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="n">h₀</span><span class="o">,</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">h₁</span><span class="w"> </span><span class="o">(</span><span class="kd">by</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">h</span><span class="o">])⟩</span> <span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h₀</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span><span class="o">)</span> <span class="o">(</span><span class="n">h₁</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span> <span class="o">:=</span> <span class="k">have</span> <span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">contrapose</span><span class="bp">!</span> <span class="n">h₁</span> <span class="n">rw</span> <span class="o">[</span><span class="n">h₁</span><span class="o">]</span> <span class="o">⟨</span><span class="n">h₀</span><span class="o">,</span> <span class="n">h</span><span class="o">⟩</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">contrapose</span><span class="bp">!</span><span class="w"> </span><span class="n">h₁</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">h₁</span><span class="o">]</span> <span class="w"> </span><span class="o">⟨</span><span class="n">h₀</span><span class="o">,</span><span class="w"> </span><span class="n">h</span><span class="o">⟩</span> </pre></div> </div> <p><em>Using</em> a conjunction instead of proving one involves unpacking the proofs of the
-
@@ -1124,46 +1124,46 @@ You can use the <code class="docutils literal notranslate"><span class="pre">rcaas well as <code class="docutils literal notranslate"><span class="pre">rintro</span></code> or a pattern-matching <code class="docutils literal notranslate"><span class="pre">fun</span></code>, all in a manner similar to the way they are used with the existential quantifier.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rcases</span> <span class="n">h</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">h₀</span><span class="o">,</span> <span class="n">h₁</span><span class="o">⟩</span> <span class="n">contrapose</span><span class="bp">!</span> <span class="n">h₁</span> <span class="n">exact</span> <span class="n">le_antisymm</span> <span class="n">h₀</span> <span class="n">h₁</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">h₀</span><span class="o">,</span><span class="w"> </span><span class="n">h₁</span><span class="o">⟩</span> <span class="w"> </span><span class="n">contrapose</span><span class="bp">!</span><span class="w"> </span><span class="n">h₁</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">le_antisymm</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h₁</span> <span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span> <span class="bp">→</span> <span class="bp">¬</span><span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rintro</span> <span class="o">⟨</span><span class="n">h₀</span><span class="o">,</span> <span class="n">h₁</span><span class="o">⟩</span> <span class="n">h'</span> <span class="n">exact</span> <span class="n">h₁</span> <span class="o">(</span><span class="n">le_antisymm</span> <span class="n">h₀</span> <span class="n">h'</span><span class="o">)</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">¬</span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="o">⟨</span><span class="n">h₀</span><span class="o">,</span><span class="w"> </span><span class="n">h₁</span><span class="o">⟩</span><span class="w"> </span><span class="n">h'</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h₁</span><span class="w"> </span><span class="o">(</span><span class="n">le_antisymm</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h'</span><span class="o">)</span> <span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span> <span class="bp">→</span> <span class="bp">¬</span><span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span> <span class="o">:=</span> <span class="k">fun</span> <span class="o">⟨</span><span class="n">h₀</span><span class="o">,</span> <span class="n">h₁</span><span class="o">⟩</span> <span class="n">h'</span> <span class="bp">↦</span> <span class="n">h₁</span> <span class="o">(</span><span class="n">le_antisymm</span> <span class="n">h₀</span> <span class="n">h'</span><span class="o">)</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">¬</span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="o">⟨</span><span class="n">h₀</span><span class="o">,</span><span class="w"> </span><span class="n">h₁</span><span class="o">⟩</span><span class="w"> </span><span class="n">h'</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">h₁</span><span class="w"> </span><span class="o">(</span><span class="n">le_antisymm</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h'</span><span class="o">)</span> </pre></div> </div> <p>In analogy to the <code class="docutils literal notranslate"><span class="pre">obtain</span></code> tactic, there is also a pattern-matching <code class="docutils literal notranslate"><span class="pre">have</span></code>:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">have</span> <span class="o">⟨</span><span class="n">h₀</span><span class="o">,</span> <span class="n">h₁</span><span class="o">⟩</span> <span class="o">:=</span> <span class="n">h</span> <span class="n">contrapose</span><span class="bp">!</span> <span class="n">h₁</span> <span class="n">exact</span> <span class="n">le_antisymm</span> <span class="n">h₀</span> <span class="n">h₁</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">⟨</span><span class="n">h₀</span><span class="o">,</span><span class="w"> </span><span class="n">h₁</span><span class="o">⟩</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">contrapose</span><span class="bp">!</span><span class="w"> </span><span class="n">h₁</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">le_antisymm</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h₁</span> </pre></div> </div> <p>In contrast to <code class="docutils literal notranslate"><span class="pre">rcases</span></code>, here the <code class="docutils literal notranslate"><span class="pre">have</span></code> tactic leaves <code class="docutils literal notranslate"><span class="pre">h</span></code> in the context. And even though we won’t use them, once again we have the computer scientists’ pattern-matching syntax:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">cases</span> <span class="n">h</span> <span class="n">case</span> <span class="n">intro</span> <span class="n">h₀</span> <span class="n">h₁</span> <span class="bp">=></span> <span class="n">contrapose</span><span class="bp">!</span> <span class="n">h₁</span> <span class="n">exact</span> <span class="n">le_antisymm</span> <span class="n">h₀</span> <span class="n">h₁</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">cases</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">case</span><span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h₁</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="n">contrapose</span><span class="bp">!</span><span class="w"> </span><span class="n">h₁</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">le_antisymm</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h₁</span> <span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">cases</span> <span class="n">h</span> <span class="n">next</span> <span class="n">h₀</span> <span class="n">h₁</span> <span class="bp">=></span> <span class="n">contrapose</span><span class="bp">!</span> <span class="n">h₁</span> <span class="n">exact</span> <span class="n">le_antisymm</span> <span class="n">h₀</span> <span class="n">h₁</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">cases</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h₁</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="n">contrapose</span><span class="bp">!</span><span class="w"> </span><span class="n">h₁</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">le_antisymm</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h₁</span> <span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">match</span> <span class="n">h</span> <span class="k">with</span> <span class="bp">|</span> <span class="o">⟨</span><span class="n">h₀</span><span class="o">,</span> <span class="n">h₁</span><span class="o">⟩</span> <span class="bp">=></span> <span class="n">contrapose</span><span class="bp">!</span> <span class="n">h₁</span> <span class="n">exact</span> <span class="n">le_antisymm</span> <span class="n">h₀</span> <span class="n">h₁</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">match</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="k">with</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="o">⟨</span><span class="n">h₀</span><span class="o">,</span><span class="w"> </span><span class="n">h₁</span><span class="o">⟩</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="n">contrapose</span><span class="bp">!</span><span class="w"> </span><span class="n">h₁</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">le_antisymm</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h₁</span> </pre></div> </div> <p>In contrast to using an existential quantifier,
-
@@ -1171,47 +1171,47 @@ you can also extract proofs of the two componentsof a hypothesis <code class="docutils literal notranslate"><span class="pre">h</span> <span class="pre">:</span> <span class="pre">A</span> <span class="pre">∧</span> <span class="pre">B</span></code> by writing <code class="docutils literal notranslate"><span class="pre">h.left</span></code> and <code class="docutils literal notranslate"><span class="pre">h.right</span></code>, or, equivalently, <code class="docutils literal notranslate"><span class="pre">h.1</span></code> and <code class="docutils literal notranslate"><span class="pre">h.2</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">h'</span> <span class="n">apply</span> <span class="n">h.right</span> <span class="n">exact</span> <span class="n">le_antisymm</span> <span class="n">h.left</span> <span class="n">h'</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h'</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">h.right</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">le_antisymm</span><span class="w"> </span><span class="n">h.left</span><span class="w"> </span><span class="n">h'</span> <span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">h'</span> <span class="bp">↦</span> <span class="n">h.right</span> <span class="o">(</span><span class="n">le_antisymm</span> <span class="n">h.left</span> <span class="n">h'</span><span class="o">)</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">h'</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">h.right</span><span class="w"> </span><span class="o">(</span><span class="n">le_antisymm</span><span class="w"> </span><span class="n">h.left</span><span class="w"> </span><span class="n">h'</span><span class="o">)</span> </pre></div> </div> <p>Try using these techniques to come up with various ways of proving of the following:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">∣</span> <span class="n">n</span> <span class="bp">∧</span> <span class="n">m</span> <span class="bp">≠</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">∣</span> <span class="n">n</span> <span class="bp">∧</span> <span class="bp">¬</span><span class="n">n</span> <span class="bp">∣</span> <span class="n">m</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="bp">¬</span><span class="n">n</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>You can nest uses of <code class="docutils literal notranslate"><span class="pre">∃</span></code> and <code class="docutils literal notranslate"><span class="pre">∧</span></code> with anonymous constructors, <code class="docutils literal notranslate"><span class="pre">rintro</span></code>, and <code class="docutils literal notranslate"><span class="pre">rcases</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">,</span> <span class="mi">2</span> <span class="bp"><</span> <span class="n">x</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp"><</span> <span class="mi">4</span> <span class="o">:=</span> <span class="o">⟨</span><span class="mi">5</span> <span class="bp">/</span> <span class="mi">2</span><span class="o">,</span> <span class="kd">by</span> <span class="n">norm_num</span><span class="o">,</span> <span class="kd">by</span> <span class="n">norm_num</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">,</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="mi">5</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="o">,</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span><span class="o">,</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span><span class="o">⟩</span> <span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="bp">∃</span> <span class="n">z</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">,</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">z</span> <span class="bp">∧</span> <span class="n">z</span> <span class="bp"><</span> <span class="n">y</span><span class="o">)</span> <span class="bp">→</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rintro</span> <span class="o">⟨</span><span class="n">z</span><span class="o">,</span> <span class="n">xltz</span><span class="o">,</span> <span class="n">zlty</span><span class="o">⟩</span> <span class="n">exact</span> <span class="n">lt_trans</span> <span class="n">xltz</span> <span class="n">zlty</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">∃</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="o">⟨</span><span class="n">z</span><span class="o">,</span><span class="w"> </span><span class="n">xltz</span><span class="o">,</span><span class="w"> </span><span class="n">zlty</span><span class="o">⟩</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">lt_trans</span><span class="w"> </span><span class="n">xltz</span><span class="w"> </span><span class="n">zlty</span> <span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="bp">∃</span> <span class="n">z</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">,</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">z</span> <span class="bp">∧</span> <span class="n">z</span> <span class="bp"><</span> <span class="n">y</span><span class="o">)</span> <span class="bp">→</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">y</span> <span class="o">:=</span> <span class="k">fun</span> <span class="o">⟨</span><span class="n">z</span><span class="o">,</span> <span class="n">xltz</span><span class="o">,</span> <span class="n">zlty</span><span class="o">⟩</span> <span class="bp">↦</span> <span class="n">lt_trans</span> <span class="n">xltz</span> <span class="n">zlty</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">∃</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="o">⟨</span><span class="n">z</span><span class="o">,</span><span class="w"> </span><span class="n">xltz</span><span class="o">,</span><span class="w"> </span><span class="n">zlty</span><span class="o">⟩</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">lt_trans</span><span class="w"> </span><span class="n">xltz</span><span class="w"> </span><span class="n">zlty</span> </pre></div> </div> <p>You can also use the <code class="docutils literal notranslate"><span class="pre">use</span></code> tactic:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">,</span> <span class="mi">2</span> <span class="bp"><</span> <span class="n">x</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp"><</span> <span class="mi">4</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">use</span> <span class="mi">5</span> <span class="bp">/</span> <span class="mi">2</span> <span class="n">constructor</span> <span class="bp"><;></span> <span class="n">norm_num</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">,</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span> <span class="w"> </span><span class="n">constructor</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">norm_num</span> <span class="kd">example</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">,</span> <span class="mi">4</span> <span class="bp"><</span> <span class="n">m</span> <span class="bp">∧</span> <span class="n">m</span> <span class="bp"><</span> <span class="n">n</span> <span class="bp">∧</span> <span class="n">n</span> <span class="bp"><</span> <span class="mi">10</span> <span class="bp">∧</span> <span class="n">Nat.Prime</span> <span class="n">m</span> <span class="bp">∧</span> <span class="n">Nat.Prime</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">use</span> <span class="mi">5</span> <span class="n">use</span> <span class="mi">7</span> <span class="n">norm_num</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="mi">5</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="mi">7</span> <span class="w"> </span><span class="n">norm_num</span> <span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span> <span class="bp">→</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="bp">¬</span><span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rintro</span> <span class="o">⟨</span><span class="n">h₀</span><span class="o">,</span> <span class="n">h₁</span><span class="o">⟩</span> <span class="n">use</span> <span class="n">h₀</span> <span class="n">exact</span> <span class="k">fun</span> <span class="n">h'</span> <span class="bp">↦</span> <span class="n">h₁</span> <span class="o">(</span><span class="n">le_antisymm</span> <span class="n">h₀</span> <span class="n">h'</span><span class="o">)</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="bp">¬</span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="o">⟨</span><span class="n">h₀</span><span class="o">,</span><span class="w"> </span><span class="n">h₁</span><span class="o">⟩</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">h₀</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">h'</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">h₁</span><span class="w"> </span><span class="o">(</span><span class="n">le_antisymm</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h'</span><span class="o">)</span> </pre></div> </div> <p>In the first example, the semicolon after the <code class="docutils literal notranslate"><span class="pre">constructor</span></code> command tells Lean to use the
-
@@ -1225,16 +1225,16 @@ You can also use <code class="docutils literal notranslate"><span class="pre">caTo prove an if-and-only-if statement, you can use <code class="docutils literal notranslate"><span class="pre">constructor</span></code> or angle brackets, just as you would if you were proving a conjunction.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span> <span class="bp">↔</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">constructor</span> <span class="bp">·</span> <span class="n">contrapose</span><span class="bp">!</span> <span class="n">rintro</span> <span class="n">rfl</span> <span class="n">rfl</span> <span class="n">contrapose</span><span class="bp">!</span> <span class="n">exact</span> <span class="n">le_antisymm</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">constructor</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">contrapose</span><span class="bp">!</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="n">rfl</span> <span class="w"> </span><span class="n">rfl</span> <span class="w"> </span><span class="n">contrapose</span><span class="bp">!</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">le_antisymm</span><span class="w"> </span><span class="n">h</span> <span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span> <span class="bp">↔</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span> <span class="o">:=</span> <span class="o">⟨</span><span class="k">fun</span> <span class="n">h₀</span> <span class="n">h₁</span> <span class="bp">↦</span> <span class="n">h₀</span> <span class="o">(</span><span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">h₁</span><span class="o">]),</span> <span class="k">fun</span> <span class="n">h₀</span> <span class="n">h₁</span> <span class="bp">↦</span> <span class="n">h₀</span> <span class="o">(</span><span class="n">le_antisymm</span> <span class="n">h</span> <span class="n">h₁</span><span class="o">)⟩</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="k">fun</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h₁</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="o">(</span><span class="kd">by</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">h₁</span><span class="o">]),</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h₁</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="o">(</span><span class="n">le_antisymm</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="n">h₁</span><span class="o">)⟩</span> </pre></div> </div> <p>The last proof term is inscrutable. Remember that you can
-
@@ -1242,8 +1242,8 @@ use underscores while writing an expression like that tosee what Lean expects.</p> <p>Try out the various techniques and gadgets you have just seen in order to prove the following:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="bp">¬</span><span class="n">y</span> <span class="bp">≤</span> <span class="n">x</span> <span class="bp">↔</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp">≠</span> <span class="n">y</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="bp">¬</span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>For a more interesting exercise, show that for any
-
@@ -1251,12 +1251,12 @@ two real numbers <code class="docutils literal notranslate"><span class="pre">x<<code class="docutils literal notranslate"><span class="pre">x^2</span> <span class="pre">+</span> <span class="pre">y^2</span> <span class="pre">=</span> <span class="pre">0</span></code> if and only if <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">=</span> <span class="pre">0</span></code> and <code class="docutils literal notranslate"><span class="pre">y</span> <span class="pre">=</span> <span class="pre">0</span></code>. We suggest proving an auxiliary lemma using <code class="docutils literal notranslate"><span class="pre">linarith</span></code>, <code class="docutils literal notranslate"><span class="pre">pow_two_nonneg</span></code>, and <code class="docutils literal notranslate"><span class="pre">pow_eq_zero</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">aux</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">y</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">=</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="k">have</span> <span class="n">h'</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">pow_eq_zero</span> <span class="n">h'</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">aux</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">pow_eq_zero</span><span class="w"> </span><span class="n">h'</span> <span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">y</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">=</span> <span class="mi">0</span> <span class="bp">↔</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">0</span> <span class="bp">∧</span> <span class="n">y</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>In Lean, bi-implication leads a double-life.
-
@@ -1272,14 +1272,14 @@ replace an expression of the form <code class="docutils literal notranslate"><spby the equivalent expression <code class="docutils literal notranslate"><span class="pre">-</span> <span class="pre">y</span> <span class="pre"><</span> <span class="pre">x</span> <span class="pre">∧</span> <span class="pre">x</span> <span class="pre"><</span> <span class="pre">y</span></code>, and in the one after that we use <code class="docutils literal notranslate"><span class="pre">Nat.dvd_gcd_iff</span></code> to replace an expression of the form <code class="docutils literal notranslate"><span class="pre">m</span> <span class="pre">∣</span> <span class="pre">Nat.gcd</span> <span class="pre">n</span> <span class="pre">k</span></code> by the equivalent expression <code class="docutils literal notranslate"><span class="pre">m</span> <span class="pre">∣</span> <span class="pre">n</span> <span class="pre">∧</span> <span class="pre">m</span> <span class="pre">∣</span> <span class="pre">k</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="bp">|</span><span class="n">x</span> <span class="bp">+</span> <span class="mi">3</span><span class="bp">|</span> <span class="bp"><</span> <span class="mi">5</span> <span class="bp">→</span> <span class="bp">-</span><span class="mi">8</span> <span class="bp"><</span> <span class="n">x</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp"><</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">abs_lt</span><span class="o">]</span> <span class="n">intro</span> <span class="n">h</span> <span class="n">constructor</span> <span class="bp"><;></span> <span class="n">linarith</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">3</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">-</span><span class="mi">8</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">abs_lt</span><span class="o">]</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">constructor</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">linarith</span> <span class="kd">example</span> <span class="o">:</span> <span class="mi">3</span> <span class="bp">∣</span> <span class="n">Nat.gcd</span> <span class="mi">6</span> <span class="mi">15</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">Nat.dvd_gcd_iff</span><span class="o">]</span> <span class="n">constructor</span> <span class="bp"><;></span> <span class="n">norm_num</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">Nat.gcd</span><span class="w"> </span><span class="mi">6</span><span class="w"> </span><span class="mi">15</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">Nat.dvd_gcd_iff</span><span class="o">]</span> <span class="w"> </span><span class="n">constructor</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">norm_num</span> </pre></div> </div> <p>See if you can use <code class="docutils literal notranslate"><span class="pre">rw</span></code> with the theorem below
-
@@ -1287,13 +1287,13 @@ to provide a short proof that negation is not anondecreasing function. (Note that <code class="docutils literal notranslate"><span class="pre">push_neg</span></code> won’t unfold definitions for you, so the <code class="docutils literal notranslate"><span class="pre">rw</span> <span class="pre">[Monotone]</span></code> in the proof of the theorem is needed.)</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">not_monotone_iff</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">Monotone</span> <span class="n">f</span> <span class="bp">↔</span> <span class="bp">∃</span> <span class="n">x</span> <span class="n">y</span><span class="o">,</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">y</span> <span class="bp">∧</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">></span> <span class="n">f</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">Monotone</span><span class="o">]</span> <span class="n">push_neg</span> <span class="n">rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">not_monotone_iff</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">Monotone</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="o">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">Monotone</span><span class="o">]</span> <span class="w"> </span><span class="n">push_neg</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">example</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">Monotone</span> <span class="k">fun</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">↦</span> <span class="bp">-</span><span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">Monotone</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="bp">-</span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>The remaining exercises in this section are designed
-
@@ -1308,12 +1308,12 @@ Lean axiomatizes the associated strict pre-order by<code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre"><</span> <span class="pre">b</span> <span class="pre">↔</span> <span class="pre">a</span> <span class="pre">≤</span> <span class="pre">b</span> <span class="pre">∧</span> <span class="pre">¬</span> <span class="pre">b</span> <span class="pre">≤</span> <span class="pre">a</span></code>. Show that if <code class="docutils literal notranslate"><span class="pre">≤</span></code> is a partial order, then <code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre"><</span> <span class="pre">b</span></code> is equivalent to <code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre">≤</span> <span class="pre">b</span> <span class="pre">∧</span> <span class="pre">a</span> <span class="pre">≠</span> <span class="pre">b</span></code>:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">PartialOrder</span> <span class="n">α</span><span class="o">]</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">PartialOrder</span><span class="w"> </span><span class="n">α</span><span class="o">]</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">b</span> <span class="bp">↔</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">∧</span> <span class="n">a</span> <span class="bp">≠</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">lt_iff_le_not_le</span><span class="o">]</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">lt_iff_le_not_le</span><span class="o">]</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p id="index-20">Beyond logical operations, you do not need
-
@@ -1329,16 +1329,16 @@ We will come back to the simplifier later,but here we are only relying on the fact that it will use the indicated lemma repeatedly, even if it needs to be instantiated to different values.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Preorder</span> <span class="n">α</span><span class="o">]</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Preorder</span><span class="w"> </span><span class="n">α</span><span class="o">]</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="kd">example</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">a</span> <span class="bp"><</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">lt_iff_le_not_le</span><span class="o">]</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">lt_iff_le_not_le</span><span class="o">]</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">b</span> <span class="bp">→</span> <span class="n">b</span> <span class="bp"><</span> <span class="n">c</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">c</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="n">only</span> <span class="o">[</span><span class="n">lt_iff_le_not_le</span><span class="o">]</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="n">only</span><span class="w"> </span><span class="o">[</span><span class="n">lt_iff_le_not_le</span><span class="o">]</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> </section>
-
@@ -1348,15 +1348,15 @@ to be instantiated to different values.</p><code class="docutils literal notranslate"><span class="pre">A</span></code> or to prove <code class="docutils literal notranslate"><span class="pre">B</span></code>. The <code class="docutils literal notranslate"><span class="pre">left</span></code> tactic chooses <code class="docutils literal notranslate"><span class="pre">A</span></code>, and the <code class="docutils literal notranslate"><span class="pre">right</span></code> tactic chooses <code class="docutils literal notranslate"><span class="pre">B</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">y</span> <span class="bp">></span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="o">:</span> <span class="n">y</span> <span class="bp">></span> <span class="mi">0</span> <span class="bp">∨</span> <span class="n">y</span> <span class="bp"><</span> <span class="bp">-</span><span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">left</span> <span class="n">linarith</span> <span class="o">[</span><span class="n">pow_two_nonneg</span> <span class="n">x</span><span class="o">]</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">-</span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">left</span> <span class="w"> </span><span class="n">linarith</span><span class="w"> </span><span class="o">[</span><span class="n">pow_two_nonneg</span><span class="w"> </span><span class="n">x</span><span class="o">]</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">-</span><span class="n">y</span> <span class="bp">></span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="o">:</span> <span class="n">y</span> <span class="bp">></span> <span class="mi">0</span> <span class="bp">∨</span> <span class="n">y</span> <span class="bp"><</span> <span class="bp">-</span><span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">right</span> <span class="n">linarith</span> <span class="o">[</span><span class="n">pow_two_nonneg</span> <span class="n">x</span><span class="o">]</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">-</span><span class="n">y</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">-</span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">right</span> <span class="w"> </span><span class="n">linarith</span><span class="w"> </span><span class="o">[</span><span class="n">pow_two_nonneg</span><span class="w"> </span><span class="n">x</span><span class="o">]</span> </pre></div> </div> <p>We cannot use an anonymous constructor to construct a proof
-
@@ -1367,11 +1367,11 @@ When we write proof terms we can useto make the choice explicitly. Here, <code class="docutils literal notranslate"><span class="pre">inl</span></code> is short for “introduction left” and <code class="docutils literal notranslate"><span class="pre">inr</span></code> is short for “introduction right.”</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">y</span> <span class="bp">></span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="n">y</span> <span class="bp">></span> <span class="mi">0</span> <span class="bp">∨</span> <span class="n">y</span> <span class="bp"><</span> <span class="bp">-</span><span class="mi">1</span> <span class="o">:=</span> <span class="n">Or.inl</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">-</span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Or.inl</span><span class="w"> </span><span class="n">h</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">y</span> <span class="bp"><</span> <span class="bp">-</span><span class="mi">1</span><span class="o">)</span> <span class="o">:</span> <span class="n">y</span> <span class="bp">></span> <span class="mi">0</span> <span class="bp">∨</span> <span class="n">y</span> <span class="bp"><</span> <span class="bp">-</span><span class="mi">1</span> <span class="o">:=</span> <span class="n">Or.inr</span> <span class="n">h</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">-</span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">-</span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Or.inr</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>It may seem strange to prove a disjunction by proving one side
-
@@ -1392,12 +1392,12 @@ the <code class="docutils literal notranslate"><span class="pre">rcases</span></As usual, we can tell Lean what names to use for the hypotheses. In the next example, we tell Lean to use the name <code class="docutils literal notranslate"><span class="pre">h</span></code> on each branch.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">x</span> <span class="bp"><</span> <span class="bp">|</span><span class="n">y</span><span class="bp">|</span> <span class="bp">→</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">y</span> <span class="bp">∨</span> <span class="n">x</span> <span class="bp"><</span> <span class="bp">-</span><span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rcases</span> <span class="n">le_or_gt</span> <span class="mi">0</span> <span class="n">y</span> <span class="k">with</span> <span class="n">h</span> <span class="bp">|</span> <span class="n">h</span> <span class="bp">·</span> <span class="n">rw</span> <span class="o">[</span><span class="n">abs_of_nonneg</span> <span class="n">h</span><span class="o">]</span> <span class="n">intro</span> <span class="n">h</span><span class="bp">;</span> <span class="n">left</span><span class="bp">;</span> <span class="n">exact</span> <span class="n">h</span> <span class="bp">.</span> <span class="n">rw</span> <span class="o">[</span><span class="n">abs_of_neg</span> <span class="n">h</span><span class="o">]</span> <span class="n">intro</span> <span class="n">h</span><span class="bp">;</span> <span class="n">right</span><span class="bp">;</span> <span class="n">exact</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">|</span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">-</span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">le_or_gt</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">abs_of_nonneg</span><span class="w"> </span><span class="n">h</span><span class="o">]</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h</span><span class="bp">;</span><span class="w"> </span><span class="n">left</span><span class="bp">;</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">abs_of_neg</span><span class="w"> </span><span class="n">h</span><span class="o">]</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h</span><span class="bp">;</span><span class="w"> </span><span class="n">right</span><span class="bp">;</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>Notice that the pattern changes from <code class="docutils literal notranslate"><span class="pre">⟨h₀,</span> <span class="pre">h₁⟩</span></code> in the case of
-
@@ -1418,14 +1418,14 @@ allowing us to split on those two cases.</p>syntax for disjunction. Now the <code class="docutils literal notranslate"><span class="pre">cases</span></code> tactic is more attractive, because it allows us to name each <code class="docutils literal notranslate"><span class="pre">case</span></code>, and name the hypothesis that is introduced closer to where it is used.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">x</span> <span class="bp"><</span> <span class="bp">|</span><span class="n">y</span><span class="bp">|</span> <span class="bp">→</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">y</span> <span class="bp">∨</span> <span class="n">x</span> <span class="bp"><</span> <span class="bp">-</span><span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">cases</span> <span class="n">le_or_gt</span> <span class="mi">0</span> <span class="n">y</span> <span class="n">case</span> <span class="n">inl</span> <span class="n">h</span> <span class="bp">=></span> <span class="n">rw</span> <span class="o">[</span><span class="n">abs_of_nonneg</span> <span class="n">h</span><span class="o">]</span> <span class="n">intro</span> <span class="n">h</span><span class="bp">;</span> <span class="n">left</span><span class="bp">;</span> <span class="n">exact</span> <span class="n">h</span> <span class="n">case</span> <span class="n">inr</span> <span class="n">h</span> <span class="bp">=></span> <span class="n">rw</span> <span class="o">[</span><span class="n">abs_of_neg</span> <span class="n">h</span><span class="o">]</span> <span class="n">intro</span> <span class="n">h</span><span class="bp">;</span> <span class="n">right</span><span class="bp">;</span> <span class="n">exact</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">|</span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">-</span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">cases</span><span class="w"> </span><span class="n">le_or_gt</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">y</span> <span class="w"> </span><span class="n">case</span><span class="w"> </span><span class="n">inl</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">abs_of_nonneg</span><span class="w"> </span><span class="n">h</span><span class="o">]</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h</span><span class="bp">;</span><span class="w"> </span><span class="n">left</span><span class="bp">;</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">case</span><span class="w"> </span><span class="n">inr</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">abs_of_neg</span><span class="w"> </span><span class="n">h</span><span class="o">]</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h</span><span class="bp">;</span><span class="w"> </span><span class="n">right</span><span class="bp">;</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>The names <code class="docutils literal notranslate"><span class="pre">inl</span></code> and <code class="docutils literal notranslate"><span class="pre">inr</span></code> are short for “intro left” and “intro right,”
-
@@ -1433,23 +1433,23 @@ respectively. Using <code class="docutils literal notranslate"><span class="pre"cases in either order; Lean uses the tag to find the relevant goal. If you don’t care about that, you can use <code class="docutils literal notranslate"><span class="pre">next</span></code>, or <code class="docutils literal notranslate"><span class="pre">match</span></code>, or even a pattern-matching <code class="docutils literal notranslate"><span class="pre">have</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">x</span> <span class="bp"><</span> <span class="bp">|</span><span class="n">y</span><span class="bp">|</span> <span class="bp">→</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">y</span> <span class="bp">∨</span> <span class="n">x</span> <span class="bp"><</span> <span class="bp">-</span><span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">cases</span> <span class="n">le_or_gt</span> <span class="mi">0</span> <span class="n">y</span> <span class="n">next</span> <span class="n">h</span> <span class="bp">=></span> <span class="n">rw</span> <span class="o">[</span><span class="n">abs_of_nonneg</span> <span class="n">h</span><span class="o">]</span> <span class="n">intro</span> <span class="n">h</span><span class="bp">;</span> <span class="n">left</span><span class="bp">;</span> <span class="n">exact</span> <span class="n">h</span> <span class="n">next</span> <span class="n">h</span> <span class="bp">=></span> <span class="n">rw</span> <span class="o">[</span><span class="n">abs_of_neg</span> <span class="n">h</span><span class="o">]</span> <span class="n">intro</span> <span class="n">h</span><span class="bp">;</span> <span class="n">right</span><span class="bp">;</span> <span class="n">exact</span> <span class="n">h</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">x</span> <span class="bp"><</span> <span class="bp">|</span><span class="n">y</span><span class="bp">|</span> <span class="bp">→</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">y</span> <span class="bp">∨</span> <span class="n">x</span> <span class="bp"><</span> <span class="bp">-</span><span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">match</span> <span class="n">le_or_gt</span> <span class="mi">0</span> <span class="n">y</span> <span class="k">with</span> <span class="bp">|</span> <span class="n">Or.inl</span> <span class="n">h</span> <span class="bp">=></span> <span class="n">rw</span> <span class="o">[</span><span class="n">abs_of_nonneg</span> <span class="n">h</span><span class="o">]</span> <span class="n">intro</span> <span class="n">h</span><span class="bp">;</span> <span class="n">left</span><span class="bp">;</span> <span class="n">exact</span> <span class="n">h</span> <span class="bp">|</span> <span class="n">Or.inr</span> <span class="n">h</span> <span class="bp">=></span> <span class="n">rw</span> <span class="o">[</span><span class="n">abs_of_neg</span> <span class="n">h</span><span class="o">]</span> <span class="n">intro</span> <span class="n">h</span><span class="bp">;</span> <span class="n">right</span><span class="bp">;</span> <span class="n">exact</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">|</span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">-</span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">cases</span><span class="w"> </span><span class="n">le_or_gt</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">y</span> <span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">abs_of_nonneg</span><span class="w"> </span><span class="n">h</span><span class="o">]</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h</span><span class="bp">;</span><span class="w"> </span><span class="n">left</span><span class="bp">;</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">abs_of_neg</span><span class="w"> </span><span class="n">h</span><span class="o">]</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h</span><span class="bp">;</span><span class="w"> </span><span class="n">right</span><span class="bp">;</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">|</span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">-</span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">match</span><span class="w"> </span><span class="n">le_or_gt</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="k">with</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">Or.inl</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">abs_of_nonneg</span><span class="w"> </span><span class="n">h</span><span class="o">]</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h</span><span class="bp">;</span><span class="w"> </span><span class="n">left</span><span class="bp">;</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">Or.inr</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">abs_of_neg</span><span class="w"> </span><span class="n">h</span><span class="o">]</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h</span><span class="bp">;</span><span class="w"> </span><span class="n">right</span><span class="bp">;</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>In the case of <code class="docutils literal notranslate"><span class="pre">match</span></code>, we need to use the full names
-
@@ -1459,54 +1459,54 @@ cases of a disjunction.</p><p>Try proving the triangle inequality using the first two theorems in the next snippet. They are given the same names they have in Mathlib.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">namespace</span> <span class="n">MyAbs</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">namespace</span><span class="w"> </span><span class="n">MyAbs</span> <span class="kd">theorem</span> <span class="n">le_abs_self</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≤</span> <span class="bp">|</span><span class="n">x</span><span class="bp">|</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">le_abs_self</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="bp">|</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">theorem</span> <span class="n">neg_le_abs_self</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="bp">-</span><span class="n">x</span> <span class="bp">≤</span> <span class="bp">|</span><span class="n">x</span><span class="bp">|</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">neg_le_abs_self</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">-</span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="bp">|</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">theorem</span> <span class="n">abs_add</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="bp">|</span><span class="n">x</span> <span class="bp">+</span> <span class="n">y</span><span class="bp">|</span> <span class="bp">≤</span> <span class="bp">|</span><span class="n">x</span><span class="bp">|</span> <span class="bp">+</span> <span class="bp">|</span><span class="n">y</span><span class="bp">|</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">abs_add</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="bp">|</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="bp">|</span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>In case you enjoyed these (pun intended) and you want more practice with disjunction, try these.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">lt_abs</span> <span class="o">:</span> <span class="n">x</span> <span class="bp"><</span> <span class="bp">|</span><span class="n">y</span><span class="bp">|</span> <span class="bp">↔</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">y</span> <span class="bp">∨</span> <span class="n">x</span> <span class="bp"><</span> <span class="bp">-</span><span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">lt_abs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">|</span><span class="n">y</span><span class="bp">|</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">-</span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">theorem</span> <span class="n">abs_lt</span> <span class="o">:</span> <span class="bp">|</span><span class="n">x</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">y</span> <span class="bp">↔</span> <span class="bp">-</span><span class="n">y</span> <span class="bp"><</span> <span class="n">x</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">abs_lt</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">|</span><span class="n">x</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">-</span><span class="n">y</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>You can also use <code class="docutils literal notranslate"><span class="pre">rcases</span></code> and <code class="docutils literal notranslate"><span class="pre">rintro</span></code> with nested disjunctions. When these result in a genuine case split with multiple goals, the patterns for each new goal are separated by a vertical bar.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp"><</span> <span class="mi">0</span> <span class="bp">∨</span> <span class="n">x</span> <span class="bp">></span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rcases</span> <span class="n">lt_trichotomy</span> <span class="n">x</span> <span class="mi">0</span> <span class="k">with</span> <span class="n">xlt</span> <span class="bp">|</span> <span class="n">xeq</span> <span class="bp">|</span> <span class="n">xgt</span> <span class="bp">·</span> <span class="n">left</span> <span class="n">exact</span> <span class="n">xlt</span> <span class="bp">·</span> <span class="n">contradiction</span> <span class="bp">.</span> <span class="n">right</span><span class="bp">;</span> <span class="n">exact</span> <span class="n">xgt</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">lt_trichotomy</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">xlt</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">xeq</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">xgt</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">left</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">xlt</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">contradiction</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">right</span><span class="bp">;</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">xgt</span> </pre></div> </div> <p>You can still nest patterns and use the <code class="docutils literal notranslate"><span class="pre">rfl</span></code> keyword to substitute equations:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">m</span> <span class="n">n</span> <span class="n">k</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">∣</span> <span class="n">n</span> <span class="bp">∨</span> <span class="n">m</span> <span class="bp">∣</span> <span class="n">k</span><span class="o">)</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">∣</span> <span class="n">n</span> <span class="bp">*</span> <span class="n">k</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rcases</span> <span class="n">h</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">a</span><span class="o">,</span> <span class="n">rfl</span><span class="o">⟩</span> <span class="bp">|</span> <span class="o">⟨</span><span class="n">b</span><span class="o">,</span> <span class="n">rfl</span><span class="o">⟩</span> <span class="bp">·</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mul_assoc</span><span class="o">]</span> <span class="n">apply</span> <span class="n">dvd_mul_right</span> <span class="bp">.</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mul_comm</span><span class="o">,</span> <span class="n">mul_assoc</span><span class="o">]</span> <span class="n">apply</span> <span class="n">dvd_mul_right</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">k</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">rfl</span><span class="o">⟩</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="o">⟨</span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">rfl</span><span class="o">⟩</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mul_assoc</span><span class="o">]</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">dvd_mul_right</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mul_comm</span><span class="o">,</span><span class="w"> </span><span class="n">mul_assoc</span><span class="o">]</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">dvd_mul_right</span> </pre></div> </div> <p>See if you can prove the following with a single (long) line. Use <code class="docutils literal notranslate"><span class="pre">rcases</span></code> to unpack the hypotheses and split on cases, and use a semicolon and <code class="docutils literal notranslate"><span class="pre">linarith</span></code> to solve each branch.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">z</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span> <span class="n">y</span><span class="o">,</span> <span class="n">z</span> <span class="bp">=</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">y</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">∨</span> <span class="n">z</span> <span class="bp">=</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">y</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="o">:</span> <span class="n">z</span> <span class="bp">≥</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="o">,</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>On the real numbers, an equation <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">*</span> <span class="pre">y</span> <span class="pre">=</span> <span class="pre">0</span></code>
-
@@ -1514,11 +1514,11 @@ tells us that <code class="docutils literal notranslate"><span class="pre">x</spIn Mathlib, this fact is known as <code class="docutils literal notranslate"><span class="pre">eq_zero_or_eq_zero_of_mul_eq_zero</span></code>, and it is another nice example of how a disjunction can arise. See if you can use it to prove the following:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">=</span> <span class="mi">1</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">1</span> <span class="bp">∨</span> <span class="n">x</span> <span class="bp">=</span> <span class="bp">-</span><span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">-</span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">=</span> <span class="n">y</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">y</span> <span class="bp">∨</span> <span class="n">x</span> <span class="bp">=</span> <span class="bp">-</span><span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">-</span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Remember that you can use the <code class="docutils literal notranslate"><span class="pre">ring</span></code> tactic to help
-
@@ -1536,14 +1536,14 @@ says that the real numbers have no nontrivial zero divisors.A commutative ring with this property is called an <em>integral domain</em>. Your proofs of the two theorems above should work equally well in any integral domain:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">IsDomain</span> <span class="n">R</span><span class="o">]</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">IsDomain</span><span class="w"> </span><span class="n">R</span><span class="o">]</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">=</span> <span class="mi">1</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">1</span> <span class="bp">∨</span> <span class="n">x</span> <span class="bp">=</span> <span class="bp">-</span><span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">-</span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">=</span> <span class="n">y</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">y</span> <span class="bp">∨</span> <span class="n">x</span> <span class="bp">=</span> <span class="bp">-</span><span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">-</span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>In fact, if you are careful, you can prove the first
-
@@ -1555,19 +1555,19 @@ depending on whether some statement is true or not.For any proposition <code class="docutils literal notranslate"><span class="pre">P</span></code>, we can use <code class="docutils literal notranslate"><span class="pre">em</span> <span class="pre">P</span> <span class="pre">:</span> <span class="pre">P</span> <span class="pre">∨</span> <span class="pre">¬</span> <span class="pre">P</span></code>. The name <code class="docutils literal notranslate"><span class="pre">em</span></code> is short for “excluded middle.”</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">P</span> <span class="o">:</span> <span class="kt">Prop</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬¬</span><span class="n">P</span> <span class="bp">→</span> <span class="n">P</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">h</span> <span class="n">cases</span> <span class="n">em</span> <span class="n">P</span> <span class="bp">·</span> <span class="n">assumption</span> <span class="bp">.</span> <span class="n">contradiction</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">P</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Prop</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬¬</span><span class="n">P</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">cases</span><span class="w"> </span><span class="n">em</span><span class="w"> </span><span class="n">P</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">assumption</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">contradiction</span> </pre></div> </div> <p id="index-23">Alternatively, you can use the <code class="docutils literal notranslate"><span class="pre">by_cases</span></code> tactic.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">P</span> <span class="o">:</span> <span class="kt">Prop</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬¬</span><span class="n">P</span> <span class="bp">→</span> <span class="n">P</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">h</span> <span class="n">by_cases</span> <span class="n">h'</span> <span class="o">:</span> <span class="n">P</span> <span class="bp">·</span> <span class="n">assumption</span> <span class="n">contradiction</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">P</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Prop</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬¬</span><span class="n">P</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">by_cases</span><span class="w"> </span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">P</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">assumption</span> <span class="w"> </span><span class="n">contradiction</span> </pre></div> </div> <p>Notice that the <code class="docutils literal notranslate"><span class="pre">by_cases</span></code> tactic lets you
-
@@ -1579,8 +1579,8 @@ If you leave out the label,Lean uses <code class="docutils literal notranslate"><span class="pre">h</span></code> by default. Try proving the following equivalence, using <code class="docutils literal notranslate"><span class="pre">by_cases</span></code> to establish one direction.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">P</span> <span class="n">Q</span> <span class="o">:</span> <span class="kt">Prop</span><span class="o">)</span> <span class="o">:</span> <span class="n">P</span> <span class="bp">→</span> <span class="n">Q</span> <span class="bp">↔</span> <span class="bp">¬</span><span class="n">P</span> <span class="bp">∨</span> <span class="n">Q</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">P</span><span class="w"> </span><span class="n">Q</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Prop</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Q</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">¬</span><span class="n">P</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">Q</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> </section>
-
@@ -1595,8 +1595,8 @@ remains within <span class="math notranslate nohighlight">\(\varepsilon\)</span>that is, there is a number <span class="math notranslate nohighlight">\(N\)</span> such that for every <span class="math notranslate nohighlight">\(n \ge N\)</span>, <span class="math notranslate nohighlight">\(| s_n - a | < \varepsilon\)</span>. In Lean, we can render this as follows:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">ConvergesTo</span> <span class="o">(</span><span class="n">s</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:=</span> <span class="bp">∀</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">N</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">n</span> <span class="bp">≥</span> <span class="n">N</span><span class="o">,</span> <span class="bp">|</span><span class="n">s</span> <span class="n">n</span> <span class="bp">-</span> <span class="n">a</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">ConvergesTo</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">N</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="n">N</span><span class="o">,</span><span class="w"> </span><span class="bp">|</span><span class="n">s</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">a</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span> </pre></div> </div> <p>The notation <code class="docutils literal notranslate"><span class="pre">∀</span> <span class="pre">ε</span> <span class="pre">></span> <span class="pre">0,</span> <span class="pre">...</span></code> is a convenient abbreviation
-
@@ -1616,9 +1616,9 @@ value for every <span class="math notranslate nohighlight">\(x\)</span>.The <code class="docutils literal notranslate"><span class="pre">ext</span></code> tactic enables us to prove an equation between functions by proving that their values are the same at all the values of their arguments.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="k">fun</span> <span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">↦</span> <span class="o">(</span><span class="n">x</span> <span class="bp">+</span> <span class="n">y</span><span class="o">)</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="bp">=</span> <span class="k">fun</span> <span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">↦</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">y</span> <span class="bp">+</span> <span class="n">y</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ext</span> <span class="n">ring</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">ext</span> <span class="w"> </span><span class="n">ring</span> </pre></div> </div> <p id="index-25">We’ll see later that <code class="docutils literal notranslate"><span class="pre">ext</span></code> is actually more general, and also one can
-
@@ -1628,9 +1628,9 @@ above proof.The second tactic, the <code class="docutils literal notranslate"><span class="pre">congr</span></code> tactic, allows us to prove an equation between two expressions by reconciling the parts that are different:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="bp">|</span><span class="n">a</span><span class="bp">|</span> <span class="bp">=</span> <span class="bp">|</span><span class="n">a</span> <span class="bp">-</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">b</span><span class="bp">|</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">congr</span> <span class="n">ring</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">|</span><span class="n">a</span><span class="bp">|</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">|</span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="bp">|</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">congr</span> <span class="w"> </span><span class="n">ring</span> </pre></div> </div> <p>Here the <code class="docutils literal notranslate"><span class="pre">congr</span></code> tactic peels off the <code class="docutils literal notranslate"><span class="pre">abs</span></code> on each side,
-
@@ -1646,10 +1646,10 @@ Instead, the <code class="docutils literal notranslate"><span class="pre">converas it is, and leaves us with the task of proving the equations that are needed to make the goal match.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">a</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="mi">1</span> <span class="bp"><</span> <span class="n">a</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">convert</span> <span class="o">(</span><span class="n">mul_lt_mul_right</span> <span class="n">_</span><span class="o">)</span><span class="bp">.</span><span class="mi">2</span> <span class="n">h</span> <span class="bp">·</span> <span class="n">rw</span> <span class="o">[</span><span class="n">one_mul</span><span class="o">]</span> <span class="n">exact</span> <span class="n">lt_trans</span> <span class="n">zero_lt_one</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">convert</span><span class="w"> </span><span class="o">(</span><span class="n">mul_lt_mul_right</span><span class="w"> </span><span class="n">_</span><span class="o">)</span><span class="bp">.</span><span class="mi">2</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">one_mul</span><span class="o">]</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">lt_trans</span><span class="w"> </span><span class="n">zero_lt_one</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>This example illustrates another useful trick: when we apply an
-
@@ -1658,12 +1658,12 @@ and Lean can’t fill it in for us automatically,it simply leaves it for us as another goal.</p> <p>The following shows that any constant sequence <span class="math notranslate nohighlight">\(a, a, a, \ldots\)</span> converges.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">convergesTo_const</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">ConvergesTo</span> <span class="o">(</span><span class="k">fun</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">↦</span> <span class="n">a</span><span class="o">)</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">ε</span> <span class="n">εpos</span> <span class="n">use</span> <span class="mi">0</span> <span class="n">intro</span> <span class="n">n</span> <span class="n">nge</span> <span class="n">rw</span> <span class="o">[</span><span class="n">sub_self</span><span class="o">,</span> <span class="n">abs_zero</span><span class="o">]</span> <span class="n">apply</span> <span class="n">εpos</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">convergesTo_const</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ConvergesTo</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="n">εpos</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="mi">0</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">nge</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">sub_self</span><span class="o">,</span><span class="w"> </span><span class="n">abs_zero</span><span class="o">]</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">εpos</span> </pre></div> </div> <p>Lean has a tactic, <code class="docutils literal notranslate"><span class="pre">simp</span></code>, which can often save you the
-
@@ -1687,16 +1687,16 @@ the sequence <code class="docutils literal notranslate"><span class="pre">fun</sof <code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre">+</span> <span class="pre">b</span></code>. The following example begins to implement this strategy. See if you can finish it off.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">convergesTo_add</span> <span class="o">{</span><span class="n">s</span> <span class="n">t</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">cs</span> <span class="o">:</span> <span class="n">ConvergesTo</span> <span class="n">s</span> <span class="n">a</span><span class="o">)</span> <span class="o">(</span><span class="n">ct</span> <span class="o">:</span> <span class="n">ConvergesTo</span> <span class="n">t</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="n">ConvergesTo</span> <span class="o">(</span><span class="k">fun</span> <span class="n">n</span> <span class="bp">↦</span> <span class="n">s</span> <span class="n">n</span> <span class="bp">+</span> <span class="n">t</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">ε</span> <span class="n">εpos</span> <span class="n">dsimp</span> <span class="c1">-- this line is not needed but cleans up the goal a bit.</span> <span class="k">have</span> <span class="n">ε2pos</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">ε</span> <span class="bp">/</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">linarith</span> <span class="n">rcases</span> <span class="n">cs</span> <span class="o">(</span><span class="n">ε</span> <span class="bp">/</span> <span class="mi">2</span><span class="o">)</span> <span class="n">ε2pos</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">Ns</span><span class="o">,</span> <span class="n">hs</span><span class="o">⟩</span> <span class="n">rcases</span> <span class="n">ct</span> <span class="o">(</span><span class="n">ε</span> <span class="bp">/</span> <span class="mi">2</span><span class="o">)</span> <span class="n">ε2pos</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">Nt</span><span class="o">,</span> <span class="n">ht</span><span class="o">⟩</span> <span class="n">use</span> <span class="n">max</span> <span class="n">Ns</span> <span class="n">Nt</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">convergesTo_add</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span> <span class="w"> </span><span class="o">(</span><span class="n">cs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ConvergesTo</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">ct</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ConvergesTo</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">ConvergesTo</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="n">εpos</span> <span class="w"> </span><span class="n">dsimp</span><span class="w"> </span><span class="c1">-- this line is not needed but cleans up the goal a bit.</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">ε2pos</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">linarith</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">cs</span><span class="w"> </span><span class="o">(</span><span class="n">ε</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="n">ε2pos</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">Ns</span><span class="o">,</span><span class="w"> </span><span class="n">hs</span><span class="o">⟩</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">ct</span><span class="w"> </span><span class="o">(</span><span class="n">ε</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="n">ε2pos</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">Nt</span><span class="o">,</span><span class="w"> </span><span class="n">ht</span><span class="o">⟩</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">max</span><span class="w"> </span><span class="n">Ns</span><span class="w"> </span><span class="n">Nt</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>As hints, you can use <code class="docutils literal notranslate"><span class="pre">le_of_max_le_left</span></code> and <code class="docutils literal notranslate"><span class="pre">le_of_max_le_right</span></code>,
-
@@ -1718,27 +1718,27 @@ is equal to zero or not.We have taken care of the zero case, and we have left you to prove the result with the extra assumption that <code class="docutils literal notranslate"><span class="pre">c</span></code> is nonzero.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">convergesTo_mul_const</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">{</span><span class="n">a</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">c</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">cs</span> <span class="o">:</span> <span class="n">ConvergesTo</span> <span class="n">s</span> <span class="n">a</span><span class="o">)</span> <span class="o">:</span> <span class="n">ConvergesTo</span> <span class="o">(</span><span class="k">fun</span> <span class="n">n</span> <span class="bp">↦</span> <span class="n">c</span> <span class="bp">*</span> <span class="n">s</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">c</span> <span class="bp">*</span> <span class="n">a</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">by_cases</span> <span class="n">h</span> <span class="o">:</span> <span class="n">c</span> <span class="bp">=</span> <span class="mi">0</span> <span class="bp">·</span> <span class="n">convert</span> <span class="n">convergesTo_const</span> <span class="mi">0</span> <span class="bp">·</span> <span class="n">rw</span> <span class="o">[</span><span class="n">h</span><span class="o">]</span> <span class="n">ring</span> <span class="n">rw</span> <span class="o">[</span><span class="n">h</span><span class="o">]</span> <span class="n">ring</span> <span class="k">have</span> <span class="n">acpos</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="bp">|</span><span class="n">c</span><span class="bp">|</span> <span class="o">:=</span> <span class="n">abs_pos.mpr</span> <span class="n">h</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">convergesTo_mul_const</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">cs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ConvergesTo</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">ConvergesTo</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">by_cases</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">convert</span><span class="w"> </span><span class="n">convergesTo_const</span><span class="w"> </span><span class="mi">0</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">h</span><span class="o">]</span> <span class="w"> </span><span class="n">ring</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">h</span><span class="o">]</span> <span class="w"> </span><span class="n">ring</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">acpos</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">|</span><span class="n">c</span><span class="bp">|</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">abs_pos.mpr</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>The next theorem is also independently interesting: it shows that a convergent sequence is eventually bounded in absolute value. We have started you off; see if you can finish it.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">exists_abs_le_of_convergesTo</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">{</span><span class="n">a</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">cs</span> <span class="o">:</span> <span class="n">ConvergesTo</span> <span class="n">s</span> <span class="n">a</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">N</span> <span class="n">b</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="n">N</span> <span class="bp">≤</span> <span class="n">n</span> <span class="bp">→</span> <span class="bp">|</span><span class="n">s</span> <span class="n">n</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rcases</span> <span class="n">cs</span> <span class="mi">1</span> <span class="n">zero_lt_one</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">N</span><span class="o">,</span> <span class="n">h</span><span class="o">⟩</span> <span class="n">use</span> <span class="n">N</span><span class="o">,</span> <span class="bp">|</span><span class="n">a</span><span class="bp">|</span> <span class="bp">+</span> <span class="mi">1</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">exists_abs_le_of_convergesTo</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">cs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ConvergesTo</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">|</span><span class="n">s</span><span class="w"> </span><span class="n">n</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">cs</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">zero_lt_one</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">N</span><span class="o">,</span><span class="w"> </span><span class="n">h</span><span class="o">⟩</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">N</span><span class="o">,</span><span class="w"> </span><span class="bp">|</span><span class="n">a</span><span class="bp">|</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>In fact, the theorem could be strengthened to assert
-
@@ -1753,31 +1753,31 @@ To do so, we use the previous theorem to find a <code class="docutils literal nothat bounds <code class="docutils literal notranslate"><span class="pre">s</span></code> beyond some point <code class="docutils literal notranslate"><span class="pre">N₀</span></code>. See if you can understand the strategy we have outlined and finish the proof.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">aux</span> <span class="o">{</span><span class="n">s</span> <span class="n">t</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">{</span><span class="n">a</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">cs</span> <span class="o">:</span> <span class="n">ConvergesTo</span> <span class="n">s</span> <span class="n">a</span><span class="o">)</span> <span class="o">(</span><span class="n">ct</span> <span class="o">:</span> <span class="n">ConvergesTo</span> <span class="n">t</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="n">ConvergesTo</span> <span class="o">(</span><span class="k">fun</span> <span class="n">n</span> <span class="bp">↦</span> <span class="n">s</span> <span class="n">n</span> <span class="bp">*</span> <span class="n">t</span> <span class="n">n</span><span class="o">)</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">ε</span> <span class="n">εpos</span> <span class="n">dsimp</span> <span class="n">rcases</span> <span class="n">exists_abs_le_of_convergesTo</span> <span class="n">cs</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">N₀</span><span class="o">,</span> <span class="n">B</span><span class="o">,</span> <span class="n">h₀</span><span class="o">⟩</span> <span class="k">have</span> <span class="n">Bpos</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">B</span> <span class="o">:=</span> <span class="n">lt_of_le_of_lt</span> <span class="o">(</span><span class="n">abs_nonneg</span> <span class="n">_</span><span class="o">)</span> <span class="o">(</span><span class="n">h₀</span> <span class="n">N₀</span> <span class="o">(</span><span class="n">le_refl</span> <span class="n">_</span><span class="o">))</span> <span class="k">have</span> <span class="n">pos₀</span> <span class="o">:</span> <span class="n">ε</span> <span class="bp">/</span> <span class="n">B</span> <span class="bp">></span> <span class="mi">0</span> <span class="o">:=</span> <span class="n">div_pos</span> <span class="n">εpos</span> <span class="n">Bpos</span> <span class="n">rcases</span> <span class="n">ct</span> <span class="n">_</span> <span class="n">pos₀</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">N₁</span><span class="o">,</span> <span class="n">h₁</span><span class="o">⟩</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">aux</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">cs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ConvergesTo</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">ct</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ConvergesTo</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">ConvergesTo</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="n">εpos</span> <span class="w"> </span><span class="n">dsimp</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">exists_abs_le_of_convergesTo</span><span class="w"> </span><span class="n">cs</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">N₀</span><span class="o">,</span><span class="w"> </span><span class="n">B</span><span class="o">,</span><span class="w"> </span><span class="n">h₀</span><span class="o">⟩</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">Bpos</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">lt_of_le_of_lt</span><span class="w"> </span><span class="o">(</span><span class="n">abs_nonneg</span><span class="w"> </span><span class="n">_</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₀</span><span class="w"> </span><span class="n">N₀</span><span class="w"> </span><span class="o">(</span><span class="n">le_refl</span><span class="w"> </span><span class="n">_</span><span class="o">))</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">pos₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">div_pos</span><span class="w"> </span><span class="n">εpos</span><span class="w"> </span><span class="n">Bpos</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">ct</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">pos₀</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">N₁</span><span class="o">,</span><span class="w"> </span><span class="n">h₁</span><span class="o">⟩</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>If you have made it this far, congratulations! We are now within striking distance of our theorem. The following proof finishes it off.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">convergesTo_mul</span> <span class="o">{</span><span class="n">s</span> <span class="n">t</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">cs</span> <span class="o">:</span> <span class="n">ConvergesTo</span> <span class="n">s</span> <span class="n">a</span><span class="o">)</span> <span class="o">(</span><span class="n">ct</span> <span class="o">:</span> <span class="n">ConvergesTo</span> <span class="n">t</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="n">ConvergesTo</span> <span class="o">(</span><span class="k">fun</span> <span class="n">n</span> <span class="bp">↦</span> <span class="n">s</span> <span class="n">n</span> <span class="bp">*</span> <span class="n">t</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">have</span> <span class="n">h₁</span> <span class="o">:</span> <span class="n">ConvergesTo</span> <span class="o">(</span><span class="k">fun</span> <span class="n">n</span> <span class="bp">↦</span> <span class="n">s</span> <span class="n">n</span> <span class="bp">*</span> <span class="o">(</span><span class="n">t</span> <span class="n">n</span> <span class="bp">+</span> <span class="bp">-</span><span class="n">b</span><span class="o">))</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">aux</span> <span class="n">cs</span> <span class="n">convert</span> <span class="n">convergesTo_add</span> <span class="n">ct</span> <span class="o">(</span><span class="n">convergesTo_const</span> <span class="o">(</span><span class="bp">-</span><span class="n">b</span><span class="o">))</span> <span class="n">ring</span> <span class="k">have</span> <span class="o">:=</span> <span class="n">convergesTo_add</span> <span class="n">h₁</span> <span class="o">(</span><span class="n">convergesTo_mul_const</span> <span class="n">b</span> <span class="n">cs</span><span class="o">)</span> <span class="n">convert</span> <span class="n">convergesTo_add</span> <span class="n">h₁</span> <span class="o">(</span><span class="n">convergesTo_mul_const</span> <span class="n">b</span> <span class="n">cs</span><span class="o">)</span> <span class="n">using</span> <span class="mi">1</span> <span class="bp">·</span> <span class="n">ext</span><span class="bp">;</span> <span class="n">ring</span> <span class="n">ring</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">convergesTo_mul</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span> <span class="w"> </span><span class="o">(</span><span class="n">cs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ConvergesTo</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">ct</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ConvergesTo</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">ConvergesTo</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ConvergesTo</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">t</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="bp">-</span><span class="n">b</span><span class="o">))</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">aux</span><span class="w"> </span><span class="n">cs</span> <span class="w"> </span><span class="n">convert</span><span class="w"> </span><span class="n">convergesTo_add</span><span class="w"> </span><span class="n">ct</span><span class="w"> </span><span class="o">(</span><span class="n">convergesTo_const</span><span class="w"> </span><span class="o">(</span><span class="bp">-</span><span class="n">b</span><span class="o">))</span> <span class="w"> </span><span class="n">ring</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">convergesTo_add</span><span class="w"> </span><span class="n">h₁</span><span class="w"> </span><span class="o">(</span><span class="n">convergesTo_mul_const</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">cs</span><span class="o">)</span> <span class="w"> </span><span class="n">convert</span><span class="w"> </span><span class="n">convergesTo_add</span><span class="w"> </span><span class="n">h₁</span><span class="w"> </span><span class="o">(</span><span class="n">convergesTo_mul_const</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">cs</span><span class="o">)</span><span class="w"> </span><span class="n">using</span><span class="w"> </span><span class="mi">1</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">ext</span><span class="bp">;</span><span class="w"> </span><span class="n">ring</span> <span class="w"> </span><span class="n">ring</span> </pre></div> </div> <p>For another challenging exercise,
-
@@ -1785,22 +1785,22 @@ try filling out the following sketch of a proof that limitsare unique. (If you are feeling bold, you can delete the proof sketch and try proving it from scratch.)</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">convergesTo_unique</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">sa</span> <span class="o">:</span> <span class="n">ConvergesTo</span> <span class="n">s</span> <span class="n">a</span><span class="o">)</span> <span class="o">(</span><span class="n">sb</span> <span class="o">:</span> <span class="n">ConvergesTo</span> <span class="n">s</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">by_contra</span> <span class="n">abne</span> <span class="k">have</span> <span class="o">:</span> <span class="bp">|</span><span class="n">a</span> <span class="bp">-</span> <span class="n">b</span><span class="bp">|</span> <span class="bp">></span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">let</span> <span class="n">ε</span> <span class="o">:=</span> <span class="bp">|</span><span class="n">a</span> <span class="bp">-</span> <span class="n">b</span><span class="bp">|</span> <span class="bp">/</span> <span class="mi">2</span> <span class="k">have</span> <span class="n">εpos</span> <span class="o">:</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">change</span> <span class="bp">|</span><span class="n">a</span> <span class="bp">-</span> <span class="n">b</span><span class="bp">|</span> <span class="bp">/</span> <span class="mi">2</span> <span class="bp">></span> <span class="mi">0</span> <span class="n">linarith</span> <span class="n">rcases</span> <span class="n">sa</span> <span class="n">ε</span> <span class="n">εpos</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">Na</span><span class="o">,</span> <span class="n">hNa</span><span class="o">⟩</span> <span class="n">rcases</span> <span class="n">sb</span> <span class="n">ε</span> <span class="n">εpos</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">Nb</span><span class="o">,</span> <span class="n">hNb</span><span class="o">⟩</span> <span class="k">let</span> <span class="n">N</span> <span class="o">:=</span> <span class="n">max</span> <span class="n">Na</span> <span class="n">Nb</span> <span class="k">have</span> <span class="n">absa</span> <span class="o">:</span> <span class="bp">|</span><span class="n">s</span> <span class="n">N</span> <span class="bp">-</span> <span class="n">a</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="n">absb</span> <span class="o">:</span> <span class="bp">|</span><span class="n">s</span> <span class="n">N</span> <span class="bp">-</span> <span class="n">b</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="o">:</span> <span class="bp">|</span><span class="n">a</span> <span class="bp">-</span> <span class="n">b</span><span class="bp">|</span> <span class="bp"><</span> <span class="bp">|</span><span class="n">a</span> <span class="bp">-</span> <span class="n">b</span><span class="bp">|</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">exact</span> <span class="n">lt_irrefl</span> <span class="n">_</span> <span class="n">this</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">convergesTo_unique</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span> <span class="w"> </span><span class="o">(</span><span class="n">sa</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ConvergesTo</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">sb</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ConvergesTo</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">by_contra</span><span class="w"> </span><span class="n">abne</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">|</span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="bp">|</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="bp">|</span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="bp">|</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">εpos</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">change</span><span class="w"> </span><span class="bp">|</span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="bp">|</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span> <span class="w"> </span><span class="n">linarith</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">sa</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="n">εpos</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">Na</span><span class="o">,</span><span class="w"> </span><span class="n">hNa</span><span class="o">⟩</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">sb</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="n">εpos</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">Nb</span><span class="o">,</span><span class="w"> </span><span class="n">hNb</span><span class="o">⟩</span> <span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">max</span><span class="w"> </span><span class="n">Na</span><span class="w"> </span><span class="n">Nb</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">absa</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">|</span><span class="n">s</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">a</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">absb</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">|</span><span class="n">s</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">|</span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">|</span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="bp">|</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">lt_irrefl</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">this</span> </pre></div> </div> <p>We close the section with the observation that our proofs can be generalized.
-
@@ -1809,10 +1809,10 @@ natural numbers is that their structure carries a partial orderwith <code class="docutils literal notranslate"><span class="pre">min</span></code> and <code class="docutils literal notranslate"><span class="pre">max</span></code>. You can check that everything still works if you replace <code class="docutils literal notranslate"><span class="pre">ℕ</span></code> everywhere by any linear order <code class="docutils literal notranslate"><span class="pre">α</span></code>:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">LinearOrder</span> <span class="n">α</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">LinearOrder</span><span class="w"> </span><span class="n">α</span><span class="o">]</span> <span class="kd">def</span> <span class="n">ConvergesTo'</span> <span class="o">(</span><span class="n">s</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:=</span> <span class="bp">∀</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">N</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">n</span> <span class="bp">≥</span> <span class="n">N</span><span class="o">,</span> <span class="bp">|</span><span class="n">s</span> <span class="n">n</span> <span class="bp">-</span> <span class="n">a</span><span class="bp">|</span> <span class="bp"><</span> <span class="n">ε</span> <span class="kd">def</span><span class="w"> </span><span class="n">ConvergesTo'</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">N</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="n">N</span><span class="o">,</span><span class="w"> </span><span class="bp">|</span><span class="n">s</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">a</span><span class="bp">|</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span> </pre></div> </div> <p>In <a class="reference internal" href="C09_Topology.html#filters"><span class="std std-numref">Section 9.1</span></a>, we will see that Mathlib has mechanisms
-
-
-
@@ -18,7 +18,7 @@<script src="_static/jquery.js?v=5d32c60e"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/documentation_options.js?v=2709fde1"></script> <script src="_static/doctools.js?v=888ff710"></script> <script src="_static/doctools.js?v=9a2dae69"></script> <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script>
-
@@ -156,69 +156,69 @@ Unlike <code class="docutils literal notranslate"><span class="pre">rw</span></cinside a universal or existential quantifier. If you step through the proof, you can see the effects of these commands.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">s</span> <span class="n">t</span> <span class="n">u</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">α</span><span class="o">)</span> <span class="kn">open</span> <span class="n">Set</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">⊆</span> <span class="n">t</span><span class="o">)</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">u</span> <span class="bp">⊆</span> <span class="n">t</span> <span class="bp">∩</span> <span class="n">u</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">subset_def</span><span class="o">,</span> <span class="n">inter_def</span><span class="o">,</span> <span class="n">inter_def</span><span class="o">]</span> <span class="n">rw</span> <span class="o">[</span><span class="n">subset_def</span><span class="o">]</span> <span class="n">at</span> <span class="n">h</span> <span class="n">simp</span> <span class="n">only</span> <span class="o">[</span><span class="n">mem_setOf</span><span class="o">]</span> <span class="n">rintro</span> <span class="n">x</span> <span class="o">⟨</span><span class="n">xs</span><span class="o">,</span> <span class="n">xu</span><span class="o">⟩</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">h</span> <span class="n">_</span> <span class="n">xs</span><span class="o">,</span> <span class="n">xu</span><span class="o">⟩</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">⊆</span> <span class="n">t</span><span class="o">)</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">u</span> <span class="bp">⊆</span> <span class="n">t</span> <span class="bp">∩</span> <span class="n">u</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="n">only</span> <span class="o">[</span><span class="n">subset_def</span><span class="o">,</span> <span class="n">mem_inter_iff</span><span class="o">]</span> <span class="n">at</span> <span class="bp">*</span> <span class="n">rintro</span> <span class="n">x</span> <span class="o">⟨</span><span class="n">xs</span><span class="o">,</span> <span class="n">xu</span><span class="o">⟩</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">h</span> <span class="n">_</span> <span class="n">xs</span><span class="o">,</span> <span class="n">xu</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="kn">open</span><span class="w"> </span><span class="n">Set</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">subset_def</span><span class="o">,</span><span class="w"> </span><span class="n">inter_def</span><span class="o">,</span><span class="w"> </span><span class="n">inter_def</span><span class="o">]</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">subset_def</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="n">only</span><span class="w"> </span><span class="o">[</span><span class="n">mem_setOf</span><span class="o">]</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">⟨</span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xu</span><span class="o">⟩</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">h</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xu</span><span class="o">⟩</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="n">only</span><span class="w"> </span><span class="o">[</span><span class="n">subset_def</span><span class="o">,</span><span class="w"> </span><span class="n">mem_inter_iff</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="bp">*</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">⟨</span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xu</span><span class="o">⟩</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">h</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xu</span><span class="o">⟩</span> </pre></div> </div> <p>In this example, we open the <code class="docutils literal notranslate"><span class="pre">set</span></code> namespace to have access to the shorter names for the theorems. But, in fact, we can delete the calls to <code class="docutils literal notranslate"><span class="pre">rw</span></code> and <code class="docutils literal notranslate"><span class="pre">simp</span></code> entirely:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">⊆</span> <span class="n">t</span><span class="o">)</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">u</span> <span class="bp">⊆</span> <span class="n">t</span> <span class="bp">∩</span> <span class="n">u</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">x</span> <span class="n">xsu</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">h</span> <span class="n">xsu.1</span><span class="o">,</span> <span class="n">xsu.2</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">xsu</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">h</span><span class="w"> </span><span class="n">xsu</span><span class="bp">.</span><span class="mi">1</span><span class="o">,</span><span class="w"> </span><span class="n">xsu</span><span class="bp">.</span><span class="mi">2</span><span class="o">⟩</span> </pre></div> </div> <p>What is going on here is known as <em>definitional reduction</em>: to make sense of the <code class="docutils literal notranslate"><span class="pre">intro</span></code> command and the anonymous constructors Lean is forced to expand the definitions. The following example also illustrate the phenomenon:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">⊆</span> <span class="n">t</span><span class="o">)</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">u</span> <span class="bp">⊆</span> <span class="n">t</span> <span class="bp">∩</span> <span class="n">u</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">x</span> <span class="o">⟨</span><span class="n">xs</span><span class="o">,</span> <span class="n">xu</span><span class="o">⟩</span> <span class="bp">↦</span> <span class="o">⟨</span><span class="n">h</span> <span class="n">xs</span><span class="o">,</span> <span class="n">xu</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">⟨</span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xu</span><span class="o">⟩</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">⟨</span><span class="n">h</span><span class="w"> </span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xu</span><span class="o">⟩</span> </pre></div> </div> <p>To deal with unions, we can use <code class="docutils literal notranslate"><span class="pre">Set.union_def</span></code> and <code class="docutils literal notranslate"><span class="pre">Set.mem_union</span></code>. Since <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">∈</span> <span class="pre">s</span> <span class="pre">∪</span> <span class="pre">t</span></code> unfolds to <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">∈</span> <span class="pre">s</span> <span class="pre">∨</span> <span class="pre">x</span> <span class="pre">∈</span> <span class="pre">t</span></code>, we can also use the <code class="docutils literal notranslate"><span class="pre">cases</span></code> tactic to force a definitional reduction.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∩</span> <span class="o">(</span><span class="n">t</span> <span class="bp">∪</span> <span class="n">u</span><span class="o">)</span> <span class="bp">⊆</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">t</span> <span class="bp">∪</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">u</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">x</span> <span class="n">hx</span> <span class="k">have</span> <span class="n">xs</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s</span> <span class="o">:=</span> <span class="n">hx.1</span> <span class="k">have</span> <span class="n">xtu</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">t</span> <span class="bp">∪</span> <span class="n">u</span> <span class="o">:=</span> <span class="n">hx.2</span> <span class="n">rcases</span> <span class="n">xtu</span> <span class="k">with</span> <span class="n">xt</span> <span class="bp">|</span> <span class="n">xu</span> <span class="bp">·</span> <span class="n">left</span> <span class="k">show</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">t</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">xs</span><span class="o">,</span> <span class="n">xt</span><span class="o">⟩</span> <span class="bp">.</span> <span class="n">right</span> <span class="k">show</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">u</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">xs</span><span class="o">,</span> <span class="n">xu</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="o">(</span><span class="n">t</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">u</span><span class="o">)</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">hx</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">hx</span><span class="bp">.</span><span class="mi">1</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">xtu</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">hx</span><span class="bp">.</span><span class="mi">2</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">xtu</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">xt</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">xu</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">left</span> <span class="w"> </span><span class="k">show</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xt</span><span class="o">⟩</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">right</span> <span class="w"> </span><span class="k">show</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">u</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xu</span><span class="o">⟩</span> </pre></div> </div> <p>Since intersection binds tighter than union, the use of parentheses in the expression <code class="docutils literal notranslate"><span class="pre">(s</span> <span class="pre">∩</span> <span class="pre">t)</span> <span class="pre">∪</span> <span class="pre">(s</span> <span class="pre">∩</span> <span class="pre">u)</span></code> is unnecessary, but they make the meaning of the expression clearer. The following is a shorter proof of the same fact:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∩</span> <span class="o">(</span><span class="n">t</span> <span class="bp">∪</span> <span class="n">u</span><span class="o">)</span> <span class="bp">⊆</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">t</span> <span class="bp">∪</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">u</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rintro</span> <span class="n">x</span> <span class="o">⟨</span><span class="n">xs</span><span class="o">,</span> <span class="n">xt</span> <span class="bp">|</span> <span class="n">xu</span><span class="o">⟩</span> <span class="bp">·</span> <span class="n">left</span><span class="bp">;</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">xs</span><span class="o">,</span> <span class="n">xt</span><span class="o">⟩</span> <span class="bp">.</span> <span class="n">right</span><span class="bp">;</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">xs</span><span class="o">,</span> <span class="n">xu</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="o">(</span><span class="n">t</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">u</span><span class="o">)</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">⟨</span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xt</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">xu</span><span class="o">⟩</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">left</span><span class="bp">;</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xt</span><span class="o">⟩</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">right</span><span class="bp">;</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xu</span><span class="o">⟩</span> </pre></div> </div> <p>As an exercise, try proving the other inclusion:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">t</span> <span class="bp">∪</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">u</span> <span class="bp">⊆</span> <span class="n">s</span> <span class="bp">∩</span> <span class="o">(</span><span class="n">t</span> <span class="bp">∪</span> <span class="n">u</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="o">(</span><span class="n">t</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">u</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>It might help to know that when using <code class="docutils literal notranslate"><span class="pre">rintro</span></code>,
-
@@ -233,28 +233,28 @@ It can be rewritten manually using <code class="docutils literal notranslate"><sor <code class="docutils literal notranslate"><span class="pre">Set.mem_diff</span></code>, but the following two proofs of the same inclusion show how to avoid using them.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">s</span> <span class="bp">\</span> <span class="n">t</span><span class="o">)</span> <span class="bp">\</span> <span class="n">u</span> <span class="bp">⊆</span> <span class="n">s</span> <span class="bp">\</span> <span class="o">(</span><span class="n">t</span> <span class="bp">∪</span> <span class="n">u</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">x</span> <span class="n">xstu</span> <span class="k">have</span> <span class="n">xs</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s</span> <span class="o">:=</span> <span class="n">xstu.1.1</span> <span class="k">have</span> <span class="n">xnt</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∉</span> <span class="n">t</span> <span class="o">:=</span> <span class="n">xstu.1.2</span> <span class="k">have</span> <span class="n">xnu</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∉</span> <span class="n">u</span> <span class="o">:=</span> <span class="n">xstu.2</span> <span class="n">constructor</span> <span class="bp">·</span> <span class="n">exact</span> <span class="n">xs</span> <span class="n">intro</span> <span class="n">xtu</span> <span class="c1">-- x ∈ t ∨ x ∈ u</span> <span class="n">rcases</span> <span class="n">xtu</span> <span class="k">with</span> <span class="n">xt</span> <span class="bp">|</span> <span class="n">xu</span> <span class="bp">·</span> <span class="k">show</span> <span class="n">False</span><span class="bp">;</span> <span class="n">exact</span> <span class="n">xnt</span> <span class="n">xt</span> <span class="bp">.</span> <span class="k">show</span> <span class="n">False</span><span class="bp">;</span> <span class="n">exact</span> <span class="n">xnu</span> <span class="n">xu</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">s</span> <span class="bp">\</span> <span class="n">t</span><span class="o">)</span> <span class="bp">\</span> <span class="n">u</span> <span class="bp">⊆</span> <span class="n">s</span> <span class="bp">\</span> <span class="o">(</span><span class="n">t</span> <span class="bp">∪</span> <span class="n">u</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rintro</span> <span class="n">x</span> <span class="o">⟨⟨</span><span class="n">xs</span><span class="o">,</span> <span class="n">xnt</span><span class="o">⟩,</span> <span class="n">xnu</span><span class="o">⟩</span> <span class="n">use</span> <span class="n">xs</span> <span class="n">rintro</span> <span class="o">(</span><span class="n">xt</span> <span class="bp">|</span> <span class="n">xu</span><span class="o">)</span> <span class="bp"><;></span> <span class="n">contradiction</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="o">(</span><span class="n">t</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">u</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">xstu</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">xstu</span><span class="bp">.</span><span class="mi">1</span><span class="bp">.</span><span class="mi">1</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">xnt</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∉</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">xstu</span><span class="bp">.</span><span class="mi">1</span><span class="bp">.</span><span class="mi">2</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">xnu</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∉</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">xstu</span><span class="bp">.</span><span class="mi">2</span> <span class="w"> </span><span class="n">constructor</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">xs</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">xtu</span> <span class="w"> </span><span class="c1">-- x ∈ t ∨ x ∈ u</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">xtu</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">xt</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">xu</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="k">show</span><span class="w"> </span><span class="n">False</span><span class="bp">;</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">xnt</span><span class="w"> </span><span class="n">xt</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="k">show</span><span class="w"> </span><span class="n">False</span><span class="bp">;</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">xnu</span><span class="w"> </span><span class="n">xu</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="o">(</span><span class="n">t</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">u</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">⟨⟨</span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xnt</span><span class="o">⟩,</span><span class="w"> </span><span class="n">xnu</span><span class="o">⟩</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">xs</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="o">(</span><span class="n">xt</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">xu</span><span class="o">)</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">contradiction</span> </pre></div> </div> <p>As an exercise, prove the reverse inclusion:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">\</span> <span class="o">(</span><span class="n">t</span> <span class="bp">∪</span> <span class="n">u</span><span class="o">)</span> <span class="bp">⊆</span> <span class="o">(</span><span class="n">s</span> <span class="bp">\</span> <span class="n">t</span><span class="o">)</span> <span class="bp">\</span> <span class="n">u</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="o">(</span><span class="n">t</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">u</span><span class="o">)</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>To prove that two sets are equal,
-
@@ -263,57 +263,57 @@ of the other.This principle is known as “extensionality,” and, unsurprisingly, the <code class="docutils literal notranslate"><span class="pre">ext</span></code> tactic is equipped to handle it.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">t</span> <span class="bp">=</span> <span class="n">t</span> <span class="bp">∩</span> <span class="n">s</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ext</span> <span class="n">x</span> <span class="n">simp</span> <span class="n">only</span> <span class="o">[</span><span class="n">mem_inter_iff</span><span class="o">]</span> <span class="n">constructor</span> <span class="bp">·</span> <span class="n">rintro</span> <span class="o">⟨</span><span class="n">xs</span><span class="o">,</span> <span class="n">xt</span><span class="o">⟩</span><span class="bp">;</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">xt</span><span class="o">,</span> <span class="n">xs</span><span class="o">⟩</span> <span class="bp">.</span> <span class="n">rintro</span> <span class="o">⟨</span><span class="n">xt</span><span class="o">,</span> <span class="n">xs</span><span class="o">⟩</span><span class="bp">;</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">xs</span><span class="o">,</span> <span class="n">xt</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="n">only</span><span class="w"> </span><span class="o">[</span><span class="n">mem_inter_iff</span><span class="o">]</span> <span class="w"> </span><span class="n">constructor</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="o">⟨</span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xt</span><span class="o">⟩</span><span class="bp">;</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">xt</span><span class="o">,</span><span class="w"> </span><span class="n">xs</span><span class="o">⟩</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="o">⟨</span><span class="n">xt</span><span class="o">,</span><span class="w"> </span><span class="n">xs</span><span class="o">⟩</span><span class="bp">;</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xt</span><span class="o">⟩</span> </pre></div> </div> <p>Once again, deleting the line <code class="docutils literal notranslate"><span class="pre">simp</span> <span class="pre">only</span> <span class="pre">[mem_inter_iff]</span></code> does not harm the proof. In fact, if you like inscrutable proof terms, the following one-line proof is for you:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">t</span> <span class="bp">=</span> <span class="n">t</span> <span class="bp">∩</span> <span class="n">s</span> <span class="o">:=</span> <span class="n">Set.ext</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="o">⟨</span><span class="k">fun</span> <span class="o">⟨</span><span class="n">xs</span><span class="o">,</span> <span class="n">xt</span><span class="o">⟩</span> <span class="bp">↦</span> <span class="o">⟨</span><span class="n">xt</span><span class="o">,</span> <span class="n">xs</span><span class="o">⟩,</span> <span class="k">fun</span> <span class="o">⟨</span><span class="n">xt</span><span class="o">,</span> <span class="n">xs</span><span class="o">⟩</span> <span class="bp">↦</span> <span class="o">⟨</span><span class="n">xs</span><span class="o">,</span> <span class="n">xt</span><span class="o">⟩⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Set.ext</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">⟨</span><span class="k">fun</span><span class="w"> </span><span class="o">⟨</span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xt</span><span class="o">⟩</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">⟨</span><span class="n">xt</span><span class="o">,</span><span class="w"> </span><span class="n">xs</span><span class="o">⟩,</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="o">⟨</span><span class="n">xt</span><span class="o">,</span><span class="w"> </span><span class="n">xs</span><span class="o">⟩</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">⟨</span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xt</span><span class="o">⟩⟩</span> </pre></div> </div> <p>Here is an even shorter proof, using the simplifier:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">t</span> <span class="bp">=</span> <span class="n">t</span> <span class="bp">∩</span> <span class="n">s</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ext</span> <span class="n">x</span><span class="bp">;</span> <span class="n">simp</span> <span class="o">[</span><span class="n">and_comm</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="n">x</span><span class="bp">;</span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">and_comm</span><span class="o">]</span> </pre></div> </div> <p>An alternative to using <code class="docutils literal notranslate"><span class="pre">ext</span></code> is to use the theorem <code class="docutils literal notranslate"><span class="pre">Subset.antisymm</span></code> which allows us to prove an equation <code class="docutils literal notranslate"><span class="pre">s</span> <span class="pre">=</span> <span class="pre">t</span></code> between sets by proving <code class="docutils literal notranslate"><span class="pre">s</span> <span class="pre">⊆</span> <span class="pre">t</span></code> and <code class="docutils literal notranslate"><span class="pre">t</span> <span class="pre">⊆</span> <span class="pre">s</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">t</span> <span class="bp">=</span> <span class="n">t</span> <span class="bp">∩</span> <span class="n">s</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">Subset.antisymm</span> <span class="bp">·</span> <span class="n">rintro</span> <span class="n">x</span> <span class="o">⟨</span><span class="n">xs</span><span class="o">,</span> <span class="n">xt</span><span class="o">⟩</span><span class="bp">;</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">xt</span><span class="o">,</span> <span class="n">xs</span><span class="o">⟩</span> <span class="bp">.</span> <span class="n">rintro</span> <span class="n">x</span> <span class="o">⟨</span><span class="n">xt</span><span class="o">,</span> <span class="n">xs</span><span class="o">⟩</span><span class="bp">;</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">xs</span><span class="o">,</span> <span class="n">xt</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">Subset.antisymm</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">⟨</span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xt</span><span class="o">⟩</span><span class="bp">;</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">xt</span><span class="o">,</span><span class="w"> </span><span class="n">xs</span><span class="o">⟩</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">⟨</span><span class="n">xt</span><span class="o">,</span><span class="w"> </span><span class="n">xs</span><span class="o">⟩</span><span class="bp">;</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">xt</span><span class="o">⟩</span> </pre></div> </div> <p>Try finishing this proof term:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">t</span> <span class="bp">=</span> <span class="n">t</span> <span class="bp">∩</span> <span class="n">s</span> <span class="o">:=</span> <span class="n">Subset.antisymm</span> <span class="gr">sorry</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Subset.antisymm</span><span class="w"> </span><span class="gr">sorry</span><span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Remember that you can replace <cite>sorry</cite> by an underscore, and when you hover over it, Lean will show you what it expects at that point.</p> <p>Here are some set-theoretic identities you might enjoy proving:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∩</span> <span class="o">(</span><span class="n">s</span> <span class="bp">∪</span> <span class="n">t</span><span class="o">)</span> <span class="bp">=</span> <span class="n">s</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∪</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">t</span> <span class="bp">=</span> <span class="n">s</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">\</span> <span class="n">t</span> <span class="bp">∪</span> <span class="n">t</span> <span class="bp">=</span> <span class="n">s</span> <span class="bp">∪</span> <span class="n">t</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">\</span> <span class="n">t</span> <span class="bp">∪</span> <span class="n">t</span> <span class="bp">\</span> <span class="n">s</span> <span class="bp">=</span> <span class="o">(</span><span class="n">s</span> <span class="bp">∪</span> <span class="n">t</span><span class="o">)</span> <span class="bp">\</span> <span class="o">(</span><span class="n">s</span> <span class="bp">∩</span> <span class="n">t</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>When it comes to representing sets,
-
@@ -329,17 +329,17 @@ In other words, sets are really properties, treated as objects.</p>The expression <code class="docutils literal notranslate"><span class="pre">{</span> <span class="pre">y</span> <span class="pre">|</span> <span class="pre">P</span> <span class="pre">y</span> <span class="pre">}</span></code> unfolds to <code class="docutils literal notranslate"><span class="pre">(fun</span> <span class="pre">y</span> <span class="pre">↦</span> <span class="pre">P</span> <span class="pre">y)</span></code>, so <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">∈</span> <span class="pre">{</span> <span class="pre">y</span> <span class="pre">|</span> <span class="pre">P</span> <span class="pre">y</span> <span class="pre">}</span></code> reduces to <code class="docutils literal notranslate"><span class="pre">P</span> <span class="pre">x</span></code>. So we can turn the property of being even into the set of even numbers:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">evens</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">ℕ</span> <span class="o">:=</span> <span class="o">{</span> <span class="n">n</span> <span class="bp">|</span> <span class="n">Even</span> <span class="n">n</span> <span class="o">}</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">evens</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">Even</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">}</span> <span class="kd">def</span> <span class="n">odds</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">ℕ</span> <span class="o">:=</span> <span class="o">{</span> <span class="n">n</span> <span class="bp">|</span> <span class="bp">¬</span><span class="n">Even</span> <span class="n">n</span> <span class="o">}</span> <span class="kd">def</span><span class="w"> </span><span class="n">odds</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="bp">¬</span><span class="n">Even</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">}</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">evens</span> <span class="bp">∪</span> <span class="n">odds</span> <span class="bp">=</span> <span class="n">univ</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">evens</span><span class="o">,</span> <span class="n">odds</span><span class="o">]</span> <span class="n">ext</span> <span class="n">n</span> <span class="n">simp</span> <span class="n">apply</span> <span class="n">Classical.em</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">evens</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">odds</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">univ</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">evens</span><span class="o">,</span><span class="w"> </span><span class="n">odds</span><span class="o">]</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="n">n</span> <span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">Classical.em</span> </pre></div> </div> <p>You should step through this proof and make sure
-
@@ -359,11 +359,11 @@ because Lean has trouble guessing which ones we mean.The following examples show how Lean unfolds the last two definitions when needed. In the second one, <code class="docutils literal notranslate"><span class="pre">trivial</span></code> is the canonical proof of <code class="docutils literal notranslate"><span class="pre">True</span></code> in the library.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="o">(</span><span class="bp">∅</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">ℕ</span><span class="o">))</span> <span class="o">:</span> <span class="n">False</span> <span class="o">:=</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="o">(</span><span class="bp">∅</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">ℕ</span><span class="o">))</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">False</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">h</span> <span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="o">(</span><span class="n">univ</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:=</span> <span class="n">trivial</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="o">(</span><span class="n">univ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">trivial</span> </pre></div> </div> <p>As an exercise, prove the following inclusion.
-
@@ -372,8 +372,8 @@ and use the simplifier to reduce theset-theoretic constructions to logic. We also recommend using the theorems <code class="docutils literal notranslate"><span class="pre">Nat.Prime.eq_two_or_odd</span></code> and <code class="docutils literal notranslate"><span class="pre">Nat.even_iff</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="o">{</span> <span class="n">n</span> <span class="bp">|</span> <span class="n">Nat.Prime</span> <span class="n">n</span> <span class="o">}</span> <span class="bp">∩</span> <span class="o">{</span> <span class="n">n</span> <span class="bp">|</span> <span class="n">n</span> <span class="bp">></span> <span class="mi">2</span> <span class="o">}</span> <span class="bp">⊆</span> <span class="o">{</span> <span class="n">n</span> <span class="bp">|</span> <span class="bp">¬</span><span class="n">Even</span> <span class="n">n</span> <span class="o">}</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="bp">¬</span><span class="n">Even</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Be careful: it is somewhat confusing that the library has multiple versions
-
@@ -382,21 +382,21 @@ The most general one makes sense in any commutative monoid with a zero element.The predicate <code class="docutils literal notranslate"><span class="pre">Nat.Prime</span></code> is specific to the natural numbers. Fortunately, there is a theorem that says that in the specific case, the two notions agree, so you can always rewrite one to the other.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#print</span> <span class="n">Prime</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#print</span><span class="w"> </span><span class="n">Prime</span> <span class="k">#print</span> <span class="n">Nat.Prime</span> <span class="k">#print</span><span class="w"> </span><span class="n">Nat.Prime</span> <span class="kd">example</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="n">Prime</span> <span class="n">n</span> <span class="bp">↔</span> <span class="n">Nat.Prime</span> <span class="n">n</span> <span class="o">:=</span> <span class="n">Nat.prime_iff.symm</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Prime</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Nat.prime_iff.symm</span> <span class="kd">example</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">Prime</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">Nat.Prime</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">Nat.prime_iff</span><span class="o">]</span> <span class="n">exact</span> <span class="n">h</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Prime</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">Nat.prime_iff</span><span class="o">]</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p id="index-2">The <cite>rwa</cite> tactic follows a rewrite with the assumption tactic.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">Prime</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">Nat.Prime</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rwa</span> <span class="o">[</span><span class="n">Nat.prime_iff</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Prime</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rwa</span><span class="w"> </span><span class="o">[</span><span class="n">Nat.prime_iff</span><span class="o">]</span> </pre></div> </div> <p id="index-3">Lean introduces the notation <code class="docutils literal notranslate"><span class="pre">∀</span> <span class="pre">x</span> <span class="pre">∈</span> <span class="pre">s,</span> <span class="pre">...</span></code>,
-
@@ -417,28 +417,28 @@ these two expressions behave roughly the same.As a result, we usually don’t need to use <code class="docutils literal notranslate"><span class="pre">bex_def</span></code> to transform them explicitly. Here is are some examples of how they are used:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">(</span><span class="n">s</span> <span class="n">t</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">ℕ</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h₀</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="bp">¬</span><span class="n">Even</span> <span class="n">x</span><span class="o">)</span> <span class="o">(</span><span class="n">h₁</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="n">Prime</span> <span class="n">x</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="bp">¬</span><span class="n">Even</span> <span class="n">x</span> <span class="bp">∧</span> <span class="n">Prime</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">x</span> <span class="n">xs</span> <span class="n">constructor</span> <span class="bp">·</span> <span class="n">apply</span> <span class="n">h₀</span> <span class="n">x</span> <span class="n">xs</span> <span class="n">apply</span> <span class="n">h₁</span> <span class="n">x</span> <span class="n">xs</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="bp">¬</span><span class="n">Even</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">Prime</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="bp">¬</span><span class="n">Even</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">Prime</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">xs</span> <span class="w"> </span><span class="n">constructor</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">xs</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">h₁</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">xs</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="bp">¬</span><span class="n">Even</span> <span class="n">x</span> <span class="bp">∧</span> <span class="n">Prime</span> <span class="n">x</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="n">Prime</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rcases</span> <span class="n">h</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">x</span><span class="o">,</span> <span class="n">xs</span><span class="o">,</span> <span class="n">_</span><span class="o">,</span> <span class="n">prime_x</span><span class="o">⟩</span> <span class="n">use</span> <span class="n">x</span><span class="o">,</span> <span class="n">xs</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="bp">¬</span><span class="n">Even</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">Prime</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">Prime</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">_</span><span class="o">,</span><span class="w"> </span><span class="n">prime_x</span><span class="o">⟩</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">xs</span> </pre></div> </div> <p>See if you can prove these slight variations:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">section</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">ssubt</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">⊆</span> <span class="n">t</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">ssubt</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">t</span><span class="o">)</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h₀</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">t</span><span class="o">,</span> <span class="bp">¬</span><span class="n">Even</span> <span class="n">x</span><span class="o">)</span> <span class="o">(</span><span class="n">h₁</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">t</span><span class="o">,</span> <span class="n">Prime</span> <span class="n">x</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="bp">¬</span><span class="n">Even</span> <span class="n">x</span> <span class="bp">∧</span> <span class="n">Prime</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">t</span><span class="o">,</span><span class="w"> </span><span class="bp">¬</span><span class="n">Even</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">t</span><span class="o">,</span><span class="w"> </span><span class="n">Prime</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="bp">¬</span><span class="n">Even</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">Prime</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="bp">¬</span><span class="n">Even</span> <span class="n">x</span> <span class="bp">∧</span> <span class="n">Prime</span> <span class="n">x</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">t</span><span class="o">,</span> <span class="n">Prime</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="bp">¬</span><span class="n">Even</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">Prime</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">t</span><span class="o">,</span><span class="w"> </span><span class="n">Prime</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">end</span> </pre></div>
-
@@ -454,35 +454,35 @@ There is nothing special about the natural numbers here,so <code class="docutils literal notranslate"><span class="pre">ℕ</span></code> can be replaced by any type <code class="docutils literal notranslate"><span class="pre">I</span></code> used to index the sets. The following illustrates their use.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="n">I</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">A</span> <span class="n">B</span> <span class="o">:</span> <span class="n">I</span> <span class="bp">→</span> <span class="n">Set</span> <span class="n">α</span><span class="o">)</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">α</span><span class="o">)</span> <span class="kn">open</span> <span class="n">Set</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">s</span> <span class="bp">∩</span> <span class="bp">⋃</span> <span class="n">i</span><span class="o">,</span> <span class="n">A</span> <span class="n">i</span><span class="o">)</span> <span class="bp">=</span> <span class="bp">⋃</span> <span class="n">i</span><span class="o">,</span> <span class="n">A</span> <span class="n">i</span> <span class="bp">∩</span> <span class="n">s</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ext</span> <span class="n">x</span> <span class="n">simp</span> <span class="n">only</span> <span class="o">[</span><span class="n">mem_inter_iff</span><span class="o">,</span> <span class="n">mem_iUnion</span><span class="o">]</span> <span class="n">constructor</span> <span class="bp">·</span> <span class="n">rintro</span> <span class="o">⟨</span><span class="n">xs</span><span class="o">,</span> <span class="o">⟨</span><span class="n">i</span><span class="o">,</span> <span class="n">xAi</span><span class="o">⟩⟩</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">i</span><span class="o">,</span> <span class="n">xAi</span><span class="o">,</span> <span class="n">xs</span><span class="o">⟩</span> <span class="n">rintro</span> <span class="o">⟨</span><span class="n">i</span><span class="o">,</span> <span class="n">xAi</span><span class="o">,</span> <span class="n">xs</span><span class="o">⟩</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">xs</span><span class="o">,</span> <span class="o">⟨</span><span class="n">i</span><span class="o">,</span> <span class="n">xAi</span><span class="o">⟩⟩</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="bp">⋂</span> <span class="n">i</span><span class="o">,</span> <span class="n">A</span> <span class="n">i</span> <span class="bp">∩</span> <span class="n">B</span> <span class="n">i</span><span class="o">)</span> <span class="bp">=</span> <span class="o">(</span><span class="bp">⋂</span> <span class="n">i</span><span class="o">,</span> <span class="n">A</span> <span class="n">i</span><span class="o">)</span> <span class="bp">∩</span> <span class="bp">⋂</span> <span class="n">i</span><span class="o">,</span> <span class="n">B</span> <span class="n">i</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ext</span> <span class="n">x</span> <span class="n">simp</span> <span class="n">only</span> <span class="o">[</span><span class="n">mem_inter_iff</span><span class="o">,</span> <span class="n">mem_iInter</span><span class="o">]</span> <span class="n">constructor</span> <span class="bp">·</span> <span class="n">intro</span> <span class="n">h</span> <span class="n">constructor</span> <span class="bp">·</span> <span class="n">intro</span> <span class="n">i</span> <span class="n">exact</span> <span class="o">(</span><span class="n">h</span> <span class="n">i</span><span class="o">)</span><span class="bp">.</span><span class="mi">1</span> <span class="n">intro</span> <span class="n">i</span> <span class="n">exact</span> <span class="o">(</span><span class="n">h</span> <span class="n">i</span><span class="o">)</span><span class="bp">.</span><span class="mi">2</span> <span class="n">rintro</span> <span class="o">⟨</span><span class="n">h1</span><span class="o">,</span> <span class="n">h2</span><span class="o">⟩</span> <span class="n">i</span> <span class="n">constructor</span> <span class="bp">·</span> <span class="n">exact</span> <span class="n">h1</span> <span class="n">i</span> <span class="n">exact</span> <span class="n">h2</span> <span class="n">i</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">A</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="kn">open</span><span class="w"> </span><span class="n">Set</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="bp">⋃</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">⋃</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="n">only</span><span class="w"> </span><span class="o">[</span><span class="n">mem_inter_iff</span><span class="o">,</span><span class="w"> </span><span class="n">mem_iUnion</span><span class="o">]</span> <span class="w"> </span><span class="n">constructor</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="o">⟨</span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="o">⟨</span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">xAi</span><span class="o">⟩⟩</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">xAi</span><span class="o">,</span><span class="w"> </span><span class="n">xs</span><span class="o">⟩</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="o">⟨</span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">xAi</span><span class="o">,</span><span class="w"> </span><span class="n">xs</span><span class="o">⟩</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="o">⟨</span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">xAi</span><span class="o">⟩⟩</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">⋂</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="bp">⋂</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="bp">⋂</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="n">only</span><span class="w"> </span><span class="o">[</span><span class="n">mem_inter_iff</span><span class="o">,</span><span class="w"> </span><span class="n">mem_iInter</span><span class="o">]</span> <span class="w"> </span><span class="n">constructor</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">constructor</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">i</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="bp">.</span><span class="mi">1</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">i</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="bp">.</span><span class="mi">2</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="o">⟨</span><span class="n">h1</span><span class="o">,</span><span class="w"> </span><span class="n">h2</span><span class="o">⟩</span><span class="w"> </span><span class="n">i</span> <span class="w"> </span><span class="n">constructor</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h1</span><span class="w"> </span><span class="n">i</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h2</span><span class="w"> </span><span class="n">i</span> </pre></div> </div> <p>Parentheses are often needed with an
-
@@ -493,8 +493,8 @@ the scope of the bound variable extends as far as it can.</p>One direction requires classical logic! We recommend using <code class="docutils literal notranslate"><span class="pre">by_cases</span> <span class="pre">xs</span> <span class="pre">:</span> <span class="pre">x</span> <span class="pre">∈</span> <span class="pre">s</span></code> at an appropriate point in the proof.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">s</span> <span class="bp">∪</span> <span class="bp">⋂</span> <span class="n">i</span><span class="o">,</span> <span class="n">A</span> <span class="n">i</span><span class="o">)</span> <span class="bp">=</span> <span class="bp">⋂</span> <span class="n">i</span><span class="o">,</span> <span class="n">A</span> <span class="n">i</span> <span class="bp">∪</span> <span class="n">s</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="bp">⋂</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">⋂</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Mathlib also has bounded unions and intersections,
-
@@ -503,23 +503,23 @@ You can unpack their meaning with <code class="docutils literal notranslate"><spand <code class="docutils literal notranslate"><span class="pre">mem_iInter₂</span></code>. As the following examples show, Lean’s simplifier carries out these replacements as well.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">primes</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">ℕ</span> <span class="o">:=</span> <span class="o">{</span> <span class="n">x</span> <span class="bp">|</span> <span class="n">Nat.Prime</span> <span class="n">x</span> <span class="o">}</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="bp">⋃</span> <span class="n">p</span> <span class="bp">∈</span> <span class="n">primes</span><span class="o">,</span> <span class="o">{</span> <span class="n">x</span> <span class="bp">|</span> <span class="n">p</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">∣</span> <span class="n">x</span> <span class="o">})</span> <span class="bp">=</span> <span class="o">{</span> <span class="n">x</span> <span class="bp">|</span> <span class="bp">∃</span> <span class="n">p</span> <span class="bp">∈</span> <span class="n">primes</span><span class="o">,</span> <span class="n">p</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">∣</span> <span class="n">x</span> <span class="o">}</span> <span class="o">:=</span><span class="kd">by</span> <span class="n">ext</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mem_iUnion₂</span><span class="o">]</span> <span class="n">simp</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="bp">⋃</span> <span class="n">p</span> <span class="bp">∈</span> <span class="n">primes</span><span class="o">,</span> <span class="o">{</span> <span class="n">x</span> <span class="bp">|</span> <span class="n">p</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">∣</span> <span class="n">x</span> <span class="o">})</span> <span class="bp">=</span> <span class="o">{</span> <span class="n">x</span> <span class="bp">|</span> <span class="bp">∃</span> <span class="n">p</span> <span class="bp">∈</span> <span class="n">primes</span><span class="o">,</span> <span class="n">p</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">∣</span> <span class="n">x</span> <span class="o">}</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ext</span> <span class="n">simp</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="bp">⋂</span> <span class="n">p</span> <span class="bp">∈</span> <span class="n">primes</span><span class="o">,</span> <span class="o">{</span> <span class="n">x</span> <span class="bp">|</span> <span class="bp">¬</span><span class="n">p</span> <span class="bp">∣</span> <span class="n">x</span> <span class="o">})</span> <span class="bp">⊆</span> <span class="o">{</span> <span class="n">x</span> <span class="bp">|</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">}</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">x</span> <span class="n">contrapose</span><span class="bp">!</span> <span class="n">simp</span> <span class="n">apply</span> <span class="n">Nat.exists_prime_and_dvd</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">primes</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">}</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">⋃</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">primes</span><span class="o">,</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">})</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">primes</span><span class="o">,</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="o">:=</span><span class="kd">by</span> <span class="w"> </span><span class="n">ext</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mem_iUnion₂</span><span class="o">]</span> <span class="w"> </span><span class="n">simp</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">⋃</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">primes</span><span class="o">,</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">})</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">primes</span><span class="o">,</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">ext</span> <span class="w"> </span><span class="n">simp</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">⋂</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">primes</span><span class="o">,</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="bp">¬</span><span class="n">p</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">})</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">contrapose</span><span class="bp">!</span> <span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">Nat.exists_prime_and_dvd</span> </pre></div> </div> <p>Try solving the following example, which is similar.
-
@@ -527,8 +527,8 @@ If you start typing <code class="docutils literal notranslate"><span class="pre"tab completion will tell you that <code class="docutils literal notranslate"><span class="pre">apply</span> <span class="pre">eq_univ_of_forall</span></code> is a good way to start the proof. We also recommend using the theorem <code class="docutils literal notranslate"><span class="pre">Nat.exists_infinite_primes</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="bp">⋃</span> <span class="n">p</span> <span class="bp">∈</span> <span class="n">primes</span><span class="o">,</span> <span class="o">{</span> <span class="n">x</span> <span class="bp">|</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">p</span> <span class="o">})</span> <span class="bp">=</span> <span class="n">univ</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">⋃</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">primes</span><span class="o">,</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">})</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">univ</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Give a collection of sets, <code class="docutils literal notranslate"><span class="pre">s</span> <span class="pre">:</span> <span class="pre">Set</span> <span class="pre">(Set</span> <span class="pre">α)</span></code>,
-
@@ -539,17 +539,17 @@ Similarly, their intersection, <code class="docutils literal notranslate"><spanThese operations are called <code class="docutils literal notranslate"><span class="pre">sUnion</span></code> and <code class="docutils literal notranslate"><span class="pre">sInter</span></code>, respectively. The following examples show their relationship to bounded union and intersection.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">(</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="o">(</span><span class="n">Set</span> <span class="n">α</span><span class="o">))</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="o">(</span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">))</span> <span class="kd">example</span> <span class="o">:</span> <span class="bp">⋃₀</span> <span class="n">s</span> <span class="bp">=</span> <span class="bp">⋃</span> <span class="n">t</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="n">t</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ext</span> <span class="n">x</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mem_iUnion₂</span><span class="o">]</span> <span class="n">simp</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">⋃₀</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">⋃</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mem_iUnion₂</span><span class="o">]</span> <span class="w"> </span><span class="n">simp</span> <span class="kd">example</span> <span class="o">:</span> <span class="bp">⋂₀</span> <span class="n">s</span> <span class="bp">=</span> <span class="bp">⋂</span> <span class="n">t</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="n">t</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ext</span> <span class="n">x</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mem_iInter₂</span><span class="o">]</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">⋂₀</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">⋂</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mem_iInter₂</span><span class="o">]</span> <span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p>In the library, these identities are called
-
@@ -563,17 +563,17 @@ the library defines <code class="docutils literal notranslate"><span class="pre"to be <code class="docutils literal notranslate"><span class="pre">{x</span> <span class="pre">|</span> <span class="pre">f</span> <span class="pre">x</span> <span class="pre">∈</span> <span class="pre">p}</span></code>. The expression <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">∈</span> <span class="pre">f</span> <span class="pre">⁻¹'</span> <span class="pre">p</span></code> reduces to <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">x</span> <span class="pre">∈</span> <span class="pre">p</span></code>. This is often convenient, as in the following example:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="n">β</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">β</span><span class="o">)</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">s</span> <span class="n">t</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">α</span><span class="o">)</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">u</span> <span class="n">v</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">β</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">β</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">β</span><span class="o">)</span> <span class="kn">open</span> <span class="n">Function</span> <span class="kn">open</span> <span class="n">Set</span> <span class="kn">open</span><span class="w"> </span><span class="n">Function</span> <span class="kn">open</span><span class="w"> </span><span class="n">Set</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="o">(</span><span class="n">u</span> <span class="bp">∩</span> <span class="n">v</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">u</span> <span class="bp">∩</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">v</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ext</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">v</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">ext</span> <span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p>If <code class="docutils literal notranslate"><span class="pre">s</span></code> is a set of elements of type <code class="docutils literal notranslate"><span class="pre">α</span></code>,
-
@@ -585,25 +585,25 @@ So a hypothesis <code class="docutils literal notranslate"><span class="pre">y<and <code class="docutils literal notranslate"><span class="pre">xeq</span> <span class="pre">:</span> <span class="pre">f</span> <span class="pre">x</span> <span class="pre">=</span> <span class="pre">y</span></code>. The <code class="docutils literal notranslate"><span class="pre">rfl</span></code> tag in the <code class="docutils literal notranslate"><span class="pre">rintro</span></code> tactic (see <a class="reference internal" href="C03_Logic.html#the-existential-quantifier"><span class="std std-numref">Section 3.2</span></a>) was made precisely for this sort of situation.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">''</span> <span class="o">(</span><span class="n">s</span> <span class="bp">∪</span> <span class="n">t</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">s</span> <span class="bp">∪</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">t</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ext</span> <span class="n">y</span><span class="bp">;</span> <span class="n">constructor</span> <span class="bp">·</span> <span class="n">rintro</span> <span class="o">⟨</span><span class="n">x</span><span class="o">,</span> <span class="n">xs</span> <span class="bp">|</span> <span class="n">xt</span><span class="o">,</span> <span class="n">rfl</span><span class="o">⟩</span> <span class="bp">·</span> <span class="n">left</span> <span class="n">use</span> <span class="n">x</span><span class="o">,</span> <span class="n">xs</span> <span class="n">right</span> <span class="n">use</span> <span class="n">x</span><span class="o">,</span> <span class="n">xt</span> <span class="n">rintro</span> <span class="o">(⟨</span><span class="n">x</span><span class="o">,</span> <span class="n">xs</span><span class="o">,</span> <span class="n">rfl</span><span class="o">⟩</span> <span class="bp">|</span> <span class="o">⟨</span><span class="n">x</span><span class="o">,</span> <span class="n">xt</span><span class="o">,</span> <span class="n">rfl</span><span class="o">⟩)</span> <span class="bp">·</span> <span class="n">use</span> <span class="n">x</span><span class="o">,</span> <span class="n">Or.inl</span> <span class="n">xs</span> <span class="n">use</span> <span class="n">x</span><span class="o">,</span> <span class="n">Or.inr</span> <span class="n">xt</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="n">y</span><span class="bp">;</span><span class="w"> </span><span class="n">constructor</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="o">⟨</span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">xt</span><span class="o">,</span><span class="w"> </span><span class="n">rfl</span><span class="o">⟩</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">left</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">xs</span> <span class="w"> </span><span class="n">right</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">xt</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="o">(⟨</span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">xs</span><span class="o">,</span><span class="w"> </span><span class="n">rfl</span><span class="o">⟩</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="o">⟨</span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">xt</span><span class="o">,</span><span class="w"> </span><span class="n">rfl</span><span class="o">⟩)</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">Or.inl</span><span class="w"> </span><span class="n">xs</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">Or.inr</span><span class="w"> </span><span class="n">xt</span> </pre></div> </div> <p>Notice also that the <code class="docutils literal notranslate"><span class="pre">use</span></code> tactic applies <code class="docutils literal notranslate"><span class="pre">rfl</span></code> to close goals when it can.</p> <p>Here is another example:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">⊆</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="o">(</span><span class="n">f</span> <span class="bp">''</span> <span class="n">s</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">x</span> <span class="n">xs</span> <span class="k">show</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">s</span> <span class="n">use</span> <span class="n">x</span><span class="o">,</span> <span class="n">xs</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">xs</span> <span class="w"> </span><span class="k">show</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">s</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">xs</span> </pre></div> </div> <p>We can replace the line <code class="docutils literal notranslate"><span class="pre">use</span> <span class="pre">x,</span> <span class="pre">xs</span></code> by
-
@@ -612,8 +612,8 @@ use a theorem specifically designed for that purpose.But knowing that the image is defined in terms of an existential quantifier is often convenient.</p> <p>The following equivalence is a good exercise:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">s</span> <span class="bp">⊆</span> <span class="n">v</span> <span class="bp">↔</span> <span class="n">s</span> <span class="bp">⊆</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">v</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>It shows that <code class="docutils literal notranslate"><span class="pre">image</span> <span class="pre">f</span></code> and <code class="docutils literal notranslate"><span class="pre">preimage</span> <span class="pre">f</span></code> are
-
@@ -632,47 +632,47 @@ you to enjoy.You don’t have to do all of them at once; do a few of them, and set the rest aside for a rainy day.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">Injective</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="o">(</span><span class="n">f</span> <span class="bp">''</span> <span class="n">s</span><span class="o">)</span> <span class="bp">⊆</span> <span class="n">s</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Injective</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">''</span> <span class="o">(</span><span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">u</span><span class="o">)</span> <span class="bp">⊆</span> <span class="n">u</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">u</span><span class="o">)</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">Surjective</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">u</span> <span class="bp">⊆</span> <span class="n">f</span> <span class="bp">''</span> <span class="o">(</span><span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">u</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Surjective</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">u</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">⊆</span> <span class="n">t</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">s</span> <span class="bp">⊆</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">t</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">u</span> <span class="bp">⊆</span> <span class="n">v</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">u</span> <span class="bp">⊆</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">v</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">v</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="o">(</span><span class="n">u</span> <span class="bp">∪</span> <span class="n">v</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">u</span> <span class="bp">∪</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">v</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">v</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">''</span> <span class="o">(</span><span class="n">s</span> <span class="bp">∩</span> <span class="n">t</span><span class="o">)</span> <span class="bp">⊆</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">t</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">Injective</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">t</span> <span class="bp">⊆</span> <span class="n">f</span> <span class="bp">''</span> <span class="o">(</span><span class="n">s</span> <span class="bp">∩</span> <span class="n">t</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Injective</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">s</span> <span class="bp">\</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">t</span> <span class="bp">⊆</span> <span class="n">f</span> <span class="bp">''</span> <span class="o">(</span><span class="n">s</span> <span class="bp">\</span> <span class="n">t</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">u</span> <span class="bp">\</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">v</span> <span class="bp">⊆</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="o">(</span><span class="n">u</span> <span class="bp">\</span> <span class="n">v</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="n">v</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">v</span> <span class="bp">=</span> <span class="n">f</span> <span class="bp">''</span> <span class="o">(</span><span class="n">s</span> <span class="bp">∩</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">v</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">v</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">''</span> <span class="o">(</span><span class="n">s</span> <span class="bp">∩</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">u</span><span class="o">)</span> <span class="bp">⊆</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">u</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">u</span><span class="o">)</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">u</span> <span class="bp">⊆</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="o">(</span><span class="n">f</span> <span class="bp">''</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">u</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">u</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∪</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">u</span> <span class="bp">⊆</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="o">(</span><span class="n">f</span> <span class="bp">''</span> <span class="n">s</span> <span class="bp">∪</span> <span class="n">u</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">u</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>You can also try your hand at the next group of exercises,
-
@@ -683,29 +683,29 @@ to guarantee that the index set is nonempty.To prove any of these, we recommend using <code class="docutils literal notranslate"><span class="pre">ext</span></code> or <code class="docutils literal notranslate"><span class="pre">intro</span></code> to unfold the meaning of an equation or inclusion between sets, and then calling <code class="docutils literal notranslate"><span class="pre">simp</span></code> to unpack the conditions for membership.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">I</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">(</span><span class="n">A</span> <span class="o">:</span> <span class="n">I</span> <span class="bp">→</span> <span class="n">Set</span> <span class="n">α</span><span class="o">)</span> <span class="o">(</span><span class="n">B</span> <span class="o">:</span> <span class="n">I</span> <span class="bp">→</span> <span class="n">Set</span> <span class="n">β</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">I</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">A</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">B</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">β</span><span class="o">)</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">f</span> <span class="bp">''</span> <span class="bp">⋃</span> <span class="n">i</span><span class="o">,</span> <span class="n">A</span> <span class="n">i</span><span class="o">)</span> <span class="bp">=</span> <span class="bp">⋃</span> <span class="n">i</span><span class="o">,</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">A</span> <span class="n">i</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="bp">⋃</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">⋃</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">f</span> <span class="bp">''</span> <span class="bp">⋂</span> <span class="n">i</span><span class="o">,</span> <span class="n">A</span> <span class="n">i</span><span class="o">)</span> <span class="bp">⊆</span> <span class="bp">⋂</span> <span class="n">i</span><span class="o">,</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">A</span> <span class="n">i</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="bp">⋂</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="bp">⋂</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">i</span> <span class="o">:</span> <span class="n">I</span><span class="o">)</span> <span class="o">(</span><span class="n">injf</span> <span class="o">:</span> <span class="n">Injective</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="bp">⋂</span> <span class="n">i</span><span class="o">,</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">A</span> <span class="n">i</span><span class="o">)</span> <span class="bp">⊆</span> <span class="n">f</span> <span class="bp">''</span> <span class="bp">⋂</span> <span class="n">i</span><span class="o">,</span> <span class="n">A</span> <span class="n">i</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">i</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">I</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">injf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Injective</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">⋂</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="bp">⋂</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">f</span> <span class="bp">⁻¹'</span> <span class="bp">⋃</span> <span class="n">i</span><span class="o">,</span> <span class="n">B</span> <span class="n">i</span><span class="o">)</span> <span class="bp">=</span> <span class="bp">⋃</span> <span class="n">i</span><span class="o">,</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">B</span> <span class="n">i</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="bp">⋃</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">⋃</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">f</span> <span class="bp">⁻¹'</span> <span class="bp">⋂</span> <span class="n">i</span><span class="o">,</span> <span class="n">B</span> <span class="n">i</span><span class="o">)</span> <span class="bp">=</span> <span class="bp">⋂</span> <span class="n">i</span><span class="o">,</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">B</span> <span class="n">i</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="bp">⋂</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">⋂</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>The library defines a predicate <code class="docutils literal notranslate"><span class="pre">InjOn</span> <span class="pre">f</span> <span class="pre">s</span></code> to say that <code class="docutils literal notranslate"><span class="pre">f</span></code> is injective on <code class="docutils literal notranslate"><span class="pre">s</span></code>. It is defined as follows:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">InjOn</span> <span class="n">f</span> <span class="n">s</span> <span class="bp">↔</span> <span class="bp">∀</span> <span class="n">x₁</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">x₂</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="n">f</span> <span class="n">x₁</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">x₂</span> <span class="bp">→</span> <span class="n">x₁</span> <span class="bp">=</span> <span class="n">x₂</span> <span class="o">:=</span> <span class="n">Iff.refl</span> <span class="n">_</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">InjOn</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x₁</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x₂</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x₁</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x₂</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">x₁</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x₂</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Iff.refl</span><span class="w"> </span><span class="n">_</span> </pre></div> </div> <p>The statement <code class="docutils literal notranslate"><span class="pre">Injective</span> <span class="pre">f</span></code> is provably equivalent
-
@@ -719,39 +719,39 @@ to their full domain,there are often relativized versions that restrict the statements to a subset of the domain type.</p> <p>Here is are some examples of <code class="docutils literal notranslate"><span class="pre">InjOn</span></code> and <code class="docutils literal notranslate"><span class="pre">range</span></code> in use:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">Set</span> <span class="n">Real</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">InjOn</span> <span class="n">log</span> <span class="o">{</span> <span class="n">x</span> <span class="bp">|</span> <span class="n">x</span> <span class="bp">></span> <span class="mi">0</span> <span class="o">}</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">x</span> <span class="n">xpos</span> <span class="n">y</span> <span class="n">ypos</span> <span class="n">intro</span> <span class="n">e</span> <span class="c1">-- log x = log y</span> <span class="k">calc</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">exp</span> <span class="o">(</span><span class="n">log</span> <span class="n">x</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">exp_log</span> <span class="n">xpos</span><span class="o">]</span> <span class="n">_</span> <span class="bp">=</span> <span class="n">exp</span> <span class="o">(</span><span class="n">log</span> <span class="n">y</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">e</span><span class="o">]</span> <span class="n">_</span> <span class="bp">=</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">exp_log</span> <span class="n">ypos</span><span class="o">]</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">range</span> <span class="n">exp</span> <span class="bp">=</span> <span class="o">{</span> <span class="n">y</span> <span class="bp">|</span> <span class="n">y</span> <span class="bp">></span> <span class="mi">0</span> <span class="o">}</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ext</span> <span class="n">y</span><span class="bp">;</span> <span class="n">constructor</span> <span class="bp">·</span> <span class="n">rintro</span> <span class="o">⟨</span><span class="n">x</span><span class="o">,</span> <span class="n">rfl</span><span class="o">⟩</span> <span class="n">apply</span> <span class="n">exp_pos</span> <span class="n">intro</span> <span class="n">ypos</span> <span class="n">use</span> <span class="n">log</span> <span class="n">y</span> <span class="n">rw</span> <span class="o">[</span><span class="n">exp_log</span> <span class="n">ypos</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">Real</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">InjOn</span><span class="w"> </span><span class="n">log</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">xpos</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">ypos</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">e</span> <span class="w"> </span><span class="c1">-- log x = log y</span> <span class="w"> </span><span class="k">calc</span> <span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="o">(</span><span class="n">log</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">exp_log</span><span class="w"> </span><span class="n">xpos</span><span class="o">]</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="o">(</span><span class="n">log</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">e</span><span class="o">]</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">exp_log</span><span class="w"> </span><span class="n">ypos</span><span class="o">]</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="n">exp</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="n">y</span><span class="bp">;</span><span class="w"> </span><span class="n">constructor</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="o">⟨</span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">rfl</span><span class="o">⟩</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">exp_pos</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">ypos</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">log</span><span class="w"> </span><span class="n">y</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">exp_log</span><span class="w"> </span><span class="n">ypos</span><span class="o">]</span> </pre></div> </div> <p>Try proving these:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">InjOn</span> <span class="n">sqrt</span> <span class="o">{</span> <span class="n">x</span> <span class="bp">|</span> <span class="n">x</span> <span class="bp">≥</span> <span class="mi">0</span> <span class="o">}</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">InjOn</span><span class="w"> </span><span class="n">sqrt</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">InjOn</span> <span class="o">(</span><span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="o">{</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">|</span> <span class="n">x</span> <span class="bp">≥</span> <span class="mi">0</span> <span class="o">}</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">InjOn</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">sqrt</span> <span class="bp">''</span> <span class="o">{</span> <span class="n">x</span> <span class="bp">|</span> <span class="n">x</span> <span class="bp">≥</span> <span class="mi">0</span> <span class="o">}</span> <span class="bp">=</span> <span class="o">{</span> <span class="n">y</span> <span class="bp">|</span> <span class="n">y</span> <span class="bp">≥</span> <span class="mi">0</span> <span class="o">}</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">sqrt</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">range</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="bp">=</span> <span class="o">{</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">|</span> <span class="n">y</span> <span class="bp">≥</span> <span class="mi">0</span> <span class="o">}</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">range</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>To define the inverse of a function <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">:</span> <span class="pre">α</span> <span class="pre">→</span> <span class="pre">β</span></code>,
-
@@ -771,16 +771,16 @@ This requires an appeal to the <em>axiom of choice</em>.Lean allows various ways of accessing it; one convenient method is to use the classical <code class="docutils literal notranslate"><span class="pre">choose</span></code> operator, illustrated below.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="n">β</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Inhabited</span> <span class="n">α</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Inhabited</span><span class="w"> </span><span class="n">α</span><span class="o">]</span> <span class="k">#check</span> <span class="o">(</span><span class="n">default</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">default</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">P</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="kt">Prop</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span><span class="o">,</span> <span class="n">P</span> <span class="n">x</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">P</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="kt">Prop</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">x</span><span class="o">)</span> <span class="k">#check</span> <span class="n">Classical.choose</span> <span class="n">h</span> <span class="k">#check</span><span class="w"> </span><span class="n">Classical.choose</span><span class="w"> </span><span class="n">h</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">P</span> <span class="o">(</span><span class="n">Classical.choose</span> <span class="n">h</span><span class="o">)</span> <span class="o">:=</span> <span class="n">Classical.choose_spec</span> <span class="n">h</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="o">(</span><span class="n">Classical.choose</span><span class="w"> </span><span class="n">h</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Classical.choose_spec</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>Given <code class="docutils literal notranslate"><span class="pre">h</span> <span class="pre">:</span> <span class="pre">∃</span> <span class="pre">x,</span> <span class="pre">P</span> <span class="pre">x</span></code>, the value of <code class="docutils literal notranslate"><span class="pre">Classical.choose</span> <span class="pre">h</span></code>
-
@@ -789,16 +789,16 @@ The theorem <code class="docutils literal notranslate"><span class="pre">Classicmeets this specification.</p> <p>With these in hand, we can define the inverse function as follows:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span> <span class="kn">section</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span><span class="w"> </span><span class="kn">section</span> <span class="kn">open</span> <span class="n">Classical</span> <span class="kn">open</span><span class="w"> </span><span class="n">Classical</span> <span class="kd">def</span> <span class="n">inverse</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">β</span><span class="o">)</span> <span class="o">:</span> <span class="n">β</span> <span class="bp">→</span> <span class="n">α</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">y</span> <span class="o">:</span> <span class="n">β</span> <span class="bp">↦</span> <span class="k">if</span> <span class="n">h</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">y</span> <span class="k">then</span> <span class="n">Classical.choose</span> <span class="n">h</span> <span class="k">else</span> <span class="n">default</span> <span class="kd">def</span><span class="w"> </span><span class="n">inverse</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">β</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="bp">↦</span> <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">Classical.choose</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="n">default</span> <span class="kd">theorem</span> <span class="n">inverse_spec</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">β</span><span class="o">}</span> <span class="o">(</span><span class="n">y</span> <span class="o">:</span> <span class="n">β</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">y</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="o">(</span><span class="n">inverse</span> <span class="n">f</span> <span class="n">y</span><span class="o">)</span> <span class="bp">=</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">inverse</span><span class="o">,</span> <span class="n">dif_pos</span> <span class="n">h</span><span class="o">]</span> <span class="n">exact</span> <span class="n">Classical.choose_spec</span> <span class="n">h</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">inverse_spec</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">β</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">β</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">inverse</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">inverse</span><span class="o">,</span><span class="w"> </span><span class="n">dif_pos</span><span class="w"> </span><span class="n">h</span><span class="o">]</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">Classical.choose_spec</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>The lines <code class="docutils literal notranslate"><span class="pre">noncomputable</span> <span class="pre">section</span></code> and <code class="docutils literal notranslate"><span class="pre">open</span> <span class="pre">Classical</span></code>
-
@@ -831,15 +831,15 @@ You should be able to prove each of them with about a half-dozenshort lines. If you are looking for an extra challenge, try to condense each proof to a single-line proof term.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">β</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">β</span><span class="o">)</span> <span class="kn">open</span> <span class="n">Function</span> <span class="kn">open</span><span class="w"> </span><span class="n">Function</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">Injective</span> <span class="n">f</span> <span class="bp">↔</span> <span class="n">LeftInverse</span> <span class="o">(</span><span class="n">inverse</span> <span class="n">f</span><span class="o">)</span> <span class="n">f</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Injective</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">LeftInverse</span><span class="w"> </span><span class="o">(</span><span class="n">inverse</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">Surjective</span> <span class="n">f</span> <span class="bp">↔</span> <span class="n">RightInverse</span> <span class="o">(</span><span class="n">inverse</span> <span class="n">f</span><span class="o">)</span> <span class="n">f</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Surjective</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">RightInverse</span><span class="w"> </span><span class="o">(</span><span class="n">inverse</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>We close this section with a type-theoretic statement of Cantor’s
-
@@ -847,19 +847,19 @@ famous theorem that there is no surjective function from a setto its power set. See if you can understand the proof, and then fill in the two lines that are missing.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">Cantor</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">f</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">Set</span> <span class="n">α</span><span class="o">,</span> <span class="bp">¬</span><span class="n">Surjective</span> <span class="n">f</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">f</span> <span class="n">surjf</span> <span class="k">let</span> <span class="n">S</span> <span class="o">:=</span> <span class="o">{</span> <span class="n">i</span> <span class="bp">|</span> <span class="n">i</span> <span class="bp">∉</span> <span class="n">f</span> <span class="n">i</span> <span class="o">}</span> <span class="n">rcases</span> <span class="n">surjf</span> <span class="n">S</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">j</span><span class="o">,</span> <span class="n">h</span><span class="o">⟩</span> <span class="k">have</span> <span class="n">h₁</span> <span class="o">:</span> <span class="n">j</span> <span class="bp">∉</span> <span class="n">f</span> <span class="n">j</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">h'</span> <span class="k">have</span> <span class="o">:</span> <span class="n">j</span> <span class="bp">∉</span> <span class="n">f</span> <span class="n">j</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rwa</span> <span class="o">[</span><span class="n">h</span><span class="o">]</span> <span class="n">at</span> <span class="n">h'</span> <span class="n">contradiction</span> <span class="k">have</span> <span class="n">h₂</span> <span class="o">:</span> <span class="n">j</span> <span class="bp">∈</span> <span class="n">S</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="n">h₃</span> <span class="o">:</span> <span class="n">j</span> <span class="bp">∉</span> <span class="n">S</span> <span class="gr">sorry</span> <span class="n">contradiction</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">Cantor</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="bp">¬</span><span class="n">Surjective</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">surjf</span> <span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">∉</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">}</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">surjf</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">j</span><span class="o">,</span><span class="w"> </span><span class="n">h</span><span class="o">⟩</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="bp">∉</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h'</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="bp">∉</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">rwa</span><span class="w"> </span><span class="o">[</span><span class="n">h</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">h'</span> <span class="w"> </span><span class="n">contradiction</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h₂</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">S</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h₃</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="bp">∉</span><span class="w"> </span><span class="n">S</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">contradiction</span> </pre></div> </div> </section>
-
@@ -939,9 +939,9 @@ Formalizing the proof will not only improve our confidence in theresult, but also help us understand it better. Because the proof uses classical logic, we tell Lean that our definitions will generally not be computable.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span> <span class="kn">section</span> <span class="kn">open</span> <span class="n">Classical</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="n">β</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Nonempty</span> <span class="n">β</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span><span class="w"> </span><span class="kn">section</span> <span class="kn">open</span><span class="w"> </span><span class="n">Classical</span> <span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Nonempty</span><span class="w"> </span><span class="n">β</span><span class="o">]</span> </pre></div> </div> <p>The annotation <code class="docutils literal notranslate"><span class="pre">[Nonempty</span> <span class="pre">β]</span></code> specifies that <code class="docutils literal notranslate"><span class="pre">β</span></code> is nonempty.
-
@@ -957,21 +957,21 @@ in <code class="docutils literal notranslate"><span class="pre">β</span></cand returns an arbitrary element of <code class="docutils literal notranslate"><span class="pre">β</span></code> otherwise. The function <code class="docutils literal notranslate"><span class="pre">invFun</span> <span class="pre">g</span></code> is always a left inverse if <code class="docutils literal notranslate"><span class="pre">g</span></code> is injective and a right inverse if <code class="docutils literal notranslate"><span class="pre">g</span></code> is surjective.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="o">(</span><span class="n">invFun</span> <span class="n">g</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">β</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">leftInverse_invFun</span> <span class="o">:</span> <span class="n">Injective</span> <span class="n">g</span> <span class="bp">→</span> <span class="n">LeftInverse</span> <span class="o">(</span><span class="n">invFun</span> <span class="n">g</span><span class="o">)</span> <span class="n">g</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">leftInverse_invFun</span> <span class="o">:</span> <span class="n">Injective</span> <span class="n">g</span> <span class="bp">→</span> <span class="bp">∀</span> <span class="n">y</span><span class="o">,</span> <span class="n">invFun</span> <span class="n">g</span> <span class="o">(</span><span class="n">g</span> <span class="n">y</span><span class="o">)</span> <span class="bp">=</span> <span class="n">y</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">invFun_eq</span> <span class="o">:</span> <span class="o">(</span><span class="bp">∃</span> <span class="n">y</span><span class="o">,</span> <span class="n">g</span> <span class="n">y</span> <span class="bp">=</span> <span class="n">x</span><span class="o">)</span> <span class="bp">→</span> <span class="n">g</span> <span class="o">(</span><span class="n">invFun</span> <span class="n">g</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="n">x</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">invFun</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">β</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">leftInverse_invFun</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Injective</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">LeftInverse</span><span class="w"> </span><span class="o">(</span><span class="n">invFun</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="n">g</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">leftInverse_invFun</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Injective</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">y</span><span class="o">,</span><span class="w"> </span><span class="n">invFun</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">y</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">invFun_eq</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">∃</span><span class="w"> </span><span class="n">y</span><span class="o">,</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">(</span><span class="n">invFun</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="o">)</span> </pre></div> </div> <p>We define the set corresponding to the union of the shaded regions as follows.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">β</span><span class="o">)</span> <span class="o">(</span><span class="n">g</span> <span class="o">:</span> <span class="n">β</span> <span class="bp">→</span> <span class="n">α</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">β</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="kd">def</span> <span class="n">sbAux</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">Set</span> <span class="n">α</span> <span class="bp">|</span> <span class="mi">0</span> <span class="bp">=></span> <span class="n">univ</span> <span class="bp">\</span> <span class="n">g</span> <span class="bp">''</span> <span class="n">univ</span> <span class="bp">|</span> <span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span> <span class="bp">=></span> <span class="n">g</span> <span class="bp">''</span> <span class="o">(</span><span class="n">f</span> <span class="bp">''</span> <span class="n">sbAux</span> <span class="n">n</span><span class="o">)</span> <span class="kd">def</span><span class="w"> </span><span class="n">sbAux</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="n">univ</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">univ</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">sbAux</span><span class="w"> </span><span class="n">n</span><span class="o">)</span> <span class="kd">def</span> <span class="n">sbSet</span> <span class="o">:=</span> <span class="bp">⋃</span> <span class="n">n</span><span class="o">,</span> <span class="n">sbAux</span> <span class="n">f</span> <span class="n">g</span> <span class="n">n</span> <span class="kd">def</span><span class="w"> </span><span class="n">sbSet</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="bp">⋃</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">sbAux</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">n</span> </pre></div> </div> <p>The definition <code class="docutils literal notranslate"><span class="pre">sbAux</span></code> is an example of a <em>recursive definition</em>,
-
@@ -983,8 +983,8 @@ S_{n+1} &= g(f(S_n)).\end{split}\]</div><p>The definition <code class="docutils literal notranslate"><span class="pre">sbSet</span></code> corresponds to the set <span class="math notranslate nohighlight">\(A = \bigcup_{n \in \mathbb{N}} S_n\)</span> in our proof sketch. The function <span class="math notranslate nohighlight">\(h\)</span> described above is now defined as follows:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">sbFun</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <span class="o">:</span> <span class="n">β</span> <span class="o">:=</span> <span class="k">if</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">sbSet</span> <span class="n">f</span> <span class="n">g</span> <span class="k">then</span> <span class="n">f</span> <span class="n">x</span> <span class="k">else</span> <span class="n">invFun</span> <span class="n">g</span> <span class="n">x</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">sbFun</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">sbSet</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="n">invFun</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span> </pre></div> </div> <p>We will need the fact that our definition of <span class="math notranslate nohighlight">\(g^{-1}\)</span> is a
-
@@ -1003,16 +1003,16 @@ and fill in the remaining parts.You will need to use <code class="docutils literal notranslate"><span class="pre">invFun_eq</span></code> at the end. Notice that rewriting with <code class="docutils literal notranslate"><span class="pre">sbAux</span></code> here replaces <code class="docutils literal notranslate"><span class="pre">sbAux</span> <span class="pre">f</span> <span class="pre">g</span> <span class="pre">0</span></code> with the right-hand side of the corresponding defining equation.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">sb_right_inv</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">α</span><span class="o">}</span> <span class="o">(</span><span class="n">hx</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∉</span> <span class="n">sbSet</span> <span class="n">f</span> <span class="n">g</span><span class="o">)</span> <span class="o">:</span> <span class="n">g</span> <span class="o">(</span><span class="n">invFun</span> <span class="n">g</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">have</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">g</span> <span class="bp">''</span> <span class="n">univ</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">contrapose</span><span class="bp">!</span> <span class="n">hx</span> <span class="n">rw</span> <span class="o">[</span><span class="n">sbSet</span><span class="o">,</span> <span class="n">mem_iUnion</span><span class="o">]</span> <span class="n">use</span> <span class="mi">0</span> <span class="n">rw</span> <span class="o">[</span><span class="n">sbAux</span><span class="o">,</span> <span class="n">mem_diff</span><span class="o">]</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">y</span><span class="o">,</span> <span class="n">g</span> <span class="n">y</span> <span class="bp">=</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">sb_right_inv</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hx</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∉</span><span class="w"> </span><span class="n">sbSet</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">(</span><span class="n">invFun</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">univ</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">contrapose</span><span class="bp">!</span><span class="w"> </span><span class="n">hx</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">sbSet</span><span class="o">,</span><span class="w"> </span><span class="n">mem_iUnion</span><span class="o">]</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="mi">0</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">sbAux</span><span class="o">,</span><span class="w"> </span><span class="n">mem_diff</span><span class="o">]</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">y</span><span class="o">,</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>We now turn to the proof that <span class="math notranslate nohighlight">\(h\)</span> is injective.
-
@@ -1036,32 +1036,32 @@ Applying <span class="math notranslate nohighlight">\(g\)</span> to both sides y<p>Once again, we encourage you to step through the following proof to see how the argument plays out in Lean. See if you can finish off the proof using <code class="docutils literal notranslate"><span class="pre">sb_right_inv</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">sb_injective</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">Injective</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">Injective</span> <span class="o">(</span><span class="n">sbFun</span> <span class="n">f</span> <span class="n">g</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">set</span> <span class="n">A</span> <span class="o">:=</span> <span class="n">sbSet</span> <span class="n">f</span> <span class="n">g</span> <span class="k">with</span> <span class="n">A_def</span> <span class="n">set</span> <span class="n">h</span> <span class="o">:=</span> <span class="n">sbFun</span> <span class="n">f</span> <span class="n">g</span> <span class="k">with</span> <span class="n">h_def</span> <span class="n">intro</span> <span class="n">x₁</span> <span class="n">x₂</span> <span class="n">intro</span> <span class="o">(</span><span class="n">hxeq</span> <span class="o">:</span> <span class="n">h</span> <span class="n">x₁</span> <span class="bp">=</span> <span class="n">h</span> <span class="n">x₂</span><span class="o">)</span> <span class="k">show</span> <span class="n">x₁</span> <span class="bp">=</span> <span class="n">x₂</span> <span class="n">simp</span> <span class="n">only</span> <span class="o">[</span><span class="n">h_def</span><span class="o">,</span> <span class="n">sbFun</span><span class="o">,</span> <span class="bp">←</span> <span class="n">A_def</span><span class="o">]</span> <span class="n">at</span> <span class="n">hxeq</span> <span class="n">by_cases</span> <span class="n">xA</span> <span class="o">:</span> <span class="n">x₁</span> <span class="bp">∈</span> <span class="n">A</span> <span class="bp">∨</span> <span class="n">x₂</span> <span class="bp">∈</span> <span class="n">A</span> <span class="bp">·</span> <span class="n">wlog</span> <span class="n">x₁A</span> <span class="o">:</span> <span class="n">x₁</span> <span class="bp">∈</span> <span class="n">A</span> <span class="n">generalizing</span> <span class="n">x₁</span> <span class="n">x₂</span> <span class="n">hxeq</span> <span class="n">xA</span> <span class="bp">·</span> <span class="n">symm</span> <span class="n">apply</span> <span class="n">this</span> <span class="n">hxeq.symm</span> <span class="n">xA.symm</span> <span class="o">(</span><span class="n">xA.resolve_left</span> <span class="n">x₁A</span><span class="o">)</span> <span class="k">have</span> <span class="n">x₂A</span> <span class="o">:</span> <span class="n">x₂</span> <span class="bp">∈</span> <span class="n">A</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">_root_.not_imp_self.mp</span> <span class="n">intro</span> <span class="o">(</span><span class="n">x₂nA</span> <span class="o">:</span> <span class="n">x₂</span> <span class="bp">∉</span> <span class="n">A</span><span class="o">)</span> <span class="n">rw</span> <span class="o">[</span><span class="n">if_pos</span> <span class="n">x₁A</span><span class="o">,</span> <span class="n">if_neg</span> <span class="n">x₂nA</span><span class="o">]</span> <span class="n">at</span> <span class="n">hxeq</span> <span class="n">rw</span> <span class="o">[</span><span class="n">A_def</span><span class="o">,</span> <span class="n">sbSet</span><span class="o">,</span> <span class="n">mem_iUnion</span><span class="o">]</span> <span class="n">at</span> <span class="n">x₁A</span> <span class="k">have</span> <span class="n">x₂eq</span> <span class="o">:</span> <span class="n">x₂</span> <span class="bp">=</span> <span class="n">g</span> <span class="o">(</span><span class="n">f</span> <span class="n">x₁</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">rcases</span> <span class="n">x₁A</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">n</span><span class="o">,</span> <span class="n">hn</span><span class="o">⟩</span> <span class="n">rw</span> <span class="o">[</span><span class="n">A_def</span><span class="o">,</span> <span class="n">sbSet</span><span class="o">,</span> <span class="n">mem_iUnion</span><span class="o">]</span> <span class="n">use</span> <span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span> <span class="n">simp</span> <span class="o">[</span><span class="n">sbAux</span><span class="o">]</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">x₁</span><span class="o">,</span> <span class="n">hn</span><span class="o">,</span> <span class="n">x₂eq.symm</span><span class="o">⟩</span> <span class="gr">sorry</span> <span class="n">push_neg</span> <span class="n">at</span> <span class="n">xA</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">sb_injective</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Injective</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Injective</span><span class="w"> </span><span class="o">(</span><span class="n">sbFun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">set</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">sbSet</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">A_def</span> <span class="w"> </span><span class="n">set</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">sbFun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">h_def</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x₁</span><span class="w"> </span><span class="n">x₂</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="o">(</span><span class="n">hxeq</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="n">x₁</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="n">x₂</span><span class="o">)</span> <span class="w"> </span><span class="k">show</span><span class="w"> </span><span class="n">x₁</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x₂</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="n">only</span><span class="w"> </span><span class="o">[</span><span class="n">h_def</span><span class="o">,</span><span class="w"> </span><span class="n">sbFun</span><span class="o">,</span><span class="w"> </span><span class="bp">←</span><span class="w"> </span><span class="n">A_def</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">hxeq</span> <span class="w"> </span><span class="n">by_cases</span><span class="w"> </span><span class="n">xA</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x₁</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">x₂</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">A</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">wlog</span><span class="w"> </span><span class="n">x₁A</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x₁</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="n">generalizing</span><span class="w"> </span><span class="n">x₁</span><span class="w"> </span><span class="n">x₂</span><span class="w"> </span><span class="n">hxeq</span><span class="w"> </span><span class="n">xA</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">symm</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">this</span><span class="w"> </span><span class="n">hxeq.symm</span><span class="w"> </span><span class="n">xA.symm</span><span class="w"> </span><span class="o">(</span><span class="n">xA.resolve_left</span><span class="w"> </span><span class="n">x₁A</span><span class="o">)</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">x₂A</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x₂</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">_root_.not_imp_self.mp</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="o">(</span><span class="n">x₂nA</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x₂</span><span class="w"> </span><span class="bp">∉</span><span class="w"> </span><span class="n">A</span><span class="o">)</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">if_pos</span><span class="w"> </span><span class="n">x₁A</span><span class="o">,</span><span class="w"> </span><span class="n">if_neg</span><span class="w"> </span><span class="n">x₂nA</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">hxeq</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">A_def</span><span class="o">,</span><span class="w"> </span><span class="n">sbSet</span><span class="o">,</span><span class="w"> </span><span class="n">mem_iUnion</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">x₁A</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">x₂eq</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x₂</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">x₁</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">x₁A</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">hn</span><span class="o">⟩</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">A_def</span><span class="o">,</span><span class="w"> </span><span class="n">sbSet</span><span class="o">,</span><span class="w"> </span><span class="n">mem_iUnion</span><span class="o">]</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">sbAux</span><span class="o">]</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">x₁</span><span class="o">,</span><span class="w"> </span><span class="n">hn</span><span class="o">,</span><span class="w"> </span><span class="n">x₂eq.symm</span><span class="o">⟩</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">push_neg</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">xA</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>The proof introduces some new tactics.
-
@@ -1095,32 +1095,32 @@ The tactic <code class="docutils literal notranslate"><span class="pre">rcases</and <code class="docutils literal notranslate"><span class="pre">g</span> <span class="pre">y</span> <span class="pre">∈</span> <span class="pre">sbAux</span> <span class="pre">f</span> <span class="pre">g</span> <span class="pre">(n</span> <span class="pre">+</span> <span class="pre">1)</span></code>. In both cases, calling the simplifier with <code class="docutils literal notranslate"><span class="pre">simp</span> <span class="pre">[sbAux]</span></code> applies the corresponding defining equation of <code class="docutils literal notranslate"><span class="pre">sbAux</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">sb_surjective</span> <span class="o">(</span><span class="n">hg</span> <span class="o">:</span> <span class="n">Injective</span> <span class="n">g</span><span class="o">)</span> <span class="o">:</span> <span class="n">Surjective</span> <span class="o">(</span><span class="n">sbFun</span> <span class="n">f</span> <span class="n">g</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">set</span> <span class="n">A</span> <span class="o">:=</span> <span class="n">sbSet</span> <span class="n">f</span> <span class="n">g</span> <span class="k">with</span> <span class="n">A_def</span> <span class="n">set</span> <span class="n">h</span> <span class="o">:=</span> <span class="n">sbFun</span> <span class="n">f</span> <span class="n">g</span> <span class="k">with</span> <span class="n">h_def</span> <span class="n">intro</span> <span class="n">y</span> <span class="n">by_cases</span> <span class="n">gyA</span> <span class="o">:</span> <span class="n">g</span> <span class="n">y</span> <span class="bp">∈</span> <span class="n">A</span> <span class="bp">·</span> <span class="n">rw</span> <span class="o">[</span><span class="n">A_def</span><span class="o">,</span> <span class="n">sbSet</span><span class="o">,</span> <span class="n">mem_iUnion</span><span class="o">]</span> <span class="n">at</span> <span class="n">gyA</span> <span class="n">rcases</span> <span class="n">gyA</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">n</span><span class="o">,</span> <span class="n">hn</span><span class="o">⟩</span> <span class="n">rcases</span> <span class="n">n</span> <span class="k">with</span> <span class="n">_</span> <span class="bp">|</span> <span class="n">n</span> <span class="bp">·</span> <span class="n">simp</span> <span class="o">[</span><span class="n">sbAux</span><span class="o">]</span> <span class="n">at</span> <span class="n">hn</span> <span class="n">simp</span> <span class="o">[</span><span class="n">sbAux</span><span class="o">]</span> <span class="n">at</span> <span class="n">hn</span> <span class="n">rcases</span> <span class="n">hn</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">x</span><span class="o">,</span> <span class="n">xmem</span><span class="o">,</span> <span class="n">hx</span><span class="o">⟩</span> <span class="n">use</span> <span class="n">x</span> <span class="k">have</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">A</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">A_def</span><span class="o">,</span> <span class="n">sbSet</span><span class="o">,</span> <span class="n">mem_iUnion</span><span class="o">]</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">n</span><span class="o">,</span> <span class="n">xmem</span><span class="o">⟩</span> <span class="n">simp</span> <span class="n">only</span> <span class="o">[</span><span class="n">h_def</span><span class="o">,</span> <span class="n">sbFun</span><span class="o">,</span> <span class="n">if_pos</span> <span class="n">this</span><span class="o">]</span> <span class="n">exact</span> <span class="n">hg</span> <span class="n">hx</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">sb_surjective</span><span class="w"> </span><span class="o">(</span><span class="n">hg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Injective</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Surjective</span><span class="w"> </span><span class="o">(</span><span class="n">sbFun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">set</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">sbSet</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">A_def</span> <span class="w"> </span><span class="n">set</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">sbFun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">h_def</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">y</span> <span class="w"> </span><span class="n">by_cases</span><span class="w"> </span><span class="n">gyA</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">A</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">A_def</span><span class="o">,</span><span class="w"> </span><span class="n">sbSet</span><span class="o">,</span><span class="w"> </span><span class="n">mem_iUnion</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">gyA</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">gyA</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">hn</span><span class="o">⟩</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">n</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">sbAux</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">hn</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">sbAux</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">hn</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">hn</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">xmem</span><span class="o">,</span><span class="w"> </span><span class="n">hx</span><span class="o">⟩</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">A_def</span><span class="o">,</span><span class="w"> </span><span class="n">sbSet</span><span class="o">,</span><span class="w"> </span><span class="n">mem_iUnion</span><span class="o">]</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">xmem</span><span class="o">⟩</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="n">only</span><span class="w"> </span><span class="o">[</span><span class="n">h_def</span><span class="o">,</span><span class="w"> </span><span class="n">sbFun</span><span class="o">,</span><span class="w"> </span><span class="n">if_pos</span><span class="w"> </span><span class="n">this</span><span class="o">]</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">hg</span><span class="w"> </span><span class="n">hx</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>We can now put it all together. The final statement is short and sweet, and the proof uses the fact that <code class="docutils literal notranslate"><span class="pre">Bijective</span> <span class="pre">h</span></code> unfolds to <code class="docutils literal notranslate"><span class="pre">Injective</span> <span class="pre">h</span> <span class="pre">∧</span> <span class="pre">Surjective</span> <span class="pre">h</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">schroeder_bernstein</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">β</span><span class="o">}</span> <span class="o">{</span><span class="n">g</span> <span class="o">:</span> <span class="n">β</span> <span class="bp">→</span> <span class="n">α</span><span class="o">}</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">Injective</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">hg</span> <span class="o">:</span> <span class="n">Injective</span> <span class="n">g</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">h</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">β</span><span class="o">,</span> <span class="n">Bijective</span> <span class="n">h</span> <span class="o">:=</span> <span class="o">⟨</span><span class="n">sbFun</span> <span class="n">f</span> <span class="n">g</span><span class="o">,</span> <span class="n">sb_injective</span> <span class="n">f</span> <span class="n">g</span> <span class="n">hf</span><span class="o">,</span> <span class="n">sb_surjective</span> <span class="n">f</span> <span class="n">g</span> <span class="n">hg</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">schroeder_bernstein</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">β</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Injective</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Injective</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">β</span><span class="o">,</span><span class="w"> </span><span class="n">Bijective</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="n">sbFun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="o">,</span><span class="w"> </span><span class="n">sb_injective</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">hf</span><span class="o">,</span><span class="w"> </span><span class="n">sb_surjective</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">hg</span><span class="o">⟩</span> </pre></div> </div> </section>
-
-
-
@@ -18,7 +18,7 @@<script src="_static/jquery.js?v=5d32c60e"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/documentation_options.js?v=2709fde1"></script> <script src="_static/doctools.js?v=888ff710"></script> <script src="_static/doctools.js?v=9a2dae69"></script> <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script>
-
@@ -125,18 +125,18 @@ when necessary,but we can also do it manually by rewriting or simplifying with the identifier <code class="docutils literal notranslate"><span class="pre">Nat.Coprime</span></code>. The <code class="docutils literal notranslate"><span class="pre">norm_num</span></code> tactic is smart enough to compute concrete values.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#print</span> <span class="n">Nat.Coprime</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#print</span><span class="w"> </span><span class="n">Nat.Coprime</span> <span class="kd">example</span> <span class="o">(</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">m.Coprime</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">m.gcd</span> <span class="n">n</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="n">h</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m.Coprime</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m.gcd</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">h</span> <span class="kd">example</span> <span class="o">(</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">m.Coprime</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">m.gcd</span> <span class="n">n</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">Nat.Coprime</span><span class="o">]</span> <span class="n">at</span> <span class="n">h</span> <span class="n">exact</span> <span class="n">h</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m.Coprime</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m.gcd</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">Nat.Coprime</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">Nat.Coprime</span> <span class="mi">12</span> <span class="mi">7</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">norm_num</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.Coprime</span><span class="w"> </span><span class="mi">12</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">Nat.gcd</span> <span class="mi">12</span> <span class="mi">8</span> <span class="bp">=</span> <span class="mi">4</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">norm_num</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.gcd</span><span class="w"> </span><span class="mi">12</span><span class="w"> </span><span class="mi">8</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span> </pre></div> </div> <p>We have already encountered the <code class="docutils literal notranslate"><span class="pre">gcd</span></code> function in
-
@@ -154,24 +154,24 @@ to the natural numbers.</p><p>We also need the notion of a prime number, <code class="docutils literal notranslate"><span class="pre">Nat.Prime</span></code>. The theorem <code class="docutils literal notranslate"><span class="pre">Nat.prime_def_lt</span></code> provides one familiar characterization, and <code class="docutils literal notranslate"><span class="pre">Nat.Prime.eq_one_or_self_of_dvd</span></code> provides another.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">Nat.prime_def_lt</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="n">Nat.prime_def_lt</span> <span class="kd">example</span> <span class="o">(</span><span class="n">p</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">prime_p</span> <span class="o">:</span> <span class="n">Nat.Prime</span> <span class="n">p</span><span class="o">)</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">≤</span> <span class="n">p</span> <span class="bp">∧</span> <span class="bp">∀</span> <span class="n">m</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">,</span> <span class="n">m</span> <span class="bp"><</span> <span class="n">p</span> <span class="bp">→</span> <span class="n">m</span> <span class="bp">∣</span> <span class="n">p</span> <span class="bp">→</span> <span class="n">m</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rwa</span> <span class="o">[</span><span class="n">Nat.prime_def_lt</span><span class="o">]</span> <span class="n">at</span> <span class="n">prime_p</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">prime_p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="n">p</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rwa</span><span class="w"> </span><span class="o">[</span><span class="n">Nat.prime_def_lt</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">prime_p</span> <span class="k">#check</span> <span class="n">Nat.Prime.eq_one_or_self_of_dvd</span> <span class="k">#check</span><span class="w"> </span><span class="n">Nat.Prime.eq_one_or_self_of_dvd</span> <span class="kd">example</span> <span class="o">(</span><span class="n">p</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">prime_p</span> <span class="o">:</span> <span class="n">Nat.Prime</span> <span class="n">p</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">m</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">,</span> <span class="n">m</span> <span class="bp">∣</span> <span class="n">p</span> <span class="bp">→</span> <span class="n">m</span> <span class="bp">=</span> <span class="mi">1</span> <span class="bp">∨</span> <span class="n">m</span> <span class="bp">=</span> <span class="n">p</span> <span class="o">:=</span> <span class="n">prime_p.eq_one_or_self_of_dvd</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">prime_p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="n">p</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">prime_p.eq_one_or_self_of_dvd</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">Nat.Prime</span> <span class="mi">17</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">norm_num</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="mi">17</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span> <span class="c1">-- commonly used</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">Nat.Prime</span> <span class="mi">2</span> <span class="o">:=</span> <span class="n">Nat.prime_two</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Nat.prime_two</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">Nat.Prime</span> <span class="mi">3</span> <span class="o">:=</span> <span class="n">Nat.prime_three</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Nat.prime_three</span> </pre></div> </div> <p>In the natural numbers, a prime number has the property that it cannot
-
@@ -189,16 +189,16 @@ if the square of a number is even, then that number is even as well.Mathlib defines the predicate <code class="docutils literal notranslate"><span class="pre">Even</span></code> in <code class="docutils literal notranslate"><span class="pre">Algebra.Group.Even</span></code>, but for reasons that will become clear below, we will simply use <code class="docutils literal notranslate"><span class="pre">2</span> <span class="pre">∣</span> <span class="pre">m</span></code> to express that <code class="docutils literal notranslate"><span class="pre">m</span></code> is even.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">Nat.Prime.dvd_mul</span> <span class="k">#check</span> <span class="n">Nat.Prime.dvd_mul</span> <span class="n">Nat.prime_two</span> <span class="k">#check</span> <span class="n">Nat.prime_two.dvd_mul</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="n">Nat.Prime.dvd_mul</span> <span class="k">#check</span><span class="w"> </span><span class="n">Nat.Prime.dvd_mul</span><span class="w"> </span><span class="n">Nat.prime_two</span> <span class="k">#check</span><span class="w"> </span><span class="n">Nat.prime_two.dvd_mul</span> <span class="kd">theorem</span> <span class="n">even_of_even_sqr</span> <span class="o">{</span><span class="n">m</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">∣</span> <span class="n">m</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">∣</span> <span class="n">m</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">pow_two</span><span class="o">,</span> <span class="n">Nat.prime_two.dvd_mul</span><span class="o">]</span> <span class="n">at</span> <span class="n">h</span> <span class="n">cases</span> <span class="n">h</span> <span class="bp"><;></span> <span class="n">assumption</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">even_of_even_sqr</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">pow_two</span><span class="o">,</span><span class="w"> </span><span class="n">Nat.prime_two.dvd_mul</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">cases</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">assumption</span> <span class="kd">example</span> <span class="o">{</span><span class="n">m</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">∣</span> <span class="n">m</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">∣</span> <span class="n">m</span> <span class="o">:=</span> <span class="n">Nat.Prime.dvd_of_dvd_pow</span> <span class="n">Nat.prime_two</span> <span class="n">h</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Nat.Prime.dvd_of_dvd_pow</span><span class="w"> </span><span class="n">Nat.prime_two</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>As we proceed, you will need to become proficient at finding the facts you
-
@@ -215,32 +215,32 @@ You can also use the search engine on theand if all else fails, don’t hesitate to ask on <a class="reference external" href="https://leanprover.zulipchat.com/">Zulip</a>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">c</span><span class="o">)</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">c</span> <span class="o">:=</span> <span class="c1">-- apply? suggests the following:</span> <span class="o">(</span><span class="n">mul_right_inj'</span> <span class="n">h'</span><span class="o">)</span><span class="bp">.</span><span class="n">mp</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="c1">-- apply? suggests the following:</span> <span class="w"> </span><span class="o">(</span><span class="n">mul_right_inj'</span><span class="w"> </span><span class="n">h'</span><span class="o">)</span><span class="bp">.</span><span class="n">mp</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>The heart of our proof of the irrationality of the square root of two is contained in the following theorem. See if you can fill out the proof sketch, using <code class="docutils literal notranslate"><span class="pre">even_of_even_sqr</span></code> and the theorem <code class="docutils literal notranslate"><span class="pre">Nat.dvd_gcd</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">coprime_mn</span> <span class="o">:</span> <span class="n">m.Coprime</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">≠</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">sqr_eq</span> <span class="k">have</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">∣</span> <span class="n">m</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">obtain</span> <span class="o">⟨</span><span class="n">k</span><span class="o">,</span> <span class="n">meq</span><span class="o">⟩</span> <span class="o">:=</span> <span class="n">dvd_iff_exists_eq_mul_left.mp</span> <span class="n">this</span> <span class="k">have</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">*</span> <span class="o">(</span><span class="mi">2</span> <span class="bp">*</span> <span class="n">k</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="bp">=</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="bp">←</span> <span class="n">sqr_eq</span><span class="o">,</span> <span class="n">meq</span><span class="o">]</span> <span class="n">ring</span> <span class="k">have</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">k</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">=</span> <span class="n">n</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">∣</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">∣</span> <span class="n">m.gcd</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">∣</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">norm_num</span> <span class="n">at</span> <span class="n">this</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">coprime_mn</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m.Coprime</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">sqr_eq</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">obtain</span><span class="w"> </span><span class="o">⟨</span><span class="n">k</span><span class="o">,</span><span class="w"> </span><span class="n">meq</span><span class="o">⟩</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">dvd_iff_exists_eq_mul_left.mp</span><span class="w"> </span><span class="n">this</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="bp">←</span><span class="w"> </span><span class="n">sqr_eq</span><span class="o">,</span><span class="w"> </span><span class="n">meq</span><span class="o">]</span> <span class="w"> </span><span class="n">ring</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">m.gcd</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">norm_num</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">this</span> </pre></div> </div> <p>In fact, with very few changes, we can replace <code class="docutils literal notranslate"><span class="pre">2</span></code> by an arbitrary prime.
-
@@ -250,8 +250,8 @@ At the end of the proof, you’ll need to derive a contradiction fromYou can use <code class="docutils literal notranslate"><span class="pre">Nat.Prime.two_le</span></code>, which says that any prime number is greater than or equal to two, and <code class="docutils literal notranslate"><span class="pre">Nat.le_of_dvd</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">m</span> <span class="n">n</span> <span class="n">p</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">coprime_mn</span> <span class="o">:</span> <span class="n">m.Coprime</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">prime_p</span> <span class="o">:</span> <span class="n">p.Prime</span><span class="o">)</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">≠</span> <span class="n">p</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">coprime_mn</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m.Coprime</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">prime_p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">p.Prime</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Let us consider another approach.
-
@@ -273,10 +273,10 @@ are prime, that any <code class="docutils literal notranslate"><span class="pre"product of its factors, and that if <code class="docutils literal notranslate"><span class="pre">n</span></code> is equal to the product of another list of prime numbers, then that list is a permutation of <code class="docutils literal notranslate"><span class="pre">Nat.primeFactorsList</span> <span class="pre">n</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">Nat.primeFactorsList</span> <span class="k">#check</span> <span class="n">Nat.prime_of_mem_primeFactorsList</span> <span class="k">#check</span> <span class="n">Nat.prod_primeFactorsList</span> <span class="k">#check</span> <span class="n">Nat.primeFactorsList_unique</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="n">Nat.primeFactorsList</span> <span class="k">#check</span><span class="w"> </span><span class="n">Nat.prime_of_mem_primeFactorsList</span> <span class="k">#check</span><span class="w"> </span><span class="n">Nat.prod_primeFactorsList</span> <span class="k">#check</span><span class="w"> </span><span class="n">Nat.primeFactorsList_unique</span> </pre></div> </div> <p>You can browse these theorems and others nearby, even though we have not
-
@@ -287,20 +287,20 @@ that represents the same data as a function.Specifically, <code class="docutils literal notranslate"><span class="pre">Nat.factorization</span> <span class="pre">n</span> <span class="pre">p</span></code>, which we can also write <code class="docutils literal notranslate"><span class="pre">n.factorization</span> <span class="pre">p</span></code>, returns the multiplicity of <code class="docutils literal notranslate"><span class="pre">p</span></code> in the prime factorization of <code class="docutils literal notranslate"><span class="pre">n</span></code>. We will use the following three facts.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">factorization_mul'</span> <span class="o">{</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">mnez</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">(</span><span class="n">nnez</span> <span class="o">:</span> <span class="n">n</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">(</span><span class="n">p</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">m</span> <span class="bp">*</span> <span class="n">n</span><span class="o">)</span><span class="bp">.</span><span class="n">factorization</span> <span class="n">p</span> <span class="bp">=</span> <span class="n">m.factorization</span> <span class="n">p</span> <span class="bp">+</span> <span class="n">n.factorization</span> <span class="n">p</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">Nat.factorization_mul</span> <span class="n">mnez</span> <span class="n">nnez</span><span class="o">]</span> <span class="n">rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">factorization_mul'</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">mnez</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">nnez</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="bp">.</span><span class="n">factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">m.factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">n.factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">Nat.factorization_mul</span><span class="w"> </span><span class="n">mnez</span><span class="w"> </span><span class="n">nnez</span><span class="o">]</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">theorem</span> <span class="n">factorization_pow'</span> <span class="o">(</span><span class="n">n</span> <span class="n">k</span> <span class="n">p</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">n</span> <span class="bp">^</span> <span class="n">k</span><span class="o">)</span><span class="bp">.</span><span class="n">factorization</span> <span class="n">p</span> <span class="bp">=</span> <span class="n">k</span> <span class="bp">*</span> <span class="n">n.factorization</span> <span class="n">p</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">Nat.factorization_pow</span><span class="o">]</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">factorization_pow'</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">k</span><span class="o">)</span><span class="bp">.</span><span class="n">factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n.factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">Nat.factorization_pow</span><span class="o">]</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">theorem</span> <span class="n">Nat.Prime.factorization'</span> <span class="o">{</span><span class="n">p</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">prime_p</span> <span class="o">:</span> <span class="n">p.Prime</span><span class="o">)</span> <span class="o">:</span> <span class="n">p.factorization</span> <span class="n">p</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">prime_p.factorization</span><span class="o">]</span> <span class="n">simp</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">Nat.Prime.factorization'</span><span class="w"> </span><span class="o">{</span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">prime_p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">p.Prime</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">p.factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">prime_p.factorization</span><span class="o">]</span> <span class="w"> </span><span class="n">simp</span> </pre></div> </div> <p>In fact, <code class="docutils literal notranslate"><span class="pre">n.factorization</span></code> is defined in Lean as a function of finite support,
-
@@ -312,17 +312,17 @@ the three theorems above as a black box.</p>followed by <code class="docutils literal notranslate"><span class="pre">assumption</span></code>.</p> <p>See if you can use the identities above to fill in the missing parts of the proof.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">m</span> <span class="n">n</span> <span class="n">p</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">nnz</span> <span class="o">:</span> <span class="n">n</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">(</span><span class="n">prime_p</span> <span class="o">:</span> <span class="n">p.Prime</span><span class="o">)</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">≠</span> <span class="n">p</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">sqr_eq</span> <span class="k">have</span> <span class="n">nsqr_nez</span> <span class="o">:</span> <span class="n">n</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">≠</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simpa</span> <span class="k">have</span> <span class="n">eq1</span> <span class="o">:</span> <span class="n">Nat.factorization</span> <span class="o">(</span><span class="n">m</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="n">p</span> <span class="bp">=</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">m.factorization</span> <span class="n">p</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="n">eq2</span> <span class="o">:</span> <span class="o">(</span><span class="n">p</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span><span class="bp">.</span><span class="n">factorization</span> <span class="n">p</span> <span class="bp">=</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">n.factorization</span> <span class="n">p</span> <span class="bp">+</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">m.factorization</span> <span class="n">p</span> <span class="bp">%</span> <span class="mi">2</span> <span class="bp">=</span> <span class="o">(</span><span class="mi">2</span> <span class="bp">*</span> <span class="n">n.factorization</span> <span class="n">p</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">%</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="bp">←</span> <span class="n">eq1</span><span class="o">,</span> <span class="n">sqr_eq</span><span class="o">,</span> <span class="n">eq2</span><span class="o">]</span> <span class="n">rw</span> <span class="o">[</span><span class="n">add_comm</span><span class="o">,</span> <span class="n">Nat.add_mul_mod_self_left</span><span class="o">,</span> <span class="n">Nat.mul_mod_right</span><span class="o">]</span> <span class="n">at</span> <span class="n">this</span> <span class="n">norm_num</span> <span class="n">at</span> <span class="n">this</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">nnz</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">prime_p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">p.Prime</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">sqr_eq</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">nsqr_nez</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simpa</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">eq1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.factorization</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">m.factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">eq2</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">p</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="bp">.</span><span class="n">factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n.factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">m.factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n.factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="bp">←</span><span class="w"> </span><span class="n">eq1</span><span class="o">,</span><span class="w"> </span><span class="n">sqr_eq</span><span class="o">,</span><span class="w"> </span><span class="n">eq2</span><span class="o">]</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">add_comm</span><span class="o">,</span><span class="w"> </span><span class="n">Nat.add_mul_mod_self_left</span><span class="o">,</span><span class="w"> </span><span class="n">Nat.mul_mod_right</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">this</span> <span class="w"> </span><span class="n">norm_num</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">this</span> </pre></div> </div> <p>A nice thing about this proof is that it also generalizes. There is
-
@@ -349,20 +349,20 @@ to finish it off.</p><p>Note that this example does not assume that <code class="docutils literal notranslate"><span class="pre">p</span></code> is prime, but the conclusion is trivial when <code class="docutils literal notranslate"><span class="pre">p</span></code> is not prime since <code class="docutils literal notranslate"><span class="pre">r.factorization</span> <span class="pre">p</span></code> is then zero by definition, and the proof works in all cases anyway.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">m</span> <span class="n">n</span> <span class="n">k</span> <span class="n">r</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">nnz</span> <span class="o">:</span> <span class="n">n</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">(</span><span class="n">pow_eq</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">^</span> <span class="n">k</span> <span class="bp">=</span> <span class="n">r</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">^</span> <span class="n">k</span><span class="o">)</span> <span class="o">{</span><span class="n">p</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">:</span> <span class="n">k</span> <span class="bp">∣</span> <span class="n">r.factorization</span> <span class="n">p</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rcases</span> <span class="n">r</span> <span class="k">with</span> <span class="n">_</span> <span class="bp">|</span> <span class="n">r</span> <span class="bp">·</span> <span class="n">simp</span> <span class="k">have</span> <span class="n">npow_nz</span> <span class="o">:</span> <span class="n">n</span> <span class="bp">^</span> <span class="n">k</span> <span class="bp">≠</span> <span class="mi">0</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">npowz</span> <span class="bp">↦</span> <span class="n">nnz</span> <span class="o">(</span><span class="n">pow_eq_zero</span> <span class="n">npowz</span><span class="o">)</span> <span class="k">have</span> <span class="n">eq1</span> <span class="o">:</span> <span class="o">(</span><span class="n">m</span> <span class="bp">^</span> <span class="n">k</span><span class="o">)</span><span class="bp">.</span><span class="n">factorization</span> <span class="n">p</span> <span class="bp">=</span> <span class="n">k</span> <span class="bp">*</span> <span class="n">m.factorization</span> <span class="n">p</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="n">eq2</span> <span class="o">:</span> <span class="o">((</span><span class="n">r</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">^</span> <span class="n">k</span><span class="o">)</span><span class="bp">.</span><span class="n">factorization</span> <span class="n">p</span> <span class="bp">=</span> <span class="n">k</span> <span class="bp">*</span> <span class="n">n.factorization</span> <span class="n">p</span> <span class="bp">+</span> <span class="o">(</span><span class="n">r</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span><span class="bp">.</span><span class="n">factorization</span> <span class="n">p</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="o">:</span> <span class="n">r.succ.factorization</span> <span class="n">p</span> <span class="bp">=</span> <span class="n">k</span> <span class="bp">*</span> <span class="n">m.factorization</span> <span class="n">p</span> <span class="bp">-</span> <span class="n">k</span> <span class="bp">*</span> <span class="n">n.factorization</span> <span class="n">p</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="bp">←</span> <span class="n">eq1</span><span class="o">,</span> <span class="n">pow_eq</span><span class="o">,</span> <span class="n">eq2</span><span class="o">,</span> <span class="n">add_comm</span><span class="o">,</span> <span class="n">Nat.add_sub_cancel</span><span class="o">]</span> <span class="n">rw</span> <span class="o">[</span><span class="n">this</span><span class="o">]</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">nnz</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">pow_eq</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">k</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">r.factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">r</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">npow_nz</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">npowz</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">nnz</span><span class="w"> </span><span class="o">(</span><span class="n">pow_eq_zero</span><span class="w"> </span><span class="n">npowz</span><span class="o">)</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">eq1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">k</span><span class="o">)</span><span class="bp">.</span><span class="n">factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">m.factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">eq2</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">((</span><span class="n">r</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">k</span><span class="o">)</span><span class="bp">.</span><span class="n">factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">=</span> <span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n.factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="bp">.</span><span class="n">factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">r.succ.factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">m.factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n.factorization</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="bp">←</span><span class="w"> </span><span class="n">eq1</span><span class="o">,</span><span class="w"> </span><span class="n">pow_eq</span><span class="o">,</span><span class="w"> </span><span class="n">eq2</span><span class="o">,</span><span class="w"> </span><span class="n">add_comm</span><span class="o">,</span><span class="w"> </span><span class="n">Nat.add_sub_cancel</span><span class="o">]</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">this</span><span class="o">]</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>There are a number of ways in which we might want to improve on these results.
-
@@ -412,9 +412,9 @@ Lean’s foundation allows us to declare <em>inductive types</em>,which are types generated inductively by a given list of <em>constructors</em>. In Lean, the natural numbers are declared as follows.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">inductive</span> <span class="n">Nat</span> <span class="n">where</span> <span class="bp">|</span> <span class="n">zero</span> <span class="o">:</span> <span class="n">Nat</span> <span class="bp">|</span> <span class="n">succ</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">)</span> <span class="o">:</span> <span class="n">Nat</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">inductive</span><span class="w"> </span><span class="n">Nat</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">zero</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">succ</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat</span> </pre></div> </div> <p>You can find this in the library by writing <code class="docutils literal notranslate"><span class="pre">#check</span> <span class="pre">Nat</span></code> and
-
@@ -428,11 +428,11 @@ representations, but we don’t have to worry about the details of that now.<p>What “freely” means for the working mathematician is that the type <code class="docutils literal notranslate"><span class="pre">Nat</span></code> has an element <code class="docutils literal notranslate"><span class="pre">zero</span></code> and an injective successor function <code class="docutils literal notranslate"><span class="pre">succ</span></code> whose image does not include <code class="docutils literal notranslate"><span class="pre">zero</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">)</span> <span class="o">:</span> <span class="n">n.succ</span> <span class="bp">≠</span> <span class="n">Nat.zero</span> <span class="o">:=</span> <span class="n">Nat.succ_ne_zero</span> <span class="n">n</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">n.succ</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">Nat.zero</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Nat.succ_ne_zero</span><span class="w"> </span><span class="n">n</span> <span class="kd">example</span> <span class="o">(</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">m.succ</span> <span class="bp">=</span> <span class="n">n.succ</span><span class="o">)</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">=</span> <span class="n">n</span> <span class="o">:=</span> <span class="n">Nat.succ.inj</span> <span class="n">h</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m.succ</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">n.succ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Nat.succ.inj</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>What the word “inductively” means for the working mathematician is that
-
@@ -441,9 +441,9 @@ and a principle of definition by recursion.This section will show you how to use these.</p> <p>Here is an example of a recursive definition of the factorial function.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">fac</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℕ</span> <span class="bp">|</span> <span class="mi">0</span> <span class="bp">=></span> <span class="mi">1</span> <span class="bp">|</span> <span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span> <span class="bp">=></span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">*</span> <span class="n">fac</span> <span class="n">n</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">fac</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℕ</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="mi">1</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">fac</span><span class="w"> </span><span class="n">n</span> </pre></div> </div> <p>The syntax takes some getting used to.
-
@@ -452,23 +452,23 @@ The next two lines provide the base case and inductive stepfor a recursive definition. These equations hold definitionally, but they can also be used manually by giving the name <code class="docutils literal notranslate"><span class="pre">fac</span></code> to <code class="docutils literal notranslate"><span class="pre">simp</span></code> or <code class="docutils literal notranslate"><span class="pre">rw</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">fac</span> <span class="mi">0</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="n">rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">fac</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">fac</span> <span class="mi">0</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">fac</span><span class="o">]</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">fac</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">fac</span><span class="o">]</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">fac</span> <span class="mi">0</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="o">[</span><span class="n">fac</span><span class="o">]</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">fac</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">fac</span><span class="o">]</span> <span class="kd">example</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="n">fac</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">=</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">*</span> <span class="n">fac</span> <span class="n">n</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">fac</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">fac</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">example</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="n">fac</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">=</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">*</span> <span class="n">fac</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">fac</span><span class="o">]</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">fac</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">fac</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">fac</span><span class="o">]</span> <span class="kd">example</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="n">fac</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">=</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">*</span> <span class="n">fac</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="o">[</span><span class="n">fac</span><span class="o">]</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">fac</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">fac</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">fac</span><span class="o">]</span> </pre></div> </div> <p>The factorial function is actually already defined in Mathlib as
-
@@ -491,26 +491,26 @@ and a required to prove <code class="docutils literal notranslate"><span class="The phrase <code class="docutils literal notranslate"><span class="pre">with</span> <span class="pre">n</span> <span class="pre">ih</span></code> serves to name the variable and the assumption for the inductive hypothesis, and you can choose whatever names you want for them.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">fac_pos</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">fac</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">induction'</span> <span class="n">n</span> <span class="k">with</span> <span class="n">n</span> <span class="n">ih</span> <span class="bp">·</span> <span class="n">rw</span> <span class="o">[</span><span class="n">fac</span><span class="o">]</span> <span class="n">exact</span> <span class="n">zero_lt_one</span> <span class="n">rw</span> <span class="o">[</span><span class="n">fac</span><span class="o">]</span> <span class="n">exact</span> <span class="n">mul_pos</span> <span class="n">n.succ_pos</span> <span class="n">ih</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">fac_pos</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">fac</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">induction'</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">ih</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">fac</span><span class="o">]</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">zero_lt_one</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">fac</span><span class="o">]</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">mul_pos</span><span class="w"> </span><span class="n">n.succ_pos</span><span class="w"> </span><span class="n">ih</span> </pre></div> </div> <p>The <code class="docutils literal notranslate"><span class="pre">induction</span></code> tactic is smart enough to include hypotheses that depend on the induction variable as part of the induction hypothesis. Step through the next example to see what is going on.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">dvd_fac</span> <span class="o">{</span><span class="n">i</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">ipos</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">i</span><span class="o">)</span> <span class="o">(</span><span class="n">ile</span> <span class="o">:</span> <span class="n">i</span> <span class="bp">≤</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">i</span> <span class="bp">∣</span> <span class="n">fac</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">induction'</span> <span class="n">n</span> <span class="k">with</span> <span class="n">n</span> <span class="n">ih</span> <span class="bp">·</span> <span class="n">exact</span> <span class="n">absurd</span> <span class="n">ipos</span> <span class="o">(</span><span class="n">not_lt_of_ge</span> <span class="n">ile</span><span class="o">)</span> <span class="n">rw</span> <span class="o">[</span><span class="n">fac</span><span class="o">]</span> <span class="n">rcases</span> <span class="n">Nat.of_le_succ</span> <span class="n">ile</span> <span class="k">with</span> <span class="n">h</span> <span class="bp">|</span> <span class="n">h</span> <span class="bp">·</span> <span class="n">apply</span> <span class="n">dvd_mul_of_dvd_right</span> <span class="o">(</span><span class="n">ih</span> <span class="n">h</span><span class="o">)</span> <span class="n">rw</span> <span class="o">[</span><span class="n">h</span><span class="o">]</span> <span class="n">apply</span> <span class="n">dvd_mul_right</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">dvd_fac</span><span class="w"> </span><span class="o">{</span><span class="n">i</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">ipos</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">ile</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">fac</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">induction'</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">ih</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">absurd</span><span class="w"> </span><span class="n">ipos</span><span class="w"> </span><span class="o">(</span><span class="n">not_lt_of_ge</span><span class="w"> </span><span class="n">ile</span><span class="o">)</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">fac</span><span class="o">]</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">Nat.of_le_succ</span><span class="w"> </span><span class="n">ile</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">dvd_mul_of_dvd_right</span><span class="w"> </span><span class="o">(</span><span class="n">ih</span><span class="w"> </span><span class="n">h</span><span class="o">)</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">h</span><span class="o">]</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">dvd_mul_right</span> </pre></div> </div> <p>The following example provides a crude lower bound for the factorial
-
@@ -520,10 +520,10 @@ so that the remainder of the proof starts with the case<span class="math notranslate nohighlight">\(n = 1\)</span>. See if you can complete the argument with a proof by induction using <code class="docutils literal notranslate"><span class="pre">pow_succ</span></code> or <code class="docutils literal notranslate"><span class="pre">pow_succ'</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">pow_two_le_fac</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">^</span> <span class="o">(</span><span class="n">n</span> <span class="bp">-</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">≤</span> <span class="n">fac</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rcases</span> <span class="n">n</span> <span class="k">with</span> <span class="n">_</span> <span class="bp">|</span> <span class="n">n</span> <span class="bp">·</span> <span class="n">simp</span> <span class="o">[</span><span class="n">fac</span><span class="o">]</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">pow_two_le_fac</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">fac</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">n</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">fac</span><span class="o">]</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Induction is often used to prove identities involving finite sums and
-
@@ -542,50 +542,50 @@ it supports in the next section, and again in a later chapter.For now, we will only make use of <code class="docutils literal notranslate"><span class="pre">Finset.range</span> <span class="pre">n</span></code>, which is the finite set of natural numbers less than <code class="docutils literal notranslate"><span class="pre">n</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">(</span><span class="n">s</span> <span class="o">:</span> <span class="n">Finset</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Finset</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span> <span class="k">#check</span> <span class="n">Finset.sum</span> <span class="n">s</span> <span class="n">f</span> <span class="k">#check</span> <span class="n">Finset.prod</span> <span class="n">s</span> <span class="n">f</span> <span class="k">#check</span><span class="w"> </span><span class="n">Finset.sum</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">f</span> <span class="k">#check</span><span class="w"> </span><span class="n">Finset.prod</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">f</span> <span class="kn">open</span> <span class="n">BigOperators</span> <span class="kn">open</span> <span class="n">Finset</span> <span class="kn">open</span><span class="w"> </span><span class="n">BigOperators</span> <span class="kn">open</span><span class="w"> </span><span class="n">Finset</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">s.sum</span> <span class="n">f</span> <span class="bp">=</span> <span class="bp">∑</span> <span class="n">x</span> <span class="k">in</span> <span class="n">s</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s.sum</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">∑</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">s.prod</span> <span class="n">f</span> <span class="bp">=</span> <span class="bp">∏</span> <span class="n">x</span> <span class="k">in</span> <span class="n">s</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s.prod</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">∏</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">range</span> <span class="n">n</span><span class="o">)</span><span class="bp">.</span><span class="n">sum</span> <span class="n">f</span> <span class="bp">=</span> <span class="bp">∑</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="n">n</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">range</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="bp">.</span><span class="n">sum</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">∑</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">range</span> <span class="n">n</span><span class="o">)</span><span class="bp">.</span><span class="n">prod</span> <span class="n">f</span> <span class="bp">=</span> <span class="bp">∏</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="n">n</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">range</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="bp">.</span><span class="n">prod</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">∏</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p>The facts <code class="docutils literal notranslate"><span class="pre">Finset.sum_range_zero</span></code> and <code class="docutils literal notranslate"><span class="pre">Finset.sum_range_succ</span></code> provide a recursive description of summation up to <span class="math notranslate nohighlight">\(n\)</span>, and similarly for products.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∑</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="mi">0</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="n">Finset.sum_range_zero</span> <span class="n">f</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∑</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Finset.sum_range_zero</span><span class="w"> </span><span class="n">f</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∑</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="n">n.succ</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">=</span> <span class="bp">∑</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="n">n</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">f</span> <span class="n">n</span> <span class="o">:=</span> <span class="n">Finset.sum_range_succ</span> <span class="n">f</span> <span class="n">n</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∑</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="n">n.succ</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">∑</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Finset.sum_range_succ</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">n</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∏</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="mi">0</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="n">Finset.prod_range_zero</span> <span class="n">f</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∏</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Finset.prod_range_zero</span><span class="w"> </span><span class="n">f</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∏</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="n">n.succ</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">=</span> <span class="o">(</span><span class="bp">∏</span> <span class="n">x</span> <span class="k">in</span> <span class="n">range</span> <span class="n">n</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">n</span> <span class="o">:=</span> <span class="n">Finset.prod_range_succ</span> <span class="n">f</span> <span class="n">n</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∏</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="n">n.succ</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="bp">∏</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Finset.prod_range_succ</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">n</span> </pre></div> </div> <p>The first identity in each pair holds definitionally, which is to say, you can replace the proofs by <code class="docutils literal notranslate"><span class="pre">rfl</span></code>.</p> <p>The following expresses the factorial function that we defined as a product.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="n">fac</span> <span class="n">n</span> <span class="bp">=</span> <span class="bp">∏</span> <span class="n">i</span> <span class="k">in</span> <span class="n">range</span> <span class="n">n</span><span class="o">,</span> <span class="o">(</span><span class="n">i</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">induction'</span> <span class="n">n</span> <span class="k">with</span> <span class="n">n</span> <span class="n">ih</span> <span class="bp">·</span> <span class="n">simp</span> <span class="o">[</span><span class="n">fac</span><span class="o">,</span> <span class="n">prod_range_zero</span><span class="o">]</span> <span class="n">simp</span> <span class="o">[</span><span class="n">fac</span><span class="o">,</span> <span class="n">ih</span><span class="o">,</span> <span class="n">prod_range_succ</span><span class="o">,</span> <span class="n">mul_comm</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">fac</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">∏</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="o">(</span><span class="n">i</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">induction'</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">ih</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">fac</span><span class="o">,</span><span class="w"> </span><span class="n">prod_range_zero</span><span class="o">]</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">fac</span><span class="o">,</span><span class="w"> </span><span class="n">ih</span><span class="o">,</span><span class="w"> </span><span class="n">prod_range_succ</span><span class="o">,</span><span class="w"> </span><span class="n">mul_comm</span><span class="o">]</span> </pre></div> </div> <p>The fact that we include <code class="docutils literal notranslate"><span class="pre">mul_comm</span></code> as a simplification rule deserves
-
@@ -599,8 +599,8 @@ The following example shows that simplifying using the three rules<code class="docutils literal notranslate"><span class="pre">mul_assoc</span></code>, <code class="docutils literal notranslate"><span class="pre">mul_comm</span></code>, and <code class="docutils literal notranslate"><span class="pre">mul_left_comm</span></code> manages to identify products that are the same up to the placement of parentheses and ordering of variables.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="n">d</span> <span class="n">e</span> <span class="n">f</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="o">(</span><span class="n">b</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">*</span> <span class="n">f</span> <span class="bp">*</span> <span class="o">(</span><span class="n">d</span> <span class="bp">*</span> <span class="n">e</span><span class="o">))</span> <span class="bp">=</span> <span class="n">d</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">f</span> <span class="bp">*</span> <span class="n">e</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">c</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="o">[</span><span class="n">mul_assoc</span><span class="o">,</span> <span class="n">mul_comm</span><span class="o">,</span> <span class="n">mul_left_comm</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">d</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">e</span><span class="o">))</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">e</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">mul_assoc</span><span class="o">,</span><span class="w"> </span><span class="n">mul_comm</span><span class="o">,</span><span class="w"> </span><span class="n">mul_left_comm</span><span class="o">]</span> </pre></div> </div> <p>Roughly, the rules work by pushing parentheses to the right
-
@@ -614,18 +614,18 @@ The first step of the proof clears the denominator.This is generally useful when formalizing identities, because calculations with division generally have side conditions. (It is similarly useful to avoid using subtraction on the natural numbers when possible.)</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">sum_id</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∑</span> <span class="n">i</span> <span class="k">in</span> <span class="n">range</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">),</span> <span class="n">i</span> <span class="bp">=</span> <span class="n">n</span> <span class="bp">*</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">symm</span><span class="bp">;</span> <span class="n">apply</span> <span class="n">Nat.div_eq_of_eq_mul_right</span> <span class="o">(</span><span class="kd">by</span> <span class="n">norm_num</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="mi">2</span><span class="o">)</span> <span class="n">induction'</span> <span class="n">n</span> <span class="k">with</span> <span class="n">n</span> <span class="n">ih</span> <span class="bp">·</span> <span class="n">simp</span> <span class="n">rw</span> <span class="o">[</span><span class="n">Finset.sum_range_succ</span><span class="o">,</span> <span class="n">mul_add</span> <span class="mi">2</span><span class="o">,</span> <span class="bp">←</span> <span class="n">ih</span><span class="o">]</span> <span class="n">ring</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">sum_id</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∑</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">),</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">symm</span><span class="bp">;</span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">Nat.div_eq_of_eq_mul_right</span><span class="w"> </span><span class="o">(</span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span> <span class="w"> </span><span class="n">induction'</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">ih</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">Finset.sum_range_succ</span><span class="o">,</span><span class="w"> </span><span class="n">mul_add</span><span class="w"> </span><span class="mi">2</span><span class="o">,</span><span class="w"> </span><span class="bp">←</span><span class="w"> </span><span class="n">ih</span><span class="o">]</span> <span class="w"> </span><span class="n">ring</span> </pre></div> </div> <p>We encourage you to prove the analogous identity for sums of squares, and other identities you can find on the web.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">sum_sqr</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∑</span> <span class="n">i</span> <span class="k">in</span> <span class="n">range</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">),</span> <span class="n">i</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">=</span> <span class="n">n</span> <span class="bp">*</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="mi">2</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">6</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">sum_sqr</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∑</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">),</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">6</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>In Lean’s core library, addition and multiplication are themselves defined
-
@@ -664,48 +664,48 @@ Remember that truncated subtraction cuts off at zero.To define that, it is useful to define a predecessor function, <code class="docutils literal notranslate"><span class="pre">pred</span></code>, that subtracts one from any nonzero number and fixes zero. The function <code class="docutils literal notranslate"><span class="pre">pred</span></code> can be defined by a simple instance of recursion.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">inductive</span> <span class="n">MyNat</span> <span class="n">where</span> <span class="bp">|</span> <span class="n">zero</span> <span class="o">:</span> <span class="n">MyNat</span> <span class="bp">|</span> <span class="n">succ</span> <span class="o">:</span> <span class="n">MyNat</span> <span class="bp">→</span> <span class="n">MyNat</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">inductive</span><span class="w"> </span><span class="n">MyNat</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">zero</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MyNat</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">succ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MyNat</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">MyNat</span> <span class="kn">namespace</span> <span class="n">MyNat</span> <span class="kn">namespace</span><span class="w"> </span><span class="n">MyNat</span> <span class="kd">def</span> <span class="n">add</span> <span class="o">:</span> <span class="n">MyNat</span> <span class="bp">→</span> <span class="n">MyNat</span> <span class="bp">→</span> <span class="n">MyNat</span> <span class="bp">|</span> <span class="n">x</span><span class="o">,</span> <span class="n">zero</span> <span class="bp">=></span> <span class="n">x</span> <span class="bp">|</span> <span class="n">x</span><span class="o">,</span> <span class="n">succ</span> <span class="n">y</span> <span class="bp">=></span> <span class="n">succ</span> <span class="o">(</span><span class="n">add</span> <span class="n">x</span> <span class="n">y</span><span class="o">)</span> <span class="kd">def</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MyNat</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">MyNat</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">MyNat</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">zero</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">succ</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="n">succ</span><span class="w"> </span><span class="o">(</span><span class="n">add</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="o">)</span> <span class="kd">def</span> <span class="n">mul</span> <span class="o">:</span> <span class="n">MyNat</span> <span class="bp">→</span> <span class="n">MyNat</span> <span class="bp">→</span> <span class="n">MyNat</span> <span class="bp">|</span> <span class="n">x</span><span class="o">,</span> <span class="n">zero</span> <span class="bp">=></span> <span class="n">zero</span> <span class="bp">|</span> <span class="n">x</span><span class="o">,</span> <span class="n">succ</span> <span class="n">y</span> <span class="bp">=></span> <span class="n">add</span> <span class="o">(</span><span class="n">mul</span> <span class="n">x</span> <span class="n">y</span><span class="o">)</span> <span class="n">x</span> <span class="kd">def</span><span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MyNat</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">MyNat</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">MyNat</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">zero</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="n">zero</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">succ</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="o">(</span><span class="n">mul</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="n">x</span> <span class="kd">theorem</span> <span class="n">zero_add</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">MyNat</span><span class="o">)</span> <span class="o">:</span> <span class="n">add</span> <span class="n">zero</span> <span class="n">n</span> <span class="bp">=</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">induction'</span> <span class="n">n</span> <span class="k">with</span> <span class="n">n</span> <span class="n">ih</span> <span class="bp">·</span> <span class="n">rfl</span> <span class="n">rw</span> <span class="o">[</span><span class="n">add</span><span class="o">,</span> <span class="n">ih</span><span class="o">]</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">zero_add</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MyNat</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="n">zero</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">induction'</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">ih</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rfl</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">add</span><span class="o">,</span><span class="w"> </span><span class="n">ih</span><span class="o">]</span> <span class="kd">theorem</span> <span class="n">succ_add</span> <span class="o">(</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">MyNat</span><span class="o">)</span> <span class="o">:</span> <span class="n">add</span> <span class="o">(</span><span class="n">succ</span> <span class="n">m</span><span class="o">)</span> <span class="n">n</span> <span class="bp">=</span> <span class="n">succ</span> <span class="o">(</span><span class="n">add</span> <span class="n">m</span> <span class="n">n</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">induction'</span> <span class="n">n</span> <span class="k">with</span> <span class="n">n</span> <span class="n">ih</span> <span class="bp">·</span> <span class="n">rfl</span> <span class="n">rw</span> <span class="o">[</span><span class="n">add</span><span class="o">,</span> <span class="n">ih</span><span class="o">]</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">succ_add</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MyNat</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="o">(</span><span class="n">succ</span><span class="w"> </span><span class="n">m</span><span class="o">)</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">succ</span><span class="w"> </span><span class="o">(</span><span class="n">add</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">induction'</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">ih</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rfl</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">add</span><span class="o">,</span><span class="w"> </span><span class="n">ih</span><span class="o">]</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">theorem</span> <span class="n">add_comm</span> <span class="o">(</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">MyNat</span><span class="o">)</span> <span class="o">:</span> <span class="n">add</span> <span class="n">m</span> <span class="n">n</span> <span class="bp">=</span> <span class="n">add</span> <span class="n">n</span> <span class="n">m</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">induction'</span> <span class="n">n</span> <span class="k">with</span> <span class="n">n</span> <span class="n">ih</span> <span class="bp">·</span> <span class="n">rw</span> <span class="o">[</span><span class="n">zero_add</span><span class="o">]</span> <span class="n">rfl</span> <span class="n">rw</span> <span class="o">[</span><span class="n">add</span><span class="o">,</span> <span class="n">succ_add</span><span class="o">,</span> <span class="n">ih</span><span class="o">]</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">add_comm</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MyNat</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">induction'</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">ih</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">zero_add</span><span class="o">]</span> <span class="w"> </span><span class="n">rfl</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">add</span><span class="o">,</span><span class="w"> </span><span class="n">succ_add</span><span class="o">,</span><span class="w"> </span><span class="n">ih</span><span class="o">]</span> <span class="kd">theorem</span> <span class="n">add_assoc</span> <span class="o">(</span><span class="n">m</span> <span class="n">n</span> <span class="n">k</span> <span class="o">:</span> <span class="n">MyNat</span><span class="o">)</span> <span class="o">:</span> <span class="n">add</span> <span class="o">(</span><span class="n">add</span> <span class="n">m</span> <span class="n">n</span><span class="o">)</span> <span class="n">k</span> <span class="bp">=</span> <span class="n">add</span> <span class="n">m</span> <span class="o">(</span><span class="n">add</span> <span class="n">n</span> <span class="n">k</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span> <span class="n">mul_add</span> <span class="o">(</span><span class="n">m</span> <span class="n">n</span> <span class="n">k</span> <span class="o">:</span> <span class="n">MyNat</span><span class="o">)</span> <span class="o">:</span> <span class="n">mul</span> <span class="n">m</span> <span class="o">(</span><span class="n">add</span> <span class="n">n</span> <span class="n">k</span><span class="o">)</span> <span class="bp">=</span> <span class="n">add</span> <span class="o">(</span><span class="n">mul</span> <span class="n">m</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">mul</span> <span class="n">m</span> <span class="n">k</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span> <span class="n">zero_mul</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">MyNat</span><span class="o">)</span> <span class="o">:</span> <span class="n">mul</span> <span class="n">zero</span> <span class="n">n</span> <span class="bp">=</span> <span class="n">zero</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span> <span class="n">succ_mul</span> <span class="o">(</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">MyNat</span><span class="o">)</span> <span class="o">:</span> <span class="n">mul</span> <span class="o">(</span><span class="n">succ</span> <span class="n">m</span><span class="o">)</span> <span class="n">n</span> <span class="bp">=</span> <span class="n">add</span> <span class="o">(</span><span class="n">mul</span> <span class="n">m</span> <span class="n">n</span><span class="o">)</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span> <span class="n">mul_comm</span> <span class="o">(</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">MyNat</span><span class="o">)</span> <span class="o">:</span> <span class="n">mul</span> <span class="n">m</span> <span class="n">n</span> <span class="bp">=</span> <span class="n">mul</span> <span class="n">n</span> <span class="n">m</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">end</span> <span class="n">MyNat</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">add_assoc</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MyNat</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="o">(</span><span class="n">add</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">(</span><span class="n">add</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">k</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">mul_add</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MyNat</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">(</span><span class="n">add</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">k</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="o">(</span><span class="n">mul</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">mul</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">k</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">zero_mul</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MyNat</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="n">zero</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">zero</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">succ_mul</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MyNat</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="o">(</span><span class="n">succ</span><span class="w"> </span><span class="n">m</span><span class="o">)</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="o">(</span><span class="n">mul</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">mul_comm</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MyNat</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">end</span><span class="w"> </span><span class="n">MyNat</span> </pre></div> </div> </section>
-
@@ -730,12 +730,12 @@ annoying to formalize.Here we consider a few ways to do it.</p> <p>To start with, we can use the <code class="docutils literal notranslate"><span class="pre">cases</span></code> tactic and the fact that the successor function respects the ordering on the natural numbers.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">two_le</span> <span class="o">{</span><span class="n">m</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">h0</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">(</span><span class="n">h1</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">≠</span> <span class="mi">1</span><span class="o">)</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">≤</span> <span class="n">m</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">cases</span> <span class="n">m</span><span class="bp">;</span> <span class="n">contradiction</span> <span class="n">case</span> <span class="n">succ</span> <span class="n">m</span> <span class="bp">=></span> <span class="n">cases</span> <span class="n">m</span><span class="bp">;</span> <span class="n">contradiction</span> <span class="n">repeat</span> <span class="n">apply</span> <span class="n">Nat.succ_le_succ</span> <span class="n">apply</span> <span class="n">zero_le</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">two_le</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h0</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">cases</span><span class="w"> </span><span class="n">m</span><span class="bp">;</span><span class="w"> </span><span class="n">contradiction</span> <span class="w"> </span><span class="n">case</span><span class="w"> </span><span class="n">succ</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="n">cases</span><span class="w"> </span><span class="n">m</span><span class="bp">;</span><span class="w"> </span><span class="n">contradiction</span> <span class="w"> </span><span class="n">repeat</span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">Nat.succ_le_succ</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">zero_le</span> </pre></div> </div> <p>Another strategy is to use the tactic <code class="docutils literal notranslate"><span class="pre">interval_cases</span></code>,
-
@@ -743,10 +743,10 @@ which automatically splits the goal into cases whenthe variable in question is contained in an interval of natural numbers or integers. Remember that you can hover over it to see its documentation.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">m</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">h0</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">(</span><span class="n">h1</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">≠</span> <span class="mi">1</span><span class="o">)</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">≤</span> <span class="n">m</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">by_contra</span> <span class="n">h</span> <span class="n">push_neg</span> <span class="n">at</span> <span class="n">h</span> <span class="n">interval_cases</span> <span class="n">m</span> <span class="bp"><;></span> <span class="n">contradiction</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h0</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">by_contra</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">push_neg</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">interval_cases</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">contradiction</span> </pre></div> </div> <p id="index-0">Recall that the semicolon after <code class="docutils literal notranslate"><span class="pre">interval_cases</span> <span class="pre">m</span></code> means
-
@@ -756,12 +756,12 @@ to find a decision procedure to solve the problem.Lean knows that you can decide the truth value of a statement that begins with a bounded quantifier <code class="docutils literal notranslate"><span class="pre">∀</span> <span class="pre">x,</span> <span class="pre">x</span> <span class="pre"><</span> <span class="pre">n</span> <span class="pre">→</span> <span class="pre">...</span></code> or <code class="docutils literal notranslate"><span class="pre">∃</span> <span class="pre">x,</span> <span class="pre">x</span> <span class="pre"><</span> <span class="pre">n</span> <span class="pre">∧</span> <span class="pre">...</span></code> by deciding each of the finitely many instances.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">m</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">h0</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">(</span><span class="n">h1</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">≠</span> <span class="mi">1</span><span class="o">)</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">≤</span> <span class="n">m</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">by_contra</span> <span class="n">h</span> <span class="n">push_neg</span> <span class="n">at</span> <span class="n">h</span> <span class="n">revert</span> <span class="n">h0</span> <span class="n">h1</span> <span class="n">revert</span> <span class="n">h</span> <span class="n">m</span> <span class="n">decide</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h0</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">by_contra</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">push_neg</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">revert</span><span class="w"> </span><span class="n">h0</span><span class="w"> </span><span class="n">h1</span> <span class="w"> </span><span class="n">revert</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="n">m</span> <span class="w"> </span><span class="n">decide</span> </pre></div> </div> <p>With the theorem <code class="docutils literal notranslate"><span class="pre">two_le</span></code> in hand, let’s start by showing that every
-
@@ -786,44 +786,44 @@ then by one of the characterizations of what it means to be a prime number,it has a nontrivial factor, <span class="math notranslate nohighlight">\(m\)</span>, and we can apply the inductive hypothesis to that. Step through the next proof to see how that plays out.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">exists_prime_factor</span> <span class="o">{</span><span class="n">n</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">≤</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">p</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">,</span> <span class="n">p.Prime</span> <span class="bp">∧</span> <span class="n">p</span> <span class="bp">∣</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">by_cases</span> <span class="n">np</span> <span class="o">:</span> <span class="n">n.Prime</span> <span class="bp">·</span> <span class="n">use</span> <span class="n">n</span><span class="o">,</span> <span class="n">np</span> <span class="n">induction'</span> <span class="n">n</span> <span class="n">using</span> <span class="n">Nat.strong_induction_on</span> <span class="k">with</span> <span class="n">n</span> <span class="n">ih</span> <span class="n">rw</span> <span class="o">[</span><span class="n">Nat.prime_def_lt</span><span class="o">]</span> <span class="n">at</span> <span class="n">np</span> <span class="n">push_neg</span> <span class="n">at</span> <span class="n">np</span> <span class="n">rcases</span> <span class="n">np</span> <span class="n">h</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">m</span><span class="o">,</span> <span class="n">mltn</span><span class="o">,</span> <span class="n">mdvdn</span><span class="o">,</span> <span class="n">mne1</span><span class="o">⟩</span> <span class="k">have</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">≠</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">mz</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mz</span><span class="o">,</span> <span class="n">zero_dvd_iff</span><span class="o">]</span> <span class="n">at</span> <span class="n">mdvdn</span> <span class="n">linarith</span> <span class="k">have</span> <span class="n">mgt2</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">≤</span> <span class="n">m</span> <span class="o">:=</span> <span class="n">two_le</span> <span class="n">this</span> <span class="n">mne1</span> <span class="n">by_cases</span> <span class="n">mp</span> <span class="o">:</span> <span class="n">m.Prime</span> <span class="bp">·</span> <span class="n">use</span> <span class="n">m</span><span class="o">,</span> <span class="n">mp</span> <span class="bp">.</span> <span class="n">rcases</span> <span class="n">ih</span> <span class="n">m</span> <span class="n">mltn</span> <span class="n">mgt2</span> <span class="n">mp</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">p</span><span class="o">,</span> <span class="n">pp</span><span class="o">,</span> <span class="n">pdvd</span><span class="o">⟩</span> <span class="n">use</span> <span class="n">p</span><span class="o">,</span> <span class="n">pp</span> <span class="n">apply</span> <span class="n">pdvd.trans</span> <span class="n">mdvdn</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">exists_prime_factor</span><span class="w"> </span><span class="o">{</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat</span><span class="o">,</span><span class="w"> </span><span class="n">p.Prime</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">by_cases</span><span class="w"> </span><span class="n">np</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">n.Prime</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">np</span> <span class="w"> </span><span class="n">induction'</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">using</span><span class="w"> </span><span class="n">Nat.strong_induction_on</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">ih</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">Nat.prime_def_lt</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">np</span> <span class="w"> </span><span class="n">push_neg</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">np</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">np</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">m</span><span class="o">,</span><span class="w"> </span><span class="n">mltn</span><span class="o">,</span><span class="w"> </span><span class="n">mdvdn</span><span class="o">,</span><span class="w"> </span><span class="n">mne1</span><span class="o">⟩</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">mz</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mz</span><span class="o">,</span><span class="w"> </span><span class="n">zero_dvd_iff</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">mdvdn</span> <span class="w"> </span><span class="n">linarith</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">mgt2</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">two_le</span><span class="w"> </span><span class="n">this</span><span class="w"> </span><span class="n">mne1</span> <span class="w"> </span><span class="n">by_cases</span><span class="w"> </span><span class="n">mp</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m.Prime</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">m</span><span class="o">,</span><span class="w"> </span><span class="n">mp</span> <span class="w"> </span><span class="bp">.</span><span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">ih</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">mltn</span><span class="w"> </span><span class="n">mgt2</span><span class="w"> </span><span class="n">mp</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">p</span><span class="o">,</span><span class="w"> </span><span class="n">pp</span><span class="o">,</span><span class="w"> </span><span class="n">pdvd</span><span class="o">⟩</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">p</span><span class="o">,</span><span class="w"> </span><span class="n">pp</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">pdvd.trans</span><span class="w"> </span><span class="n">mdvdn</span> </pre></div> </div> <p>We can now prove the following formulation of our theorem. See if you can fill out the sketch. You can use <code class="docutils literal notranslate"><span class="pre">Nat.factorial_pos</span></code>, <code class="docutils literal notranslate"><span class="pre">Nat.dvd_factorial</span></code>, and <code class="docutils literal notranslate"><span class="pre">Nat.dvd_sub'</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">primes_infinite</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">p</span> <span class="bp">></span> <span class="n">n</span><span class="o">,</span> <span class="n">Nat.Prime</span> <span class="n">p</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">n</span> <span class="k">have</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">≤</span> <span class="n">Nat.factorial</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">+</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">rcases</span> <span class="n">exists_prime_factor</span> <span class="n">this</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">p</span><span class="o">,</span> <span class="n">pp</span><span class="o">,</span> <span class="n">pdvd</span><span class="o">⟩</span> <span class="n">refine'</span> <span class="o">⟨</span><span class="n">p</span><span class="o">,</span> <span class="n">_</span><span class="o">,</span> <span class="n">pp</span><span class="o">⟩</span> <span class="k">show</span> <span class="n">p</span> <span class="bp">></span> <span class="n">n</span> <span class="n">by_contra</span> <span class="n">ple</span> <span class="n">push_neg</span> <span class="n">at</span> <span class="n">ple</span> <span class="k">have</span> <span class="o">:</span> <span class="n">p</span> <span class="bp">∣</span> <span class="n">Nat.factorial</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="o">:</span> <span class="n">p</span> <span class="bp">∣</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">show</span> <span class="n">False</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">primes_infinite</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">n</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">Nat.factorial</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">exists_prime_factor</span><span class="w"> </span><span class="n">this</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">p</span><span class="o">,</span><span class="w"> </span><span class="n">pp</span><span class="o">,</span><span class="w"> </span><span class="n">pdvd</span><span class="o">⟩</span> <span class="w"> </span><span class="n">refine</span><span class="w"> </span><span class="o">⟨</span><span class="n">p</span><span class="o">,</span><span class="w"> </span><span class="bp">?</span><span class="n">_</span><span class="o">,</span><span class="w"> </span><span class="n">pp</span><span class="o">⟩</span> <span class="w"> </span><span class="k">show</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="n">n</span> <span class="w"> </span><span class="n">by_contra</span><span class="w"> </span><span class="n">ple</span> <span class="w"> </span><span class="n">push_neg</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">ple</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">Nat.factorial</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">show</span><span class="w"> </span><span class="n">False</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Let’s consider a variation of the proof above, where instead
-
@@ -852,31 +852,31 @@ so they need to be expanded manually using equivalences likeand <code class="docutils literal notranslate"><span class="pre">Finset.mem_sdiff</span></code>. The <code class="docutils literal notranslate"><span class="pre">ext</span></code> tactic can still be used to show that two finite sets are equal by showing that every element of one is an element of the other.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">Finset</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">Finset</span> <span class="kn">section</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">DecidableEq</span> <span class="n">α</span><span class="o">]</span> <span class="o">(</span><span class="n">r</span> <span class="n">s</span> <span class="n">t</span> <span class="o">:</span> <span class="n">Finset</span> <span class="n">α</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">DecidableEq</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Finset</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">r</span> <span class="bp">∩</span> <span class="o">(</span><span class="n">s</span> <span class="bp">∪</span> <span class="n">t</span><span class="o">)</span> <span class="bp">⊆</span> <span class="n">r</span> <span class="bp">∩</span> <span class="n">s</span> <span class="bp">∪</span> <span class="n">r</span> <span class="bp">∩</span> <span class="n">t</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">subset_iff</span><span class="o">]</span> <span class="n">intro</span> <span class="n">x</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mem_inter</span><span class="o">,</span> <span class="n">mem_union</span><span class="o">,</span> <span class="n">mem_union</span><span class="o">,</span> <span class="n">mem_inter</span><span class="o">,</span> <span class="n">mem_inter</span><span class="o">]</span> <span class="n">tauto</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">subset_iff</span><span class="o">]</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mem_inter</span><span class="o">,</span><span class="w"> </span><span class="n">mem_union</span><span class="o">,</span><span class="w"> </span><span class="n">mem_union</span><span class="o">,</span><span class="w"> </span><span class="n">mem_inter</span><span class="o">,</span><span class="w"> </span><span class="n">mem_inter</span><span class="o">]</span> <span class="w"> </span><span class="n">tauto</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">r</span> <span class="bp">∩</span> <span class="o">(</span><span class="n">s</span> <span class="bp">∪</span> <span class="n">t</span><span class="o">)</span> <span class="bp">⊆</span> <span class="n">r</span> <span class="bp">∩</span> <span class="n">s</span> <span class="bp">∪</span> <span class="n">r</span> <span class="bp">∩</span> <span class="n">t</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="o">[</span><span class="n">subset_iff</span><span class="o">]</span> <span class="n">intro</span> <span class="n">x</span> <span class="n">tauto</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">subset_iff</span><span class="o">]</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">tauto</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">r</span> <span class="bp">∩</span> <span class="n">s</span> <span class="bp">∪</span> <span class="n">r</span> <span class="bp">∩</span> <span class="n">t</span> <span class="bp">⊆</span> <span class="n">r</span> <span class="bp">∩</span> <span class="o">(</span><span class="n">s</span> <span class="bp">∪</span> <span class="n">t</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="o">[</span><span class="n">subset_iff</span><span class="o">]</span> <span class="n">intro</span> <span class="n">x</span> <span class="n">tauto</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">subset_iff</span><span class="o">]</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">tauto</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">r</span> <span class="bp">∩</span> <span class="n">s</span> <span class="bp">∪</span> <span class="n">r</span> <span class="bp">∩</span> <span class="n">t</span> <span class="bp">=</span> <span class="n">r</span> <span class="bp">∩</span> <span class="o">(</span><span class="n">s</span> <span class="bp">∪</span> <span class="n">t</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ext</span> <span class="n">x</span> <span class="n">simp</span> <span class="n">tauto</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">tauto</span> <span class="kd">end</span> </pre></div>
-
@@ -885,27 +885,27 @@ that every element of one is an element of the other.</p>version, <code class="docutils literal notranslate"><span class="pre">tauto!</span></code>, which uses classical logic) can be used to dispense with propositional tautologies. See if you can use these methods to prove the two examples below.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">r</span> <span class="bp">∪</span> <span class="n">s</span><span class="o">)</span> <span class="bp">∩</span> <span class="o">(</span><span class="n">r</span> <span class="bp">∪</span> <span class="n">t</span><span class="o">)</span> <span class="bp">=</span> <span class="n">r</span> <span class="bp">∪</span> <span class="n">s</span> <span class="bp">∩</span> <span class="n">t</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">r</span> <span class="bp">\</span> <span class="n">s</span><span class="o">)</span> <span class="bp">\</span> <span class="n">t</span> <span class="bp">=</span> <span class="n">r</span> <span class="bp">\</span> <span class="o">(</span><span class="n">s</span> <span class="bp">∪</span> <span class="n">t</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">\</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>The theorem <code class="docutils literal notranslate"><span class="pre">Finset.dvd_prod_of_mem</span></code> tells us that if an <code class="docutils literal notranslate"><span class="pre">n</span></code> is an element of a finite set <code class="docutils literal notranslate"><span class="pre">s</span></code>, then <code class="docutils literal notranslate"><span class="pre">n</span></code> divides <code class="docutils literal notranslate"><span class="pre">∏</span> <span class="pre">i</span> <span class="pre">in</span> <span class="pre">s,</span> <span class="pre">i</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">s</span> <span class="o">:</span> <span class="n">Finset</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">n</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">)</span> <span class="o">:</span> <span class="n">n</span> <span class="bp">∣</span> <span class="bp">∏</span> <span class="n">i</span> <span class="k">in</span> <span class="n">s</span><span class="o">,</span> <span class="n">i</span> <span class="o">:=</span> <span class="n">Finset.dvd_prod_of_mem</span> <span class="n">_</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Finset</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="bp">∏</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Finset.dvd_prod_of_mem</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>We also need to know that the converse holds in the case where <code class="docutils literal notranslate"><span class="pre">n</span></code> is prime and <code class="docutils literal notranslate"><span class="pre">s</span></code> is a set of primes. To show that, we need the following lemma, which you should be able to prove using the theorem <code class="docutils literal notranslate"><span class="pre">Nat.Prime.eq_one_or_self_of_dvd</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">_root_.Nat.Prime.eq_of_dvd_of_prime</span> <span class="o">{</span><span class="n">p</span> <span class="n">q</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">prime_p</span> <span class="o">:</span> <span class="n">Nat.Prime</span> <span class="n">p</span><span class="o">)</span> <span class="o">(</span><span class="n">prime_q</span> <span class="o">:</span> <span class="n">Nat.Prime</span> <span class="n">q</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">p</span> <span class="bp">∣</span> <span class="n">q</span><span class="o">)</span> <span class="o">:</span> <span class="n">p</span> <span class="bp">=</span> <span class="n">q</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">_root_.Nat.Prime.eq_of_dvd_of_prime</span><span class="w"> </span><span class="o">{</span><span class="n">p</span><span class="w"> </span><span class="n">q</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span> <span class="w"> </span><span class="o">(</span><span class="n">prime_p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="n">p</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">prime_q</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="n">q</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">q</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">q</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>We can use this lemma to show that if a prime <code class="docutils literal notranslate"><span class="pre">p</span></code> divides a product of a finite
-
@@ -924,15 +924,15 @@ the relevant rewrite rules for the product.In the proof below, the first <code class="docutils literal notranslate"><span class="pre">simp</span></code> applies <code class="docutils literal notranslate"><span class="pre">Finset.prod_empty</span></code>. Step through the beginning of the proof to see the induction unfold, and then finish it off.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">mem_of_dvd_prod_primes</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Finset</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">{</span><span class="n">p</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">prime_p</span> <span class="o">:</span> <span class="n">p.Prime</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="bp">∀</span> <span class="n">n</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="n">Nat.Prime</span> <span class="n">n</span><span class="o">)</span> <span class="bp">→</span> <span class="o">(</span><span class="n">p</span> <span class="bp">∣</span> <span class="bp">∏</span> <span class="n">n</span> <span class="k">in</span> <span class="n">s</span><span class="o">,</span> <span class="n">n</span><span class="o">)</span> <span class="bp">→</span> <span class="n">p</span> <span class="bp">∈</span> <span class="n">s</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">h₀</span> <span class="n">h₁</span> <span class="n">induction'</span> <span class="n">s</span> <span class="n">using</span> <span class="n">Finset.induction_on</span> <span class="k">with</span> <span class="n">a</span> <span class="n">s</span> <span class="n">ans</span> <span class="n">ih</span> <span class="bp">·</span> <span class="n">simp</span> <span class="n">at</span> <span class="n">h₁</span> <span class="n">linarith</span> <span class="o">[</span><span class="n">prime_p.two_le</span><span class="o">]</span> <span class="n">simp</span> <span class="o">[</span><span class="n">Finset.prod_insert</span> <span class="n">ans</span><span class="o">,</span> <span class="n">prime_p.dvd_mul</span><span class="o">]</span> <span class="n">at</span> <span class="n">h₀</span> <span class="n">h₁</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mem_insert</span><span class="o">]</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">mem_of_dvd_prod_primes</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Finset</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">prime_p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">p.Prime</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="o">(</span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="o">(</span><span class="n">p</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="bp">∏</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h₁</span> <span class="w"> </span><span class="n">induction'</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">using</span><span class="w"> </span><span class="n">Finset.induction_on</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">ans</span><span class="w"> </span><span class="n">ih</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">h₁</span> <span class="w"> </span><span class="n">linarith</span><span class="w"> </span><span class="o">[</span><span class="n">prime_p.two_le</span><span class="o">]</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">Finset.prod_insert</span><span class="w"> </span><span class="n">ans</span><span class="o">,</span><span class="w"> </span><span class="n">prime_p.dvd_mul</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">h₀</span><span class="w"> </span><span class="n">h₁</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mem_insert</span><span class="o">]</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>We need one last property of finite sets.
-
@@ -942,8 +942,8 @@ we wrote <code class="docutils literal notranslate"><span class="pre">{</span> <elements of <code class="docutils literal notranslate"><span class="pre">s</span></code> that satisfy <code class="docutils literal notranslate"><span class="pre">P</span></code>. Given <code class="docutils literal notranslate"><span class="pre">s</span> <span class="pre">:</span> <span class="pre">Finset</span> <span class="pre">α</span></code>, the analogous notion is written <code class="docutils literal notranslate"><span class="pre">s.filter</span> <span class="pre">P</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">s</span> <span class="o">:</span> <span class="n">Finset</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s.filter</span> <span class="n">Nat.Prime</span> <span class="bp">↔</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s</span> <span class="bp">∧</span> <span class="n">x.Prime</span> <span class="o">:=</span> <span class="n">mem_filter</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Finset</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s.filter</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x.Prime</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">mem_filter</span> </pre></div> </div> <p>We now prove an alternative formulation of the statement that there are infinitely many
-
@@ -956,25 +956,25 @@ of the resultleads to the contradiction we are looking for. See if you can complete the sketch below. You can use <code class="docutils literal notranslate"><span class="pre">Finset.prod_pos</span></code> in the proof of the first <code class="docutils literal notranslate"><span class="pre">have</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">primes_infinite'</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">s</span> <span class="o">:</span> <span class="n">Finset</span> <span class="n">Nat</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">p</span><span class="o">,</span> <span class="n">Nat.Prime</span> <span class="n">p</span> <span class="bp">∧</span> <span class="n">p</span> <span class="bp">∉</span> <span class="n">s</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">s</span> <span class="n">by_contra</span> <span class="n">h</span> <span class="n">push_neg</span> <span class="n">at</span> <span class="n">h</span> <span class="n">set</span> <span class="n">s'</span> <span class="o">:=</span> <span class="n">s.filter</span> <span class="n">Nat.Prime</span> <span class="k">with</span> <span class="n">s'_def</span> <span class="k">have</span> <span class="n">mem_s'</span> <span class="o">:</span> <span class="bp">∀</span> <span class="o">{</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">},</span> <span class="n">n</span> <span class="bp">∈</span> <span class="n">s'</span> <span class="bp">↔</span> <span class="n">n.Prime</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">n</span> <span class="n">simp</span> <span class="o">[</span><span class="n">s'_def</span><span class="o">]</span> <span class="n">apply</span> <span class="n">h</span> <span class="k">have</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">≤</span> <span class="o">(</span><span class="bp">∏</span> <span class="n">i</span> <span class="k">in</span> <span class="n">s'</span><span class="o">,</span> <span class="n">i</span><span class="o">)</span> <span class="bp">+</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">rcases</span> <span class="n">exists_prime_factor</span> <span class="n">this</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">p</span><span class="o">,</span> <span class="n">pp</span><span class="o">,</span> <span class="n">pdvd</span><span class="o">⟩</span> <span class="k">have</span> <span class="o">:</span> <span class="n">p</span> <span class="bp">∣</span> <span class="bp">∏</span> <span class="n">i</span> <span class="k">in</span> <span class="n">s'</span><span class="o">,</span> <span class="n">i</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="o">:</span> <span class="n">p</span> <span class="bp">∣</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">convert</span> <span class="n">Nat.dvd_sub'</span> <span class="n">pdvd</span> <span class="n">this</span> <span class="n">simp</span> <span class="k">show</span> <span class="n">False</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">primes_infinite'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Finset</span><span class="w"> </span><span class="n">Nat</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">p</span><span class="o">,</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∉</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">s</span> <span class="w"> </span><span class="n">by_contra</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">push_neg</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">set</span><span class="w"> </span><span class="n">s'</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">s.filter</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">s'_def</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">mem_s'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">{</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">},</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s'</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">n.Prime</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">n</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">s'_def</span><span class="o">]</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="o">(</span><span class="bp">∏</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">s'</span><span class="o">,</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">exists_prime_factor</span><span class="w"> </span><span class="n">this</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">p</span><span class="o">,</span><span class="w"> </span><span class="n">pp</span><span class="o">,</span><span class="w"> </span><span class="n">pdvd</span><span class="o">⟩</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="bp">∏</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">s'</span><span class="o">,</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">convert</span><span class="w"> </span><span class="n">Nat.dvd_sub'</span><span class="w"> </span><span class="n">pdvd</span><span class="w"> </span><span class="n">this</span> <span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="k">show</span><span class="w"> </span><span class="n">False</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>We have thus seen two ways of saying that there are infinitely many primes:
-
@@ -990,22 +990,22 @@ we can dispense with the assumption.</p>ranges over <code class="docutils literal notranslate"><span class="pre">s</span></code>, returning <code class="docutils literal notranslate"><span class="pre">0</span></code> in the case where <code class="docutils literal notranslate"><span class="pre">s</span></code> is empty and the codomain of <code class="docutils literal notranslate"><span class="pre">f</span></code> is <code class="docutils literal notranslate"><span class="pre">ℕ</span></code>. In the first proof, we use <code class="docutils literal notranslate"><span class="pre">s.sup</span> <span class="pre">id</span></code>, where <code class="docutils literal notranslate"><span class="pre">id</span></code> is the identity function, to refer to the maximum value in <code class="docutils literal notranslate"><span class="pre">s</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">bounded_of_ex_finset</span> <span class="o">(</span><span class="n">Q</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="kt">Prop</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="bp">∃</span> <span class="n">s</span> <span class="o">:</span> <span class="n">Finset</span> <span class="n">ℕ</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">k</span><span class="o">,</span> <span class="n">Q</span> <span class="n">k</span> <span class="bp">→</span> <span class="n">k</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">)</span> <span class="bp">→</span> <span class="bp">∃</span> <span class="n">n</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">k</span><span class="o">,</span> <span class="n">Q</span> <span class="n">k</span> <span class="bp">→</span> <span class="n">k</span> <span class="bp"><</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rintro</span> <span class="o">⟨</span><span class="n">s</span><span class="o">,</span> <span class="n">hs</span><span class="o">⟩</span> <span class="n">use</span> <span class="n">s.sup</span> <span class="n">id</span> <span class="bp">+</span> <span class="mi">1</span> <span class="n">intro</span> <span class="n">k</span> <span class="n">Qk</span> <span class="n">apply</span> <span class="n">Nat.lt_succ_of_le</span> <span class="k">show</span> <span class="n">id</span> <span class="n">k</span> <span class="bp">≤</span> <span class="n">s.sup</span> <span class="n">id</span> <span class="n">apply</span> <span class="n">le_sup</span> <span class="o">(</span><span class="n">hs</span> <span class="n">k</span> <span class="n">Qk</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">bounded_of_ex_finset</span><span class="w"> </span><span class="o">(</span><span class="n">Q</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="kt">Prop</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="o">(</span><span class="bp">∃</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Finset</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">k</span><span class="o">,</span><span class="w"> </span><span class="n">Q</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">k</span><span class="o">,</span><span class="w"> </span><span class="n">Q</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="o">⟨</span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">hs</span><span class="o">⟩</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">s.sup</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="n">Qk</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">Nat.lt_succ_of_le</span> <span class="w"> </span><span class="k">show</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">s.sup</span><span class="w"> </span><span class="n">id</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">le_sup</span><span class="w"> </span><span class="o">(</span><span class="n">hs</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="n">Qk</span><span class="o">)</span> <span class="kd">theorem</span> <span class="n">ex_finset_of_bounded</span> <span class="o">(</span><span class="n">Q</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="kt">Prop</span><span class="o">)</span> <span class="o">[</span><span class="n">DecidablePred</span> <span class="n">Q</span><span class="o">]</span> <span class="o">:</span> <span class="o">(</span><span class="bp">∃</span> <span class="n">n</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">k</span><span class="o">,</span> <span class="n">Q</span> <span class="n">k</span> <span class="bp">→</span> <span class="n">k</span> <span class="bp">≤</span> <span class="n">n</span><span class="o">)</span> <span class="bp">→</span> <span class="bp">∃</span> <span class="n">s</span> <span class="o">:</span> <span class="n">Finset</span> <span class="n">ℕ</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">k</span><span class="o">,</span> <span class="n">Q</span> <span class="n">k</span> <span class="bp">↔</span> <span class="n">k</span> <span class="bp">∈</span> <span class="n">s</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rintro</span> <span class="o">⟨</span><span class="n">n</span><span class="o">,</span> <span class="n">hn</span><span class="o">⟩</span> <span class="n">use</span> <span class="o">(</span><span class="n">range</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">))</span><span class="bp">.</span><span class="n">filter</span> <span class="n">Q</span> <span class="n">intro</span> <span class="n">k</span> <span class="n">simp</span> <span class="o">[</span><span class="n">Nat.lt_succ_iff</span><span class="o">]</span> <span class="n">exact</span> <span class="n">hn</span> <span class="n">k</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">ex_finset_of_bounded</span><span class="w"> </span><span class="o">(</span><span class="n">Q</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="kt">Prop</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">DecidablePred</span><span class="w"> </span><span class="n">Q</span><span class="o">]</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="o">(</span><span class="bp">∃</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">k</span><span class="o">,</span><span class="w"> </span><span class="n">Q</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Finset</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">k</span><span class="o">,</span><span class="w"> </span><span class="n">Q</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="o">⟨</span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">hn</span><span class="o">⟩</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="o">(</span><span class="n">range</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">))</span><span class="bp">.</span><span class="n">filter</span><span class="w"> </span><span class="n">Q</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">k</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">Nat.lt_succ_iff</span><span class="o">]</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">hn</span><span class="w"> </span><span class="n">k</span> </pre></div> </div> <p>A small variation on our second proof that there are infinitely many primes
-
@@ -1035,7 +1035,7 @@ But in that case, <span class="math notranslate nohighlight">\(p\)</span> divideand hence 3, which contradicts the fact that it is not 3.</p> <p>In Lean, the notation <code class="docutils literal notranslate"><span class="pre">n</span> <span class="pre">%</span> <span class="pre">m</span></code>, read “<code class="docutils literal notranslate"><span class="pre">n</span></code> modulo <code class="docutils literal notranslate"><span class="pre">m</span></code>,” denotes the remainder of the division of <code class="docutils literal notranslate"><span class="pre">n</span></code> by <code class="docutils literal notranslate"><span class="pre">m</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="mi">27</span> <span class="bp">%</span> <span class="mi">4</span> <span class="bp">=</span> <span class="mi">3</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">norm_num</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">27</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span> </pre></div> </div> <p>We can then render the statement “<code class="docutils literal notranslate"><span class="pre">n</span></code> is congruent to 3 modulo 4”
-
@@ -1046,66 +1046,66 @@ a small number of cases.In the second named theorem, remember that the semicolon means that the subsequent tactic block is applied to all the goals created by the preceding tactic.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="mi">4</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">+</span> <span class="mi">3</span><span class="o">)</span> <span class="bp">%</span> <span class="mi">4</span> <span class="bp">=</span> <span class="mi">3</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">add_comm</span><span class="o">,</span> <span class="n">Nat.add_mul_mod_self_left</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="mi">4</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">3</span><span class="o">)</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">add_comm</span><span class="o">,</span><span class="w"> </span><span class="n">Nat.add_mul_mod_self_left</span><span class="o">]</span> <span class="kd">theorem</span> <span class="n">mod_4_eq_3_or_mod_4_eq_3</span> <span class="o">{</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">*</span> <span class="n">n</span> <span class="bp">%</span> <span class="mi">4</span> <span class="bp">=</span> <span class="mi">3</span><span class="o">)</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">%</span> <span class="mi">4</span> <span class="bp">=</span> <span class="mi">3</span> <span class="bp">∨</span> <span class="n">n</span> <span class="bp">%</span> <span class="mi">4</span> <span class="bp">=</span> <span class="mi">3</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">revert</span> <span class="n">h</span> <span class="n">rw</span> <span class="o">[</span><span class="n">Nat.mul_mod</span><span class="o">]</span> <span class="k">have</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">%</span> <span class="mi">4</span> <span class="bp"><</span> <span class="mi">4</span> <span class="o">:=</span> <span class="n">Nat.mod_lt</span> <span class="n">m</span> <span class="o">(</span><span class="kd">by</span> <span class="n">norm_num</span><span class="o">)</span> <span class="n">interval_cases</span> <span class="n">m</span> <span class="bp">%</span> <span class="mi">4</span> <span class="bp"><;></span> <span class="n">simp</span> <span class="o">[</span><span class="bp">-</span><span class="n">Nat.mul_mod_mod</span><span class="o">]</span> <span class="k">have</span> <span class="o">:</span> <span class="n">n</span> <span class="bp">%</span> <span class="mi">4</span> <span class="bp"><</span> <span class="mi">4</span> <span class="o">:=</span> <span class="n">Nat.mod_lt</span> <span class="n">n</span> <span class="o">(</span><span class="kd">by</span> <span class="n">norm_num</span><span class="o">)</span> <span class="n">interval_cases</span> <span class="n">n</span> <span class="bp">%</span> <span class="mi">4</span> <span class="bp"><;></span> <span class="n">simp</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">mod_4_eq_3_or_mod_4_eq_3</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">3</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">revert</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">Nat.mul_mod</span><span class="o">]</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Nat.mod_lt</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">(</span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span><span class="o">)</span> <span class="w"> </span><span class="n">interval_cases</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="bp">-</span><span class="n">Nat.mul_mod_mod</span><span class="o">]</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Nat.mod_lt</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">(</span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span><span class="o">)</span> <span class="w"> </span><span class="n">interval_cases</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">simp</span> <span class="kd">theorem</span> <span class="n">two_le_of_mod_4_eq_3</span> <span class="o">{</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">n</span> <span class="bp">%</span> <span class="mi">4</span> <span class="bp">=</span> <span class="mi">3</span><span class="o">)</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">≤</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">two_le</span> <span class="bp"><;></span> <span class="bp">·</span> <span class="n">intro</span> <span class="n">neq</span> <span class="n">rw</span> <span class="o">[</span><span class="n">neq</span><span class="o">]</span> <span class="n">at</span> <span class="n">h</span> <span class="n">norm_num</span> <span class="n">at</span> <span class="n">h</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">two_le_of_mod_4_eq_3</span><span class="w"> </span><span class="o">{</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">3</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">two_le</span><span class="w"> </span><span class="bp"><;></span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">neq</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">neq</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">norm_num</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>We will also need the following fact, which says that if <code class="docutils literal notranslate"><span class="pre">m</span></code> is a nontrivial divisor of <code class="docutils literal notranslate"><span class="pre">n</span></code>, then so is <code class="docutils literal notranslate"><span class="pre">n</span> <span class="pre">/</span> <span class="pre">m</span></code>. See if you can complete the proof using <code class="docutils literal notranslate"><span class="pre">Nat.div_dvd_of_dvd</span></code> and <code class="docutils literal notranslate"><span class="pre">Nat.div_lt_self</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">aux</span> <span class="o">{</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">h₀</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">∣</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">h₁</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">≤</span> <span class="n">m</span><span class="o">)</span> <span class="o">(</span><span class="n">h₂</span> <span class="o">:</span> <span class="n">m</span> <span class="bp"><</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">n</span> <span class="bp">/</span> <span class="n">m</span> <span class="bp">∣</span> <span class="n">n</span> <span class="bp">∧</span> <span class="n">n</span> <span class="bp">/</span> <span class="n">m</span> <span class="bp"><</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">aux</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">m</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h₂</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Now put all the pieces together to prove that any number congruent to 3 modulo 4 has a prime divisor with that same property.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">exists_prime_factor_mod_4_eq_3</span> <span class="o">{</span><span class="n">n</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">n</span> <span class="bp">%</span> <span class="mi">4</span> <span class="bp">=</span> <span class="mi">3</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">p</span> <span class="o">:</span> <span class="n">Nat</span><span class="o">,</span> <span class="n">p.Prime</span> <span class="bp">∧</span> <span class="n">p</span> <span class="bp">∣</span> <span class="n">n</span> <span class="bp">∧</span> <span class="n">p</span> <span class="bp">%</span> <span class="mi">4</span> <span class="bp">=</span> <span class="mi">3</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">by_cases</span> <span class="n">np</span> <span class="o">:</span> <span class="n">n.Prime</span> <span class="bp">·</span> <span class="n">use</span> <span class="n">n</span> <span class="n">induction'</span> <span class="n">n</span> <span class="n">using</span> <span class="n">Nat.strong_induction_on</span> <span class="k">with</span> <span class="n">n</span> <span class="n">ih</span> <span class="n">rw</span> <span class="o">[</span><span class="n">Nat.prime_def_lt</span><span class="o">]</span> <span class="n">at</span> <span class="n">np</span> <span class="n">push_neg</span> <span class="n">at</span> <span class="n">np</span> <span class="n">rcases</span> <span class="n">np</span> <span class="o">(</span><span class="n">two_le_of_mod_4_eq_3</span> <span class="n">h</span><span class="o">)</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">m</span><span class="o">,</span> <span class="n">mltn</span><span class="o">,</span> <span class="n">mdvdn</span><span class="o">,</span> <span class="n">mne1</span><span class="o">⟩</span> <span class="k">have</span> <span class="n">mge2</span> <span class="o">:</span> <span class="mi">2</span> <span class="bp">≤</span> <span class="n">m</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">two_le</span> <span class="n">_</span> <span class="n">mne1</span> <span class="n">intro</span> <span class="n">mz</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mz</span><span class="o">,</span> <span class="n">zero_dvd_iff</span><span class="o">]</span> <span class="n">at</span> <span class="n">mdvdn</span> <span class="n">linarith</span> <span class="k">have</span> <span class="n">neq</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">*</span> <span class="o">(</span><span class="n">n</span> <span class="bp">/</span> <span class="n">m</span><span class="o">)</span> <span class="bp">=</span> <span class="n">n</span> <span class="o">:=</span> <span class="n">Nat.mul_div_cancel'</span> <span class="n">mdvdn</span> <span class="k">have</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">%</span> <span class="mi">4</span> <span class="bp">=</span> <span class="mi">3</span> <span class="bp">∨</span> <span class="n">n</span> <span class="bp">/</span> <span class="n">m</span> <span class="bp">%</span> <span class="mi">4</span> <span class="bp">=</span> <span class="mi">3</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">mod_4_eq_3_or_mod_4_eq_3</span> <span class="n">rw</span> <span class="o">[</span><span class="n">neq</span><span class="o">,</span> <span class="n">h</span><span class="o">]</span> <span class="n">rcases</span> <span class="n">this</span> <span class="k">with</span> <span class="n">h1</span> <span class="bp">|</span> <span class="n">h1</span> <span class="bp">.</span> <span class="gr">sorry</span> <span class="bp">.</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">exists_prime_factor_mod_4_eq_3</span><span class="w"> </span><span class="o">{</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">3</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat</span><span class="o">,</span><span class="w"> </span><span class="n">p.Prime</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">by_cases</span><span class="w"> </span><span class="n">np</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">n.Prime</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">n</span> <span class="w"> </span><span class="n">induction'</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">using</span><span class="w"> </span><span class="n">Nat.strong_induction_on</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">ih</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">Nat.prime_def_lt</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">np</span> <span class="w"> </span><span class="n">push_neg</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">np</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">np</span><span class="w"> </span><span class="o">(</span><span class="n">two_le_of_mod_4_eq_3</span><span class="w"> </span><span class="n">h</span><span class="o">)</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">m</span><span class="o">,</span><span class="w"> </span><span class="n">mltn</span><span class="o">,</span><span class="w"> </span><span class="n">mdvdn</span><span class="o">,</span><span class="w"> </span><span class="n">mne1</span><span class="o">⟩</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">mge2</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">two_le</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">mne1</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">mz</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mz</span><span class="o">,</span><span class="w"> </span><span class="n">zero_dvd_iff</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">mdvdn</span> <span class="w"> </span><span class="n">linarith</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">neq</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="n">m</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Nat.mul_div_cancel'</span><span class="w"> </span><span class="n">mdvdn</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">mod_4_eq_3_or_mod_4_eq_3</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">neq</span><span class="o">,</span><span class="w"> </span><span class="n">h</span><span class="o">]</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">this</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">h1</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">h1</span> <span class="w"> </span><span class="bp">.</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="bp">.</span><span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>We are in the home stretch. Given a set <code class="docutils literal notranslate"><span class="pre">s</span></code> of prime numbers, we need to talk about the result of removing 3 from that set, if it is present. The function <code class="docutils literal notranslate"><span class="pre">Finset.erase</span></code> handles that.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">s</span> <span class="o">:</span> <span class="n">Finset</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">∈</span> <span class="n">erase</span> <span class="n">s</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">≠</span> <span class="n">n</span> <span class="bp">∧</span> <span class="n">m</span> <span class="bp">∈</span> <span class="n">s</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rwa</span> <span class="o">[</span><span class="n">mem_erase</span><span class="o">]</span> <span class="n">at</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Finset</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">erase</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rwa</span><span class="w"> </span><span class="o">[</span><span class="n">mem_erase</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">h</span> <span class="kd">example</span> <span class="o">(</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">s</span> <span class="o">:</span> <span class="n">Finset</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">∈</span> <span class="n">erase</span> <span class="n">s</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">m</span> <span class="bp">≠</span> <span class="n">n</span> <span class="bp">∧</span> <span class="n">m</span> <span class="bp">∈</span> <span class="n">s</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="n">at</span> <span class="n">h</span> <span class="n">assumption</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Finset</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">erase</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">assumption</span> </pre></div> </div> <p>We are now ready to prove that there are infinitely many primes
-
@@ -1113,31 +1113,31 @@ congruent to 3 modulo 4.Fill in the missing parts below. Our solution uses <code class="docutils literal notranslate"><span class="pre">Nat.dvd_add_iff_left</span></code> and <code class="docutils literal notranslate"><span class="pre">Nat.dvd_sub'</span></code> along the way.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">primes_mod_4_eq_3_infinite</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">p</span> <span class="bp">></span> <span class="n">n</span><span class="o">,</span> <span class="n">Nat.Prime</span> <span class="n">p</span> <span class="bp">∧</span> <span class="n">p</span> <span class="bp">%</span> <span class="mi">4</span> <span class="bp">=</span> <span class="mi">3</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">by_contra</span> <span class="n">h</span> <span class="n">push_neg</span> <span class="n">at</span> <span class="n">h</span> <span class="n">rcases</span> <span class="n">h</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">n</span><span class="o">,</span> <span class="n">hn</span><span class="o">⟩</span> <span class="k">have</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">s</span> <span class="o">:</span> <span class="n">Finset</span> <span class="n">Nat</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">p</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">,</span> <span class="n">p.Prime</span> <span class="bp">∧</span> <span class="n">p</span> <span class="bp">%</span> <span class="mi">4</span> <span class="bp">=</span> <span class="mi">3</span> <span class="bp">↔</span> <span class="n">p</span> <span class="bp">∈</span> <span class="n">s</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">ex_finset_of_bounded</span> <span class="n">use</span> <span class="n">n</span> <span class="n">contrapose</span><span class="bp">!</span> <span class="n">hn</span> <span class="n">rcases</span> <span class="n">hn</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">p</span><span class="o">,</span> <span class="o">⟨</span><span class="n">pp</span><span class="o">,</span> <span class="n">p4</span><span class="o">⟩,</span> <span class="n">pltn</span><span class="o">⟩</span> <span class="n">exact</span> <span class="o">⟨</span><span class="n">p</span><span class="o">,</span> <span class="n">pltn</span><span class="o">,</span> <span class="n">pp</span><span class="o">,</span> <span class="n">p4</span><span class="o">⟩</span> <span class="n">rcases</span> <span class="n">this</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">s</span><span class="o">,</span> <span class="n">hs</span><span class="o">⟩</span> <span class="k">have</span> <span class="n">h₁</span> <span class="o">:</span> <span class="o">((</span><span class="mi">4</span> <span class="bp">*</span> <span class="bp">∏</span> <span class="n">i</span> <span class="k">in</span> <span class="n">erase</span> <span class="n">s</span> <span class="mi">3</span><span class="o">,</span> <span class="n">i</span><span class="o">)</span> <span class="bp">+</span> <span class="mi">3</span><span class="o">)</span> <span class="bp">%</span> <span class="mi">4</span> <span class="bp">=</span> <span class="mi">3</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">rcases</span> <span class="n">exists_prime_factor_mod_4_eq_3</span> <span class="n">h₁</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">p</span><span class="o">,</span> <span class="n">pp</span><span class="o">,</span> <span class="n">pdvd</span><span class="o">,</span> <span class="n">p4eq</span><span class="o">⟩</span> <span class="k">have</span> <span class="n">ps</span> <span class="o">:</span> <span class="n">p</span> <span class="bp">∈</span> <span class="n">s</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="n">pne3</span> <span class="o">:</span> <span class="n">p</span> <span class="bp">≠</span> <span class="mi">3</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="o">:</span> <span class="n">p</span> <span class="bp">∣</span> <span class="mi">4</span> <span class="bp">*</span> <span class="bp">∏</span> <span class="n">i</span> <span class="k">in</span> <span class="n">erase</span> <span class="n">s</span> <span class="mi">3</span><span class="o">,</span> <span class="n">i</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="o">:</span> <span class="n">p</span> <span class="bp">∣</span> <span class="mi">3</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="o">:</span> <span class="n">p</span> <span class="bp">=</span> <span class="mi">3</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">contradiction</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">primes_mod_4_eq_3_infinite</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">Nat.Prime</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">by_contra</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">push_neg</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">hn</span><span class="o">⟩</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Finset</span><span class="w"> </span><span class="n">Nat</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="n">p.Prime</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">ex_finset_of_bounded</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">n</span> <span class="w"> </span><span class="n">contrapose</span><span class="bp">!</span><span class="w"> </span><span class="n">hn</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">hn</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">p</span><span class="o">,</span><span class="w"> </span><span class="o">⟨</span><span class="n">pp</span><span class="o">,</span><span class="w"> </span><span class="n">p4</span><span class="o">⟩,</span><span class="w"> </span><span class="n">pltn</span><span class="o">⟩</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="o">⟨</span><span class="n">p</span><span class="o">,</span><span class="w"> </span><span class="n">pltn</span><span class="o">,</span><span class="w"> </span><span class="n">pp</span><span class="o">,</span><span class="w"> </span><span class="n">p4</span><span class="o">⟩</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">this</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">hs</span><span class="o">⟩</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">h₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">((</span><span class="mi">4</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="bp">∏</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">erase</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="mi">3</span><span class="o">,</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">3</span><span class="o">)</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">exists_prime_factor_mod_4_eq_3</span><span class="w"> </span><span class="n">h₁</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">p</span><span class="o">,</span><span class="w"> </span><span class="n">pp</span><span class="o">,</span><span class="w"> </span><span class="n">pdvd</span><span class="o">,</span><span class="w"> </span><span class="n">p4eq</span><span class="o">⟩</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">ps</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">pne3</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="bp">∏</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">erase</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="mi">3</span><span class="o">,</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">contradiction</span> </pre></div> </div> <p>If you managed to complete the proof, congratulations! This has been a serious
-
-
-
@@ -18,7 +18,7 @@<script src="_static/jquery.js?v=5d32c60e"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/documentation_options.js?v=2709fde1"></script> <script src="_static/doctools.js?v=888ff710"></script> <script src="_static/doctools.js?v=9a2dae69"></script> <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script>
-
@@ -122,34 +122,34 @@ An <em>instance</em> of the structure is a particular bundle of data satisfyingthe constraints. For example, we can specify that a point is a tuple of three real numbers:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">@[</span><span class="n">ext</span><span class="kd">]</span> <span class="kd">structure</span> <span class="n">Point</span> <span class="n">where</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="n">z</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="kd">structure</span><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span> <span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span> <span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span> </pre></div> </div> <p>The <code class="docutils literal notranslate"><span class="pre">@[ext]</span></code> annotation tells Lean to automatically generate theorems that can be used to prove that two instances of a structure are equal when their components are equal, a property known as <em>extensionality</em>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">Point.ext</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="n">Point.ext</span> <span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">Point</span><span class="o">)</span> <span class="o">(</span><span class="n">hx</span> <span class="o">:</span> <span class="n">a.x</span> <span class="bp">=</span> <span class="n">b.x</span><span class="o">)</span> <span class="o">(</span><span class="n">hy</span> <span class="o">:</span> <span class="n">a.y</span> <span class="bp">=</span> <span class="n">b.y</span><span class="o">)</span> <span class="o">(</span><span class="n">hz</span> <span class="o">:</span> <span class="n">a.z</span> <span class="bp">=</span> <span class="n">b.z</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ext</span> <span class="n">repeat'</span> <span class="n">assumption</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hx</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a.x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b.x</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hy</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a.y</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b.y</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hz</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a.z</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b.z</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">ext</span> <span class="w"> </span><span class="n">repeat'</span><span class="w"> </span><span class="n">assumption</span> </pre></div> </div> <p>We can then define particular instances of the <code class="docutils literal notranslate"><span class="pre">Point</span></code> structure. Lean provides multiple ways of doing that.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">myPoint1</span> <span class="o">:</span> <span class="n">Point</span> <span class="n">where</span> <span class="n">x</span> <span class="o">:=</span> <span class="mi">2</span> <span class="n">y</span> <span class="o">:=</span> <span class="bp">-</span><span class="mi">1</span> <span class="n">z</span> <span class="o">:=</span> <span class="mi">4</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">myPoint1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">2</span> <span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="bp">-</span><span class="mi">1</span> <span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">4</span> <span class="kd">def</span> <span class="n">myPoint2</span> <span class="o">:</span> <span class="n">Point</span> <span class="o">:=</span> <span class="o">⟨</span><span class="mi">2</span><span class="o">,</span> <span class="bp">-</span><span class="mi">1</span><span class="o">,</span> <span class="mi">4</span><span class="o">⟩</span> <span class="kd">def</span><span class="w"> </span><span class="n">myPoint2</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="mi">2</span><span class="o">,</span><span class="w"> </span><span class="bp">-</span><span class="mi">1</span><span class="o">,</span><span class="w"> </span><span class="mi">4</span><span class="o">⟩</span> <span class="kd">def</span> <span class="n">myPoint3</span> <span class="o">:=</span> <span class="n">Point.mk</span> <span class="mi">2</span> <span class="o">(</span><span class="bp">-</span><span class="mi">1</span><span class="o">)</span> <span class="mi">4</span> <span class="kd">def</span><span class="w"> </span><span class="n">myPoint3</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Point.mk</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">(</span><span class="bp">-</span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="mi">4</span> </pre></div> </div> <p>In the first example, the fields of the structure are named
-
@@ -158,12 +158,12 @@ The function <code class="docutils literal notranslate"><span class="pre">Point.is known as the <em>constructor</em> for the <code class="docutils literal notranslate"><span class="pre">Point</span></code> structure, because it serves to construct elements. You can specify a different name if you want, like <code class="docutils literal notranslate"><span class="pre">build</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">structure</span> <span class="n">Point'</span> <span class="n">where</span> <span class="n">build</span> <span class="o">::</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="n">z</span> <span class="o">:</span> <span class="n">ℝ</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">structure</span><span class="w"> </span><span class="n">Point'</span><span class="w"> </span><span class="n">where</span><span class="w"> </span><span class="n">build</span><span class="w"> </span><span class="o">::</span> <span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span> <span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span> <span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span> <span class="k">#check</span> <span class="n">Point'.build</span> <span class="mi">2</span> <span class="o">(</span><span class="bp">-</span><span class="mi">1</span><span class="o">)</span> <span class="mi">4</span> <span class="k">#check</span><span class="w"> </span><span class="n">Point'.build</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">(</span><span class="bp">-</span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="mi">4</span> </pre></div> </div> <p>The next two examples show how to define functions on structures.
-
@@ -181,23 +181,23 @@ But remember that it is often convenient to useanonymous projection notation, which allows us to write <code class="docutils literal notranslate"><span class="pre">a.add</span> <span class="pre">b</span></code> instead of <code class="docutils literal notranslate"><span class="pre">Point.add</span> <span class="pre">a</span> <span class="pre">b</span></code>. Lean interprets the former as the latter because <code class="docutils literal notranslate"><span class="pre">a</span></code> has type <code class="docutils literal notranslate"><span class="pre">Point</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">namespace</span> <span class="n">Point</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">namespace</span><span class="w"> </span><span class="n">Point</span> <span class="kd">def</span> <span class="n">add</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">Point</span><span class="o">)</span> <span class="o">:</span> <span class="n">Point</span> <span class="o">:=</span> <span class="o">⟨</span><span class="n">a.x</span> <span class="bp">+</span> <span class="n">b.x</span><span class="o">,</span> <span class="n">a.y</span> <span class="bp">+</span> <span class="n">b.y</span><span class="o">,</span> <span class="n">a.z</span> <span class="bp">+</span> <span class="n">b.z</span><span class="o">⟩</span> <span class="kd">def</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="n">a.x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b.x</span><span class="o">,</span><span class="w"> </span><span class="n">a.y</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b.y</span><span class="o">,</span><span class="w"> </span><span class="n">a.z</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b.z</span><span class="o">⟩</span> <span class="kd">def</span> <span class="n">add'</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">Point</span><span class="o">)</span> <span class="o">:</span> <span class="n">Point</span> <span class="n">where</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">a.x</span> <span class="bp">+</span> <span class="n">b.x</span> <span class="n">y</span> <span class="o">:=</span> <span class="n">a.y</span> <span class="bp">+</span> <span class="n">b.y</span> <span class="n">z</span> <span class="o">:=</span> <span class="n">a.z</span> <span class="bp">+</span> <span class="n">b.z</span> <span class="kd">def</span><span class="w"> </span><span class="n">add'</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">a.x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b.x</span> <span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">a.y</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b.y</span> <span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">a.z</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b.z</span> <span class="k">#check</span> <span class="n">add</span> <span class="n">myPoint1</span> <span class="n">myPoint2</span> <span class="k">#check</span> <span class="n">myPoint1.add</span> <span class="n">myPoint2</span> <span class="k">#check</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="n">myPoint1</span><span class="w"> </span><span class="n">myPoint2</span> <span class="k">#check</span><span class="w"> </span><span class="n">myPoint1.add</span><span class="w"> </span><span class="n">myPoint2</span> <span class="kd">end</span> <span class="n">Point</span> <span class="kd">end</span><span class="w"> </span><span class="n">Point</span> <span class="k">#check</span> <span class="n">Point.add</span> <span class="n">myPoint1</span> <span class="n">myPoint2</span> <span class="k">#check</span> <span class="n">myPoint1.add</span> <span class="n">myPoint2</span> <span class="k">#check</span><span class="w"> </span><span class="n">Point.add</span><span class="w"> </span><span class="n">myPoint1</span><span class="w"> </span><span class="n">myPoint2</span> <span class="k">#check</span><span class="w"> </span><span class="n">myPoint1.add</span><span class="w"> </span><span class="n">myPoint2</span> </pre></div> </div> <p>Below we will continue to put definitions in the relevant
-
@@ -210,18 +210,18 @@ Below we use the <code class="docutils literal notranslate"><span class="pre">prtheorem is <code class="docutils literal notranslate"><span class="pre">Point.add_comm</span></code>, even when the namespace is open. This is helpful when we want to avoid ambiguity with a generic theorem like <code class="docutils literal notranslate"><span class="pre">add_comm</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">protected</span> <span class="kd">theorem</span> <span class="n">add_comm</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">Point</span><span class="o">)</span> <span class="o">:</span> <span class="n">add</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">add</span> <span class="n">b</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">add</span><span class="o">,</span> <span class="n">add</span><span class="o">]</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">dsimp</span> <span class="n">repeat'</span> <span class="n">apply</span> <span class="n">add_comm</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">protected</span><span class="w"> </span><span class="kd">theorem</span><span class="w"> </span><span class="n">add_comm</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">add</span><span class="o">,</span><span class="w"> </span><span class="n">add</span><span class="o">]</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">dsimp</span> <span class="w"> </span><span class="n">repeat'</span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">add_comm</span> <span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">Point</span><span class="o">)</span> <span class="o">:</span> <span class="n">add</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">add</span> <span class="n">b</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="o">[</span><span class="n">add</span><span class="o">,</span> <span class="n">add_comm</span><span class="o">]</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">add</span><span class="o">,</span><span class="w"> </span><span class="n">add_comm</span><span class="o">]</span> </pre></div> </div> <p>Because Lean can unfold definitions and simplify projections internally, sometimes the equations we want hold definitionally.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">add_x</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">Point</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">a.add</span> <span class="n">b</span><span class="o">)</span><span class="bp">.</span><span class="n">x</span> <span class="bp">=</span> <span class="n">a.x</span> <span class="bp">+</span> <span class="n">b.x</span> <span class="o">:=</span> <span class="n">rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">add_x</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">a.add</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="bp">.</span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a.x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b.x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p>It is also possible to define functions on structures using
-
@@ -234,20 +234,20 @@ in the second.Although it is sometimes convenient to define functions this way, and structural eta-reduction makes this alternative definitionally equivalent, it can make things less convenient in later proofs. In particular, <cite>rw [addAlt]</cite> leaves us with a messier goal view containing a <cite>match</cite> statement.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">addAlt</span> <span class="o">:</span> <span class="n">Point</span> <span class="bp">→</span> <span class="n">Point</span> <span class="bp">→</span> <span class="n">Point</span> <span class="bp">|</span> <span class="n">Point.mk</span> <span class="n">x₁</span> <span class="n">y₁</span> <span class="n">z₁</span><span class="o">,</span> <span class="n">Point.mk</span> <span class="n">x₂</span> <span class="n">y₂</span> <span class="n">z₂</span> <span class="bp">=></span> <span class="o">⟨</span><span class="n">x₁</span> <span class="bp">+</span> <span class="n">x₂</span><span class="o">,</span> <span class="n">y₁</span> <span class="bp">+</span> <span class="n">y₂</span><span class="o">,</span> <span class="n">z₁</span> <span class="bp">+</span> <span class="n">z₂</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">addAlt</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Point</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">Point.mk</span><span class="w"> </span><span class="n">x₁</span><span class="w"> </span><span class="n">y₁</span><span class="w"> </span><span class="n">z₁</span><span class="o">,</span><span class="w"> </span><span class="n">Point.mk</span><span class="w"> </span><span class="n">x₂</span><span class="w"> </span><span class="n">y₂</span><span class="w"> </span><span class="n">z₂</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="o">⟨</span><span class="n">x₁</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">x₂</span><span class="o">,</span><span class="w"> </span><span class="n">y₁</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y₂</span><span class="o">,</span><span class="w"> </span><span class="n">z₁</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">z₂</span><span class="o">⟩</span> <span class="kd">def</span> <span class="n">addAlt'</span> <span class="o">:</span> <span class="n">Point</span> <span class="bp">→</span> <span class="n">Point</span> <span class="bp">→</span> <span class="n">Point</span> <span class="bp">|</span> <span class="o">⟨</span><span class="n">x₁</span><span class="o">,</span> <span class="n">y₁</span><span class="o">,</span> <span class="n">z₁</span><span class="o">⟩,</span> <span class="o">⟨</span><span class="n">x₂</span><span class="o">,</span> <span class="n">y₂</span><span class="o">,</span> <span class="n">z₂</span><span class="o">⟩</span> <span class="bp">=></span> <span class="o">⟨</span><span class="n">x₁</span> <span class="bp">+</span> <span class="n">x₂</span><span class="o">,</span> <span class="n">y₁</span> <span class="bp">+</span> <span class="n">y₂</span><span class="o">,</span> <span class="n">z₁</span> <span class="bp">+</span> <span class="n">z₂</span><span class="o">⟩</span> <span class="kd">def</span><span class="w"> </span><span class="n">addAlt'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Point</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="o">⟨</span><span class="n">x₁</span><span class="o">,</span><span class="w"> </span><span class="n">y₁</span><span class="o">,</span><span class="w"> </span><span class="n">z₁</span><span class="o">⟩,</span><span class="w"> </span><span class="o">⟨</span><span class="n">x₂</span><span class="o">,</span><span class="w"> </span><span class="n">y₂</span><span class="o">,</span><span class="w"> </span><span class="n">z₂</span><span class="o">⟩</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="o">⟨</span><span class="n">x₁</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">x₂</span><span class="o">,</span><span class="w"> </span><span class="n">y₁</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y₂</span><span class="o">,</span><span class="w"> </span><span class="n">z₁</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">z₂</span><span class="o">⟩</span> <span class="kd">theorem</span> <span class="n">addAlt_x</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">Point</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">a.addAlt</span> <span class="n">b</span><span class="o">)</span><span class="bp">.</span><span class="n">x</span> <span class="bp">=</span> <span class="n">a.x</span> <span class="bp">+</span> <span class="n">b.x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">addAlt_x</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">a.addAlt</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="bp">.</span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a.x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b.x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">theorem</span> <span class="n">addAlt_comm</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">Point</span><span class="o">)</span> <span class="o">:</span> <span class="n">addAlt</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">addAlt</span> <span class="n">b</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">addAlt</span><span class="o">,</span> <span class="n">addAlt</span><span class="o">]</span> <span class="c1">-- the same proof still works, but the goal view here is harder to read</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">dsimp</span> <span class="n">repeat'</span> <span class="n">apply</span> <span class="n">add_comm</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">addAlt_comm</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">addAlt</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">addAlt</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">addAlt</span><span class="o">,</span><span class="w"> </span><span class="n">addAlt</span><span class="o">]</span> <span class="w"> </span><span class="c1">-- the same proof still works, but the goal view here is harder to read</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">dsimp</span> <span class="w"> </span><span class="n">repeat'</span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">add_comm</span> </pre></div> </div> <p>Mathematical constructions often involve taking apart bundled information and
-
@@ -257,15 +257,15 @@ of doing this efficiently.As an exercise, try proving that <code class="docutils literal notranslate"><span class="pre">Point.add</span></code> is associative. Then define scalar multiplication for a point and show that it distributes over addition.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">protected</span> <span class="kd">theorem</span> <span class="n">add_assoc</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">Point</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">a.add</span> <span class="n">b</span><span class="o">)</span><span class="bp">.</span><span class="n">add</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">a.add</span> <span class="o">(</span><span class="n">b.add</span> <span class="n">c</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">protected</span><span class="w"> </span><span class="kd">theorem</span><span class="w"> </span><span class="n">add_assoc</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">a.add</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="bp">.</span><span class="n">add</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a.add</span><span class="w"> </span><span class="o">(</span><span class="n">b.add</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">def</span> <span class="n">smul</span> <span class="o">(</span><span class="n">r</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">Point</span><span class="o">)</span> <span class="o">:</span> <span class="n">Point</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">def</span><span class="w"> </span><span class="n">smul</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">theorem</span> <span class="n">smul_distrib</span> <span class="o">(</span><span class="n">r</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">Point</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">smul</span> <span class="n">r</span> <span class="n">a</span><span class="o">)</span><span class="bp">.</span><span class="n">add</span> <span class="o">(</span><span class="n">smul</span> <span class="n">r</span> <span class="n">b</span><span class="o">)</span> <span class="bp">=</span> <span class="n">smul</span> <span class="n">r</span> <span class="o">(</span><span class="n">a.add</span> <span class="n">b</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">smul_distrib</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="o">(</span><span class="n">smul</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="bp">.</span><span class="n">add</span><span class="w"> </span><span class="o">(</span><span class="n">smul</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">smul</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">(</span><span class="n">a.add</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Using structures is only the first step on the road to
-
@@ -289,44 +289,44 @@ the equilateral triangle in three-space with vertices<span class="math notranslate nohighlight">\((1, 0, 0)\)</span>, <span class="math notranslate nohighlight">\((0, 1, 0)\)</span>, and <span class="math notranslate nohighlight">\((0, 0, 1)\)</span>, together with its interior. We can represent it in Lean as follows:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">structure</span> <span class="n">StandardTwoSimplex</span> <span class="n">where</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="n">z</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="n">x_nonneg</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">x</span> <span class="n">y_nonneg</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">y</span> <span class="n">z_nonneg</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">z</span> <span class="n">sum_eq</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">y</span> <span class="bp">+</span> <span class="n">z</span> <span class="bp">=</span> <span class="mi">1</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">structure</span><span class="w"> </span><span class="n">StandardTwoSimplex</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span> <span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span> <span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span> <span class="w"> </span><span class="n">x_nonneg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">y_nonneg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">y</span> <span class="w"> </span><span class="n">z_nonneg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">z</span> <span class="w"> </span><span class="n">sum_eq</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span> </pre></div> </div> <p>Notice that the last four fields refer to <code class="docutils literal notranslate"><span class="pre">x</span></code>, <code class="docutils literal notranslate"><span class="pre">y</span></code>, and <code class="docutils literal notranslate"><span class="pre">z</span></code>, that is, the first three fields. We can define a map from the two-simplex to itself that swaps <code class="docutils literal notranslate"><span class="pre">x</span></code> and <code class="docutils literal notranslate"><span class="pre">y</span></code>:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">swapXy</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">StandardTwoSimplex</span><span class="o">)</span> <span class="o">:</span> <span class="n">StandardTwoSimplex</span> <span class="n">where</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">a.y</span> <span class="n">y</span> <span class="o">:=</span> <span class="n">a.x</span> <span class="n">z</span> <span class="o">:=</span> <span class="n">a.z</span> <span class="n">x_nonneg</span> <span class="o">:=</span> <span class="n">a.y_nonneg</span> <span class="n">y_nonneg</span> <span class="o">:=</span> <span class="n">a.x_nonneg</span> <span class="n">z_nonneg</span> <span class="o">:=</span> <span class="n">a.z_nonneg</span> <span class="n">sum_eq</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">add_comm</span> <span class="n">a.y</span> <span class="n">a.x</span><span class="o">,</span> <span class="n">a.sum_eq</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">swapXy</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">StandardTwoSimplex</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">StandardTwoSimplex</span> <span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">a.y</span> <span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">a.x</span> <span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">a.z</span> <span class="w"> </span><span class="n">x_nonneg</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">a.y_nonneg</span> <span class="w"> </span><span class="n">y_nonneg</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">a.x_nonneg</span> <span class="w"> </span><span class="n">z_nonneg</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">a.z_nonneg</span> <span class="w"> </span><span class="n">sum_eq</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">add_comm</span><span class="w"> </span><span class="n">a.y</span><span class="w"> </span><span class="n">a.x</span><span class="o">,</span><span class="w"> </span><span class="n">a.sum_eq</span><span class="o">]</span> </pre></div> </div> <p>More interestingly, we can compute the midpoint of two points on the simplex. We have added the phrase <code class="docutils literal notranslate"><span class="pre">noncomputable</span> <span class="pre">section</span></code> at the beginning of this file in order to use division on the real numbers.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span> <span class="kn">section</span> <span class="kd">def</span> <span class="n">midpoint</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">StandardTwoSimplex</span><span class="o">)</span> <span class="o">:</span> <span class="n">StandardTwoSimplex</span> <span class="n">where</span> <span class="n">x</span> <span class="o">:=</span> <span class="o">(</span><span class="n">a.x</span> <span class="bp">+</span> <span class="n">b.x</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">2</span> <span class="n">y</span> <span class="o">:=</span> <span class="o">(</span><span class="n">a.y</span> <span class="bp">+</span> <span class="n">b.y</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">2</span> <span class="n">z</span> <span class="o">:=</span> <span class="o">(</span><span class="n">a.z</span> <span class="bp">+</span> <span class="n">b.z</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">2</span> <span class="n">x_nonneg</span> <span class="o">:=</span> <span class="n">div_nonneg</span> <span class="o">(</span><span class="n">add_nonneg</span> <span class="n">a.x_nonneg</span> <span class="n">b.x_nonneg</span><span class="o">)</span> <span class="o">(</span><span class="kd">by</span> <span class="n">norm_num</span><span class="o">)</span> <span class="n">y_nonneg</span> <span class="o">:=</span> <span class="n">div_nonneg</span> <span class="o">(</span><span class="n">add_nonneg</span> <span class="n">a.y_nonneg</span> <span class="n">b.y_nonneg</span><span class="o">)</span> <span class="o">(</span><span class="kd">by</span> <span class="n">norm_num</span><span class="o">)</span> <span class="n">z_nonneg</span> <span class="o">:=</span> <span class="n">div_nonneg</span> <span class="o">(</span><span class="n">add_nonneg</span> <span class="n">a.z_nonneg</span> <span class="n">b.z_nonneg</span><span class="o">)</span> <span class="o">(</span><span class="kd">by</span> <span class="n">norm_num</span><span class="o">)</span> <span class="n">sum_eq</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">field_simp</span><span class="bp">;</span> <span class="n">linarith</span> <span class="o">[</span><span class="n">a.sum_eq</span><span class="o">,</span> <span class="n">b.sum_eq</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span><span class="w"> </span><span class="kn">section</span> <span class="kd">def</span><span class="w"> </span><span class="n">midpoint</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">StandardTwoSimplex</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">StandardTwoSimplex</span> <span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="n">a.x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b.x</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span> <span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="n">a.y</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b.y</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span> <span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="n">a.z</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b.z</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span> <span class="w"> </span><span class="n">x_nonneg</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">div_nonneg</span><span class="w"> </span><span class="o">(</span><span class="n">add_nonneg</span><span class="w"> </span><span class="n">a.x_nonneg</span><span class="w"> </span><span class="n">b.x_nonneg</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span><span class="o">)</span> <span class="w"> </span><span class="n">y_nonneg</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">div_nonneg</span><span class="w"> </span><span class="o">(</span><span class="n">add_nonneg</span><span class="w"> </span><span class="n">a.y_nonneg</span><span class="w"> </span><span class="n">b.y_nonneg</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span><span class="o">)</span> <span class="w"> </span><span class="n">z_nonneg</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">div_nonneg</span><span class="w"> </span><span class="o">(</span><span class="n">add_nonneg</span><span class="w"> </span><span class="n">a.z_nonneg</span><span class="w"> </span><span class="n">b.z_nonneg</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="kd">by</span><span class="w"> </span><span class="n">norm_num</span><span class="o">)</span> <span class="w"> </span><span class="n">sum_eq</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">field_simp</span><span class="bp">;</span><span class="w"> </span><span class="n">linarith</span><span class="w"> </span><span class="o">[</span><span class="n">a.sum_eq</span><span class="o">,</span><span class="w"> </span><span class="n">b.sum_eq</span><span class="o">]</span> </pre></div> </div> <p>Here we have established <code class="docutils literal notranslate"><span class="pre">x_nonneg</span></code>, <code class="docutils literal notranslate"><span class="pre">y_nonneg</span></code>, and <code class="docutils literal notranslate"><span class="pre">z_nonneg</span></code>
-
@@ -337,9 +337,9 @@ we can take the weighted average <span class="math notranslate nohighlight">\(\lof two points <span class="math notranslate nohighlight">\(a\)</span> and <span class="math notranslate nohighlight">\(b\)</span> in the standard 2-simplex. We challenge you to define that function, in analogy to the <code class="docutils literal notranslate"><span class="pre">midpoint</span></code> function above.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">weightedAverage</span> <span class="o">(</span><span class="n">lambda</span> <span class="o">:</span> <span class="n">Real</span><span class="o">)</span> <span class="o">(</span><span class="n">lambda_nonneg</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">lambda</span><span class="o">)</span> <span class="o">(</span><span class="n">lambda_le</span> <span class="o">:</span> <span class="n">lambda</span> <span class="bp">≤</span> <span class="mi">1</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">StandardTwoSimplex</span><span class="o">)</span> <span class="o">:</span> <span class="n">StandardTwoSimplex</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">weightedAverage</span><span class="w"> </span><span class="o">(</span><span class="n">lambda</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Real</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">lambda_nonneg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">lambda</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">lambda_le</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">lambda</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">StandardTwoSimplex</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">StandardTwoSimplex</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Structures can depend on parameters.
-
@@ -348,29 +348,29 @@ For example, we can generalize the standard 2-simplex to the standardAt this stage, you don’t have to know anything about the type <code class="docutils literal notranslate"><span class="pre">Fin</span> <span class="pre">n</span></code> except that it has <span class="math notranslate nohighlight">\(n\)</span> elements, and that Lean knows how to sum over it.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">BigOperators</span> <span class="kd">structure</span> <span class="n">StandardSimplex</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="n">where</span> <span class="n">V</span> <span class="o">:</span> <span class="n">Fin</span> <span class="n">n</span> <span class="bp">→</span> <span class="n">ℝ</span> <span class="n">NonNeg</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">i</span> <span class="o">:</span> <span class="n">Fin</span> <span class="n">n</span><span class="o">,</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">V</span> <span class="n">i</span> <span class="n">sum_eq_one</span> <span class="o">:</span> <span class="o">(</span><span class="bp">∑</span> <span class="n">i</span><span class="o">,</span> <span class="n">V</span> <span class="n">i</span><span class="o">)</span> <span class="bp">=</span> <span class="mi">1</span> <span class="kn">namespace</span> <span class="n">StandardSimplex</span> <span class="kd">def</span> <span class="n">midpoint</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">StandardSimplex</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">StandardSimplex</span> <span class="n">n</span> <span class="n">where</span> <span class="n">V</span> <span class="n">i</span> <span class="o">:=</span> <span class="o">(</span><span class="n">a.V</span> <span class="n">i</span> <span class="bp">+</span> <span class="n">b.V</span> <span class="n">i</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">2</span> <span class="n">NonNeg</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">i</span> <span class="n">apply</span> <span class="n">div_nonneg</span> <span class="bp">·</span> <span class="n">linarith</span> <span class="o">[</span><span class="n">a.NonNeg</span> <span class="n">i</span><span class="o">,</span> <span class="n">b.NonNeg</span> <span class="n">i</span><span class="o">]</span> <span class="n">norm_num</span> <span class="n">sum_eq_one</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="o">[</span><span class="n">div_eq_mul_inv</span><span class="o">,</span> <span class="bp">←</span> <span class="n">Finset.sum_mul</span><span class="o">,</span> <span class="n">Finset.sum_add_distrib</span><span class="o">,</span> <span class="n">a.sum_eq_one</span><span class="o">,</span> <span class="n">b.sum_eq_one</span><span class="o">]</span> <span class="n">field_simp</span> <span class="kd">end</span> <span class="n">StandardSimplex</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">BigOperators</span> <span class="kd">structure</span><span class="w"> </span><span class="n">StandardSimplex</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">V</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Fin</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span> <span class="w"> </span><span class="n">NonNeg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Fin</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">V</span><span class="w"> </span><span class="n">i</span> <span class="w"> </span><span class="n">sum_eq_one</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">∑</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">V</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span> <span class="kn">namespace</span><span class="w"> </span><span class="n">StandardSimplex</span> <span class="kd">def</span><span class="w"> </span><span class="n">midpoint</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">StandardSimplex</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">StandardSimplex</span><span class="w"> </span><span class="n">n</span> <span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">V</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="n">a.V</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b.V</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span> <span class="w"> </span><span class="n">NonNeg</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">i</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">div_nonneg</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">linarith</span><span class="w"> </span><span class="o">[</span><span class="n">a.NonNeg</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">b.NonNeg</span><span class="w"> </span><span class="n">i</span><span class="o">]</span> <span class="w"> </span><span class="n">norm_num</span> <span class="w"> </span><span class="n">sum_eq_one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">div_eq_mul_inv</span><span class="o">,</span><span class="w"> </span><span class="bp">←</span><span class="w"> </span><span class="n">Finset.sum_mul</span><span class="o">,</span><span class="w"> </span><span class="n">Finset.sum_add_distrib</span><span class="o">,</span> <span class="w"> </span><span class="n">a.sum_eq_one</span><span class="o">,</span><span class="w"> </span><span class="n">b.sum_eq_one</span><span class="o">]</span> <span class="w"> </span><span class="n">field_simp</span> <span class="kd">end</span><span class="w"> </span><span class="n">StandardSimplex</span> </pre></div> </div> <p>As an exercise, see if you can define the weighted average of
-
@@ -383,15 +383,15 @@ Interestingly, they can also be used to bundle together propertieswithout the data. For example, the next structure, <code class="docutils literal notranslate"><span class="pre">IsLinear</span></code>, bundles together the two components of linearity.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">structure</span> <span class="n">IsLinear</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="n">where</span> <span class="n">is_additive</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="n">y</span><span class="o">,</span> <span class="n">f</span> <span class="o">(</span><span class="n">x</span> <span class="bp">+</span> <span class="n">y</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">f</span> <span class="n">y</span> <span class="n">preserves_mul</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="n">c</span><span class="o">,</span> <span class="n">f</span> <span class="o">(</span><span class="n">c</span> <span class="bp">*</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="n">c</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">x</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">structure</span><span class="w"> </span><span class="n">IsLinear</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">is_additive</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">y</span> <span class="w"> </span><span class="n">preserves_mul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">c</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span> <span class="kn">section</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">linf</span> <span class="o">:</span> <span class="n">IsLinear</span> <span class="n">f</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">linf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsLinear</span><span class="w"> </span><span class="n">f</span><span class="o">)</span> <span class="k">#check</span> <span class="n">linf.is_additive</span> <span class="k">#check</span> <span class="n">linf.preserves_mul</span> <span class="k">#check</span><span class="w"> </span><span class="n">linf.is_additive</span> <span class="k">#check</span><span class="w"> </span><span class="n">linf.preserves_mul</span> <span class="kd">end</span> </pre></div>
-
@@ -400,11 +400,11 @@ the two components of linearity.</p>together data. The <code class="docutils literal notranslate"><span class="pre">Point</span></code> data structure can be defined using the generic type product, and <code class="docutils literal notranslate"><span class="pre">IsLinear</span></code> can be defined with a simple <code class="docutils literal notranslate"><span class="pre">and</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">Point''</span> <span class="o">:=</span> <span class="n">ℝ</span> <span class="bp">×</span> <span class="n">ℝ</span> <span class="bp">×</span> <span class="n">ℝ</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">Point''</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">×</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">×</span><span class="w"> </span><span class="n">ℝ</span> <span class="kd">def</span> <span class="n">IsLinear'</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:=</span> <span class="o">(</span><span class="bp">∀</span> <span class="n">x</span> <span class="n">y</span><span class="o">,</span> <span class="n">f</span> <span class="o">(</span><span class="n">x</span> <span class="bp">+</span> <span class="n">y</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">f</span> <span class="n">y</span><span class="o">)</span> <span class="bp">∧</span> <span class="bp">∀</span> <span class="n">x</span> <span class="n">c</span><span class="o">,</span> <span class="n">f</span> <span class="o">(</span><span class="n">c</span> <span class="bp">*</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="n">c</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">x</span> <span class="kd">def</span><span class="w"> </span><span class="n">IsLinear'</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">(</span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">c</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span> </pre></div> </div> <p>Generic type constructions can even be used in place of structures
-
@@ -417,42 +417,42 @@ Any <code class="docutils literal notranslate"><span class="pre">x</span> <spanpositive. You can access these components as <code class="docutils literal notranslate"><span class="pre">x.val</span></code>, which has type <code class="docutils literal notranslate"><span class="pre">ℝ</span></code>, and <code class="docutils literal notranslate"><span class="pre">x.property</span></code>, which represents the fact <code class="docutils literal notranslate"><span class="pre">0</span> <span class="pre"><</span> <span class="pre">x.val</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">PReal</span> <span class="o">:=</span> <span class="o">{</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">//</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">y</span> <span class="o">}</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">PReal</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">//</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">}</span> <span class="kn">section</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">PReal</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">PReal</span><span class="o">)</span> <span class="k">#check</span> <span class="n">x.val</span> <span class="k">#check</span> <span class="n">x.property</span> <span class="k">#check</span> <span class="n">x.1</span> <span class="k">#check</span> <span class="n">x.2</span> <span class="k">#check</span><span class="w"> </span><span class="n">x.val</span> <span class="k">#check</span><span class="w"> </span><span class="n">x.property</span> <span class="k">#check</span><span class="w"> </span><span class="n">x</span><span class="bp">.</span><span class="mi">1</span> <span class="k">#check</span><span class="w"> </span><span class="n">x</span><span class="bp">.</span><span class="mi">2</span> <span class="kd">end</span> </pre></div> </div> <p>We could have used subtypes to define the standard 2-simplex, as well as the standard <span class="math notranslate nohighlight">\(n\)</span>-simplex for an arbitrary <span class="math notranslate nohighlight">\(n\)</span>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">StandardTwoSimplex'</span> <span class="o">:=</span> <span class="o">{</span> <span class="n">p</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">×</span> <span class="n">ℝ</span> <span class="bp">×</span> <span class="n">ℝ</span> <span class="bp">//</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">p.1</span> <span class="bp">∧</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">p.2.1</span> <span class="bp">∧</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">p.2.2</span> <span class="bp">∧</span> <span class="n">p.1</span> <span class="bp">+</span> <span class="n">p.2.1</span> <span class="bp">+</span> <span class="n">p.2.2</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">}</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">StandardTwoSimplex'</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">×</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">×</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">//</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">1</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">2</span><span class="bp">.</span><span class="mi">1</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">2</span><span class="bp">.</span><span class="mi">2</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">1</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">2</span><span class="bp">.</span><span class="mi">1</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">2</span><span class="bp">.</span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">}</span> <span class="kd">def</span> <span class="n">StandardSimplex'</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:=</span> <span class="o">{</span> <span class="n">v</span> <span class="o">:</span> <span class="n">Fin</span> <span class="n">n</span> <span class="bp">→</span> <span class="n">ℝ</span> <span class="bp">//</span> <span class="o">(</span><span class="bp">∀</span> <span class="n">i</span> <span class="o">:</span> <span class="n">Fin</span> <span class="n">n</span><span class="o">,</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">v</span> <span class="n">i</span><span class="o">)</span> <span class="bp">∧</span> <span class="o">(</span><span class="bp">∑</span> <span class="n">i</span><span class="o">,</span> <span class="n">v</span> <span class="n">i</span><span class="o">)</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">}</span> <span class="kd">def</span><span class="w"> </span><span class="n">StandardSimplex'</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Fin</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">//</span><span class="w"> </span><span class="o">(</span><span class="bp">∀</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Fin</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="o">(</span><span class="bp">∑</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">}</span> </pre></div> </div> <p>Similarly, <em>Sigma types</em> are generalizations of ordered pairs, whereby the type of the second component depends on the type of the first.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">StdSimplex</span> <span class="o">:=</span> <span class="bp">Σ</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">,</span> <span class="n">StandardSimplex</span> <span class="n">n</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">StdSimplex</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="bp">Σ</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="n">StandardSimplex</span><span class="w"> </span><span class="n">n</span> <span class="kn">section</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">s</span> <span class="o">:</span> <span class="n">StdSimplex</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">StdSimplex</span><span class="o">)</span> <span class="k">#check</span> <span class="n">s.fst</span> <span class="k">#check</span> <span class="n">s.snd</span> <span class="k">#check</span><span class="w"> </span><span class="n">s.fst</span> <span class="k">#check</span><span class="w"> </span><span class="n">s.snd</span> <span class="k">#check</span> <span class="n">s.1</span> <span class="k">#check</span> <span class="n">s.2</span> <span class="k">#check</span><span class="w"> </span><span class="n">s</span><span class="bp">.</span><span class="mi">1</span> <span class="k">#check</span><span class="w"> </span><span class="n">s</span><span class="bp">.</span><span class="mi">2</span> <span class="kd">end</span> </pre></div>
-
@@ -593,14 +593,14 @@ this is exactly what the <code class="docutils literal notranslate"><span class=It’s a marriage made in heaven!</p> <p>Given a data type <code class="docutils literal notranslate"><span class="pre">α</span></code>, we can define the group structure on <code class="docutils literal notranslate"><span class="pre">α</span></code> as follows.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">structure</span> <span class="n">Group₁</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="n">where</span> <span class="n">mul</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">α</span> <span class="n">one</span> <span class="o">:</span> <span class="n">α</span> <span class="n">inv</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">α</span> <span class="n">mul_assoc</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">mul</span> <span class="o">(</span><span class="n">mul</span> <span class="n">x</span> <span class="n">y</span><span class="o">)</span> <span class="n">z</span> <span class="bp">=</span> <span class="n">mul</span> <span class="n">x</span> <span class="o">(</span><span class="n">mul</span> <span class="n">y</span> <span class="n">z</span><span class="o">)</span> <span class="n">mul_one</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">mul</span> <span class="n">x</span> <span class="n">one</span> <span class="bp">=</span> <span class="n">x</span> <span class="n">one_mul</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">mul</span> <span class="n">one</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">x</span> <span class="n">mul_left_inv</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">mul</span> <span class="o">(</span><span class="n">inv</span> <span class="n">x</span><span class="o">)</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">one</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">structure</span><span class="w"> </span><span class="n">Group₁</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span> <span class="w"> </span><span class="n">one</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span> <span class="w"> </span><span class="n">inv</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span> <span class="w"> </span><span class="n">mul_assoc</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="o">(</span><span class="n">mul</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">(</span><span class="n">mul</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="o">)</span> <span class="w"> </span><span class="n">mul_one</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">one</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">one_mul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="n">one</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">mul_left_inv</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="o">(</span><span class="n">inv</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">one</span> </pre></div> </div> <p>Notice that the type <code class="docutils literal notranslate"><span class="pre">α</span></code> is a <em>parameter</em> in the definition of <code class="docutils literal notranslate"><span class="pre">group₁</span></code>.
-
@@ -629,9 +629,9 @@ morally the same as the definition of a group that Mathlib uses.</p>the type together with the structure, and Mathlib also contains a definition of a <code class="docutils literal notranslate"><span class="pre">GroupCat</span></code> structure that is equivalent to the following:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">structure</span> <span class="n">Group₁Cat</span> <span class="n">where</span> <span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span> <span class="n">str</span> <span class="o">:</span> <span class="n">Group₁</span> <span class="n">α</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">structure</span><span class="w"> </span><span class="n">Group₁Cat</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span> <span class="w"> </span><span class="n">str</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Group₁</span><span class="w"> </span><span class="n">α</span> </pre></div> </div> <p>The Mathlib version is found in <code class="docutils literal notranslate"><span class="pre">Mathlib.Algebra.Category.GroupCat.Basic</span></code>,
-
@@ -654,17 +654,17 @@ a function <code class="docutils literal notranslate"><span class="pre">f.toFun<the inverse function <code class="docutils literal notranslate"><span class="pre">f.invFun</span></code> from <code class="docutils literal notranslate"><span class="pre">β</span></code> to <code class="docutils literal notranslate"><span class="pre">α</span></code>, and two properties that specify these functions are indeed inverse to one another.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">(</span><span class="n">α</span> <span class="n">β</span> <span class="n">γ</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">≃</span> <span class="n">β</span><span class="o">)</span> <span class="o">(</span><span class="n">g</span> <span class="o">:</span> <span class="n">β</span> <span class="bp">≃</span> <span class="n">γ</span><span class="o">)</span> <span class="k">#check</span> <span class="n">Equiv</span> <span class="n">α</span> <span class="n">β</span> <span class="k">#check</span> <span class="o">(</span><span class="n">f.toFun</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">β</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">f.invFun</span> <span class="o">:</span> <span class="n">β</span> <span class="bp">→</span> <span class="n">α</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">f.right_inv</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="o">:</span> <span class="n">β</span><span class="o">,</span> <span class="n">f</span> <span class="o">(</span><span class="n">f.invFun</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="n">x</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">f.left_inv</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">f.invFun</span> <span class="o">(</span><span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="n">x</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">Equiv.refl</span> <span class="n">α</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">≃</span> <span class="n">α</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">f.symm</span> <span class="o">:</span> <span class="n">β</span> <span class="bp">≃</span> <span class="n">α</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">f.trans</span> <span class="n">g</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">≃</span> <span class="n">γ</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="n">γ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">≃</span><span class="w"> </span><span class="n">β</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="bp">≃</span><span class="w"> </span><span class="n">γ</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="n">Equiv</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="n">β</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">f.toFun</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">β</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">f.invFun</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">f.right_inv</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">β</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">f.invFun</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">f.left_inv</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">f.invFun</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">Equiv.refl</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">≃</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">f.symm</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="bp">≃</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">f.trans</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">≃</span><span class="w"> </span><span class="n">γ</span><span class="o">)</span> </pre></div> </div> <p>Notice the creative naming of the last three constructions. We think of the
-
@@ -675,20 +675,20 @@ that the property of being in bijective correspondence is an equivalence relatioin reverse order. Mathlib has declared a <em>coercion</em> from <code class="docutils literal notranslate"><span class="pre">Equiv</span> <span class="pre">α</span> <span class="pre">β</span></code> to the function type <code class="docutils literal notranslate"><span class="pre">α</span> <span class="pre">→</span> <span class="pre">β</span></code>, so we can omit writing <code class="docutils literal notranslate"><span class="pre">.toFun</span></code> and have Lean insert it for us.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">f.trans</span> <span class="n">g</span><span class="o">)</span><span class="bp">.</span><span class="n">toFun</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">g.toFun</span> <span class="o">(</span><span class="n">f.toFun</span> <span class="n">x</span><span class="o">)</span> <span class="o">:=</span> <span class="n">rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">f.trans</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="bp">.</span><span class="n">toFun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">g.toFun</span><span class="w"> </span><span class="o">(</span><span class="n">f.toFun</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">f.trans</span> <span class="n">g</span><span class="o">)</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">g</span> <span class="o">(</span><span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">f.trans</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">f.trans</span> <span class="n">g</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">γ</span><span class="o">)</span> <span class="bp">=</span> <span class="n">g</span> <span class="bp">∘</span> <span class="n">f</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">f.trans</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">γ</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">∘</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p>Mathlib also defines the type <code class="docutils literal notranslate"><span class="pre">perm</span> <span class="pre">α</span></code> of equivalences between <code class="docutils literal notranslate"><span class="pre">α</span></code> and itself.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="o">:</span> <span class="n">Equiv.Perm</span> <span class="n">α</span> <span class="bp">=</span> <span class="o">(</span><span class="n">α</span> <span class="bp">≃</span> <span class="n">α</span><span class="o">)</span> <span class="o">:=</span> <span class="n">rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Equiv.Perm</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="bp">≃</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p>It should be clear that <code class="docutils literal notranslate"><span class="pre">Equiv.Perm</span> <span class="pre">α</span></code> forms a group under composition
-
@@ -696,15 +696,15 @@ of equivalences. We orient things so that <code class="docutils literal notranslequal to <code class="docutils literal notranslate"><span class="pre">g.trans</span> <span class="pre">f</span></code>, whose forward function is <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">∘</span> <span class="pre">g</span></code>. In other words, multiplication is what we ordinarily think of as composition of the bijections. Here we define this group:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">permGroup</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">:</span> <span class="n">Group₁</span> <span class="o">(</span><span class="n">Equiv.Perm</span> <span class="n">α</span><span class="o">)</span> <span class="n">where</span> <span class="n">mul</span> <span class="n">f</span> <span class="n">g</span> <span class="o">:=</span> <span class="n">Equiv.trans</span> <span class="n">g</span> <span class="n">f</span> <span class="n">one</span> <span class="o">:=</span> <span class="n">Equiv.refl</span> <span class="n">α</span> <span class="n">inv</span> <span class="o">:=</span> <span class="n">Equiv.symm</span> <span class="n">mul_assoc</span> <span class="n">f</span> <span class="n">g</span> <span class="n">h</span> <span class="o">:=</span> <span class="o">(</span><span class="n">Equiv.trans_assoc</span> <span class="n">_</span> <span class="n">_</span> <span class="n">_</span><span class="o">)</span><span class="bp">.</span><span class="n">symm</span> <span class="n">one_mul</span> <span class="o">:=</span> <span class="n">Equiv.trans_refl</span> <span class="n">mul_one</span> <span class="o">:=</span> <span class="n">Equiv.refl_trans</span> <span class="n">mul_left_inv</span> <span class="o">:=</span> <span class="n">Equiv.self_trans_symm</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">permGroup</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Group₁</span><span class="w"> </span><span class="o">(</span><span class="n">Equiv.Perm</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Equiv.trans</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">f</span> <span class="w"> </span><span class="n">one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Equiv.refl</span><span class="w"> </span><span class="n">α</span> <span class="w"> </span><span class="n">inv</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Equiv.symm</span> <span class="w"> </span><span class="n">mul_assoc</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="n">Equiv.trans_assoc</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">_</span><span class="o">)</span><span class="bp">.</span><span class="n">symm</span> <span class="w"> </span><span class="n">one_mul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Equiv.trans_refl</span> <span class="w"> </span><span class="n">mul_one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Equiv.refl_trans</span> <span class="w"> </span><span class="n">mul_left_inv</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Equiv.self_trans_symm</span> </pre></div> </div> <p>In fact, Mathlib defines exactly this <code class="docutils literal notranslate"><span class="pre">Group</span></code> structure on <code class="docutils literal notranslate"><span class="pre">Equiv.Perm</span> <span class="pre">α</span></code>
-
@@ -738,27 +738,27 @@ to the <code class="docutils literal notranslate"><span class="pre">Group₁additive naming scheme just described. Define negation and a zero on the <code class="docutils literal notranslate"><span class="pre">Point</span></code> data type, and define the <code class="docutils literal notranslate"><span class="pre">AddGroup₁</span></code> structure on <code class="docutils literal notranslate"><span class="pre">Point</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">structure</span> <span class="n">AddGroup₁</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="n">where</span> <span class="o">(</span><span class="n">add</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">α</span><span class="o">)</span> <span class="c1">-- fill in the rest</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">structure</span><span class="w"> </span><span class="n">AddGroup₁</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="o">(</span><span class="n">add</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="w"> </span><span class="c1">-- fill in the rest</span> <span class="kd">@[</span><span class="n">ext</span><span class="kd">]</span> <span class="kd">structure</span> <span class="n">Point</span> <span class="n">where</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="n">z</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="kd">structure</span><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span> <span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span> <span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span> <span class="kn">namespace</span> <span class="n">Point</span> <span class="kn">namespace</span><span class="w"> </span><span class="n">Point</span> <span class="kd">def</span> <span class="n">add</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">Point</span><span class="o">)</span> <span class="o">:</span> <span class="n">Point</span> <span class="o">:=</span> <span class="o">⟨</span><span class="n">a.x</span> <span class="bp">+</span> <span class="n">b.x</span><span class="o">,</span> <span class="n">a.y</span> <span class="bp">+</span> <span class="n">b.y</span><span class="o">,</span> <span class="n">a.z</span> <span class="bp">+</span> <span class="n">b.z</span><span class="o">⟩</span> <span class="kd">def</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="n">a.x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b.x</span><span class="o">,</span><span class="w"> </span><span class="n">a.y</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b.y</span><span class="o">,</span><span class="w"> </span><span class="n">a.z</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b.z</span><span class="o">⟩</span> <span class="kd">def</span> <span class="n">neg</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">Point</span><span class="o">)</span> <span class="o">:</span> <span class="n">Point</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">def</span><span class="w"> </span><span class="n">neg</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="kd">def</span> <span class="n">zero</span> <span class="o">:</span> <span class="n">Point</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">def</span><span class="w"> </span><span class="n">zero</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="kd">def</span> <span class="n">addGroupPoint</span> <span class="o">:</span> <span class="n">AddGroup₁</span> <span class="n">Point</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">def</span><span class="w"> </span><span class="n">addGroupPoint</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">AddGroup₁</span><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="kd">end</span> <span class="n">Point</span> <span class="kd">end</span><span class="w"> </span><span class="n">Point</span> </pre></div> </div> <p>We are making progress.
-
@@ -772,21 +772,21 @@ and we want to arrange it so that we can prove a theorem abouta structure and use it with any instance.</p> <p>In fact, Mathlib is already set up to use generic group notation, definitions, and theorems for <code class="docutils literal notranslate"><span class="pre">Equiv.Perm</span> <span class="pre">α</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">(</span><span class="n">f</span> <span class="n">g</span> <span class="o">:</span> <span class="n">Equiv.Perm</span> <span class="n">α</span><span class="o">)</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Equiv.Perm</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span> <span class="k">#check</span> <span class="n">f</span> <span class="bp">*</span> <span class="n">g</span> <span class="k">#check</span> <span class="n">mul_assoc</span> <span class="n">f</span> <span class="n">g</span> <span class="n">g</span><span class="bp">⁻¹</span> <span class="k">#check</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g</span> <span class="k">#check</span><span class="w"> </span><span class="n">mul_assoc</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">g</span><span class="bp">⁻¹</span> <span class="c1">-- group power, defined for any group</span> <span class="k">#check</span> <span class="n">g</span> <span class="bp">^</span> <span class="n">n</span> <span class="k">#check</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">n</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">*</span> <span class="n">g</span> <span class="bp">*</span> <span class="n">g</span><span class="bp">⁻¹</span> <span class="bp">=</span> <span class="n">f</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mul_assoc</span><span class="o">,</span> <span class="n">mul_right_inv</span><span class="o">,</span> <span class="n">mul_one</span><span class="o">]</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mul_assoc</span><span class="o">,</span><span class="w"> </span><span class="n">mul_right_inv</span><span class="o">,</span><span class="w"> </span><span class="n">mul_one</span><span class="o">]</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">*</span> <span class="n">g</span> <span class="bp">*</span> <span class="n">g</span><span class="bp">⁻¹</span> <span class="bp">=</span> <span class="n">f</span> <span class="o">:=</span> <span class="n">mul_inv_cancel_right</span> <span class="n">f</span> <span class="n">g</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">mul_inv_cancel_right</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span> <span class="kd">example</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">(</span><span class="n">f</span> <span class="n">g</span> <span class="o">:</span> <span class="n">Equiv.Perm</span> <span class="n">α</span><span class="o">)</span> <span class="o">:</span> <span class="n">g.symm.trans</span> <span class="o">(</span><span class="n">g.trans</span> <span class="n">f</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="o">:=</span> <span class="n">mul_inv_cancel_right</span> <span class="n">f</span> <span class="n">g</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Equiv.Perm</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">g.symm.trans</span><span class="w"> </span><span class="o">(</span><span class="n">g.trans</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">mul_inv_cancel_right</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span> </pre></div> </div> <p>You can check that this is not the case for the additive group structure
-
@@ -850,41 +850,41 @@ Lean. As with the names of class variables, we are allowed to leave thename of an instance definition anonymous, since in general we intend Lean to find it and put it to use without troubling us with the details.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">Group₂</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="n">where</span> <span class="n">mul</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">α</span> <span class="n">one</span> <span class="o">:</span> <span class="n">α</span> <span class="n">inv</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">α</span> <span class="n">mul_assoc</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">mul</span> <span class="o">(</span><span class="n">mul</span> <span class="n">x</span> <span class="n">y</span><span class="o">)</span> <span class="n">z</span> <span class="bp">=</span> <span class="n">mul</span> <span class="n">x</span> <span class="o">(</span><span class="n">mul</span> <span class="n">y</span> <span class="n">z</span><span class="o">)</span> <span class="n">mul_one</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">mul</span> <span class="n">x</span> <span class="n">one</span> <span class="bp">=</span> <span class="n">x</span> <span class="n">one_mul</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">mul</span> <span class="n">one</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">x</span> <span class="n">mul_left_inv</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">mul</span> <span class="o">(</span><span class="n">inv</span> <span class="n">x</span><span class="o">)</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">one</span> <span class="kd">instance</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">:</span> <span class="n">Group₂</span> <span class="o">(</span><span class="n">Equiv.Perm</span> <span class="n">α</span><span class="o">)</span> <span class="n">where</span> <span class="n">mul</span> <span class="n">f</span> <span class="n">g</span> <span class="o">:=</span> <span class="n">Equiv.trans</span> <span class="n">g</span> <span class="n">f</span> <span class="n">one</span> <span class="o">:=</span> <span class="n">Equiv.refl</span> <span class="n">α</span> <span class="n">inv</span> <span class="o">:=</span> <span class="n">Equiv.symm</span> <span class="n">mul_assoc</span> <span class="n">f</span> <span class="n">g</span> <span class="n">h</span> <span class="o">:=</span> <span class="o">(</span><span class="n">Equiv.trans_assoc</span> <span class="n">_</span> <span class="n">_</span> <span class="n">_</span><span class="o">)</span><span class="bp">.</span><span class="n">symm</span> <span class="n">one_mul</span> <span class="o">:=</span> <span class="n">Equiv.trans_refl</span> <span class="n">mul_one</span> <span class="o">:=</span> <span class="n">Equiv.refl_trans</span> <span class="n">mul_left_inv</span> <span class="o">:=</span> <span class="n">Equiv.self_trans_symm</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">Group₂</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span> <span class="w"> </span><span class="n">one</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span> <span class="w"> </span><span class="n">inv</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span> <span class="w"> </span><span class="n">mul_assoc</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="o">(</span><span class="n">mul</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">(</span><span class="n">mul</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="o">)</span> <span class="w"> </span><span class="n">mul_one</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">one</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">one_mul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="n">one</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">mul_left_inv</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="o">(</span><span class="n">inv</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">one</span> <span class="kd">instance</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Group₂</span><span class="w"> </span><span class="o">(</span><span class="n">Equiv.Perm</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Equiv.trans</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">f</span> <span class="w"> </span><span class="n">one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Equiv.refl</span><span class="w"> </span><span class="n">α</span> <span class="w"> </span><span class="n">inv</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Equiv.symm</span> <span class="w"> </span><span class="n">mul_assoc</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="n">Equiv.trans_assoc</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">_</span><span class="o">)</span><span class="bp">.</span><span class="n">symm</span> <span class="w"> </span><span class="n">one_mul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Equiv.trans_refl</span> <span class="w"> </span><span class="n">mul_one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Equiv.refl_trans</span> <span class="w"> </span><span class="n">mul_left_inv</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Equiv.self_trans_symm</span> </pre></div> </div> <p>The following illustrates their use.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">Group₂.mul</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="n">Group₂.mul</span> <span class="kd">def</span> <span class="n">mySquare</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group₂</span> <span class="n">α</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <span class="o">:=</span> <span class="n">Group₂.mul</span> <span class="n">x</span> <span class="n">x</span> <span class="kd">def</span><span class="w"> </span><span class="n">mySquare</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group₂</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Group₂.mul</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">x</span> <span class="k">#check</span> <span class="n">mySquare</span> <span class="k">#check</span><span class="w"> </span><span class="n">mySquare</span> <span class="kn">section</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">β</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">(</span><span class="n">f</span> <span class="n">g</span> <span class="o">:</span> <span class="n">Equiv.Perm</span> <span class="n">β</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">β</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Equiv.Perm</span><span class="w"> </span><span class="n">β</span><span class="o">)</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">Group₂.mul</span> <span class="n">f</span> <span class="n">g</span> <span class="bp">=</span> <span class="n">g.trans</span> <span class="n">f</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Group₂.mul</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">g.trans</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">mySquare</span> <span class="n">f</span> <span class="bp">=</span> <span class="n">f.trans</span> <span class="n">f</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">mySquare</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f.trans</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">end</span> </pre></div>
-
@@ -917,12 +917,12 @@ element of a list, can return the default value when the list is empty.To make that work, the Lean library defines a class <code class="docutils literal notranslate"><span class="pre">Inhabited</span> <span class="pre">α</span></code>, which does nothing more than store a default value. We can show that the <code class="docutils literal notranslate"><span class="pre">Point</span></code> type is an instance:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="o">:</span> <span class="n">Inhabited</span> <span class="n">Point</span> <span class="n">where</span> <span class="n">default</span> <span class="o">:=</span> <span class="o">⟨</span><span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Inhabited</span><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="n">where</span><span class="w"> </span><span class="n">default</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">⟨</span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="mi">0</span><span class="o">⟩</span> <span class="k">#check</span> <span class="o">(</span><span class="n">default</span> <span class="o">:</span> <span class="n">Point</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">default</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="o">)</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">([]</span> <span class="o">:</span> <span class="n">List</span> <span class="n">Point</span><span class="o">)</span><span class="bp">.</span><span class="n">headI</span> <span class="bp">=</span> <span class="n">default</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">([]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">List</span><span class="w"> </span><span class="n">Point</span><span class="o">)</span><span class="bp">.</span><span class="n">headI</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">default</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p>The class inference mechanism is also used for generic notation.
-
@@ -932,15 +932,15 @@ a binary function on <code class="docutils literal notranslate"><span class="preWriting <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">+</span> <span class="pre">y</span></code> tells Lean to find a registered instance of <code class="docutils literal notranslate"><span class="pre">[Add.add</span> <span class="pre">α]</span></code> and use the corresponding function. Below, we register the addition function for <code class="docutils literal notranslate"><span class="pre">Point</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="o">:</span> <span class="n">Add</span> <span class="n">Point</span> <span class="n">where</span> <span class="n">add</span> <span class="o">:=</span> <span class="n">Point.add</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Add</span><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="n">where</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Point.add</span> <span class="kn">section</span> <span class="kd">variable</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">Point</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Point</span><span class="o">)</span> <span class="k">#check</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">y</span> <span class="k">#check</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">y</span> <span class="bp">=</span> <span class="n">Point.add</span> <span class="n">x</span> <span class="n">y</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">Point.add</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">end</span> </pre></div>
-
@@ -954,22 +954,22 @@ When we define a new instance of a ring in Lean,we don’t have to define <code class="docutils literal notranslate"><span class="pre">+</span></code> and <code class="docutils literal notranslate"><span class="pre">*</span></code> for that instance, because Lean knows that these are defined for every ring. We can use this method to specify notation for our <code class="docutils literal notranslate"><span class="pre">Group₂</span></code> class:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="n">hasMulGroup₂</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group₂</span> <span class="n">α</span><span class="o">]</span> <span class="o">:</span> <span class="n">Mul</span> <span class="n">α</span> <span class="o">:=</span> <span class="o">⟨</span><span class="n">Group₂.mul</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="n">hasMulGroup₂</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group₂</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Mul</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="n">Group₂.mul</span><span class="o">⟩</span> <span class="kd">instance</span> <span class="n">hasOneGroup₂</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group₂</span> <span class="n">α</span><span class="o">]</span> <span class="o">:</span> <span class="n">One</span> <span class="n">α</span> <span class="o">:=</span> <span class="o">⟨</span><span class="n">Group₂.one</span><span class="o">⟩</span> <span class="kd">instance</span><span class="w"> </span><span class="n">hasOneGroup₂</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group₂</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">One</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="n">Group₂.one</span><span class="o">⟩</span> <span class="kd">instance</span> <span class="n">hasInvGroup₂</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group₂</span> <span class="n">α</span><span class="o">]</span> <span class="o">:</span> <span class="n">Inv</span> <span class="n">α</span> <span class="o">:=</span> <span class="o">⟨</span><span class="n">Group₂.inv</span><span class="o">⟩</span> <span class="kd">instance</span><span class="w"> </span><span class="n">hasInvGroup₂</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group₂</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Inv</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="n">Group₂.inv</span><span class="o">⟩</span> <span class="kn">section</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">(</span><span class="n">f</span> <span class="n">g</span> <span class="o">:</span> <span class="n">Equiv.Perm</span> <span class="n">α</span><span class="o">)</span> <span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Equiv.Perm</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> <span class="k">#check</span> <span class="n">f</span> <span class="bp">*</span> <span class="mi">1</span> <span class="bp">*</span> <span class="n">g</span><span class="bp">⁻¹</span> <span class="k">#check</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g</span><span class="bp">⁻¹</span> <span class="kd">def</span> <span class="n">foo</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">*</span> <span class="mi">1</span> <span class="bp">*</span> <span class="n">g</span><span class="bp">⁻¹</span> <span class="bp">=</span> <span class="n">g.symm.trans</span> <span class="o">((</span><span class="n">Equiv.refl</span> <span class="n">α</span><span class="o">)</span><span class="bp">.</span><span class="n">trans</span> <span class="n">f</span><span class="o">)</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">def</span><span class="w"> </span><span class="n">foo</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">g.symm.trans</span><span class="w"> </span><span class="o">((</span><span class="n">Equiv.refl</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="bp">.</span><span class="n">trans</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">end</span> </pre></div>
-
@@ -1008,9 +1008,9 @@ using the classes <code class="docutils literal notranslate"><span class="pre">AThen show <code class="docutils literal notranslate"><span class="pre">Point</span></code> is an instance of <code class="docutils literal notranslate"><span class="pre">AddGroup₂</span></code>. Try it out and make sure that the additive group notation works for elements of <code class="docutils literal notranslate"><span class="pre">Point</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">AddGroup₂</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="n">where</span> <span class="n">add</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">α</span> <span class="c1">-- fill in the rest</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">AddGroup₂</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span> <span class="w"> </span><span class="c1">-- fill in the rest</span> </pre></div> </div> <p>It is not a big problem that we have already declared instances
-
@@ -1037,9 +1037,9 @@ here is to define them as a data type in their own right. We do this byrepresenting a Gaussian integer as a pair of integers, which we think of as the <em>real</em> and <em>imaginary</em> parts.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">@[</span><span class="n">ext</span><span class="kd">]</span> <span class="kd">structure</span> <span class="n">GaussInt</span> <span class="n">where</span> <span class="n">re</span> <span class="o">:</span> <span class="n">ℤ</span> <span class="n">im</span> <span class="o">:</span> <span class="n">ℤ</span> <span class="kd">structure</span><span class="w"> </span><span class="n">GaussInt</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">re</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℤ</span> <span class="w"> </span><span class="n">im</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℤ</span> </pre></div> </div> <p>We first show that the Gaussian integers have the structure of a ring,
-
@@ -1051,20 +1051,20 @@ be a square root of <span class="math notranslate nohighlight">\(-1\)</span>. Th\[\begin{split}(a + bi) (c + di) & = ac + bci + adi + bd i^2 \\ & = (ac - bd) + (bc + ad)i.\end{split}\]</div> <p>This explains the definition of <code class="docutils literal notranslate"><span class="pre">Mul</span></code> below.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="o">:</span> <span class="n">Zero</span> <span class="n">GaussInt</span> <span class="o">:=</span> <span class="o">⟨⟨</span><span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">⟩⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Zero</span><span class="w"> </span><span class="n">GaussInt</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨⟨</span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="mi">0</span><span class="o">⟩⟩</span> <span class="kd">instance</span> <span class="o">:</span> <span class="n">One</span> <span class="n">GaussInt</span> <span class="o">:=</span> <span class="o">⟨⟨</span><span class="mi">1</span><span class="o">,</span> <span class="mi">0</span><span class="o">⟩⟩</span> <span class="kd">instance</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">One</span><span class="w"> </span><span class="n">GaussInt</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨⟨</span><span class="mi">1</span><span class="o">,</span><span class="w"> </span><span class="mi">0</span><span class="o">⟩⟩</span> <span class="kd">instance</span> <span class="o">:</span> <span class="n">Add</span> <span class="n">GaussInt</span> <span class="o">:=</span> <span class="o">⟨</span><span class="k">fun</span> <span class="n">x</span> <span class="n">y</span> <span class="bp">↦</span> <span class="o">⟨</span><span class="n">x.re</span> <span class="bp">+</span> <span class="n">y.re</span><span class="o">,</span> <span class="n">x.im</span> <span class="bp">+</span> <span class="n">y.im</span><span class="o">⟩⟩</span> <span class="kd">instance</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Add</span><span class="w"> </span><span class="n">GaussInt</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">⟨</span><span class="n">x.re</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y.re</span><span class="o">,</span><span class="w"> </span><span class="n">x.im</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y.im</span><span class="o">⟩⟩</span> <span class="kd">instance</span> <span class="o">:</span> <span class="n">Neg</span> <span class="n">GaussInt</span> <span class="o">:=</span> <span class="o">⟨</span><span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="o">⟨</span><span class="bp">-</span><span class="n">x.re</span><span class="o">,</span> <span class="bp">-</span><span class="n">x.im</span><span class="o">⟩⟩</span> <span class="kd">instance</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Neg</span><span class="w"> </span><span class="n">GaussInt</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">⟨</span><span class="bp">-</span><span class="n">x.re</span><span class="o">,</span><span class="w"> </span><span class="bp">-</span><span class="n">x.im</span><span class="o">⟩⟩</span> <span class="kd">instance</span> <span class="o">:</span> <span class="n">Mul</span> <span class="n">GaussInt</span> <span class="o">:=</span> <span class="o">⟨</span><span class="k">fun</span> <span class="n">x</span> <span class="n">y</span> <span class="bp">↦</span> <span class="o">⟨</span><span class="n">x.re</span> <span class="bp">*</span> <span class="n">y.re</span> <span class="bp">-</span> <span class="n">x.im</span> <span class="bp">*</span> <span class="n">y.im</span><span class="o">,</span> <span class="n">x.re</span> <span class="bp">*</span> <span class="n">y.im</span> <span class="bp">+</span> <span class="n">x.im</span> <span class="bp">*</span> <span class="n">y.re</span><span class="o">⟩⟩</span> <span class="kd">instance</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Mul</span><span class="w"> </span><span class="n">GaussInt</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">⟨</span><span class="n">x.re</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y.re</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">x.im</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y.im</span><span class="o">,</span><span class="w"> </span><span class="n">x.re</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y.im</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">x.im</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y.re</span><span class="o">⟩⟩</span> </pre></div> </div> <p>As noted in <a class="reference internal" href="#section-structures"><span class="std std-numref">Section 6.1</span></a>, it is a good idea to put all the definitions
-
@@ -1076,64 +1076,64 @@ files associated with this chapter, these definitions are made in the<code class="docutils literal notranslate"><span class="pre">GaussInt.zero</span></code> and the like and assigning the notation to those. It is often useful to have an explicit name for the definitions, for example, to use with <code class="docutils literal notranslate"><span class="pre">simp</span></code> and <code class="docutils literal notranslate"><span class="pre">rewrite</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">zero_def</span> <span class="o">:</span> <span class="o">(</span><span class="mi">0</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="bp">=</span> <span class="o">⟨</span><span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">⟩</span> <span class="o">:=</span> <span class="n">rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">zero_def</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="mi">0</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">⟨</span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="mi">0</span><span class="o">⟩</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">theorem</span> <span class="n">one_def</span> <span class="o">:</span> <span class="o">(</span><span class="mi">1</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="bp">=</span> <span class="o">⟨</span><span class="mi">1</span><span class="o">,</span> <span class="mi">0</span><span class="o">⟩</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">one_def</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="mi">1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">⟨</span><span class="mi">1</span><span class="o">,</span><span class="w"> </span><span class="mi">0</span><span class="o">⟩</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">theorem</span> <span class="n">add_def</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">y</span> <span class="bp">=</span> <span class="o">⟨</span><span class="n">x.re</span> <span class="bp">+</span> <span class="n">y.re</span><span class="o">,</span> <span class="n">x.im</span> <span class="bp">+</span> <span class="n">y.im</span><span class="o">⟩</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">add_def</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">⟨</span><span class="n">x.re</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y.re</span><span class="o">,</span><span class="w"> </span><span class="n">x.im</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y.im</span><span class="o">⟩</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">theorem</span> <span class="n">neg_def</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="bp">-</span><span class="n">x</span> <span class="bp">=</span> <span class="o">⟨</span><span class="bp">-</span><span class="n">x.re</span><span class="o">,</span> <span class="bp">-</span><span class="n">x.im</span><span class="o">⟩</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">neg_def</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">-</span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">⟨</span><span class="bp">-</span><span class="n">x.re</span><span class="o">,</span><span class="w"> </span><span class="bp">-</span><span class="n">x.im</span><span class="o">⟩</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">theorem</span> <span class="n">mul_def</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">y</span> <span class="bp">=</span> <span class="o">⟨</span><span class="n">x.re</span> <span class="bp">*</span> <span class="n">y.re</span> <span class="bp">-</span> <span class="n">x.im</span> <span class="bp">*</span> <span class="n">y.im</span><span class="o">,</span> <span class="n">x.re</span> <span class="bp">*</span> <span class="n">y.im</span> <span class="bp">+</span> <span class="n">x.im</span> <span class="bp">*</span> <span class="n">y.re</span><span class="o">⟩</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">mul_def</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">⟨</span><span class="n">x.re</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y.re</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">x.im</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y.im</span><span class="o">,</span><span class="w"> </span><span class="n">x.re</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y.im</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">x.im</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y.re</span><span class="o">⟩</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p>It is also useful to name the rules that compute the real and imaginary parts, and to declare them to the simplifier.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">@[</span><span class="n">simp</span><span class="kd">]</span> <span class="kd">theorem</span> <span class="n">zero_re</span> <span class="o">:</span> <span class="o">(</span><span class="mi">0</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">zero_re</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="mi">0</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">@[</span><span class="n">simp</span><span class="kd">]</span> <span class="kd">theorem</span> <span class="n">zero_im</span> <span class="o">:</span> <span class="o">(</span><span class="mi">0</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">zero_im</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="mi">0</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">@[</span><span class="n">simp</span><span class="kd">]</span> <span class="kd">theorem</span> <span class="n">one_re</span> <span class="o">:</span> <span class="o">(</span><span class="mi">1</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">one_re</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="mi">1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">@[</span><span class="n">simp</span><span class="kd">]</span> <span class="kd">theorem</span> <span class="n">one_im</span> <span class="o">:</span> <span class="o">(</span><span class="mi">1</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">one_im</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="mi">1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">@[</span><span class="n">simp</span><span class="kd">]</span> <span class="kd">theorem</span> <span class="n">add_re</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">x</span> <span class="bp">+</span> <span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span> <span class="bp">=</span> <span class="n">x.re</span> <span class="bp">+</span> <span class="n">y.re</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">add_re</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x.re</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y.re</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">@[</span><span class="n">simp</span><span class="kd">]</span> <span class="kd">theorem</span> <span class="n">add_im</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">x</span> <span class="bp">+</span> <span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span> <span class="bp">=</span> <span class="n">x.im</span> <span class="bp">+</span> <span class="n">y.im</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">add_im</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x.im</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y.im</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">@[</span><span class="n">simp</span><span class="kd">]</span> <span class="kd">theorem</span> <span class="n">neg_re</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="bp">-</span><span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span> <span class="bp">=</span> <span class="bp">-</span><span class="n">x.re</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">neg_re</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">-</span><span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">-</span><span class="n">x.re</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">@[</span><span class="n">simp</span><span class="kd">]</span> <span class="kd">theorem</span> <span class="n">neg_im</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="bp">-</span><span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span> <span class="bp">=</span> <span class="bp">-</span><span class="n">x.im</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">neg_im</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">-</span><span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">-</span><span class="n">x.im</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">@[</span><span class="n">simp</span><span class="kd">]</span> <span class="kd">theorem</span> <span class="n">mul_re</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span> <span class="bp">=</span> <span class="n">x.re</span> <span class="bp">*</span> <span class="n">y.re</span> <span class="bp">-</span> <span class="n">x.im</span> <span class="bp">*</span> <span class="n">y.im</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">mul_re</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x.re</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y.re</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">x.im</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y.im</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">@[</span><span class="n">simp</span><span class="kd">]</span> <span class="kd">theorem</span> <span class="n">mul_im</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span> <span class="bp">=</span> <span class="n">x.re</span> <span class="bp">*</span> <span class="n">y.im</span> <span class="bp">+</span> <span class="n">x.im</span> <span class="bp">*</span> <span class="n">y.re</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">mul_im</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x.re</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y.im</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">x.im</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y.re</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p>It is now surprisingly easy to show that the Gaussian integers are an instance
-
@@ -1157,63 +1157,63 @@ to reduce the identities to their real and imaginary components,simplifying, and, if necessary, carrying out the relevant ring calculation in the integers. Note that we could easily avoid repeating all this code, but this is not the topic of the current discussion.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="n">instCommRing</span> <span class="o">:</span> <span class="n">CommRing</span> <span class="n">GaussInt</span> <span class="n">where</span> <span class="n">zero</span> <span class="o">:=</span> <span class="mi">0</span> <span class="n">one</span> <span class="o">:=</span> <span class="mi">1</span> <span class="n">add</span> <span class="o">:=</span> <span class="o">(</span><span class="bp">·</span> <span class="bp">+</span> <span class="bp">·</span><span class="o">)</span> <span class="n">neg</span> <span class="n">x</span> <span class="o">:=</span> <span class="bp">-</span><span class="n">x</span> <span class="n">mul</span> <span class="o">:=</span> <span class="o">(</span><span class="bp">·</span> <span class="bp">*</span> <span class="bp">·</span><span class="o">)</span> <span class="n">nsmul</span> <span class="o">:=</span> <span class="n">nsmulRec</span> <span class="n">zsmul</span> <span class="o">:=</span> <span class="n">zsmulRec</span> <span class="n">add_assoc</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intros</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">simp</span> <span class="bp"><;></span> <span class="n">ring</span> <span class="n">zero_add</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">simp</span> <span class="n">add_zero</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">simp</span> <span class="n">add_left_neg</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">simp</span> <span class="n">add_comm</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intros</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">simp</span> <span class="bp"><;></span> <span class="n">ring</span> <span class="n">mul_assoc</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intros</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">simp</span> <span class="bp"><;></span> <span class="n">ring</span> <span class="n">one_mul</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">simp</span> <span class="n">mul_one</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">simp</span> <span class="n">left_distrib</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intros</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">simp</span> <span class="bp"><;></span> <span class="n">ring</span> <span class="n">right_distrib</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intros</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">simp</span> <span class="bp"><;></span> <span class="n">ring</span> <span class="n">mul_comm</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intros</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">simp</span> <span class="bp"><;></span> <span class="n">ring</span> <span class="n">zero_mul</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intros</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">simp</span> <span class="n">mul_zero</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intros</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">simp</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="n">instCommRing</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">CommRing</span><span class="w"> </span><span class="n">GaussInt</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">zero</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">0</span> <span class="w"> </span><span class="n">one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">1</span> <span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="bp">·</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="bp">·</span><span class="o">)</span> <span class="w"> </span><span class="n">neg</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="bp">-</span><span class="n">x</span> <span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="bp">·</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="bp">·</span><span class="o">)</span> <span class="w"> </span><span class="n">nsmul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">nsmulRec</span> <span class="w"> </span><span class="n">zsmul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">zsmulRec</span> <span class="w"> </span><span class="n">add_assoc</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intros</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">ring</span> <span class="w"> </span><span class="n">zero_add</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">add_zero</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">add_left_neg</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">add_comm</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intros</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">ring</span> <span class="w"> </span><span class="n">mul_assoc</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intros</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">ring</span> <span class="w"> </span><span class="n">one_mul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">mul_one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">left_distrib</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intros</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">ring</span> <span class="w"> </span><span class="n">right_distrib</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intros</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">ring</span> <span class="w"> </span><span class="n">mul_comm</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intros</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">ring</span> <span class="w"> </span><span class="n">zero_mul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intros</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">mul_zero</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intros</span> <span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">simp</span> </pre></div> </div> <p>Lean’s library defines the class of <em>nontrivial</em> types to be types with at least two distinct elements. In the context of a ring, this is equivalent to saying that the zero is not equal to the one. Since some common theorems depend on that fact, we may as well establish it now.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="o">:</span> <span class="n">Nontrivial</span> <span class="n">GaussInt</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">use</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">1</span> <span class="n">rw</span> <span class="o">[</span><span class="n">Ne</span><span class="o">,</span> <span class="n">GaussInt.ext_iff</span><span class="o">]</span> <span class="n">simp</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nontrivial</span><span class="w"> </span><span class="n">GaussInt</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="mi">1</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">Ne</span><span class="o">,</span><span class="w"> </span><span class="n">GaussInt.ext_iff</span><span class="o">]</span> <span class="w"> </span><span class="n">simp</span> </pre></div> </div> <p>We will now show that the Gaussian integers have an important additional
-
@@ -1231,14 +1231,14 @@ In that case, we can take <span class="math notranslate nohighlight">\(q\)</spanresult of integer division of <span class="math notranslate nohighlight">\(a\)</span> by <span class="math notranslate nohighlight">\(b\)</span> and <span class="math notranslate nohighlight">\(r\)</span> to be the remainder. These functions are defined in Lean so that the satisfy the following:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℤ</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">b</span> <span class="bp">*</span> <span class="o">(</span><span class="n">a</span> <span class="bp">/</span> <span class="n">b</span><span class="o">)</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp">%</span> <span class="n">b</span> <span class="o">:=</span> <span class="n">Eq.symm</span> <span class="o">(</span><span class="n">Int.ediv_add_emod</span> <span class="n">a</span> <span class="n">b</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℤ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Eq.symm</span><span class="w"> </span><span class="o">(</span><span class="n">Int.ediv_add_emod</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> <span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℤ</span><span class="o">)</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">≠</span> <span class="mi">0</span> <span class="bp">→</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">a</span> <span class="bp">%</span> <span class="n">b</span> <span class="o">:=</span> <span class="n">Int.emod_nonneg</span> <span class="n">a</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℤ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Int.emod_nonneg</span><span class="w"> </span><span class="n">a</span> <span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℤ</span><span class="o">)</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">≠</span> <span class="mi">0</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp">%</span> <span class="n">b</span> <span class="bp"><</span> <span class="bp">|</span><span class="n">b</span><span class="bp">|</span> <span class="o">:=</span> <span class="n">Int.emod_lt</span> <span class="n">a</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℤ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">|</span><span class="n">b</span><span class="bp">|</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Int.emod_lt</span><span class="w"> </span><span class="n">a</span> </pre></div> </div> <p>In an arbitrary ring, an element <span class="math notranslate nohighlight">\(a\)</span> is said to be a <em>unit</em> if it divides
-
@@ -1326,38 +1326,38 @@ We are grateful to Heather Macbeth for suggesting the following moreelegant approach, which avoids definition by cases. We simply add <code class="docutils literal notranslate"><span class="pre">b</span> <span class="pre">/</span> <span class="pre">2</span></code> to <code class="docutils literal notranslate"><span class="pre">a</span></code> before dividing and then subtract it from the remainder.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">div'</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℤ</span><span class="o">)</span> <span class="o">:=</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">/</span> <span class="mi">2</span><span class="o">)</span> <span class="bp">/</span> <span class="n">b</span> <span class="kd">def</span> <span class="n">mod'</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℤ</span><span class="o">)</span> <span class="o">:=</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">/</span> <span class="mi">2</span><span class="o">)</span> <span class="bp">%</span> <span class="n">b</span> <span class="bp">-</span> <span class="n">b</span> <span class="bp">/</span> <span class="mi">2</span> <span class="kd">theorem</span> <span class="n">div'_add_mod'</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℤ</span><span class="o">)</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">div'</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">mod'</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">div'</span><span class="o">,</span> <span class="n">mod'</span><span class="o">]</span> <span class="n">linarith</span> <span class="o">[</span><span class="n">Int.ediv_add_emod</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">/</span> <span class="mi">2</span><span class="o">)</span> <span class="n">b</span><span class="o">]</span> <span class="kd">theorem</span> <span class="n">abs_mod'_le</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℤ</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="bp">|</span><span class="n">mod'</span> <span class="n">a</span> <span class="n">b</span><span class="bp">|</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">/</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mod'</span><span class="o">,</span> <span class="n">abs_le</span><span class="o">]</span> <span class="n">constructor</span> <span class="bp">·</span> <span class="n">linarith</span> <span class="o">[</span><span class="n">Int.emod_nonneg</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">/</span> <span class="mi">2</span><span class="o">)</span> <span class="n">h.ne'</span><span class="o">]</span> <span class="k">have</span> <span class="o">:=</span> <span class="n">Int.emod_lt_of_pos</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">/</span> <span class="mi">2</span><span class="o">)</span> <span class="n">h</span> <span class="k">have</span> <span class="o">:=</span> <span class="n">Int.ediv_add_emod</span> <span class="n">b</span> <span class="mi">2</span> <span class="k">have</span> <span class="o">:=</span> <span class="n">Int.emod_lt_of_pos</span> <span class="n">b</span> <span class="n">zero_lt_two</span> <span class="n">revert</span> <span class="n">this</span><span class="bp">;</span> <span class="n">intro</span> <span class="n">this</span> <span class="c1">-- FIXME, this should not be needed</span> <span class="n">linarith</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">div'</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℤ</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="n">b</span> <span class="kd">def</span><span class="w"> </span><span class="n">mod'</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℤ</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">div'_add_mod'</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℤ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">div'</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">mod'</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">div'</span><span class="o">,</span><span class="w"> </span><span class="n">mod'</span><span class="o">]</span> <span class="w"> </span><span class="n">linarith</span><span class="w"> </span><span class="o">[</span><span class="n">Int.ediv_add_emod</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="n">b</span><span class="o">]</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">abs_mod'_le</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℤ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">|</span><span class="n">mod'</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="bp">|</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mod'</span><span class="o">,</span><span class="w"> </span><span class="n">abs_le</span><span class="o">]</span> <span class="w"> </span><span class="n">constructor</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">linarith</span><span class="w"> </span><span class="o">[</span><span class="n">Int.emod_nonneg</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="n">h.ne'</span><span class="o">]</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Int.emod_lt_of_pos</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="n">h</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Int.ediv_add_emod</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="mi">2</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Int.emod_lt_of_pos</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">zero_lt_two</span> <span class="w"> </span><span class="n">revert</span><span class="w"> </span><span class="n">this</span><span class="bp">;</span><span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">this</span><span class="w"> </span><span class="c1">-- FIXME, this should not be needed</span> <span class="w"> </span><span class="n">linarith</span> </pre></div> </div> <p>Note the use of our old friend, <code class="docutils literal notranslate"><span class="pre">linarith</span></code>. We will also need to express <code class="docutils literal notranslate"><span class="pre">mod'</span></code> in terms of <code class="docutils literal notranslate"><span class="pre">div'</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">mod'_eq</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℤ</span><span class="o">)</span> <span class="o">:</span> <span class="n">mod'</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">-</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">div'</span> <span class="n">a</span> <span class="n">b</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">linarith</span> <span class="o">[</span><span class="n">div'_add_mod'</span> <span class="n">a</span> <span class="n">b</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">mod'_eq</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℤ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">mod'</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">div'</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">linarith</span><span class="w"> </span><span class="o">[</span><span class="n">div'_add_mod'</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="o">]</span> </pre></div> </div> <p>We will use the fact that <span class="math notranslate nohighlight">\(x^2 + y^2\)</span> is equal to zero if and only if <span class="math notranslate nohighlight">\(x\)</span> and <span class="math notranslate nohighlight">\(y\)</span> are both zero. As an exercise, we ask you to prove that this holds in any ordered ring.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">sq_add_sq_eq_zero</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">LinearOrderedRing</span> <span class="n">α</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">y</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">=</span> <span class="mi">0</span> <span class="bp">↔</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">0</span> <span class="bp">∧</span> <span class="n">y</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">sq_add_sq_eq_zero</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">LinearOrderedRing</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>We will put all the remaining definitions and theorems in this section
-
@@ -1365,33 +1365,33 @@ in the <code class="docutils literal notranslate"><span class="pre">GaussInt</spFirst, we define the <code class="docutils literal notranslate"><span class="pre">norm</span></code> function and ask you to establish some of its properties. The proofs are all short.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">norm</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:=</span> <span class="n">x.re</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">x.im</span> <span class="bp">^</span> <span class="mi">2</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">x.re</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">x.im</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span> <span class="kd">@[</span><span class="n">simp</span><span class="kd">]</span> <span class="kd">theorem</span> <span class="n">norm_nonneg</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">norm</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span> <span class="n">norm_eq_zero</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="n">norm</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">0</span> <span class="bp">↔</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span> <span class="n">norm_pos</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">norm</span> <span class="n">x</span> <span class="bp">↔</span> <span class="n">x</span> <span class="bp">≠</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span> <span class="n">norm_mul</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="n">norm</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="o">)</span> <span class="bp">=</span> <span class="n">norm</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">norm</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">norm_nonneg</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">norm_eq_zero</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">norm_pos</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">norm_mul</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Next we define the conjugate function:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">conj</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="n">GaussInt</span> <span class="o">:=</span> <span class="o">⟨</span><span class="n">x.re</span><span class="o">,</span> <span class="bp">-</span><span class="n">x.im</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">conj</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="n">x.re</span><span class="o">,</span><span class="w"> </span><span class="bp">-</span><span class="n">x.im</span><span class="o">⟩</span> <span class="kd">@[</span><span class="n">simp</span><span class="kd">]</span> <span class="kd">theorem</span> <span class="n">conj_re</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">conj</span> <span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span> <span class="bp">=</span> <span class="n">x.re</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">conj_re</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">conj</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x.re</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">@[</span><span class="n">simp</span><span class="kd">]</span> <span class="kd">theorem</span> <span class="n">conj_im</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">conj</span> <span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span> <span class="bp">=</span> <span class="bp">-</span><span class="n">x.im</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">conj_im</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">conj</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">-</span><span class="n">x.im</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">theorem</span> <span class="n">norm_conj</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="n">norm</span> <span class="o">(</span><span class="n">conj</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="n">norm</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="o">[</span><span class="n">norm</span><span class="o">]</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">norm_conj</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="o">(</span><span class="n">conj</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">norm</span><span class="o">]</span> </pre></div> </div> <p>Finally, we define division for the Gaussian integers
-
@@ -1404,23 +1404,23 @@ then the real and imaginary parts of <code class="docutils literal notranslate"><p>respectively. Here the numerators are the real and imaginary parts of <span class="math notranslate nohighlight">\((a + bi) (c - di)\)</span>, and the denominators are both equal to the norm of <span class="math notranslate nohighlight">\(c + di\)</span>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="o">:</span> <span class="n">Div</span> <span class="n">GaussInt</span> <span class="o">:=</span> <span class="o">⟨</span><span class="k">fun</span> <span class="n">x</span> <span class="n">y</span> <span class="bp">↦</span> <span class="o">⟨</span><span class="n">Int.div'</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">conj</span> <span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span> <span class="o">(</span><span class="n">norm</span> <span class="n">y</span><span class="o">),</span> <span class="n">Int.div'</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">conj</span> <span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span> <span class="o">(</span><span class="n">norm</span> <span class="n">y</span><span class="o">)⟩⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Div</span><span class="w"> </span><span class="n">GaussInt</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">⟨</span><span class="n">Int.div'</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">conj</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span><span class="w"> </span><span class="o">(</span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="o">),</span><span class="w"> </span><span class="n">Int.div'</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">conj</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span><span class="w"> </span><span class="o">(</span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="o">)⟩⟩</span> </pre></div> </div> <p>Having defined <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">/</span> <span class="pre">y</span></code>, We define <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">%</span> <span class="pre">y</span></code> to be the remainder, <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">-</span> <span class="pre">(x</span> <span class="pre">/</span> <span class="pre">y)</span> <span class="pre">*</span> <span class="pre">y</span></code>. As above, we record the definitions in the theorems <code class="docutils literal notranslate"><span class="pre">div_def</span></code> and <code class="docutils literal notranslate"><span class="pre">mod_def</span></code> so that we can use them with <code class="docutils literal notranslate"><span class="pre">simp</span></code> and <code class="docutils literal notranslate"><span class="pre">rewrite</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="o">:</span> <span class="n">Mod</span> <span class="n">GaussInt</span> <span class="o">:=</span> <span class="o">⟨</span><span class="k">fun</span> <span class="n">x</span> <span class="n">y</span> <span class="bp">↦</span> <span class="n">x</span> <span class="bp">-</span> <span class="n">y</span> <span class="bp">*</span> <span class="o">(</span><span class="n">x</span> <span class="bp">/</span> <span class="n">y</span><span class="o">)⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Mod</span><span class="w"> </span><span class="n">GaussInt</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="n">y</span><span class="o">)⟩</span> <span class="kd">theorem</span> <span class="n">div_def</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">/</span> <span class="n">y</span> <span class="bp">=</span> <span class="o">⟨</span><span class="n">Int.div'</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">conj</span> <span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span> <span class="o">(</span><span class="n">norm</span> <span class="n">y</span><span class="o">),</span> <span class="n">Int.div'</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">conj</span> <span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span> <span class="o">(</span><span class="n">norm</span> <span class="n">y</span><span class="o">)⟩</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">div_def</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">⟨</span><span class="n">Int.div'</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">conj</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span><span class="w"> </span><span class="o">(</span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="o">),</span><span class="w"> </span><span class="n">Int.div'</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">conj</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span><span class="w"> </span><span class="o">(</span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="o">)⟩</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">theorem</span> <span class="n">mod_def</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">%</span> <span class="n">y</span> <span class="bp">=</span> <span class="n">x</span> <span class="bp">-</span> <span class="n">y</span> <span class="bp">*</span> <span class="o">(</span><span class="n">x</span> <span class="bp">/</span> <span class="n">y</span><span class="o">)</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">mod_def</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p>These definitions immediately yield <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">=</span> <span class="pre">y</span> <span class="pre">*</span> <span class="pre">(x</span> <span class="pre">/</span> <span class="pre">y)</span> <span class="pre">+</span> <span class="pre">x</span> <span class="pre">%</span> <span class="pre">y</span></code> for every
-
@@ -1448,24 +1448,24 @@ So we have</p>as required.</p> <p>This messy calculation is carried out in the next proof. We encourage you to step through the details and see if you can find a nicer argument.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">norm_mod_lt</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">{</span><span class="n">y</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">}</span> <span class="o">(</span><span class="n">hy</span> <span class="o">:</span> <span class="n">y</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">x</span> <span class="bp">%</span> <span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">norm</span> <span class="bp"><</span> <span class="n">y.norm</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">have</span> <span class="n">norm_y_pos</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">norm</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rwa</span> <span class="o">[</span><span class="n">norm_pos</span><span class="o">]</span> <span class="k">have</span> <span class="n">H1</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">%</span> <span class="n">y</span> <span class="bp">*</span> <span class="n">conj</span> <span class="n">y</span> <span class="bp">=</span> <span class="o">⟨</span><span class="n">Int.mod'</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">conj</span> <span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span> <span class="o">(</span><span class="n">norm</span> <span class="n">y</span><span class="o">),</span> <span class="n">Int.mod'</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">conj</span> <span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span> <span class="o">(</span><span class="n">norm</span> <span class="n">y</span><span class="o">)⟩</span> <span class="bp">·</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">simp</span> <span class="o">[</span><span class="n">Int.mod'_eq</span><span class="o">,</span> <span class="n">mod_def</span><span class="o">,</span> <span class="n">div_def</span><span class="o">,</span> <span class="n">norm</span><span class="o">]</span> <span class="bp"><;></span> <span class="n">ring</span> <span class="k">have</span> <span class="n">H2</span> <span class="o">:</span> <span class="n">norm</span> <span class="o">(</span><span class="n">x</span> <span class="bp">%</span> <span class="n">y</span><span class="o">)</span> <span class="bp">*</span> <span class="n">norm</span> <span class="n">y</span> <span class="bp">≤</span> <span class="n">norm</span> <span class="n">y</span> <span class="bp">/</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">norm</span> <span class="n">y</span> <span class="bp">·</span> <span class="k">calc</span> <span class="n">norm</span> <span class="o">(</span><span class="n">x</span> <span class="bp">%</span> <span class="n">y</span><span class="o">)</span> <span class="bp">*</span> <span class="n">norm</span> <span class="n">y</span> <span class="bp">=</span> <span class="n">norm</span> <span class="o">(</span><span class="n">x</span> <span class="bp">%</span> <span class="n">y</span> <span class="bp">*</span> <span class="n">conj</span> <span class="n">y</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="n">only</span> <span class="o">[</span><span class="n">norm_mul</span><span class="o">,</span> <span class="n">norm_conj</span><span class="o">]</span> <span class="n">_</span> <span class="bp">=</span> <span class="bp">|</span><span class="n">Int.mod'</span> <span class="o">(</span><span class="n">x.re</span> <span class="bp">*</span> <span class="n">y.re</span> <span class="bp">+</span> <span class="n">x.im</span> <span class="bp">*</span> <span class="n">y.im</span><span class="o">)</span> <span class="o">(</span><span class="n">norm</span> <span class="n">y</span><span class="o">)</span><span class="bp">|</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="bp">|</span><span class="n">Int.mod'</span> <span class="o">(</span><span class="bp">-</span><span class="o">(</span><span class="n">x.re</span> <span class="bp">*</span> <span class="n">y.im</span><span class="o">)</span> <span class="bp">+</span> <span class="n">x.im</span> <span class="bp">*</span> <span class="n">y.re</span><span class="o">)</span> <span class="o">(</span><span class="n">norm</span> <span class="n">y</span><span class="o">)</span><span class="bp">|</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="o">[</span><span class="n">H1</span><span class="o">,</span> <span class="n">norm</span><span class="o">,</span> <span class="n">sq_abs</span><span class="o">]</span> <span class="n">_</span> <span class="bp">≤</span> <span class="o">(</span><span class="n">y.norm</span> <span class="bp">/</span> <span class="mi">2</span><span class="o">)</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="o">(</span><span class="n">y.norm</span> <span class="bp">/</span> <span class="mi">2</span><span class="o">)</span> <span class="bp">^</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">gcongr</span> <span class="bp"><;></span> <span class="n">apply</span> <span class="n">Int.abs_mod'_le</span> <span class="n">_</span> <span class="n">_</span> <span class="n">norm_y_pos</span> <span class="n">_</span> <span class="bp">=</span> <span class="n">norm</span> <span class="n">y</span> <span class="bp">/</span> <span class="mi">2</span> <span class="bp">*</span> <span class="o">(</span><span class="n">norm</span> <span class="n">y</span> <span class="bp">/</span> <span class="mi">2</span> <span class="bp">*</span> <span class="mi">2</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ring</span> <span class="n">_</span> <span class="bp">≤</span> <span class="n">norm</span> <span class="n">y</span> <span class="bp">/</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">norm</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">gcongr</span><span class="bp">;</span> <span class="n">apply</span> <span class="n">Int.ediv_mul_le</span><span class="bp">;</span> <span class="n">norm_num</span> <span class="k">calc</span> <span class="n">norm</span> <span class="o">(</span><span class="n">x</span> <span class="bp">%</span> <span class="n">y</span><span class="o">)</span> <span class="bp">≤</span> <span class="n">norm</span> <span class="n">y</span> <span class="bp">/</span> <span class="mi">2</span> <span class="o">:=</span> <span class="n">le_of_mul_le_mul_right</span> <span class="n">H2</span> <span class="n">norm_y_pos</span> <span class="n">_</span> <span class="bp"><</span> <span class="n">norm</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">Int.ediv_lt_of_lt_mul</span> <span class="bp">·</span> <span class="n">norm_num</span> <span class="bp">·</span> <span class="n">linarith</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">norm_mod_lt</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hy</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">norm</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y.norm</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">norm_y_pos</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">rwa</span><span class="w"> </span><span class="o">[</span><span class="n">norm_pos</span><span class="o">]</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">H1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">conj</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">⟨</span><span class="n">Int.mod'</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">conj</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">re</span><span class="w"> </span><span class="o">(</span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="o">),</span><span class="w"> </span><span class="n">Int.mod'</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">conj</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">im</span><span class="w"> </span><span class="o">(</span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="o">)⟩</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">Int.mod'_eq</span><span class="o">,</span><span class="w"> </span><span class="n">mod_def</span><span class="o">,</span><span class="w"> </span><span class="n">div_def</span><span class="o">,</span><span class="w"> </span><span class="n">norm</span><span class="o">]</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">ring</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">H2</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="n">y</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="k">calc</span> <span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">conj</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="n">only</span><span class="w"> </span><span class="o">[</span><span class="n">norm_mul</span><span class="o">,</span><span class="w"> </span><span class="n">norm_conj</span><span class="o">]</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">|</span><span class="n">Int.mod'</span><span class="w"> </span><span class="o">(</span><span class="n">x.re</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y.re</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">x.im</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y.im</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="bp">|</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span> <span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="bp">|</span><span class="n">Int.mod'</span><span class="w"> </span><span class="o">(</span><span class="bp">-</span><span class="o">(</span><span class="n">x.re</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y.im</span><span class="o">)</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">x.im</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y.re</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="bp">|</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">H1</span><span class="o">,</span><span class="w"> </span><span class="n">norm</span><span class="o">,</span><span class="w"> </span><span class="n">sq_abs</span><span class="o">]</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="o">(</span><span class="n">y.norm</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="o">(</span><span class="n">y.norm</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">gcongr</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">Int.abs_mod'_le</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">norm_y_pos</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">ring</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">gcongr</span><span class="bp">;</span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">Int.ediv_mul_le</span><span class="bp">;</span><span class="w"> </span><span class="n">norm_num</span> <span class="w"> </span><span class="k">calc</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">le_of_mul_le_mul_right</span><span class="w"> </span><span class="n">H2</span><span class="w"> </span><span class="n">norm_y_pos</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">norm</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">Int.ediv_lt_of_lt_mul</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">norm_num</span> <span class="w"> </span><span class="bp">·</span><span class="w"> </span><span class="n">linarith</span> </pre></div> </div> <p>We are in the home stretch. Our <code class="docutils literal notranslate"><span class="pre">norm</span></code> function maps Gaussian integers to
-
@@ -1475,26 +1475,26 @@ numbers, and we obtain that by composing <code class="docutils literal notranslaThe first of the next two lemmas establishes that mapping the norm to the natural numbers and back to the integers does not change the value. The second one re-expresses the fact that the norm is decreasing.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">coe_natAbs_norm</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">x.norm.natAbs</span> <span class="o">:</span> <span class="n">ℤ</span><span class="o">)</span> <span class="bp">=</span> <span class="n">x.norm</span> <span class="o">:=</span> <span class="n">Int.natAbs_of_nonneg</span> <span class="o">(</span><span class="n">norm_nonneg</span> <span class="n">_</span><span class="o">)</span> <span class="kd">theorem</span> <span class="n">natAbs_norm_mod_lt</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">(</span><span class="n">hy</span> <span class="o">:</span> <span class="n">y</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">x</span> <span class="bp">%</span> <span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">norm.natAbs</span> <span class="bp"><</span> <span class="n">y.norm.natAbs</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">Int.ofNat_lt.1</span> <span class="n">simp</span> <span class="n">only</span> <span class="o">[</span><span class="n">Int.coe_natAbs</span><span class="o">,</span> <span class="n">abs_of_nonneg</span><span class="o">,</span> <span class="n">norm_nonneg</span><span class="o">]</span> <span class="n">apply</span> <span class="n">norm_mod_lt</span> <span class="n">x</span> <span class="n">hy</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">coe_natAbs_norm</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">x.norm.natAbs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℤ</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x.norm</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Int.natAbs_of_nonneg</span><span class="w"> </span><span class="o">(</span><span class="n">norm_nonneg</span><span class="w"> </span><span class="n">_</span><span class="o">)</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">natAbs_norm_mod_lt</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hy</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="bp">.</span><span class="n">norm.natAbs</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">y.norm.natAbs</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">Int.ofNat_lt</span><span class="bp">.</span><span class="mi">1</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="n">only</span><span class="w"> </span><span class="o">[</span><span class="n">Int.coe_natAbs</span><span class="o">,</span><span class="w"> </span><span class="n">abs_of_nonneg</span><span class="o">,</span><span class="w"> </span><span class="n">norm_nonneg</span><span class="o">]</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">norm_mod_lt</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">hy</span> </pre></div> </div> <p>We also need to establish the second key property of the norm function on a Euclidean domain.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">not_norm_mul_left_lt_norm</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">{</span><span class="n">y</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">}</span> <span class="o">(</span><span class="n">hy</span> <span class="o">:</span> <span class="n">y</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="bp">¬</span><span class="o">(</span><span class="n">norm</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="o">))</span><span class="bp">.</span><span class="n">natAbs</span> <span class="bp"><</span> <span class="o">(</span><span class="n">norm</span> <span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">natAbs</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">not_lt_of_ge</span> <span class="n">rw</span> <span class="o">[</span><span class="n">norm_mul</span><span class="o">,</span> <span class="n">Int.natAbs_mul</span><span class="o">]</span> <span class="n">apply</span> <span class="n">le_mul_of_one_le_right</span> <span class="o">(</span><span class="n">Nat.zero_le</span> <span class="n">_</span><span class="o">)</span> <span class="n">apply</span> <span class="n">Int.ofNat_le.1</span> <span class="n">rw</span> <span class="o">[</span><span class="n">coe_natAbs_norm</span><span class="o">]</span> <span class="n">exact</span> <span class="n">Int.add_one_le_of_lt</span> <span class="o">((</span><span class="n">norm_pos</span> <span class="n">_</span><span class="o">)</span><span class="bp">.</span><span class="n">mpr</span> <span class="n">hy</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">not_norm_mul_left_lt_norm</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hy</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">¬</span><span class="o">(</span><span class="n">norm</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="o">))</span><span class="bp">.</span><span class="n">natAbs</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="o">(</span><span class="n">norm</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">natAbs</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">not_lt_of_ge</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">norm_mul</span><span class="o">,</span><span class="w"> </span><span class="n">Int.natAbs_mul</span><span class="o">]</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">le_mul_of_one_le_right</span><span class="w"> </span><span class="o">(</span><span class="n">Nat.zero_le</span><span class="w"> </span><span class="n">_</span><span class="o">)</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">Int.ofNat_le</span><span class="bp">.</span><span class="mi">1</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">coe_natAbs_norm</span><span class="o">]</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">Int.add_one_le_of_lt</span><span class="w"> </span><span class="o">((</span><span class="n">norm_pos</span><span class="w"> </span><span class="n">_</span><span class="o">)</span><span class="bp">.</span><span class="n">mpr</span><span class="w"> </span><span class="n">hy</span><span class="o">)</span> </pre></div> </div> <p>We can now put it together to show that the Gaussian integers are an
-
@@ -1507,25 +1507,25 @@ Comparing the values of a norm function that returns natural numbers isjust one instance of such a measure, and in that case, the required properties are the theorems <code class="docutils literal notranslate"><span class="pre">natAbs_norm_mod_lt</span></code> and <code class="docutils literal notranslate"><span class="pre">not_norm_mul_left_lt_norm</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="o">:</span> <span class="n">EuclideanDomain</span> <span class="n">GaussInt</span> <span class="o">:=</span> <span class="o">{</span> <span class="n">GaussInt.instCommRing</span> <span class="k">with</span> <span class="n">quotient</span> <span class="o">:=</span> <span class="o">(</span><span class="bp">·</span> <span class="bp">/</span> <span class="bp">·</span><span class="o">)</span> <span class="n">remainder</span> <span class="o">:=</span> <span class="o">(</span><span class="bp">·</span> <span class="bp">%</span> <span class="bp">·</span><span class="o">)</span> <span class="n">quotient_mul_add_remainder_eq</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">x</span> <span class="n">y</span> <span class="bp">↦</span> <span class="kd">by</span> <span class="n">simp</span> <span class="n">only</span><span class="bp">;</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mod_def</span><span class="o">,</span> <span class="n">add_comm</span><span class="o">]</span> <span class="bp">;</span> <span class="n">ring</span> <span class="n">quotient_zero</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="kd">by</span> <span class="n">simp</span> <span class="o">[</span><span class="n">div_def</span><span class="o">,</span> <span class="n">norm</span><span class="o">,</span> <span class="n">Int.div'</span><span class="o">]</span> <span class="n">rfl</span> <span class="n">r</span> <span class="o">:=</span> <span class="o">(</span><span class="n">measure</span> <span class="o">(</span><span class="n">Int.natAbs</span> <span class="bp">∘</span> <span class="n">norm</span><span class="o">))</span><span class="bp">.</span><span class="mi">1</span> <span class="n">r_wellFounded</span> <span class="o">:=</span> <span class="o">(</span><span class="n">measure</span> <span class="o">(</span><span class="n">Int.natAbs</span> <span class="bp">∘</span> <span class="n">norm</span><span class="o">))</span><span class="bp">.</span><span class="mi">2</span> <span class="n">remainder_lt</span> <span class="o">:=</span> <span class="n">natAbs_norm_mod_lt</span> <span class="n">mul_left_not_lt</span> <span class="o">:=</span> <span class="n">not_norm_mul_left_lt_norm</span> <span class="o">}</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">EuclideanDomain</span><span class="w"> </span><span class="n">GaussInt</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">GaussInt.instCommRing</span><span class="w"> </span><span class="k">with</span> <span class="w"> </span><span class="n">quotient</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="bp">·</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="bp">·</span><span class="o">)</span> <span class="w"> </span><span class="n">remainder</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="bp">·</span><span class="w"> </span><span class="bp">%</span><span class="w"> </span><span class="bp">·</span><span class="o">)</span> <span class="w"> </span><span class="n">quotient_mul_add_remainder_eq</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="n">only</span><span class="bp">;</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mod_def</span><span class="o">,</span><span class="w"> </span><span class="n">add_comm</span><span class="o">]</span><span class="w"> </span><span class="bp">;</span><span class="w"> </span><span class="n">ring</span> <span class="w"> </span><span class="n">quotient_zero</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">div_def</span><span class="o">,</span><span class="w"> </span><span class="n">norm</span><span class="o">,</span><span class="w"> </span><span class="n">Int.div'</span><span class="o">]</span> <span class="w"> </span><span class="n">rfl</span> <span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="n">measure</span><span class="w"> </span><span class="o">(</span><span class="n">Int.natAbs</span><span class="w"> </span><span class="bp">∘</span><span class="w"> </span><span class="n">norm</span><span class="o">))</span><span class="bp">.</span><span class="mi">1</span> <span class="w"> </span><span class="n">r_wellFounded</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="n">measure</span><span class="w"> </span><span class="o">(</span><span class="n">Int.natAbs</span><span class="w"> </span><span class="bp">∘</span><span class="w"> </span><span class="n">norm</span><span class="o">))</span><span class="bp">.</span><span class="mi">2</span> <span class="w"> </span><span class="n">remainder_lt</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">natAbs_norm_mod_lt</span> <span class="w"> </span><span class="n">mul_left_not_lt</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">not_norm_mul_left_lt_norm</span><span class="w"> </span><span class="o">}</span> </pre></div> </div> <p>An immediate payoff is that we now know that, in the Gaussian integers, the notions of being prime and being irreducible coincide.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">GaussInt</span><span class="o">)</span> <span class="o">:</span> <span class="n">Irreducible</span> <span class="n">x</span> <span class="bp">↔</span> <span class="n">Prime</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">PrincipalIdealRing.irreducible_iff_prime</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">GaussInt</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Irreducible</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">Prime</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">PrincipalIdealRing.irreducible_iff_prime</span> </pre></div> </div> </section>
-
-
-
@@ -18,7 +18,7 @@<script src="_static/jquery.js?v=5d32c60e"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/documentation_options.js?v=2709fde1"></script> <script src="_static/doctools.js?v=888ff710"></script> <script src="_static/doctools.js?v=9a2dae69"></script> <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script src="_static/js/theme.js"></script> <link rel="index" title="Index" href="genindex.html" />
-
@@ -114,9 +114,9 @@ structures, those indices will sometimes grow beyond one.</p><p>At the very bottom of all hierarchies in Lean, we find data-carrying classes. The following class records that the given type <code class="docutils literal notranslate"><span class="pre">α</span></code> is endowed with a distinguished element called <code class="docutils literal notranslate"><span class="pre">one</span></code>. At this stage, it has no property at all.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">One₁</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="n">where</span> <span class="sd">/-- The element one -/</span> <span class="n">one</span> <span class="o">:</span> <span class="n">α</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">One₁</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="sd">/-- The element one -/</span> <span class="w"> </span><span class="n">one</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span> </pre></div> </div> <p>Since we’ll make a much heavier use of classes in this chapter, we need to understand some
-
@@ -128,18 +128,18 @@ as long as they are marked as instance-implicit, ie appear between square brackeThose two effects could also have been achieved using the <code class="docutils literal notranslate"><span class="pre">structure</span></code> command with <code class="docutils literal notranslate"><span class="pre">class</span></code> attribute, ie writing <code class="docutils literal notranslate"><span class="pre">@[class]</span> <span class="pre">structure</span></code> instance of <code class="docutils literal notranslate"><span class="pre">class</span></code>. But the class command also ensures that <code class="docutils literal notranslate"><span class="pre">One₁</span> <span class="pre">α</span></code> appears as an instance-implicit argument in its own fields. Compare:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">One₁.one</span> <span class="c1">-- One₁.one {α : Type} [self : One₁ α] : α</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="n">One₁.one</span><span class="w"> </span><span class="c1">-- One₁.one {α : Type} [self : One₁ α] : α</span> <span class="kd">@[</span><span class="n">class</span><span class="kd">]</span> <span class="kd">structure</span> <span class="n">One₂</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="n">where</span> <span class="sd">/-- The element one -/</span> <span class="n">one</span> <span class="o">:</span> <span class="n">α</span> <span class="kd">@[</span><span class="n">class</span><span class="kd">]</span><span class="w"> </span><span class="kd">structure</span><span class="w"> </span><span class="n">One₂</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="sd">/-- The element one -/</span> <span class="w"> </span><span class="n">one</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span> <span class="k">#check</span> <span class="n">One₂.one</span> <span class="k">#check</span><span class="w"> </span><span class="n">One₂.one</span> </pre></div> </div> <p>In the second check, we can see that <code class="docutils literal notranslate"><span class="pre">self</span> <span class="pre">:</span> <span class="pre">One₂</span> <span class="pre">α</span></code> is an explicit argument. Let us make sure the first version is indeed usable without any explicit argument.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">One₁</span> <span class="n">α</span><span class="o">]</span> <span class="o">:</span> <span class="n">α</span> <span class="o">:=</span> <span class="n">One₁.one</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">One₁</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">One₁.one</span> </pre></div> </div> <p>Remark: in the above example, the argument <code class="docutils literal notranslate"><span class="pre">One₁</span> <span class="pre">α</span></code> is marked as instance-implicit,
-
@@ -153,7 +153,7 @@ example, leaving out the type ascription <code class="docutils literal notranslawhere <code class="docutils literal notranslate"><span class="pre">?m.263</span> <span class="pre">α</span></code> means “some type depending on <code class="docutils literal notranslate"><span class="pre">α</span></code>” (and 263 is simply an auto-generated index that would be useful to distinguish between several unknown things). Another way to avoid this issue would be to use a type annotation, as in:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">One₁</span> <span class="n">α</span><span class="o">]</span> <span class="o">:=</span> <span class="o">(</span><span class="n">One₁.one</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">One₁</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="n">One₁.one</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span> </pre></div> </div> <p>You may have already encountered that issue when playing with limits of sequences
-
@@ -165,29 +165,29 @@ with the builtin notation for <code class="docutils literal notranslate"><span ccommand where the first line tells Lean to use the documentation of <code class="docutils literal notranslate"><span class="pre">One₁.one</span></code> as documentation for the symbol <code class="docutils literal notranslate"><span class="pre">𝟙</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">@[</span><span class="n">inherit_doc</span><span class="kd">]</span> <span class="kd">notation</span> <span class="s2">"𝟙"</span> <span class="bp">=></span> <span class="n">One₁.one</span> <span class="kd">notation</span><span class="w"> </span><span class="s2">"𝟙"</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="n">One₁.one</span> <span class="kd">example</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">}</span> <span class="o">[</span><span class="n">One₁</span> <span class="n">α</span><span class="o">]</span> <span class="o">:</span> <span class="n">α</span> <span class="o">:=</span> <span class="mi">𝟙</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">One₁</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">𝟙</span> <span class="kd">example</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">}</span> <span class="o">[</span><span class="n">One₁</span> <span class="n">α</span><span class="o">]</span> <span class="o">:</span> <span class="o">(</span><span class="mi">𝟙</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <span class="bp">=</span> <span class="mi">𝟙</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">One₁</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="mi">𝟙</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">𝟙</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p>We now want a data-carrying class recording a binary operation. We don’t want to choose between addition and multiplication for now so we’ll use diamond.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">Dia₁</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="n">where</span> <span class="n">dia</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">α</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">Dia₁</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">dia</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span> <span class="kd">infixl</span><span class="o">:</span><span class="mi">70</span> <span class="s2">" ⋄ "</span> <span class="bp">=></span> <span class="n">Dia₁.dia</span> <span class="kd">infixl</span><span class="o">:</span><span class="mi">70</span><span class="w"> </span><span class="s2">" ⋄ "</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="n">Dia₁.dia</span> </pre></div> </div> <p>As in the <code class="docutils literal notranslate"><span class="pre">One₁</span></code> example, the operation has no property at all at this stage. Let us now define the class of semigroup structures where the operation is denoted by <code class="docutils literal notranslate"><span class="pre">⋄</span></code>. For now, we define it by hand as a structure with two fields, a <code class="docutils literal notranslate"><span class="pre">Dia₁</span></code> instance and some <code class="docutils literal notranslate"><span class="pre">Prop</span></code>-valued field <code class="docutils literal notranslate"><span class="pre">dia_assoc</span></code> asserting associativity of <code class="docutils literal notranslate"><span class="pre">⋄</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">Semigroup₁</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="n">where</span> <span class="n">toDia₁</span> <span class="o">:</span> <span class="n">Dia₁</span> <span class="n">α</span> <span class="sd">/-- Diamond is associative -/</span> <span class="n">dia_assoc</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">a</span> <span class="bp">⋄</span> <span class="n">b</span> <span class="bp">⋄</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">⋄</span> <span class="o">(</span><span class="n">b</span> <span class="bp">⋄</span> <span class="n">c</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">Semigroup₁</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">toDia₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Dia₁</span><span class="w"> </span><span class="n">α</span> <span class="w"> </span><span class="sd">/-- Diamond is associative -/</span> <span class="w"> </span><span class="n">dia_assoc</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> </pre></div> </div> <p>Note that while stating <cite>dia_assoc</cite>, the previously defined field <cite>toDia₁</cite> is in the local
-
@@ -196,19 +196,19 @@ of <cite>a ⋄ b</cite>. However this <cite>toDia₁</cite> field does nHence doing <code class="docutils literal notranslate"><span class="pre">example</span> <span class="pre">{α</span> <span class="pre">:</span> <span class="pre">Type}</span> <span class="pre">[Semigroup₁</span> <span class="pre">α]</span> <span class="pre">(a</span> <span class="pre">b</span> <span class="pre">:</span> <span class="pre">α)</span> <span class="pre">:</span> <span class="pre">α</span> <span class="pre">:=</span> <span class="pre">a</span> <span class="pre">⋄</span> <span class="pre">b</span></code> would fail with error message <code class="docutils literal notranslate"><span class="pre">failed</span> <span class="pre">to</span> <span class="pre">synthesize</span> <span class="pre">instance</span> <span class="pre">Dia₁</span> <span class="pre">α</span></code>.</p> <p>We can fix this by adding the <code class="docutils literal notranslate"><span class="pre">instance</span></code> attribute later.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">attribute</span> <span class="o">[</span><span class="kd">instance</span><span class="o">]</span> <span class="n">Semigroup₁.toDia₁</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">attribute</span><span class="w"> </span><span class="o">[</span><span class="kd">instance</span><span class="o">]</span><span class="w"> </span><span class="n">Semigroup₁.toDia₁</span> <span class="kd">example</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">}</span> <span class="o">[</span><span class="n">Semigroup₁</span> <span class="n">α</span><span class="o">]</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <span class="o">:</span> <span class="n">α</span> <span class="o">:=</span> <span class="n">a</span> <span class="bp">⋄</span> <span class="n">b</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Semigroup₁</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="n">b</span> </pre></div> </div> <p>Before building up, we need a more convenient way to extend structures than explicitly writing fields like <cite>toDia₁</cite> and adding the instance attribute by hand. The <code class="docutils literal notranslate"><span class="pre">class</span></code> supports this using the <code class="docutils literal notranslate"><span class="pre">extends</span></code> syntax as in:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">Semigroup₂</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">Dia₁</span> <span class="n">α</span> <span class="n">where</span> <span class="sd">/-- Diamond is associative -/</span> <span class="n">dia_assoc</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">a</span> <span class="bp">⋄</span> <span class="n">b</span> <span class="bp">⋄</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">⋄</span> <span class="o">(</span><span class="n">b</span> <span class="bp">⋄</span> <span class="n">c</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">Semigroup₂</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">Dia₁</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="sd">/-- Diamond is associative -/</span> <span class="w"> </span><span class="n">dia_assoc</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> <span class="kd">example</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">}</span> <span class="o">[</span><span class="n">Semigroup₂</span> <span class="n">α</span><span class="o">]</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <span class="o">:</span> <span class="n">α</span> <span class="o">:=</span> <span class="n">a</span> <span class="bp">⋄</span> <span class="n">b</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Semigroup₂</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="n">b</span> </pre></div> </div> <p>Note this syntax is also available in the <code class="docutils literal notranslate"><span class="pre">structure</span></code> command, although it that
-
@@ -216,11 +216,11 @@ case it fixes only the hurdle of writing fields such as <cite>toDia₁</citeis no instance to define in that case.</p> <p>Let us now try to combine a diamond operation and a distinguished one with axioms saying this element is neutral on both sides.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">DiaOneClass₁</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">One₁</span> <span class="n">α</span><span class="o">,</span> <span class="n">Dia₁</span> <span class="n">α</span> <span class="n">where</span> <span class="sd">/-- One is a left neutral element for diamond. -/</span> <span class="n">one_dia</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="mi">𝟙</span> <span class="bp">⋄</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">a</span> <span class="sd">/-- One is a right neutral element for diamond -/</span> <span class="n">dia_one</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">a</span> <span class="bp">⋄</span> <span class="mi">𝟙</span> <span class="bp">=</span> <span class="n">a</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">DiaOneClass₁</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">One₁</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">Dia₁</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="sd">/-- One is a left neutral element for diamond. -/</span> <span class="w"> </span><span class="n">one_dia</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="mi">𝟙</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span> <span class="w"> </span><span class="sd">/-- One is a right neutral element for diamond -/</span> <span class="w"> </span><span class="n">dia_one</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="mi">𝟙</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span> </pre></div> </div> <p>In the next example, we tell Lean that <code class="docutils literal notranslate"><span class="pre">α</span></code> has a <code class="docutils literal notranslate"><span class="pre">DiaOneClass₁</span></code> structure and state a
-
@@ -230,13 +230,13 @@ is rather terse by default but it can be expanded by clicking on lines ending wiIt includes failed attempts where Lean tried to find instances before having enough type information to succeed. The successful attempts do involve the instances generated by the <code class="docutils literal notranslate"><span class="pre">extends</span></code> syntax.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">set_option</span> <span class="n">trace.Meta.synthInstance</span> <span class="n">true</span> <span class="k">in</span> <span class="kd">example</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">}</span> <span class="o">[</span><span class="n">DiaOneClass₁</span> <span class="n">α</span><span class="o">]</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">α</span><span class="o">)</span> <span class="o">:</span> <span class="kt">Prop</span> <span class="o">:=</span> <span class="n">a</span> <span class="bp">⋄</span> <span class="n">b</span> <span class="bp">=</span> <span class="mi">𝟙</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">set_option</span><span class="w"> </span><span class="n">trace.Meta.synthInstance</span><span class="w"> </span><span class="n">true</span><span class="w"> </span><span class="k">in</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">DiaOneClass₁</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Prop</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">𝟙</span> </pre></div> </div> <p>Note that we don’t need to include extra fields where combining existing classes. Hence we can define monoids as:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">Monoid₁</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">Semigroup₁</span> <span class="n">α</span><span class="o">,</span> <span class="n">DiaOneClass₁</span> <span class="n">α</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">Monoid₁</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">Semigroup₁</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">DiaOneClass₁</span><span class="w"> </span><span class="n">α</span> </pre></div> </div> <p>While the above definition seems straightforward, it hides an important subtlety. Both
-
@@ -244,25 +244,25 @@ define monoids as:</p>a <code class="docutils literal notranslate"><span class="pre">Monoid₁</span> <span class="pre">α</span></code> instance gives two unrelated diamond operations on <code class="docutils literal notranslate"><span class="pre">α</span></code>, one coming from a field <code class="docutils literal notranslate"><span class="pre">Monoid₁.toSemigroup₁</span></code> and one coming from a field <code class="docutils literal notranslate"><span class="pre">Monoid₁.toDiaOneClass₁</span></code>.</p> <p>Indeed if we try to build a monoid class by hand using:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">Monoid₂</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="n">where</span> <span class="n">toSemigroup₁</span> <span class="o">:</span> <span class="n">Semigroup₁</span> <span class="n">α</span> <span class="n">toDiaOneClass₁</span> <span class="o">:</span> <span class="n">DiaOneClass₁</span> <span class="n">α</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">Monoid₂</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">toSemigroup₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Semigroup₁</span><span class="w"> </span><span class="n">α</span> <span class="w"> </span><span class="n">toDiaOneClass₁</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">DiaOneClass₁</span><span class="w"> </span><span class="n">α</span> </pre></div> </div> <p>then we get two completely unrelated diamond operations <code class="docutils literal notranslate"><span class="pre">Monoid₂.toSemigroup₁.toDia₁.dia</span></code> and <code class="docutils literal notranslate"><span class="pre">Monoid₂.toDiaOneClass₁.toDia₁.dia</span></code>.</p> <p>The version generated using the <code class="docutils literal notranslate"><span class="pre">extends</span></code> syntax does not have this defect.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">}</span> <span class="o">[</span><span class="n">Monoid₁</span> <span class="n">α</span><span class="o">]</span> <span class="o">:</span> <span class="o">(</span><span class="n">Monoid₁.toSemigroup₁.toDia₁.dia</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">α</span><span class="o">)</span> <span class="bp">=</span> <span class="n">Monoid₁.toDiaOneClass₁.toDia₁.dia</span> <span class="o">:=</span> <span class="n">rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid₁</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="o">(</span><span class="n">Monoid₁.toSemigroup₁.toDia₁.dia</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">Monoid₁.toDiaOneClass₁.toDia₁.dia</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p>So the <code class="docutils literal notranslate"><span class="pre">class</span></code> command did some magic for us (and the <code class="docutils literal notranslate"><span class="pre">structure</span></code> command would have done it too). An easy way to see what are the fields of our classes is to check their constructor. Compare:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="c">/-</span><span class="cm"> Monoid₂.mk {α : Type} (toSemigroup₁ : Semigroup₁ α) (toDiaOneClass₁ : DiaOneClass₁ α) : Monoid₂ α -/</span> <span class="k">#check</span> <span class="n">Monoid₂.mk</span> <span class="k">#check</span><span class="w"> </span><span class="n">Monoid₂.mk</span> <span class="c">/-</span><span class="cm"> Monoid₁.mk {α : Type} [toSemigroup₁ : Semigroup₁ α] [toOne₁ : One₁ α] (one_dia : ∀ (a : α), 𝟙 ⋄ a = a) (dia_one : ∀ (a : α), a ⋄ 𝟙 = a) : Monoid₁ α -/</span> <span class="k">#check</span> <span class="n">Monoid₁.mk</span> <span class="k">#check</span><span class="w"> </span><span class="n">Monoid₁.mk</span> </pre></div> </div> <p>So we see that <code class="docutils literal notranslate"><span class="pre">Monoid₁</span></code> takes <code class="docutils literal notranslate"><span class="pre">Semigroup₁</span> <span class="pre">α</span></code> argument as expected but then it won’t
-
@@ -270,50 +270,50 @@ take a would-be overlapping <code class="docutils literal notranslate"><span claonly the non-overlapping parts. And it also auto-generated an instance <code class="docutils literal notranslate"><span class="pre">Monoid₁.toDiaOneClass₁</span></code> which is <em>not</em> a field but has the expected signature which, from the end-user point of view, restores the symmetry between the two extended classes <code class="docutils literal notranslate"><span class="pre">Semigroup₁</span></code> and <code class="docutils literal notranslate"><span class="pre">DiaOneClass₁</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">Monoid₁.toSemigroup₁</span> <span class="k">#check</span> <span class="n">Monoid₁.toDiaOneClass₁</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="n">Monoid₁.toSemigroup₁</span> <span class="k">#check</span><span class="w"> </span><span class="n">Monoid₁.toDiaOneClass₁</span> </pre></div> </div> <p>We are now very close to defining groups. We could add to the monoid structure a field asserting the existence of an inverse for every element. But then we would need to work to access these inverses. In practice it is more convenient to add it as data. To optimize reusability, we define a new data-carrying class, and then give it some notation.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">Inv₁</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="n">where</span> <span class="sd">/-- The inversion function -/</span> <span class="n">inv</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">α</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">Inv₁</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="sd">/-- The inversion function -/</span> <span class="w"> </span><span class="n">inv</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span> <span class="kd">@[</span><span class="n">inherit_doc</span><span class="kd">]</span> <span class="kd">postfix</span><span class="o">:</span><span class="n">max</span> <span class="s2">"⁻¹"</span> <span class="bp">=></span> <span class="n">Inv₁.inv</span> <span class="kd">postfix</span><span class="o">:</span><span class="n">max</span><span class="w"> </span><span class="s2">"⁻¹"</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="n">Inv₁.inv</span> <span class="kd">class</span> <span class="n">Group₁</span> <span class="o">(</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">Monoid₁</span> <span class="n">G</span><span class="o">,</span> <span class="n">Inv₁</span> <span class="n">G</span> <span class="n">where</span> <span class="n">inv_dia</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="o">:</span> <span class="n">G</span><span class="o">,</span> <span class="n">a</span><span class="bp">⁻¹</span> <span class="bp">⋄</span> <span class="n">a</span> <span class="bp">=</span> <span class="mi">𝟙</span> <span class="kd">class</span><span class="w"> </span><span class="n">Group₁</span><span class="w"> </span><span class="o">(</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">Monoid₁</span><span class="w"> </span><span class="n">G</span><span class="o">,</span><span class="w"> </span><span class="n">Inv₁</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">inv_dia</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">𝟙</span> </pre></div> </div> <p>The above definition may seem too weak, we only ask that <code class="docutils literal notranslate"><span class="pre">a⁻¹</span></code> is a left-inverse of <code class="docutils literal notranslate"><span class="pre">a</span></code>. But the other side is automatic. In order to prove that, we need a preliminary lemma.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">lemma</span> <span class="n">left_inv_eq_right_inv₁</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">}</span> <span class="o">[</span><span class="n">Monoid₁</span> <span class="n">M</span><span class="o">]</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">M</span><span class="o">}</span> <span class="o">(</span><span class="n">hba</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">⋄</span> <span class="n">a</span> <span class="bp">=</span> <span class="mi">𝟙</span><span class="o">)</span> <span class="o">(</span><span class="n">hac</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">⋄</span> <span class="n">c</span> <span class="bp">=</span> <span class="mi">𝟙</span><span class="o">)</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">c</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="bp">←</span> <span class="n">DiaOneClass₁.one_dia</span> <span class="n">c</span><span class="o">,</span> <span class="bp">←</span> <span class="n">hba</span><span class="o">,</span> <span class="n">Semigroup₁.dia_assoc</span><span class="o">,</span> <span class="n">hac</span><span class="o">,</span> <span class="n">DiaOneClass₁.dia_one</span> <span class="n">b</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">lemma</span><span class="w"> </span><span class="n">left_inv_eq_right_inv₁</span><span class="w"> </span><span class="o">{</span><span class="n">M</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid₁</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hba</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">𝟙</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hac</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">𝟙</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="bp">←</span><span class="w"> </span><span class="n">DiaOneClass₁.one_dia</span><span class="w"> </span><span class="n">c</span><span class="o">,</span><span class="w"> </span><span class="bp">←</span><span class="w"> </span><span class="n">hba</span><span class="o">,</span><span class="w"> </span><span class="n">Semigroup₁.dia_assoc</span><span class="o">,</span><span class="w"> </span><span class="n">hac</span><span class="o">,</span><span class="w"> </span><span class="n">DiaOneClass₁.dia_one</span><span class="w"> </span><span class="n">b</span><span class="o">]</span> </pre></div> </div> <p>In this lemma, it is pretty annoying to give full names, especially since it requires knowing which part of the hierarchy provides those facts. One way to fix this is to use the <code class="docutils literal notranslate"><span class="pre">export</span></code> command to copy those facts as lemmas in the root name space.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">export</span> <span class="n">DiaOneClass₁</span> <span class="o">(</span><span class="n">one_dia</span> <span class="n">dia_one</span><span class="o">)</span> <span class="kn">export</span> <span class="n">Semigroup₁</span> <span class="o">(</span><span class="n">dia_assoc</span><span class="o">)</span> <span class="kn">export</span> <span class="n">Group₁</span> <span class="o">(</span><span class="n">inv_dia</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">export</span><span class="w"> </span><span class="n">DiaOneClass₁</span><span class="w"> </span><span class="o">(</span><span class="n">one_dia</span><span class="w"> </span><span class="n">dia_one</span><span class="o">)</span> <span class="kn">export</span><span class="w"> </span><span class="n">Semigroup₁</span><span class="w"> </span><span class="o">(</span><span class="n">dia_assoc</span><span class="o">)</span> <span class="kn">export</span><span class="w"> </span><span class="n">Group₁</span><span class="w"> </span><span class="o">(</span><span class="n">inv_dia</span><span class="o">)</span> </pre></div> </div> <p>We can then rewrite the above proof as:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">}</span> <span class="o">[</span><span class="n">Monoid₁</span> <span class="n">M</span><span class="o">]</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">M</span><span class="o">}</span> <span class="o">(</span><span class="n">hba</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">⋄</span> <span class="n">a</span> <span class="bp">=</span> <span class="mi">𝟙</span><span class="o">)</span> <span class="o">(</span><span class="n">hac</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">⋄</span> <span class="n">c</span> <span class="bp">=</span> <span class="mi">𝟙</span><span class="o">)</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">c</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="bp">←</span> <span class="n">one_dia</span> <span class="n">c</span><span class="o">,</span> <span class="bp">←</span> <span class="n">hba</span><span class="o">,</span> <span class="n">dia_assoc</span><span class="o">,</span> <span class="n">hac</span><span class="o">,</span> <span class="n">dia_one</span> <span class="n">b</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">M</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid₁</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hba</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">𝟙</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hac</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">𝟙</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="bp">←</span><span class="w"> </span><span class="n">one_dia</span><span class="w"> </span><span class="n">c</span><span class="o">,</span><span class="w"> </span><span class="bp">←</span><span class="w"> </span><span class="n">hba</span><span class="o">,</span><span class="w"> </span><span class="n">dia_assoc</span><span class="o">,</span><span class="w"> </span><span class="n">hac</span><span class="o">,</span><span class="w"> </span><span class="n">dia_one</span><span class="w"> </span><span class="n">b</span><span class="o">]</span> </pre></div> </div> <p>It is now your turn to prove things about our algebraic structures.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">lemma</span> <span class="n">inv_eq_of_dia</span> <span class="o">[</span><span class="n">Group₁</span> <span class="n">G</span><span class="o">]</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">G</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">⋄</span> <span class="n">b</span> <span class="bp">=</span> <span class="mi">𝟙</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span><span class="bp">⁻¹</span> <span class="bp">=</span> <span class="n">b</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">lemma</span><span class="w"> </span><span class="n">inv_eq_of_dia</span><span class="w"> </span><span class="o">[</span><span class="n">Group₁</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">𝟙</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">lemma</span> <span class="n">dia_inv</span> <span class="o">[</span><span class="n">Group₁</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">⋄</span> <span class="n">a</span><span class="bp">⁻¹</span> <span class="bp">=</span> <span class="mi">𝟙</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">lemma</span><span class="w"> </span><span class="n">dia_inv</span><span class="w"> </span><span class="o">[</span><span class="n">Group₁</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">⋄</span><span class="w"> </span><span class="n">a</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">𝟙</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>At this stage we would like to move on to define rings, but there is a serious issue.
-
@@ -331,84 +331,84 @@ lemmas are then only stated in multiplicative notation and marked with the attrito generate the additive version as <code class="docutils literal notranslate"><span class="pre">left_inv_eq_right_inv'</span></code> with its auto-generated additive version <code class="docutils literal notranslate"><span class="pre">left_neg_eq_right_neg'</span></code>. In order to check the name of this additive version we used the <code class="docutils literal notranslate"><span class="pre">whatsnew</span> <span class="pre">in</span></code> command on top of <code class="docutils literal notranslate"><span class="pre">left_inv_eq_right_inv'</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">AddSemigroup₃</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">Add</span> <span class="n">α</span> <span class="n">where</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">AddSemigroup₃</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">Add</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="n">where</span> <span class="sd">/-- Addition is associative -/</span> <span class="n">add_assoc₃</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">+</span> <span class="o">(</span><span class="n">b</span> <span class="bp">+</span> <span class="n">c</span><span class="o">)</span> <span class="w"> </span><span class="n">add_assoc₃</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> <span class="kd">@[</span><span class="n">to_additive</span> <span class="n">AddSemigroup₃</span><span class="kd">]</span> <span class="kd">class</span> <span class="n">Semigroup₃</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">Mul</span> <span class="n">α</span> <span class="n">where</span> <span class="kd">@[</span><span class="n">to_additive</span><span class="w"> </span><span class="n">AddSemigroup₃</span><span class="kd">]</span> <span class="kd">class</span><span class="w"> </span><span class="n">Semigroup₃</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">Mul</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="n">where</span> <span class="sd">/-- Multiplication is associative -/</span> <span class="n">mul_assoc₃</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="o">(</span><span class="n">b</span> <span class="bp">*</span> <span class="n">c</span><span class="o">)</span> <span class="w"> </span><span class="n">mul_assoc₃</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> <span class="kd">class</span> <span class="n">AddMonoid₃</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">AddSemigroup₃</span> <span class="n">α</span><span class="o">,</span> <span class="n">AddZeroClass</span> <span class="n">α</span> <span class="kd">class</span><span class="w"> </span><span class="n">AddMonoid₃</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">AddSemigroup₃</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">AddZeroClass</span><span class="w"> </span><span class="n">α</span> <span class="kd">@[</span><span class="n">to_additive</span> <span class="n">AddMonoid₃</span><span class="kd">]</span> <span class="kd">class</span> <span class="n">Monoid₃</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">Semigroup₃</span> <span class="n">α</span><span class="o">,</span> <span class="n">MulOneClass</span> <span class="n">α</span> <span class="kd">@[</span><span class="n">to_additive</span><span class="w"> </span><span class="n">AddMonoid₃</span><span class="kd">]</span> <span class="kd">class</span><span class="w"> </span><span class="n">Monoid₃</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">Semigroup₃</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">MulOneClass</span><span class="w"> </span><span class="n">α</span> <span class="kn">attribute</span> <span class="o">[</span><span class="n">to_additive</span> <span class="n">existing</span><span class="o">]</span> <span class="n">Monoid₃.toMulOneClass</span> <span class="kn">attribute</span><span class="w"> </span><span class="o">[</span><span class="n">to_additive</span><span class="w"> </span><span class="n">existing</span><span class="o">]</span><span class="w"> </span><span class="n">Monoid₃.toMulOneClass</span> <span class="kn">export</span> <span class="n">Semigroup₃</span> <span class="o">(</span><span class="n">mul_assoc₃</span><span class="o">)</span> <span class="kn">export</span> <span class="n">AddSemigroup₃</span> <span class="o">(</span><span class="n">add_assoc₃</span><span class="o">)</span> <span class="kn">export</span><span class="w"> </span><span class="n">Semigroup₃</span><span class="w"> </span><span class="o">(</span><span class="n">mul_assoc₃</span><span class="o">)</span> <span class="kn">export</span><span class="w"> </span><span class="n">AddSemigroup₃</span><span class="w"> </span><span class="o">(</span><span class="n">add_assoc₃</span><span class="o">)</span> <span class="n">whatsnew</span> <span class="k">in</span> <span class="n">whatsnew</span><span class="w"> </span><span class="k">in</span> <span class="kd">@[</span><span class="n">to_additive</span><span class="kd">]</span> <span class="kd">lemma</span> <span class="n">left_inv_eq_right_inv'</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">}</span> <span class="o">[</span><span class="n">Monoid₃</span> <span class="n">M</span><span class="o">]</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">M</span><span class="o">}</span> <span class="o">(</span><span class="n">hba</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">=</span> <span class="mi">1</span><span class="o">)</span> <span class="o">(</span><span class="n">hac</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">=</span> <span class="mi">1</span><span class="o">)</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">c</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="bp">←</span> <span class="n">one_mul</span> <span class="n">c</span><span class="o">,</span> <span class="bp">←</span> <span class="n">hba</span><span class="o">,</span> <span class="n">mul_assoc₃</span><span class="o">,</span> <span class="n">hac</span><span class="o">,</span> <span class="n">mul_one</span> <span class="n">b</span><span class="o">]</span> <span class="kd">lemma</span><span class="w"> </span><span class="n">left_inv_eq_right_inv'</span><span class="w"> </span><span class="o">{</span><span class="n">M</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid₃</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hba</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hac</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="bp">←</span><span class="w"> </span><span class="n">one_mul</span><span class="w"> </span><span class="n">c</span><span class="o">,</span><span class="w"> </span><span class="bp">←</span><span class="w"> </span><span class="n">hba</span><span class="o">,</span><span class="w"> </span><span class="n">mul_assoc₃</span><span class="o">,</span><span class="w"> </span><span class="n">hac</span><span class="o">,</span><span class="w"> </span><span class="n">mul_one</span><span class="w"> </span><span class="n">b</span><span class="o">]</span> <span class="k">#check</span> <span class="n">left_neg_eq_right_neg'</span> <span class="k">#check</span><span class="w"> </span><span class="n">left_neg_eq_right_neg'</span> </pre></div> </div> <p>Equipped with this technology, we can easily define also commutative semigroups, monoids and groups, and then define rings.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">AddCommSemigroup₃</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">AddSemigroup₃</span> <span class="n">α</span> <span class="n">where</span> <span class="n">add_comm</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">a</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">AddCommSemigroup₃</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">AddSemigroup₃</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">add_comm</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span> <span class="kd">@[</span><span class="n">to_additive</span> <span class="n">AddCommSemigroup₃</span><span class="kd">]</span> <span class="kd">class</span> <span class="n">CommSemigroup₃</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">Semigroup₃</span> <span class="n">α</span> <span class="n">where</span> <span class="n">mul_comm</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">a</span> <span class="kd">@[</span><span class="n">to_additive</span><span class="w"> </span><span class="n">AddCommSemigroup₃</span><span class="kd">]</span> <span class="kd">class</span><span class="w"> </span><span class="n">CommSemigroup₃</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">Semigroup₃</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">mul_comm</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span> <span class="kd">class</span> <span class="n">AddCommMonoid₃</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">AddMonoid₃</span> <span class="n">α</span><span class="o">,</span> <span class="n">AddCommSemigroup₃</span> <span class="n">α</span> <span class="kd">class</span><span class="w"> </span><span class="n">AddCommMonoid₃</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">AddMonoid₃</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">AddCommSemigroup₃</span><span class="w"> </span><span class="n">α</span> <span class="kd">@[</span><span class="n">to_additive</span> <span class="n">AddCommMonoid₃</span><span class="kd">]</span> <span class="kd">class</span> <span class="n">CommMonoid₃</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">Monoid₃</span> <span class="n">α</span><span class="o">,</span> <span class="n">CommSemigroup₃</span> <span class="n">α</span> <span class="kd">@[</span><span class="n">to_additive</span><span class="w"> </span><span class="n">AddCommMonoid₃</span><span class="kd">]</span> <span class="kd">class</span><span class="w"> </span><span class="n">CommMonoid₃</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">Monoid₃</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="n">CommSemigroup₃</span><span class="w"> </span><span class="n">α</span> <span class="kd">class</span> <span class="n">AddGroup₃</span> <span class="o">(</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">AddMonoid₃</span> <span class="n">G</span><span class="o">,</span> <span class="n">Neg</span> <span class="n">G</span> <span class="n">where</span> <span class="n">neg_add</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="o">:</span> <span class="n">G</span><span class="o">,</span> <span class="bp">-</span><span class="n">a</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp">=</span> <span class="mi">0</span> <span class="kd">class</span><span class="w"> </span><span class="n">AddGroup₃</span><span class="w"> </span><span class="o">(</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">AddMonoid₃</span><span class="w"> </span><span class="n">G</span><span class="o">,</span><span class="w"> </span><span class="n">Neg</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">neg_add</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">,</span><span class="w"> </span><span class="bp">-</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span> <span class="kd">@[</span><span class="n">to_additive</span> <span class="n">AddGroup₃</span><span class="kd">]</span> <span class="kd">class</span> <span class="n">Group₃</span> <span class="o">(</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">Monoid₃</span> <span class="n">G</span><span class="o">,</span> <span class="n">Inv</span> <span class="n">G</span> <span class="n">where</span> <span class="n">inv_mul</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="o">:</span> <span class="n">G</span><span class="o">,</span> <span class="n">a</span><span class="bp">⁻¹</span> <span class="bp">*</span> <span class="n">a</span> <span class="bp">=</span> <span class="mi">1</span> <span class="kd">@[</span><span class="n">to_additive</span><span class="w"> </span><span class="n">AddGroup₃</span><span class="kd">]</span> <span class="kd">class</span><span class="w"> </span><span class="n">Group₃</span><span class="w"> </span><span class="o">(</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">Monoid₃</span><span class="w"> </span><span class="n">G</span><span class="o">,</span><span class="w"> </span><span class="n">Inv</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">inv_mul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span> </pre></div> </div> <p>We should remember to tag lemmas with <code class="docutils literal notranslate"><span class="pre">simp</span></code> when appropriate.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">attribute</span> <span class="o">[</span><span class="n">simp</span><span class="o">]</span> <span class="n">Group₃.inv_mul</span> <span class="n">AddGroup₃.neg_add</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">attribute</span><span class="w"> </span><span class="o">[</span><span class="n">simp</span><span class="o">]</span><span class="w"> </span><span class="n">Group₃.inv_mul</span><span class="w"> </span><span class="n">AddGroup₃.neg_add</span> </pre></div> </div> <p>Then we need to repeat ourselves a bit since we switch to standard notations, but at least <code class="docutils literal notranslate"><span class="pre">to_additive</span></code> does the work of translating from the multiplicative notation to the additive one.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">@[</span><span class="n">to_additive</span><span class="kd">]</span> <span class="kd">lemma</span> <span class="n">inv_eq_of_mul</span> <span class="o">[</span><span class="n">Group₃</span> <span class="n">G</span><span class="o">]</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">G</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">=</span> <span class="mi">1</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span><span class="bp">⁻¹</span> <span class="bp">=</span> <span class="n">b</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">lemma</span><span class="w"> </span><span class="n">inv_eq_of_mul</span><span class="w"> </span><span class="o">[</span><span class="n">Group₃</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Note that <code class="docutils literal notranslate"><span class="pre">to_additive</span></code> can be asked to tag a lemma with <code class="docutils literal notranslate"><span class="pre">simp</span></code> and propagate that attribute to the additive version as follows.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">@[</span><span class="n">to_additive</span> <span class="o">(</span><span class="n">attr</span> <span class="o">:=</span> <span class="n">simp</span><span class="o">)</span><span class="kd">]</span> <span class="kd">lemma</span> <span class="n">Group₃.mul_inv</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">}</span> <span class="o">[</span><span class="n">Group₃</span> <span class="n">G</span><span class="o">]</span> <span class="o">{</span><span class="n">a</span> <span class="o">:</span> <span class="n">G</span><span class="o">}</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">a</span><span class="bp">⁻¹</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">@[</span><span class="n">to_additive</span><span class="w"> </span><span class="o">(</span><span class="n">attr</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">simp</span><span class="o">)</span><span class="kd">]</span> <span class="kd">lemma</span><span class="w"> </span><span class="n">Group₃.mul_inv</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group₃</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">a</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">@[</span><span class="n">to_additive</span><span class="kd">]</span> <span class="kd">lemma</span> <span class="n">mul_left_cancel₃</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">}</span> <span class="o">[</span><span class="n">Group₃</span> <span class="n">G</span><span class="o">]</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">G</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">c</span><span class="o">)</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">c</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">lemma</span><span class="w"> </span><span class="n">mul_left_cancel₃</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group₃</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">@[</span><span class="n">to_additive</span><span class="kd">]</span> <span class="kd">lemma</span> <span class="n">mul_right_cancel₃</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">}</span> <span class="o">[</span><span class="n">Group₃</span> <span class="n">G</span><span class="o">]</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">G</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">b</span><span class="bp">*</span><span class="n">a</span> <span class="bp">=</span> <span class="n">c</span><span class="bp">*</span><span class="n">a</span><span class="o">)</span> <span class="o">:</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">c</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">lemma</span><span class="w"> </span><span class="n">mul_right_cancel₃</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group₃</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="bp">*</span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="bp">*</span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">class</span> <span class="n">AddCommGroup₃</span> <span class="o">(</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">AddGroup₃</span> <span class="n">G</span><span class="o">,</span> <span class="n">AddCommMonoid₃</span> <span class="n">G</span> <span class="kd">class</span><span class="w"> </span><span class="n">AddCommGroup₃</span><span class="w"> </span><span class="o">(</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">AddGroup₃</span><span class="w"> </span><span class="n">G</span><span class="o">,</span><span class="w"> </span><span class="n">AddCommMonoid₃</span><span class="w"> </span><span class="n">G</span> <span class="kd">@[</span><span class="n">to_additive</span> <span class="n">AddCommGroup₃</span><span class="kd">]</span> <span class="kd">class</span> <span class="n">CommGroup₃</span> <span class="o">(</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">Group₃</span> <span class="n">G</span><span class="o">,</span> <span class="n">CommMonoid₃</span> <span class="n">G</span> <span class="kd">@[</span><span class="n">to_additive</span><span class="w"> </span><span class="n">AddCommGroup₃</span><span class="kd">]</span> <span class="kd">class</span><span class="w"> </span><span class="n">CommGroup₃</span><span class="w"> </span><span class="o">(</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">Group₃</span><span class="w"> </span><span class="n">G</span><span class="o">,</span><span class="w"> </span><span class="n">CommMonoid₃</span><span class="w"> </span><span class="n">G</span> </pre></div> </div> <p>We are now ready for rings. For demonstration purposes we won’t assume that addition is
-
@@ -418,56 +418,56 @@ also because Mathlib’s algebraic hierarchy goes through semirings which aropposites so that the proof below does not work for them. What we gain here, besides a nice exercise if you have never seen it, is an example of building an instance using the syntax that allows to provide a parent structure and some extra fields.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">Ring₃</span> <span class="o">(</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">AddGroup₃</span> <span class="n">R</span><span class="o">,</span> <span class="n">Monoid₃</span> <span class="n">R</span><span class="o">,</span> <span class="n">MulZeroClass</span> <span class="n">R</span> <span class="n">where</span> <span class="sd">/-- Multiplication is left distributive over addition -/</span> <span class="n">left_distrib</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">R</span><span class="o">,</span> <span class="n">a</span> <span class="bp">*</span> <span class="o">(</span><span class="n">b</span> <span class="bp">+</span> <span class="n">c</span><span class="o">)</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">c</span> <span class="sd">/-- Multiplication is right distributive over addition -/</span> <span class="n">right_distrib</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">R</span><span class="o">,</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">c</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">*</span> <span class="n">c</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">Ring₃</span><span class="w"> </span><span class="o">(</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">AddGroup₃</span><span class="w"> </span><span class="n">R</span><span class="o">,</span><span class="w"> </span><span class="n">Monoid₃</span><span class="w"> </span><span class="n">R</span><span class="o">,</span><span class="w"> </span><span class="n">MulZeroClass</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="sd">/-- Multiplication is left distributive over addition -/</span> <span class="w"> </span><span class="n">left_distrib</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">c</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span> <span class="w"> </span><span class="sd">/-- Multiplication is right distributive over addition -/</span> <span class="w"> </span><span class="n">right_distrib</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">,</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span> <span class="kd">instance</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">}</span> <span class="o">[</span><span class="n">Ring₃</span> <span class="n">R</span><span class="o">]</span> <span class="o">:</span> <span class="n">AddCommGroup₃</span> <span class="n">R</span> <span class="o">:=</span> <span class="o">{</span> <span class="n">Ring₃.toAddGroup₃</span> <span class="k">with</span> <span class="n">add_comm</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="o">}</span> <span class="kd">instance</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Ring₃</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">AddCommGroup₃</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="o">:=</span> <span class="o">{</span><span class="w"> </span><span class="n">Ring₃.toAddGroup₃</span><span class="w"> </span><span class="k">with</span> <span class="w"> </span><span class="n">add_comm</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span><span class="w"> </span><span class="o">}</span> </pre></div> </div> <p>Of course we can also build concrete instances, such as a ring structure on integers (of course the instance below uses that all the work is already done in Mathlib).</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="o">:</span> <span class="n">Ring₃</span> <span class="n">ℤ</span> <span class="n">where</span> <span class="n">add</span> <span class="o">:=</span> <span class="o">(</span><span class="bp">·</span> <span class="bp">+</span> <span class="bp">·</span><span class="o">)</span> <span class="n">add_assoc₃</span> <span class="o">:=</span> <span class="n">add_assoc</span> <span class="n">zero</span> <span class="o">:=</span> <span class="mi">0</span> <span class="n">zero_add</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="n">add_zero</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="n">neg</span> <span class="o">:=</span> <span class="o">(</span><span class="bp">-</span> <span class="bp">·</span><span class="o">)</span> <span class="n">neg_add</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="n">mul</span> <span class="o">:=</span> <span class="o">(</span><span class="bp">·</span> <span class="bp">*</span> <span class="bp">·</span><span class="o">)</span> <span class="n">mul_assoc₃</span> <span class="o">:=</span> <span class="n">mul_assoc</span> <span class="n">one</span> <span class="o">:=</span> <span class="mi">1</span> <span class="n">one_mul</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="n">mul_one</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="n">zero_mul</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="n">mul_zero</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="n">left_distrib</span> <span class="o">:=</span> <span class="n">Int.mul_add</span> <span class="n">right_distrib</span> <span class="o">:=</span> <span class="n">Int.add_mul</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Ring₃</span><span class="w"> </span><span class="n">ℤ</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="bp">·</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="bp">·</span><span class="o">)</span> <span class="w"> </span><span class="n">add_assoc₃</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">add_assoc</span> <span class="w"> </span><span class="n">zero</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">0</span> <span class="w"> </span><span class="n">zero_add</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">add_zero</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">neg</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="bp">-</span><span class="w"> </span><span class="bp">·</span><span class="o">)</span> <span class="w"> </span><span class="n">neg_add</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="bp">·</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="bp">·</span><span class="o">)</span> <span class="w"> </span><span class="n">mul_assoc₃</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">mul_assoc</span> <span class="w"> </span><span class="n">one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">1</span> <span class="w"> </span><span class="n">one_mul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">mul_one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">zero_mul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">mul_zero</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">left_distrib</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Int.mul_add</span> <span class="w"> </span><span class="n">right_distrib</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Int.add_mul</span> </pre></div> </div> <p>As an exercise you can now set up a simple hierarchy for order relations, including a class for ordered commutative monoids, which have both a partial order and a commutative monoid structure such that <code class="docutils literal notranslate"><span class="pre">∀</span> <span class="pre">a</span> <span class="pre">b</span> <span class="pre">:</span> <span class="pre">α,</span> <span class="pre">a</span> <span class="pre">≤</span> <span class="pre">b</span> <span class="pre">→</span> <span class="pre">∀</span> <span class="pre">c</span> <span class="pre">:</span> <span class="pre">α,</span> <span class="pre">c</span> <span class="pre">*</span> <span class="pre">a</span> <span class="pre">≤</span> <span class="pre">c</span> <span class="pre">*</span> <span class="pre">b</span></code>. Of course you need to add fields and maybe <code class="docutils literal notranslate"><span class="pre">extends</span></code> clauses to the following classes.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">LE₁</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="n">where</span> <span class="sd">/-- The Less-or-Equal relation. -/</span> <span class="n">le</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">α</span> <span class="bp">→</span> <span class="kt">Prop</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">LE₁</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="sd">/-- The Less-or-Equal relation. -/</span> <span class="w"> </span><span class="n">le</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="kt">Prop</span> <span class="kd">@[</span><span class="n">inherit_doc</span><span class="kd">]</span> <span class="kd">infix</span><span class="o">:</span><span class="mi">50</span> <span class="s2">" ≤₁ "</span> <span class="bp">=></span> <span class="n">LE₁.le</span> <span class="kd">@[</span><span class="n">inherit_doc</span><span class="kd">]</span><span class="w"> </span><span class="kd">infix</span><span class="o">:</span><span class="mi">50</span><span class="w"> </span><span class="s2">" ≤₁ "</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="n">LE₁.le</span> <span class="kd">class</span> <span class="n">Preorder₁</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">class</span><span class="w"> </span><span class="n">Preorder₁</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span> <span class="kd">class</span> <span class="n">PartialOrder₁</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">class</span><span class="w"> </span><span class="n">PartialOrder₁</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span> <span class="kd">class</span> <span class="n">OrderedCommMonoid₁</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">class</span><span class="w"> </span><span class="n">OrderedCommMonoid₁</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span> <span class="kd">instance</span> <span class="o">:</span> <span class="n">OrderedCommMonoid₁</span> <span class="n">ℕ</span> <span class="n">where</span> <span class="kd">instance</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">OrderedCommMonoid₁</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="n">where</span> </pre></div> </div> <p>We now want to discuss algebraic structures involving several types. The prime example
-
@@ -476,20 +476,20 @@ and think that all our rings are fields. Those structures are commutative additiequipped with a scalar multiplication by elements of some ring.</p> <p>We first define the data-carrying type class of scalar multiplication by some type <code class="docutils literal notranslate"><span class="pre">α</span></code> on some type <code class="docutils literal notranslate"><span class="pre">β</span></code>, and give it a right associative notation.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">SMul₃</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">(</span><span class="n">β</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="n">where</span> <span class="sd">/-- Scalar multiplication -/</span> <span class="n">smul</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">β</span> <span class="bp">→</span> <span class="n">β</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">SMul₃</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">β</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="sd">/-- Scalar multiplication -/</span> <span class="w"> </span><span class="n">smul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">β</span> <span class="kd">infixr</span><span class="o">:</span><span class="mi">73</span> <span class="s2">" • "</span> <span class="bp">=></span> <span class="n">SMul₃.smul</span> <span class="kd">infixr</span><span class="o">:</span><span class="mi">73</span><span class="w"> </span><span class="s2">" • "</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="n">SMul₃.smul</span> </pre></div> </div> <p>Then we can define modules (again think about vector spaces if you don’t know what is a module).</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">Module₁</span> <span class="o">(</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">Ring₃</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">AddCommGroup₃</span> <span class="n">M</span><span class="o">]</span> <span class="kd">extends</span> <span class="n">SMul₃</span> <span class="n">R</span> <span class="n">M</span> <span class="n">where</span> <span class="n">zero_smul</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">m</span> <span class="o">:</span> <span class="n">M</span><span class="o">,</span> <span class="o">(</span><span class="mi">0</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="bp">•</span> <span class="n">m</span> <span class="bp">=</span> <span class="mi">0</span> <span class="n">one_smul</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">m</span> <span class="o">:</span> <span class="n">M</span><span class="o">,</span> <span class="o">(</span><span class="mi">1</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="bp">•</span> <span class="n">m</span> <span class="bp">=</span> <span class="n">m</span> <span class="n">mul_smul</span> <span class="o">:</span> <span class="bp">∀</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">m</span> <span class="o">:</span> <span class="n">M</span><span class="o">),</span> <span class="o">(</span><span class="n">a</span> <span class="bp">*</span> <span class="n">b</span><span class="o">)</span> <span class="bp">•</span> <span class="n">m</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">•</span> <span class="n">b</span> <span class="bp">•</span> <span class="n">m</span> <span class="n">add_smul</span> <span class="o">:</span> <span class="bp">∀</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">m</span> <span class="o">:</span> <span class="n">M</span><span class="o">),</span> <span class="o">(</span><span class="n">a</span> <span class="bp">+</span> <span class="n">b</span><span class="o">)</span> <span class="bp">•</span> <span class="n">m</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">•</span> <span class="n">m</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">•</span> <span class="n">m</span> <span class="n">smul_add</span> <span class="o">:</span> <span class="bp">∀</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">m</span> <span class="n">n</span> <span class="o">:</span> <span class="n">M</span><span class="o">),</span> <span class="n">a</span> <span class="bp">•</span> <span class="o">(</span><span class="n">m</span> <span class="bp">+</span> <span class="n">n</span><span class="o">)</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">•</span> <span class="n">m</span> <span class="bp">+</span> <span class="n">a</span> <span class="bp">•</span> <span class="n">n</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">Module₁</span><span class="w"> </span><span class="o">(</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">Ring₃</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">M</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">AddCommGroup₃</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">SMul₃</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">zero_smul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">,</span><span class="w"> </span><span class="o">(</span><span class="mi">0</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span> <span class="w"> </span><span class="n">one_smul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">,</span><span class="w"> </span><span class="o">(</span><span class="mi">1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">m</span> <span class="w"> </span><span class="n">mul_smul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">),</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">m</span> <span class="w"> </span><span class="n">add_smul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">),</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">m</span> <span class="w"> </span><span class="n">smul_add</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">),</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">n</span> </pre></div> </div> <p>There is something interesting going on here. While it isn’t too surprising that the
-
@@ -516,13 +516,13 @@ safely be used as an instance. The rule is easy to remember: each class appearin<code class="docutils literal notranslate"><span class="pre">extends</span></code> clause should mention every type appearing in the parameters.</p> <p>Let us create our first module instance: a ring is a module over itself using its multiplication as a scalar multiplication.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="n">selfModule</span> <span class="o">(</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">Ring₃</span> <span class="n">R</span><span class="o">]</span> <span class="o">:</span> <span class="n">Module₁</span> <span class="n">R</span> <span class="n">R</span> <span class="n">where</span> <span class="n">smul</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">r</span> <span class="n">s</span> <span class="bp">↦</span> <span class="n">r</span><span class="bp">*</span><span class="n">s</span> <span class="n">zero_smul</span> <span class="o">:=</span> <span class="n">zero_mul</span> <span class="n">one_smul</span> <span class="o">:=</span> <span class="n">one_mul</span> <span class="n">mul_smul</span> <span class="o">:=</span> <span class="n">mul_assoc₃</span> <span class="n">add_smul</span> <span class="o">:=</span> <span class="n">Ring₃.right_distrib</span> <span class="n">smul_add</span> <span class="o">:=</span> <span class="n">Ring₃.left_distrib</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="n">selfModule</span><span class="w"> </span><span class="o">(</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">Ring₃</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Module₁</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">smul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">r</span><span class="bp">*</span><span class="n">s</span> <span class="w"> </span><span class="n">zero_smul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">zero_mul</span> <span class="w"> </span><span class="n">one_smul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">one_mul</span> <span class="w"> </span><span class="n">mul_smul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">mul_assoc₃</span> <span class="w"> </span><span class="n">add_smul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Ring₃.right_distrib</span> <span class="w"> </span><span class="n">smul_add</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Ring₃.left_distrib</span> </pre></div> </div> <p>As a second example, every abelian group is a module over <code class="docutils literal notranslate"><span class="pre">ℤ</span></code> (this is one of the reason to
-
@@ -530,26 +530,26 @@ generalize the theory of vector spaces by allowing non-invertible scalars). Firsscalar multiplication by a natural number for any type equipped with a zero and an addition: <code class="docutils literal notranslate"><span class="pre">n</span> <span class="pre">•</span> <span class="pre">a</span></code> is defined as <code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre">+</span> <span class="pre">⋯</span> <span class="pre">+</span> <span class="pre">a</span></code> where <code class="docutils literal notranslate"><span class="pre">a</span></code> appears <code class="docutils literal notranslate"><span class="pre">n</span></code> times. Then this is extended to scalar multiplication by an integer by ensuring <code class="docutils literal notranslate"><span class="pre">(-1)</span> <span class="pre">•</span> <span class="pre">a</span> <span class="pre">=</span> <span class="pre">-a</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">nsmul₁</span> <span class="o">[</span><span class="n">Zero</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">Add</span> <span class="n">M</span><span class="o">]</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">M</span> <span class="bp">→</span> <span class="n">M</span> <span class="bp">|</span> <span class="mi">0</span><span class="o">,</span> <span class="n">_</span> <span class="bp">=></span> <span class="mi">0</span> <span class="bp">|</span> <span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">,</span> <span class="n">a</span> <span class="bp">=></span> <span class="n">a</span> <span class="bp">+</span> <span class="n">nsmul₁</span> <span class="n">n</span> <span class="n">a</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">nsmul₁</span><span class="w"> </span><span class="o">[</span><span class="n">Zero</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Add</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">M</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="mi">0</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">nsmul₁</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">a</span> <span class="kd">def</span> <span class="n">zsmul₁</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Zero</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">Add</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">Neg</span> <span class="n">M</span><span class="o">]</span> <span class="o">:</span> <span class="n">ℤ</span> <span class="bp">→</span> <span class="n">M</span> <span class="bp">→</span> <span class="n">M</span> <span class="bp">|</span> <span class="n">Int.ofNat</span> <span class="n">n</span><span class="o">,</span> <span class="n">a</span> <span class="bp">=></span> <span class="n">nsmul₁</span> <span class="n">n</span> <span class="n">a</span> <span class="bp">|</span> <span class="n">Int.negSucc</span> <span class="n">n</span><span class="o">,</span> <span class="n">a</span> <span class="bp">=></span> <span class="bp">-</span><span class="n">nsmul₁</span> <span class="n">n.succ</span> <span class="n">a</span> <span class="kd">def</span><span class="w"> </span><span class="n">zsmul₁</span><span class="w"> </span><span class="o">{</span><span class="n">M</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Zero</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Add</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Neg</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℤ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">M</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">Int.ofNat</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="n">nsmul₁</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">a</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">Int.negSucc</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="bp">-</span><span class="n">nsmul₁</span><span class="w"> </span><span class="n">n.succ</span><span class="w"> </span><span class="n">a</span> </pre></div> </div> <p>Proving this gives rise to a module structure is a bit tedious and not interesting for the current discussion, so we will sorry all axioms. You are <em>not</em> asked to replace those sorries with proofs. If you insist on doing it then you will probably want to state and prove several intermediate lemmas about <code class="docutils literal notranslate"><span class="pre">nsmul₁</span></code> and <code class="docutils literal notranslate"><span class="pre">zsmul₁</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="n">abGrpModule</span> <span class="o">(</span><span class="n">A</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">AddCommGroup₃</span> <span class="n">A</span><span class="o">]</span> <span class="o">:</span> <span class="n">Module₁</span> <span class="n">ℤ</span> <span class="n">A</span> <span class="n">where</span> <span class="n">smul</span> <span class="o">:=</span> <span class="n">zsmul₁</span> <span class="n">zero_smul</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">one_smul</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">mul_smul</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">add_smul</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">smul_add</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="n">abGrpModule</span><span class="w"> </span><span class="o">(</span><span class="n">A</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">AddCommGroup₃</span><span class="w"> </span><span class="n">A</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Module₁</span><span class="w"> </span><span class="n">ℤ</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">smul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">zsmul₁</span> <span class="w"> </span><span class="n">zero_smul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">one_smul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">mul_smul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">add_smul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">smul_add</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>A much more important issue is that we now have two module structures over the ring <code class="docutils literal notranslate"><span class="pre">ℤ</span></code>
-
@@ -560,7 +560,7 @@ this isn’t true by definition, it requires a proof. This is very bad newsinstance resolution procedure and will lead to very frustrating failures for users of this hierarchy. When directly asked to find an instance, Lean will pick one, and we can see which one using:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="bp">#</span><span class="n">synth</span> <span class="n">Module₁</span> <span class="n">ℤ</span> <span class="n">ℤ</span> <span class="c1">-- abGrpModule ℤ</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="bp">#</span><span class="n">synth</span><span class="w"> </span><span class="n">Module₁</span><span class="w"> </span><span class="n">ℤ</span><span class="w"> </span><span class="n">ℤ</span><span class="w"> </span><span class="c1">-- abGrpModule ℤ</span> </pre></div> </div> <p>But in a more indirect context it can happen that Lean infers the one and then gets confused.
-
@@ -584,46 +584,46 @@ field and some <code class="docutils literal notranslate"><span class="pre">Propabove. Those fields are given default values using <code class="docutils literal notranslate"><span class="pre">:=</span></code> after their type in the definition below. Thanks to these default values, most instances would be constructed exactly as with our previous definitions. But in the special case of <code class="docutils literal notranslate"><span class="pre">ℤ</span></code> we will be able to provide specific values.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">AddMonoid₄</span> <span class="o">(</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="kd">extends</span> <span class="n">AddSemigroup₃</span> <span class="n">M</span><span class="o">,</span> <span class="n">AddZeroClass</span> <span class="n">M</span> <span class="n">where</span> <span class="sd">/-- Multiplication by a natural number. -/</span> <span class="n">nsmul</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">M</span> <span class="bp">→</span> <span class="n">M</span> <span class="o">:=</span> <span class="n">nsmul₁</span> <span class="sd">/-- Multiplication by `(0 : ℕ)` gives `0`. -/</span> <span class="n">nsmul_zero</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span><span class="o">,</span> <span class="n">nsmul</span> <span class="mi">0</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intros</span><span class="bp">;</span> <span class="n">rfl</span> <span class="sd">/-- Multiplication by `(n + 1 : ℕ)` behaves as expected. -/</span> <span class="n">nsmul_succ</span> <span class="o">:</span> <span class="bp">∀</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span><span class="o">),</span> <span class="n">nsmul</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">nsmul</span> <span class="n">n</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intros</span><span class="bp">;</span> <span class="n">rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">AddMonoid₄</span><span class="w"> </span><span class="o">(</span><span class="n">M</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">AddSemigroup₃</span><span class="w"> </span><span class="n">M</span><span class="o">,</span><span class="w"> </span><span class="n">AddZeroClass</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="sd">/-- Multiplication by a natural number. -/</span> <span class="w"> </span><span class="n">nsmul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">nsmul₁</span> <span class="w"> </span><span class="sd">/-- Multiplication by `(0 : ℕ)` gives `0`. -/</span> <span class="w"> </span><span class="n">nsmul_zero</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">nsmul</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">intros</span><span class="bp">;</span><span class="w"> </span><span class="n">rfl</span> <span class="w"> </span><span class="sd">/-- Multiplication by `(n + 1 : ℕ)` behaves as expected. -/</span> <span class="w"> </span><span class="n">nsmul_succ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="o">),</span><span class="w"> </span><span class="n">nsmul</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">nsmul</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">intros</span><span class="bp">;</span><span class="w"> </span><span class="n">rfl</span> <span class="kd">instance</span> <span class="n">mySMul</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">}</span> <span class="o">[</span><span class="n">AddMonoid₄</span> <span class="n">M</span><span class="o">]</span> <span class="o">:</span> <span class="n">SMul</span> <span class="n">ℕ</span> <span class="n">M</span> <span class="o">:=</span> <span class="o">⟨</span><span class="n">AddMonoid₄.nsmul</span><span class="o">⟩</span> <span class="kd">instance</span><span class="w"> </span><span class="n">mySMul</span><span class="w"> </span><span class="o">{</span><span class="n">M</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">AddMonoid₄</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">SMul</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">⟨</span><span class="n">AddMonoid₄.nsmul</span><span class="o">⟩</span> </pre></div> </div> <p>Let us check we can still construct a product monoid instance without providing the <code class="docutils literal notranslate"><span class="pre">nsmul</span></code> related fields.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="o">(</span><span class="n">M</span> <span class="n">N</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">AddMonoid₄</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">AddMonoid₄</span> <span class="n">N</span><span class="o">]</span> <span class="o">:</span> <span class="n">AddMonoid₄</span> <span class="o">(</span><span class="n">M</span> <span class="bp">×</span> <span class="n">N</span><span class="o">)</span> <span class="n">where</span> <span class="n">add</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">p</span> <span class="n">q</span> <span class="bp">↦</span> <span class="o">(</span><span class="n">p.1</span> <span class="bp">+</span> <span class="n">q.1</span><span class="o">,</span> <span class="n">p.2</span> <span class="bp">+</span> <span class="n">q.2</span><span class="o">)</span> <span class="n">add_assoc₃</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="bp">↦</span> <span class="kd">by</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">apply</span> <span class="n">add_assoc₃</span> <span class="n">zero</span> <span class="o">:=</span> <span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">)</span> <span class="n">zero_add</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">a</span> <span class="bp">↦</span> <span class="kd">by</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">apply</span> <span class="n">zero_add</span> <span class="n">add_zero</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">a</span> <span class="bp">↦</span> <span class="kd">by</span> <span class="n">ext</span> <span class="bp"><;></span> <span class="n">apply</span> <span class="n">add_zero</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="o">(</span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">AddMonoid₄</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">AddMonoid₄</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">AddMonoid₄</span><span class="w"> </span><span class="o">(</span><span class="n">M</span><span class="w"> </span><span class="bp">×</span><span class="w"> </span><span class="n">N</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="n">q</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">(</span><span class="n">p</span><span class="bp">.</span><span class="mi">1</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">q</span><span class="bp">.</span><span class="mi">1</span><span class="o">,</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">q</span><span class="bp">.</span><span class="mi">2</span><span class="o">)</span> <span class="w"> </span><span class="n">add_assoc₃</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">add_assoc₃</span> <span class="w"> </span><span class="n">zero</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span> <span class="w"> </span><span class="n">zero_add</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">zero_add</span> <span class="w"> </span><span class="n">add_zero</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">ext</span><span class="w"> </span><span class="bp"><;></span><span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">add_zero</span> </pre></div> </div> <p>And now let us handle the special case of <code class="docutils literal notranslate"><span class="pre">ℤ</span></code> where we want to build <code class="docutils literal notranslate"><span class="pre">nsmul</span></code> using the coercion of <code class="docutils literal notranslate"><span class="pre">ℕ</span></code> to <code class="docutils literal notranslate"><span class="pre">ℤ</span></code> and the multiplication on <code class="docutils literal notranslate"><span class="pre">ℤ</span></code>. Note in particular how the proof fields contain more work than in the default value above.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="o">:</span> <span class="n">AddMonoid₄</span> <span class="n">ℤ</span> <span class="n">where</span> <span class="n">add</span> <span class="o">:=</span> <span class="o">(</span><span class="bp">·</span> <span class="bp">+</span> <span class="bp">·</span><span class="o">)</span> <span class="n">add_assoc₃</span> <span class="o">:=</span> <span class="n">Int.add_assoc</span> <span class="n">zero</span> <span class="o">:=</span> <span class="mi">0</span> <span class="n">zero_add</span> <span class="o">:=</span> <span class="n">Int.zero_add</span> <span class="n">add_zero</span> <span class="o">:=</span> <span class="n">Int.add_zero</span> <span class="n">nsmul</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">n</span> <span class="n">m</span> <span class="bp">↦</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℤ</span><span class="o">)</span> <span class="bp">*</span> <span class="n">m</span> <span class="n">nsmul_zero</span> <span class="o">:=</span> <span class="n">Int.zero_mul</span> <span class="n">nsmul_succ</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">n</span> <span class="n">m</span> <span class="bp">↦</span> <span class="k">show</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span> <span class="o">:</span> <span class="n">ℤ</span><span class="o">)</span> <span class="bp">*</span> <span class="n">m</span> <span class="bp">=</span> <span class="n">m</span> <span class="bp">+</span> <span class="n">n</span> <span class="bp">*</span> <span class="n">m</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">Int.add_mul</span><span class="o">,</span> <span class="n">Int.add_comm</span><span class="o">,</span> <span class="n">Int.one_mul</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">AddMonoid₄</span><span class="w"> </span><span class="n">ℤ</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="bp">·</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="bp">·</span><span class="o">)</span> <span class="w"> </span><span class="n">add_assoc₃</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Int.add_assoc</span> <span class="w"> </span><span class="n">zero</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">0</span> <span class="w"> </span><span class="n">zero_add</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Int.zero_add</span> <span class="w"> </span><span class="n">add_zero</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Int.add_zero</span> <span class="w"> </span><span class="n">nsmul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℤ</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">m</span> <span class="w"> </span><span class="n">nsmul_zero</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Int.zero_mul</span> <span class="w"> </span><span class="n">nsmul_succ</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="k">show</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℤ</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">m</span> <span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">Int.add_mul</span><span class="o">,</span><span class="w"> </span><span class="n">Int.add_comm</span><span class="o">,</span><span class="w"> </span><span class="n">Int.one_mul</span><span class="o">]</span> </pre></div> </div> <p>Let us check we solved our issue. Because Lean already has a definition of scalar multiplication of a natural number and an integer, and we want to make sure our instance is used, we won’t use the <code class="docutils literal notranslate"><span class="pre">•</span></code> notation but call <code class="docutils literal notranslate"><span class="pre">SMul.mul</span></code> and explicitly provide our instance defined above.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">m</span> <span class="o">:</span> <span class="n">ℤ</span><span class="o">)</span> <span class="o">:</span> <span class="n">SMul.smul</span> <span class="o">(</span><span class="n">self</span> <span class="o">:=</span> <span class="n">mySMul</span><span class="o">)</span> <span class="n">n</span> <span class="n">m</span> <span class="bp">=</span> <span class="n">n</span> <span class="bp">*</span> <span class="n">m</span> <span class="o">:=</span> <span class="n">rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℤ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">SMul.smul</span><span class="w"> </span><span class="o">(</span><span class="n">self</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">mySMul</span><span class="o">)</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p>This story then continues with incorporating a <code class="docutils literal notranslate"><span class="pre">zsmul</span></code> field into the definition of groups
-
@@ -641,16 +641,16 @@ that every preorder comes with a <code class="docutils literal notranslate"><spa<p>So far in this chapter, we discussed how to create a hierarchy of mathematical structures. But defining structures is not really completed until we have morphisms. There are two main approaches here. The most obvious one is to define a predicate on functions.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">isMonoidHom₁</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="kt">Prop</span> <span class="o">:=</span> <span class="n">f</span> <span class="mi">1</span> <span class="bp">=</span> <span class="mi">1</span> <span class="bp">∧</span> <span class="bp">∀</span> <span class="n">g</span> <span class="n">g'</span><span class="o">,</span> <span class="n">f</span> <span class="o">(</span><span class="n">g</span> <span class="bp">*</span> <span class="n">g'</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">g</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">g'</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">isMonoidHom₁</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">H</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Prop</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">g'</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g'</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g'</span> </pre></div> </div> <p>In this definition, it is a bit unpleasant to use a conjunction. In particular users will need to remember the ordering we chose when they want to access the two conditions. So we could use a structure instead.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">structure</span> <span class="n">isMonoidHom₂</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="kt">Prop</span> <span class="n">where</span> <span class="n">map_one</span> <span class="o">:</span> <span class="n">f</span> <span class="mi">1</span> <span class="bp">=</span> <span class="mi">1</span> <span class="n">map_mul</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">g</span> <span class="n">g'</span><span class="o">,</span> <span class="n">f</span> <span class="o">(</span><span class="n">g</span> <span class="bp">*</span> <span class="n">g'</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">g</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">g'</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">structure</span><span class="w"> </span><span class="n">isMonoidHom₂</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">H</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Prop</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">map_one</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span> <span class="w"> </span><span class="n">map_mul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">g'</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g'</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g'</span> </pre></div> </div> <p>Once we are here, it is even tempting to make it a class and use the type class instance resolution
-
@@ -668,17 +668,17 @@ It really feels like “monoid morphism” is not an adjective you can ait is a noun. On the other hand one can argue that a continuous function between topological spaces is really a function that happens to be continuous. This is one reason why Mathlib has a <code class="docutils literal notranslate"><span class="pre">Continuous</span></code> predicate. For instance you can write:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="o">(</span><span class="n">id</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:=</span> <span class="n">continuous_id</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="o">(</span><span class="n">id</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">continuous_id</span> </pre></div> </div> <p>We still have bundles continuous functions, which are convenient for instance to put a topology on a space of continuous functions, but they are not the primary tool to work with continuity.</p> <p>By contrast, morphisms between monoids (or other algebraic structures) are bundled as in:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">@[</span><span class="n">ext</span><span class="kd">]</span> <span class="kd">structure</span> <span class="n">MonoidHom₁</span> <span class="o">(</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">H</span><span class="o">]</span> <span class="n">where</span> <span class="n">toFun</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→</span> <span class="n">H</span> <span class="n">map_one</span> <span class="o">:</span> <span class="n">toFun</span> <span class="mi">1</span> <span class="bp">=</span> <span class="mi">1</span> <span class="n">map_mul</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">g</span> <span class="n">g'</span><span class="o">,</span> <span class="n">toFun</span> <span class="o">(</span><span class="n">g</span> <span class="bp">*</span> <span class="n">g'</span><span class="o">)</span> <span class="bp">=</span> <span class="n">toFun</span> <span class="n">g</span> <span class="bp">*</span> <span class="n">toFun</span> <span class="n">g'</span> <span class="kd">structure</span><span class="w"> </span><span class="n">MonoidHom₁</span><span class="w"> </span><span class="o">(</span><span class="n">G</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">H</span><span class="o">]</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">H</span> <span class="w"> </span><span class="n">map_one</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span> <span class="w"> </span><span class="n">map_mul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">g'</span><span class="o">,</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g'</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="n">g'</span> </pre></div> </div> <p>Of course we don’t want to type <code class="docutils literal notranslate"><span class="pre">toFun</span></code> everywhere so we register a coercion using
-
@@ -686,30 +686,30 @@ the <code class="docutils literal notranslate"><span class="pre">CoeFun</span></The second argument describes the target function type. In our case it is always <code class="docutils literal notranslate"><span class="pre">G</span> <span class="pre">→</span> <span class="pre">H</span></code> for every <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">:</span> <span class="pre">MonoidHom₁</span> <span class="pre">G</span> <span class="pre">H</span></code>. We also tag <code class="docutils literal notranslate"><span class="pre">MonoidHom₁.toFun</span></code> with the <code class="docutils literal notranslate"><span class="pre">coe</span></code> attribute to make sure it is displayed almost invisibly in the tactic state, simply by a <code class="docutils literal notranslate"><span class="pre">↑</span></code> prefix.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">H</span><span class="o">]</span> <span class="o">:</span> <span class="n">CoeFun</span> <span class="o">(</span><span class="n">MonoidHom₁</span> <span class="n">G</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="k">fun</span> <span class="n">_</span> <span class="bp">↦</span> <span class="n">G</span> <span class="bp">→</span> <span class="n">H</span><span class="o">)</span> <span class="n">where</span> <span class="n">coe</span> <span class="o">:=</span> <span class="n">MonoidHom₁.toFun</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">H</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">CoeFun</span><span class="w"> </span><span class="o">(</span><span class="n">MonoidHom₁</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">coe</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">MonoidHom₁.toFun</span> <span class="kn">attribute</span> <span class="o">[</span><span class="n">coe</span><span class="o">]</span> <span class="n">MonoidHom₁.toFun</span> <span class="kn">attribute</span><span class="w"> </span><span class="o">[</span><span class="n">coe</span><span class="o">]</span><span class="w"> </span><span class="n">MonoidHom₁.toFun</span> </pre></div> </div> <p>Let us check we can indeed apply a bundled monoid morphism to an element.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">MonoidHom₁</span> <span class="n">G</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="mi">1</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="n">f.map_one</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">H</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MonoidHom₁</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">f.map_one</span> </pre></div> </div> <p>We can do the same with other kind of morphisms until we reach ring morphisms.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">@[</span><span class="n">ext</span><span class="kd">]</span> <span class="kd">structure</span> <span class="n">AddMonoidHom₁</span> <span class="o">(</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">AddMonoid</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">AddMonoid</span> <span class="n">H</span><span class="o">]</span> <span class="n">where</span> <span class="n">toFun</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→</span> <span class="n">H</span> <span class="n">map_zero</span> <span class="o">:</span> <span class="n">toFun</span> <span class="mi">0</span> <span class="bp">=</span> <span class="mi">0</span> <span class="n">map_add</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">g</span> <span class="n">g'</span><span class="o">,</span> <span class="n">toFun</span> <span class="o">(</span><span class="n">g</span> <span class="bp">+</span> <span class="n">g'</span><span class="o">)</span> <span class="bp">=</span> <span class="n">toFun</span> <span class="n">g</span> <span class="bp">+</span> <span class="n">toFun</span> <span class="n">g'</span> <span class="kd">structure</span><span class="w"> </span><span class="n">AddMonoidHom₁</span><span class="w"> </span><span class="o">(</span><span class="n">G</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">AddMonoid</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">AddMonoid</span><span class="w"> </span><span class="n">H</span><span class="o">]</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">H</span> <span class="w"> </span><span class="n">map_zero</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span> <span class="w"> </span><span class="n">map_add</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">g'</span><span class="o">,</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g'</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="n">g'</span> <span class="kd">instance</span> <span class="o">[</span><span class="n">AddMonoid</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">AddMonoid</span> <span class="n">H</span><span class="o">]</span> <span class="o">:</span> <span class="n">CoeFun</span> <span class="o">(</span><span class="n">AddMonoidHom₁</span> <span class="n">G</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="k">fun</span> <span class="n">_</span> <span class="bp">↦</span> <span class="n">G</span> <span class="bp">→</span> <span class="n">H</span><span class="o">)</span> <span class="n">where</span> <span class="n">coe</span> <span class="o">:=</span> <span class="n">AddMonoidHom₁.toFun</span> <span class="kd">instance</span><span class="w"> </span><span class="o">[</span><span class="n">AddMonoid</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">AddMonoid</span><span class="w"> </span><span class="n">H</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">CoeFun</span><span class="w"> </span><span class="o">(</span><span class="n">AddMonoidHom₁</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">coe</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">AddMonoidHom₁.toFun</span> <span class="kn">attribute</span> <span class="o">[</span><span class="n">coe</span><span class="o">]</span> <span class="n">AddMonoidHom₁.toFun</span> <span class="kn">attribute</span><span class="w"> </span><span class="o">[</span><span class="n">coe</span><span class="o">]</span><span class="w"> </span><span class="n">AddMonoidHom₁.toFun</span> <span class="kd">@[</span><span class="n">ext</span><span class="kd">]</span> <span class="kd">structure</span> <span class="n">RingHom₁</span> <span class="o">(</span><span class="n">R</span> <span class="n">S</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">S</span><span class="o">]</span> <span class="kd">extends</span> <span class="n">MonoidHom₁</span> <span class="n">R</span> <span class="n">S</span><span class="o">,</span> <span class="n">AddMonoidHom₁</span> <span class="n">R</span> <span class="n">S</span> <span class="kd">structure</span><span class="w"> </span><span class="n">RingHom₁</span><span class="w"> </span><span class="o">(</span><span class="n">R</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">Ring</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Ring</span><span class="w"> </span><span class="n">S</span><span class="o">]</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">MonoidHom₁</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="n">S</span><span class="o">,</span><span class="w"> </span><span class="n">AddMonoidHom₁</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="n">S</span> </pre></div> </div> <p>There are a couple of issues about this approach. A minor one is we don’t quite know where to put
-
@@ -723,16 +723,16 @@ Neither option is appealing so Mathlib uses a new hierarchy trick here. The ideaa type class for objects that are at least monoid morphisms, instantiate that class with both monoid morphisms and ring morphisms and use it to state every lemma. In the definition below, <code class="docutils literal notranslate"><span class="pre">F</span></code> could be <code class="docutils literal notranslate"><span class="pre">MonoidHom₁</span> <span class="pre">M</span> <span class="pre">N</span></code>, or <code class="docutils literal notranslate"><span class="pre">RingHom₁</span> <span class="pre">M</span> <span class="pre">N</span></code> if <code class="docutils literal notranslate"><span class="pre">M</span></code> and <code class="docutils literal notranslate"><span class="pre">N</span></code> have a ring structure.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">MonoidHomClass₁</span> <span class="o">(</span><span class="n">F</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">(</span><span class="n">M</span> <span class="n">N</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">N</span><span class="o">]</span> <span class="n">where</span> <span class="n">toFun</span> <span class="o">:</span> <span class="n">F</span> <span class="bp">→</span> <span class="n">M</span> <span class="bp">→</span> <span class="n">N</span> <span class="n">map_one</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">f</span> <span class="o">:</span> <span class="n">F</span><span class="o">,</span> <span class="n">toFun</span> <span class="n">f</span> <span class="mi">1</span> <span class="bp">=</span> <span class="mi">1</span> <span class="n">map_mul</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">f</span> <span class="n">g</span> <span class="n">g'</span><span class="o">,</span> <span class="n">toFun</span> <span class="n">f</span> <span class="o">(</span><span class="n">g</span> <span class="bp">*</span> <span class="n">g'</span><span class="o">)</span> <span class="bp">=</span> <span class="n">toFun</span> <span class="n">f</span> <span class="n">g</span> <span class="bp">*</span> <span class="n">toFun</span> <span class="n">f</span> <span class="n">g'</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">MonoidHomClass₁</span><span class="w"> </span><span class="o">(</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">N</span> <span class="w"> </span><span class="n">map_one</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">F</span><span class="o">,</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span> <span class="w"> </span><span class="n">map_mul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">g'</span><span class="o">,</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g'</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g'</span> </pre></div> </div> <p>However there is a problem with the above implementation. We haven’t registered a coercion to function instance yet. Let us try to do it now.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">badInst</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">N</span><span class="o">]</span> <span class="o">[</span><span class="n">MonoidHomClass₁</span> <span class="n">F</span> <span class="n">M</span> <span class="n">N</span><span class="o">]</span> <span class="o">:</span> <span class="n">CoeFun</span> <span class="n">F</span> <span class="o">(</span><span class="k">fun</span> <span class="n">_</span> <span class="bp">↦</span> <span class="n">M</span> <span class="bp">→</span> <span class="n">N</span><span class="o">)</span> <span class="n">where</span> <span class="n">coe</span> <span class="o">:=</span> <span class="n">MonoidHomClass₁.toFun</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">badInst</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">MonoidHomClass₁</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">CoeFun</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">N</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">coe</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">MonoidHomClass₁.toFun</span> </pre></div> </div> <p>Making this an instance would be bad. When faced with something like <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">x</span></code> where the type of <code class="docutils literal notranslate"><span class="pre">f</span></code>
-
@@ -750,41 +750,41 @@ replace <code class="docutils literal notranslate"><span class="pre">def</span>and <code class="docutils literal notranslate"><span class="pre">N</span></code>. This is done using the <code class="docutils literal notranslate"><span class="pre">outParam</span></code> function. This function is defined as the identity function, but is still recognized by the type class machinery and triggers the desired behavior. Hence we can retry defining our class, paying attention to the <code class="docutils literal notranslate"><span class="pre">outParam</span></code> function:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">MonoidHomClass₂</span> <span class="o">(</span><span class="n">F</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">(</span><span class="n">M</span> <span class="n">N</span> <span class="o">:</span> <span class="n">outParam</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">N</span><span class="o">]</span> <span class="n">where</span> <span class="n">toFun</span> <span class="o">:</span> <span class="n">F</span> <span class="bp">→</span> <span class="n">M</span> <span class="bp">→</span> <span class="n">N</span> <span class="n">map_one</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">f</span> <span class="o">:</span> <span class="n">F</span><span class="o">,</span> <span class="n">toFun</span> <span class="n">f</span> <span class="mi">1</span> <span class="bp">=</span> <span class="mi">1</span> <span class="n">map_mul</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">f</span> <span class="n">g</span> <span class="n">g'</span><span class="o">,</span> <span class="n">toFun</span> <span class="n">f</span> <span class="o">(</span><span class="n">g</span> <span class="bp">*</span> <span class="n">g'</span><span class="o">)</span> <span class="bp">=</span> <span class="n">toFun</span> <span class="n">f</span> <span class="n">g</span> <span class="bp">*</span> <span class="n">toFun</span> <span class="n">f</span> <span class="n">g'</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">MonoidHomClass₂</span><span class="w"> </span><span class="o">(</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">outParam</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">N</span> <span class="w"> </span><span class="n">map_one</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">F</span><span class="o">,</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span> <span class="w"> </span><span class="n">map_mul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">g'</span><span class="o">,</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g'</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g'</span> <span class="kd">instance</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">N</span><span class="o">]</span> <span class="o">[</span><span class="n">MonoidHomClass₂</span> <span class="n">F</span> <span class="n">M</span> <span class="n">N</span><span class="o">]</span> <span class="o">:</span> <span class="n">CoeFun</span> <span class="n">F</span> <span class="o">(</span><span class="k">fun</span> <span class="n">_</span> <span class="bp">↦</span> <span class="n">M</span> <span class="bp">→</span> <span class="n">N</span><span class="o">)</span> <span class="n">where</span> <span class="n">coe</span> <span class="o">:=</span> <span class="n">MonoidHomClass₂.toFun</span> <span class="kd">instance</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">MonoidHomClass₂</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">CoeFun</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">N</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">coe</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">MonoidHomClass₂.toFun</span> <span class="kn">attribute</span> <span class="o">[</span><span class="n">coe</span><span class="o">]</span> <span class="n">MonoidHomClass₂.toFun</span> <span class="kn">attribute</span><span class="w"> </span><span class="o">[</span><span class="n">coe</span><span class="o">]</span><span class="w"> </span><span class="n">MonoidHomClass₂.toFun</span> </pre></div> </div> <p>Now we can proceed with our plan to instantiate this class.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="o">(</span><span class="n">M</span> <span class="n">N</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">N</span><span class="o">]</span> <span class="o">:</span> <span class="n">MonoidHomClass₂</span> <span class="o">(</span><span class="n">MonoidHom₁</span> <span class="n">M</span> <span class="n">N</span><span class="o">)</span> <span class="n">M</span> <span class="n">N</span> <span class="n">where</span> <span class="n">toFun</span> <span class="o">:=</span> <span class="n">MonoidHom₁.toFun</span> <span class="n">map_one</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">f</span> <span class="bp">↦</span> <span class="n">f.map_one</span> <span class="n">map_mul</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">f</span> <span class="bp">↦</span> <span class="n">f.map_mul</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="o">(</span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MonoidHomClass₂</span><span class="w"> </span><span class="o">(</span><span class="n">MonoidHom₁</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="o">)</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">MonoidHom₁.toFun</span> <span class="w"> </span><span class="n">map_one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f.map_one</span> <span class="w"> </span><span class="n">map_mul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f.map_mul</span> <span class="kd">instance</span> <span class="o">(</span><span class="n">R</span> <span class="n">S</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">S</span><span class="o">]</span> <span class="o">:</span> <span class="n">MonoidHomClass₂</span> <span class="o">(</span><span class="n">RingHom₁</span> <span class="n">R</span> <span class="n">S</span><span class="o">)</span> <span class="n">R</span> <span class="n">S</span> <span class="n">where</span> <span class="n">toFun</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">f</span> <span class="bp">↦</span> <span class="n">f.toMonoidHom₁.toFun</span> <span class="n">map_one</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">f</span> <span class="bp">↦</span> <span class="n">f.toMonoidHom₁.map_one</span> <span class="n">map_mul</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">f</span> <span class="bp">↦</span> <span class="n">f.toMonoidHom₁.map_mul</span> <span class="kd">instance</span><span class="w"> </span><span class="o">(</span><span class="n">R</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">Ring</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Ring</span><span class="w"> </span><span class="n">S</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MonoidHomClass₂</span><span class="w"> </span><span class="o">(</span><span class="n">RingHom₁</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="n">S</span><span class="o">)</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f.toMonoidHom₁.toFun</span> <span class="w"> </span><span class="n">map_one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f.toMonoidHom₁.map_one</span> <span class="w"> </span><span class="n">map_mul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f.toMonoidHom₁.map_mul</span> </pre></div> </div> <p>As promised every lemma we prove about <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">:</span> <span class="pre">F</span></code> assuming an instance of <code class="docutils literal notranslate"><span class="pre">MonoidHomClass₁</span> <span class="pre">F</span></code> will apply both to monoid morphisms and ring morphisms. Let us see an example lemma and check it applies to both situations.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">lemma</span> <span class="n">map_inv_of_inv</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">N</span><span class="o">]</span> <span class="o">[</span><span class="n">MonoidHomClass₂</span> <span class="n">F</span> <span class="n">M</span> <span class="n">N</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">F</span><span class="o">)</span> <span class="o">{</span><span class="n">m</span> <span class="n">m'</span> <span class="o">:</span> <span class="n">M</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">m</span><span class="bp">*</span><span class="n">m'</span> <span class="bp">=</span> <span class="mi">1</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="n">m</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">m'</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="bp">←</span> <span class="n">MonoidHomClass₂.map_mul</span><span class="o">,</span> <span class="n">h</span><span class="o">,</span> <span class="n">MonoidHomClass₂.map_one</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">lemma</span><span class="w"> </span><span class="n">map_inv_of_inv</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">MonoidHomClass₂</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="n">m'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="bp">*</span><span class="n">m'</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">m'</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="bp">←</span><span class="w"> </span><span class="n">MonoidHomClass₂.map_mul</span><span class="o">,</span><span class="w"> </span><span class="n">h</span><span class="o">,</span><span class="w"> </span><span class="n">MonoidHomClass₂.map_one</span><span class="o">]</span> <span class="kd">example</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">N</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">MonoidHom₁</span> <span class="n">M</span> <span class="n">N</span><span class="o">)</span> <span class="o">{</span><span class="n">m</span> <span class="n">m'</span> <span class="o">:</span> <span class="n">M</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">m</span><span class="bp">*</span><span class="n">m'</span> <span class="bp">=</span> <span class="mi">1</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="n">m</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">m'</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="n">map_inv_of_inv</span> <span class="n">f</span> <span class="n">h</span> <span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MonoidHom₁</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="n">m'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">m</span><span class="bp">*</span><span class="n">m'</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">m'</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span> <span class="n">map_inv_of_inv</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">h</span> <span class="kd">example</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">S</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">RingHom₁</span> <span class="n">R</span> <span class="n">S</span><span class="o">)</span> <span class="o">{</span><span class="n">r</span> <span class="n">r'</span> <span class="o">:</span> <span class="n">R</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">r</span><span class="bp">*</span><span class="n">r'</span> <span class="bp">=</span> <span class="mi">1</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="n">r</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">r'</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="n">map_inv_of_inv</span> <span class="n">f</span> <span class="n">h</span> <span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">Ring</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Ring</span><span class="w"> </span><span class="n">S</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">RingHom₁</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="n">S</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">r</span><span class="w"> </span><span class="n">r'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">r</span><span class="bp">*</span><span class="n">r'</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">r'</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span> <span class="n">map_inv_of_inv</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>At first sight, it may look like we got back to our old bad idea of making <code class="docutils literal notranslate"><span class="pre">MonoidHom₁</span></code> a class.
-
@@ -797,16 +797,16 @@ to record that this pattern is used only for functions with extra properties, mecoercion to functions should be injective. So Mathlib adds one more layer of abstraction with the base class <code class="docutils literal notranslate"><span class="pre">DFunLike</span></code> (where “DFun” stands for dependent function). Let us redefine our <code class="docutils literal notranslate"><span class="pre">MonoidHomClass</span></code> on top of this base layer.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">MonoidHomClass₃</span> <span class="o">(</span><span class="n">F</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">(</span><span class="n">M</span> <span class="n">N</span> <span class="o">:</span> <span class="n">outParam</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">N</span><span class="o">]</span> <span class="kd">extends</span> <span class="n">DFunLike</span> <span class="n">F</span> <span class="n">M</span> <span class="o">(</span><span class="k">fun</span> <span class="n">_</span> <span class="bp">↦</span> <span class="n">N</span><span class="o">)</span> <span class="n">where</span> <span class="n">map_one</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">f</span> <span class="o">:</span> <span class="n">F</span><span class="o">,</span> <span class="n">f</span> <span class="mi">1</span> <span class="bp">=</span> <span class="mi">1</span> <span class="n">map_mul</span> <span class="o">:</span> <span class="bp">∀</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">F</span><span class="o">)</span> <span class="n">g</span> <span class="n">g'</span><span class="o">,</span> <span class="n">f</span> <span class="o">(</span><span class="n">g</span> <span class="bp">*</span> <span class="n">g'</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">g</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">g'</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">MonoidHomClass₃</span><span class="w"> </span><span class="o">(</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">outParam</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="kd">extends</span> <span class="w"> </span><span class="n">DFunLike</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">N</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">map_one</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">F</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span> <span class="w"> </span><span class="n">map_mul</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">g'</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g'</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g'</span> <span class="kd">instance</span> <span class="o">(</span><span class="n">M</span> <span class="n">N</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">N</span><span class="o">]</span> <span class="o">:</span> <span class="n">MonoidHomClass₃</span> <span class="o">(</span><span class="n">MonoidHom₁</span> <span class="n">M</span> <span class="n">N</span><span class="o">)</span> <span class="n">M</span> <span class="n">N</span> <span class="n">where</span> <span class="n">coe</span> <span class="o">:=</span> <span class="n">MonoidHom₁.toFun</span> <span class="n">coe_injective'</span> <span class="o">:=</span> <span class="n">MonoidHom₁.ext</span> <span class="n">map_one</span> <span class="o">:=</span> <span class="n">MonoidHom₁.map_one</span> <span class="n">map_mul</span> <span class="o">:=</span> <span class="n">MonoidHom₁.map_mul</span> <span class="kd">instance</span><span class="w"> </span><span class="o">(</span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MonoidHomClass₃</span><span class="w"> </span><span class="o">(</span><span class="n">MonoidHom₁</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="o">)</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">coe</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">MonoidHom₁.toFun</span> <span class="w"> </span><span class="n">coe_injective'</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">MonoidHom₁.ext</span> <span class="w"> </span><span class="n">map_one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">MonoidHom₁.map_one</span> <span class="w"> </span><span class="n">map_mul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">MonoidHom₁.map_mul</span> </pre></div> </div> <p>Of course the hierarchy of morphisms does not stop here. We could go on and define a class
-
@@ -820,24 +820,24 @@ Like continuous functions, order preserving functions are primarily unbundled inthey are defined by the <code class="docutils literal notranslate"><span class="pre">Monotone</span></code> predicate. Of course you need to complete the class definitions below.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">@[</span><span class="n">ext</span><span class="kd">]</span> <span class="kd">structure</span> <span class="n">OrderPresHom</span> <span class="o">(</span><span class="n">α</span> <span class="n">β</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">LE</span> <span class="n">α</span><span class="o">]</span> <span class="o">[</span><span class="n">LE</span> <span class="n">β</span><span class="o">]</span> <span class="n">where</span> <span class="n">toFun</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">β</span> <span class="n">le_of_le</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="n">a'</span><span class="o">,</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">a'</span> <span class="bp">→</span> <span class="n">toFun</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">toFun</span> <span class="n">a'</span> <span class="kd">structure</span><span class="w"> </span><span class="n">OrderPresHom</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">LE</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">LE</span><span class="w"> </span><span class="n">β</span><span class="o">]</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">β</span> <span class="w"> </span><span class="n">le_of_le</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">a'</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">a'</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">toFun</span><span class="w"> </span><span class="n">a'</span> <span class="kd">@[</span><span class="n">ext</span><span class="kd">]</span> <span class="kd">structure</span> <span class="n">OrderPresMonoidHom</span> <span class="o">(</span><span class="n">M</span> <span class="n">N</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">LE</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">N</span><span class="o">]</span> <span class="o">[</span><span class="n">LE</span> <span class="n">N</span><span class="o">]</span> <span class="kd">extends</span> <span class="n">MonoidHom₁</span> <span class="n">M</span> <span class="n">N</span><span class="o">,</span> <span class="n">OrderPresHom</span> <span class="n">M</span> <span class="n">N</span> <span class="kd">structure</span><span class="w"> </span><span class="n">OrderPresMonoidHom</span><span class="w"> </span><span class="o">(</span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">LE</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">LE</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="kd">extends</span> <span class="n">MonoidHom₁</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="o">,</span><span class="w"> </span><span class="n">OrderPresHom</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="n">N</span> <span class="kd">class</span> <span class="n">OrderPresHomClass</span> <span class="o">(</span><span class="n">F</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">(</span><span class="n">α</span> <span class="n">β</span> <span class="o">:</span> <span class="n">outParam</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">LE</span> <span class="n">α</span><span class="o">]</span> <span class="o">[</span><span class="n">LE</span> <span class="n">β</span><span class="o">]</span> <span class="kd">class</span><span class="w"> </span><span class="n">OrderPresHomClass</span><span class="w"> </span><span class="o">(</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">outParam</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">LE</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">LE</span><span class="w"> </span><span class="n">β</span><span class="o">]</span> <span class="kd">instance</span> <span class="o">(</span><span class="n">α</span> <span class="n">β</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">LE</span> <span class="n">α</span><span class="o">]</span> <span class="o">[</span><span class="n">LE</span> <span class="n">β</span><span class="o">]</span> <span class="o">:</span> <span class="n">OrderPresHomClass</span> <span class="o">(</span><span class="n">OrderPresHom</span> <span class="n">α</span> <span class="n">β</span><span class="o">)</span> <span class="n">α</span> <span class="n">β</span> <span class="n">where</span> <span class="kd">instance</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">LE</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">LE</span><span class="w"> </span><span class="n">β</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">OrderPresHomClass</span><span class="w"> </span><span class="o">(</span><span class="n">OrderPresHom</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="n">β</span><span class="o">)</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="n">where</span> <span class="kd">instance</span> <span class="o">(</span><span class="n">α</span> <span class="n">β</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">LE</span> <span class="n">α</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">α</span><span class="o">]</span> <span class="o">[</span><span class="n">LE</span> <span class="n">β</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">β</span><span class="o">]</span> <span class="o">:</span> <span class="n">OrderPresHomClass</span> <span class="o">(</span><span class="n">OrderPresMonoidHom</span> <span class="n">α</span> <span class="n">β</span><span class="o">)</span> <span class="n">α</span> <span class="n">β</span> <span class="n">where</span> <span class="kd">instance</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">LE</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">LE</span><span class="w"> </span><span class="n">β</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">β</span><span class="o">]</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">OrderPresHomClass</span><span class="w"> </span><span class="o">(</span><span class="n">OrderPresMonoidHom</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="n">β</span><span class="o">)</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="n">where</span> <span class="kd">instance</span> <span class="o">(</span><span class="n">α</span> <span class="n">β</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">LE</span> <span class="n">α</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">α</span><span class="o">]</span> <span class="o">[</span><span class="n">LE</span> <span class="n">β</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">β</span><span class="o">]</span> <span class="o">:</span> <span class="n">MonoidHomClass₃</span> <span class="o">(</span><span class="n">OrderPresMonoidHom</span> <span class="n">α</span> <span class="n">β</span><span class="o">)</span> <span class="n">α</span> <span class="n">β</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">instance</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">LE</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">LE</span><span class="w"> </span><span class="n">β</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">β</span><span class="o">]</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">MonoidHomClass₃</span><span class="w"> </span><span class="o">(</span><span class="n">OrderPresMonoidHom</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="n">β</span><span class="o">)</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="n">β</span> <span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> </section>
-
@@ -853,65 +853,65 @@ to <code class="docutils literal notranslate"><span class="pre">X</span> <span cfunction type, that class wraps an injection into a <code class="docutils literal notranslate"><span class="pre">Set</span></code> type and defines the corresponding coercion and <code class="docutils literal notranslate"><span class="pre">Membership</span></code> instance.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">@[</span><span class="n">ext</span><span class="kd">]</span> <span class="kd">structure</span> <span class="n">Submonoid₁</span> <span class="o">(</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="n">where</span> <span class="sd">/-- The carrier of a submonoid. -/</span> <span class="n">carrier</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">M</span> <span class="sd">/-- The product of two elements of a submonoid belongs to the submonoid. -/</span> <span class="n">mul_mem</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span><span class="o">}</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">carrier</span> <span class="bp">→</span> <span class="n">b</span> <span class="bp">∈</span> <span class="n">carrier</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">∈</span> <span class="n">carrier</span> <span class="sd">/-- The unit element belongs to the submonoid. -/</span> <span class="n">one_mem</span> <span class="o">:</span> <span class="mi">1</span> <span class="bp">∈</span> <span class="n">carrier</span> <span class="kd">structure</span><span class="w"> </span><span class="n">Submonoid₁</span><span class="w"> </span><span class="o">(</span><span class="n">M</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="sd">/-- The carrier of a submonoid. -/</span> <span class="w"> </span><span class="n">carrier</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">M</span> <span class="w"> </span><span class="sd">/-- The product of two elements of a submonoid belongs to the submonoid. -/</span> <span class="w"> </span><span class="n">mul_mem</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">carrier</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">carrier</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">carrier</span> <span class="w"> </span><span class="sd">/-- The unit element belongs to the submonoid. -/</span> <span class="w"> </span><span class="n">one_mem</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">carrier</span> <span class="sd">/-- Submonoids in `M` can be seen as sets in `M`. -/</span> <span class="kd">instance</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">:</span> <span class="n">SetLike</span> <span class="o">(</span><span class="n">Submonoid₁</span> <span class="n">M</span><span class="o">)</span> <span class="n">M</span> <span class="n">where</span> <span class="n">coe</span> <span class="o">:=</span> <span class="n">Submonoid₁.carrier</span> <span class="n">coe_injective'</span> <span class="o">:=</span> <span class="n">Submonoid₁.ext</span> <span class="kd">instance</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">SetLike</span><span class="w"> </span><span class="o">(</span><span class="n">Submonoid₁</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">coe</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Submonoid₁.carrier</span> <span class="w"> </span><span class="n">coe_injective'</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Submonoid₁.ext</span> </pre></div> </div> <p>Equipped with the above <code class="docutils literal notranslate"><span class="pre">SetLike</span></code> instance, we can already state naturally that a submonoid <code class="docutils literal notranslate"><span class="pre">N</span></code> contains <code class="docutils literal notranslate"><span class="pre">1</span></code> without using <code class="docutils literal notranslate"><span class="pre">N.carrier</span></code>. We can also silently treat <code class="docutils literal notranslate"><span class="pre">N</span></code> as a set in <code class="docutils literal notranslate"><span class="pre">M</span></code> as take its direct image under a map.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">N</span> <span class="o">:</span> <span class="n">Submonoid₁</span> <span class="n">M</span><span class="o">)</span> <span class="o">:</span> <span class="mi">1</span> <span class="bp">∈</span> <span class="n">N</span> <span class="o">:=</span> <span class="n">N.one_mem</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Submonoid₁</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">N.one_mem</span> <span class="kd">example</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">N</span> <span class="o">:</span> <span class="n">Submonoid₁</span> <span class="n">M</span><span class="o">)</span> <span class="o">(</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">M</span> <span class="bp">→</span> <span class="n">α</span><span class="o">)</span> <span class="o">:=</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">N</span> <span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Submonoid₁</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">N</span> </pre></div> </div> <p>We also have a coercion to <code class="docutils literal notranslate"><span class="pre">Type</span></code> which uses <code class="docutils literal notranslate"><span class="pre">Subtype</span></code> so, given a submonoid <code class="docutils literal notranslate"><span class="pre">N</span></code> we can write a parameter <code class="docutils literal notranslate"><span class="pre">(x</span> <span class="pre">:</span> <span class="pre">N)</span></code> which can be coerced to an element of <code class="docutils literal notranslate"><span class="pre">M</span></code> belonging to <code class="docutils literal notranslate"><span class="pre">N</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">N</span> <span class="o">:</span> <span class="n">Submonoid₁</span> <span class="n">M</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">N</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">M</span><span class="o">)</span> <span class="bp">∈</span> <span class="n">N</span> <span class="o">:=</span> <span class="n">x.property</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Submonoid₁</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">N</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">x.property</span> </pre></div> </div> <p>Using this coercion to <code class="docutils literal notranslate"><span class="pre">Type</span></code> we can also tackle the task of equipping a submonoid with a monoid structure. We will use the coercion from the type associated to <code class="docutils literal notranslate"><span class="pre">N</span></code> as above, and the lemma <code class="docutils literal notranslate"><span class="pre">SetCoe.ext</span></code> asserting this coercion is injective. Both are provided by the <code class="docutils literal notranslate"><span class="pre">SetLike</span></code> instance.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="n">SubMonoid₁Monoid</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">N</span> <span class="o">:</span> <span class="n">Submonoid₁</span> <span class="n">M</span><span class="o">)</span> <span class="o">:</span> <span class="n">Monoid</span> <span class="n">N</span> <span class="n">where</span> <span class="n">mul</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">x</span> <span class="n">y</span> <span class="bp">↦</span> <span class="o">⟨</span><span class="n">x</span><span class="bp">*</span><span class="n">y</span><span class="o">,</span> <span class="n">N.mul_mem</span> <span class="n">x.property</span> <span class="n">y.property</span><span class="o">⟩</span> <span class="n">mul_assoc</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="bp">↦</span> <span class="n">SetCoe.ext</span> <span class="o">(</span><span class="n">mul_assoc</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">M</span><span class="o">)</span> <span class="n">y</span> <span class="n">z</span><span class="o">)</span> <span class="n">one</span> <span class="o">:=</span> <span class="o">⟨</span><span class="mi">1</span><span class="o">,</span> <span class="n">N.one_mem</span><span class="o">⟩</span> <span class="n">one_mul</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">SetCoe.ext</span> <span class="o">(</span><span class="n">one_mul</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">M</span><span class="o">))</span> <span class="n">mul_one</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">SetCoe.ext</span> <span class="o">(</span><span class="n">mul_one</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">M</span><span class="o">))</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="n">SubMonoid₁Monoid</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Submonoid₁</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Monoid</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">⟨</span><span class="n">x</span><span class="bp">*</span><span class="n">y</span><span class="o">,</span><span class="w"> </span><span class="n">N.mul_mem</span><span class="w"> </span><span class="n">x.property</span><span class="w"> </span><span class="n">y.property</span><span class="o">⟩</span> <span class="w"> </span><span class="n">mul_assoc</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">SetCoe.ext</span><span class="w"> </span><span class="o">(</span><span class="n">mul_assoc</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="o">)</span> <span class="w"> </span><span class="n">one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">⟨</span><span class="mi">1</span><span class="o">,</span><span class="w"> </span><span class="n">N.one_mem</span><span class="o">⟩</span> <span class="w"> </span><span class="n">one_mul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">SetCoe.ext</span><span class="w"> </span><span class="o">(</span><span class="n">one_mul</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">))</span> <span class="w"> </span><span class="n">mul_one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">SetCoe.ext</span><span class="w"> </span><span class="o">(</span><span class="n">mul_one</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">))</span> </pre></div> </div> <p>Note that, in the above instance, instead of using the coercion to <code class="docutils literal notranslate"><span class="pre">M</span></code> and calling the <code class="docutils literal notranslate"><span class="pre">property</span></code> field, we could have used destructuring binders as follows.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">N</span> <span class="o">:</span> <span class="n">Submonoid₁</span> <span class="n">M</span><span class="o">)</span> <span class="o">:</span> <span class="n">Monoid</span> <span class="n">N</span> <span class="n">where</span> <span class="n">mul</span> <span class="o">:=</span> <span class="k">fun</span> <span class="o">⟨</span><span class="n">x</span><span class="o">,</span> <span class="n">hx</span><span class="o">⟩</span> <span class="o">⟨</span><span class="n">y</span><span class="o">,</span> <span class="n">hy</span><span class="o">⟩</span> <span class="bp">↦</span> <span class="o">⟨</span><span class="n">x</span><span class="bp">*</span><span class="n">y</span><span class="o">,</span> <span class="n">N.mul_mem</span> <span class="n">hx</span> <span class="n">hy</span><span class="o">⟩</span> <span class="n">mul_assoc</span> <span class="o">:=</span> <span class="k">fun</span> <span class="o">⟨</span><span class="n">x</span><span class="o">,</span> <span class="n">_</span><span class="o">⟩</span> <span class="o">⟨</span><span class="n">y</span><span class="o">,</span> <span class="n">_</span><span class="o">⟩</span> <span class="o">⟨</span><span class="n">z</span><span class="o">,</span> <span class="n">_</span><span class="o">⟩</span> <span class="bp">↦</span> <span class="n">SetCoe.ext</span> <span class="o">(</span><span class="n">mul_assoc</span> <span class="n">x</span> <span class="n">y</span> <span class="n">z</span><span class="o">)</span> <span class="n">one</span> <span class="o">:=</span> <span class="o">⟨</span><span class="mi">1</span><span class="o">,</span> <span class="n">N.one_mem</span><span class="o">⟩</span> <span class="n">one_mul</span> <span class="o">:=</span> <span class="k">fun</span> <span class="o">⟨</span><span class="n">x</span><span class="o">,</span> <span class="n">_</span><span class="o">⟩</span> <span class="bp">↦</span> <span class="n">SetCoe.ext</span> <span class="o">(</span><span class="n">one_mul</span> <span class="n">x</span><span class="o">)</span> <span class="n">mul_one</span> <span class="o">:=</span> <span class="k">fun</span> <span class="o">⟨</span><span class="n">x</span><span class="o">,</span> <span class="n">_</span><span class="o">⟩</span> <span class="bp">↦</span> <span class="n">SetCoe.ext</span> <span class="o">(</span><span class="n">mul_one</span> <span class="n">x</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Submonoid₁</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Monoid</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="o">⟨</span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">hx</span><span class="o">⟩</span><span class="w"> </span><span class="o">⟨</span><span class="n">y</span><span class="o">,</span><span class="w"> </span><span class="n">hy</span><span class="o">⟩</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">⟨</span><span class="n">x</span><span class="bp">*</span><span class="n">y</span><span class="o">,</span><span class="w"> </span><span class="n">N.mul_mem</span><span class="w"> </span><span class="n">hx</span><span class="w"> </span><span class="n">hy</span><span class="o">⟩</span> <span class="w"> </span><span class="n">mul_assoc</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="o">⟨</span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">_</span><span class="o">⟩</span><span class="w"> </span><span class="o">⟨</span><span class="n">y</span><span class="o">,</span><span class="w"> </span><span class="n">_</span><span class="o">⟩</span><span class="w"> </span><span class="o">⟨</span><span class="n">z</span><span class="o">,</span><span class="w"> </span><span class="n">_</span><span class="o">⟩</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">SetCoe.ext</span><span class="w"> </span><span class="o">(</span><span class="n">mul_assoc</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="o">)</span> <span class="w"> </span><span class="n">one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">⟨</span><span class="mi">1</span><span class="o">,</span><span class="w"> </span><span class="n">N.one_mem</span><span class="o">⟩</span> <span class="w"> </span><span class="n">one_mul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="o">⟨</span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">_</span><span class="o">⟩</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">SetCoe.ext</span><span class="w"> </span><span class="o">(</span><span class="n">one_mul</span><span class="w"> </span><span class="n">x</span><span class="o">)</span> <span class="w"> </span><span class="n">mul_one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="o">⟨</span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">_</span><span class="o">⟩</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">SetCoe.ext</span><span class="w"> </span><span class="o">(</span><span class="n">mul_one</span><span class="w"> </span><span class="n">x</span><span class="o">)</span> </pre></div> </div> <p>In order to apply lemmas about submonoids to subgroups or subrings, we need a class, just like for morphisms. Note this class take a <code class="docutils literal notranslate"><span class="pre">SetLike</span></code> instance as a parameter so it does not need a carrier field and can use the membership notation in its fields.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span> <span class="n">SubmonoidClass₁</span> <span class="o">(</span><span class="n">S</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">(</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="o">)</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">SetLike</span> <span class="n">S</span> <span class="n">M</span><span class="o">]</span> <span class="o">:</span> <span class="kt">Prop</span> <span class="n">where</span> <span class="n">mul_mem</span> <span class="o">:</span> <span class="bp">∀</span> <span class="o">(</span><span class="n">s</span> <span class="o">:</span> <span class="n">S</span><span class="o">)</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">M</span><span class="o">},</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">s</span> <span class="bp">→</span> <span class="n">b</span> <span class="bp">∈</span> <span class="n">s</span> <span class="bp">→</span> <span class="n">a</span> <span class="bp">*</span> <span class="n">b</span> <span class="bp">∈</span> <span class="n">s</span> <span class="n">one_mem</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">s</span> <span class="o">:</span> <span class="n">S</span><span class="o">,</span> <span class="mi">1</span> <span class="bp">∈</span> <span class="n">s</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">class</span><span class="w"> </span><span class="n">SubmonoidClass₁</span><span class="w"> </span><span class="o">(</span><span class="n">S</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">M</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">SetLike</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Prop</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">mul_mem</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">S</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">},</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span> <span class="w"> </span><span class="n">one_mem</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">S</span><span class="o">,</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span> <span class="kd">instance</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">:</span> <span class="n">SubmonoidClass₁</span> <span class="o">(</span><span class="n">Submonoid₁</span> <span class="n">M</span><span class="o">)</span> <span class="n">M</span> <span class="n">where</span> <span class="n">mul_mem</span> <span class="o">:=</span> <span class="n">Submonoid₁.mul_mem</span> <span class="n">one_mem</span> <span class="o">:=</span> <span class="n">Submonoid₁.one_mem</span> <span class="kd">instance</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">SubmonoidClass₁</span><span class="w"> </span><span class="o">(</span><span class="n">Submonoid₁</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">mul_mem</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Submonoid₁.mul_mem</span> <span class="w"> </span><span class="n">one_mem</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Submonoid₁.one_mem</span> </pre></div> </div> <p>As an exercise you should define a <code class="docutils literal notranslate"><span class="pre">Subgroup₁</span></code> structure, endow it with a <code class="docutils literal notranslate"><span class="pre">SetLike</span></code> instance
-
@@ -921,15 +921,15 @@ and a <code class="docutils literal notranslate"><span class="pre">SubmonoidClasalways form a complete lattice, and this structure is used a lot. For instance you may look for the lemma saying that an intersection of submonoids is a submonoid. But this won’t be a lemma, this will be an infimum construction. Let us do the case of two submonoids.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">:</span> <span class="n">Inf</span> <span class="o">(</span><span class="n">Submonoid₁</span> <span class="n">M</span><span class="o">)</span> <span class="o">:=</span> <span class="o">⟨</span><span class="k">fun</span> <span class="n">S₁</span> <span class="n">S₂</span> <span class="bp">↦</span> <span class="o">{</span> <span class="n">carrier</span> <span class="o">:=</span> <span class="n">S₁</span> <span class="bp">∩</span> <span class="n">S₂</span> <span class="n">one_mem</span> <span class="o">:=</span> <span class="o">⟨</span><span class="n">S₁.one_mem</span><span class="o">,</span> <span class="n">S₂.one_mem</span><span class="o">⟩</span> <span class="n">mul_mem</span> <span class="o">:=</span> <span class="k">fun</span> <span class="o">⟨</span><span class="n">hx</span><span class="o">,</span> <span class="n">hx'</span><span class="o">⟩</span> <span class="o">⟨</span><span class="n">hy</span><span class="o">,</span> <span class="n">hy'</span><span class="o">⟩</span> <span class="bp">↦</span> <span class="o">⟨</span><span class="n">S₁.mul_mem</span> <span class="n">hx</span> <span class="n">hy</span><span class="o">,</span> <span class="n">S₂.mul_mem</span> <span class="n">hx'</span> <span class="n">hy'</span><span class="o">⟩</span> <span class="o">}⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">instance</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Inf</span><span class="w"> </span><span class="o">(</span><span class="n">Submonoid₁</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="k">fun</span><span class="w"> </span><span class="n">S₁</span><span class="w"> </span><span class="n">S₂</span><span class="w"> </span><span class="bp">↦</span> <span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">carrier</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">S₁</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">S₂</span> <span class="w"> </span><span class="n">one_mem</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">⟨</span><span class="n">S₁.one_mem</span><span class="o">,</span><span class="w"> </span><span class="n">S₂.one_mem</span><span class="o">⟩</span> <span class="w"> </span><span class="n">mul_mem</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="o">⟨</span><span class="n">hx</span><span class="o">,</span><span class="w"> </span><span class="n">hx'</span><span class="o">⟩</span><span class="w"> </span><span class="o">⟨</span><span class="n">hy</span><span class="o">,</span><span class="w"> </span><span class="n">hy'</span><span class="o">⟩</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">⟨</span><span class="n">S₁.mul_mem</span><span class="w"> </span><span class="n">hx</span><span class="w"> </span><span class="n">hy</span><span class="o">,</span><span class="w"> </span><span class="n">S₂.mul_mem</span><span class="w"> </span><span class="n">hx'</span><span class="w"> </span><span class="n">hy'</span><span class="o">⟩</span><span class="w"> </span><span class="o">}⟩</span> </pre></div> </div> <p>This allows to get the intersections of two submonoids as a submonoid.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">N</span> <span class="n">P</span> <span class="o">:</span> <span class="n">Submonoid₁</span> <span class="n">M</span><span class="o">)</span> <span class="o">:</span> <span class="n">Submonoid₁</span> <span class="n">M</span> <span class="o">:=</span> <span class="n">N</span> <span class="bp">⊓</span> <span class="n">P</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">N</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Submonoid₁</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Submonoid₁</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">P</span> </pre></div> </div> <p>You may think it’s a shame that we had to use the inf symbol <code class="docutils literal notranslate"><span class="pre">⊓</span></code> in the above example instead
-
@@ -951,31 +951,31 @@ is the <code class="docutils literal notranslate"><span class="pre">HasQuotient<to you. In the last example, you can use <code class="docutils literal notranslate"><span class="pre">Setoid.refl</span></code> but it won’t automatically pick up the relevant <code class="docutils literal notranslate"><span class="pre">Setoid</span></code> structure. You can fix this issue by providing all arguments using the <code class="docutils literal notranslate"><span class="pre">@</span></code> syntax, as in <code class="docutils literal notranslate"><span class="pre">@Setoid.refl</span> <span class="pre">M</span> <span class="pre">N.Setoid</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">Submonoid.Setoid</span> <span class="o">[</span><span class="n">CommMonoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">N</span> <span class="o">:</span> <span class="n">Submonoid</span> <span class="n">M</span><span class="o">)</span> <span class="o">:</span> <span class="n">Setoid</span> <span class="n">M</span> <span class="n">where</span> <span class="n">r</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">x</span> <span class="n">y</span> <span class="bp">↦</span> <span class="bp">∃</span> <span class="n">w</span> <span class="bp">∈</span> <span class="n">N</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">z</span> <span class="bp">∈</span> <span class="n">N</span><span class="o">,</span> <span class="n">x</span><span class="bp">*</span><span class="n">w</span> <span class="bp">=</span> <span class="n">y</span><span class="bp">*</span><span class="n">z</span> <span class="n">iseqv</span> <span class="o">:=</span> <span class="o">{</span> <span class="n">refl</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="o">⟨</span><span class="mi">1</span><span class="o">,</span> <span class="n">N.one_mem</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="n">N.one_mem</span><span class="o">,</span> <span class="n">rfl</span><span class="o">⟩</span> <span class="n">symm</span> <span class="o">:=</span> <span class="k">fun</span> <span class="o">⟨</span><span class="n">w</span><span class="o">,</span> <span class="n">hw</span><span class="o">,</span> <span class="n">z</span><span class="o">,</span> <span class="n">hz</span><span class="o">,</span> <span class="n">h</span><span class="o">⟩</span> <span class="bp">↦</span> <span class="o">⟨</span><span class="n">z</span><span class="o">,</span> <span class="n">hz</span><span class="o">,</span> <span class="n">w</span><span class="o">,</span> <span class="n">hw</span><span class="o">,</span> <span class="n">h.symm</span><span class="o">⟩</span> <span class="n">trans</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="o">}</span> <span class="kd">instance</span> <span class="o">[</span><span class="n">CommMonoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">:</span> <span class="n">HasQuotient</span> <span class="n">M</span> <span class="o">(</span><span class="n">Submonoid</span> <span class="n">M</span><span class="o">)</span> <span class="n">where</span> <span class="n">quotient'</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">N</span> <span class="bp">↦</span> <span class="n">Quotient</span> <span class="n">N.Setoid</span> <span class="kd">def</span> <span class="n">QuotientMonoid.mk</span> <span class="o">[</span><span class="n">CommMonoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">N</span> <span class="o">:</span> <span class="n">Submonoid</span> <span class="n">M</span><span class="o">)</span> <span class="o">:</span> <span class="n">M</span> <span class="bp">→</span> <span class="n">M</span> <span class="bp">⧸</span> <span class="n">N</span> <span class="o">:=</span> <span class="n">Quotient.mk</span> <span class="n">N.Setoid</span> <span class="kd">instance</span> <span class="o">[</span><span class="n">CommMonoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">N</span> <span class="o">:</span> <span class="n">Submonoid</span> <span class="n">M</span><span class="o">)</span> <span class="o">:</span> <span class="n">Monoid</span> <span class="o">(</span><span class="n">M</span> <span class="bp">⧸</span> <span class="n">N</span><span class="o">)</span> <span class="n">where</span> <span class="n">mul</span> <span class="o">:=</span> <span class="n">Quotient.map₂'</span> <span class="o">(</span><span class="bp">·</span> <span class="bp">*</span> <span class="bp">·</span><span class="o">)</span> <span class="o">(</span><span class="kd">by</span> <span class="gr">sorry</span> <span class="o">)</span> <span class="n">mul_assoc</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">one</span> <span class="o">:=</span> <span class="n">QuotientMonoid.mk</span> <span class="n">N</span> <span class="mi">1</span> <span class="n">one_mul</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">mul_one</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">Submonoid.Setoid</span><span class="w"> </span><span class="o">[</span><span class="n">CommMonoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Submonoid</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Setoid</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">N</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">N</span><span class="o">,</span><span class="w"> </span><span class="n">x</span><span class="bp">*</span><span class="n">w</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">y</span><span class="bp">*</span><span class="n">z</span> <span class="w"> </span><span class="n">iseqv</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">{</span> <span class="w"> </span><span class="n">refl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">⟨</span><span class="mi">1</span><span class="o">,</span><span class="w"> </span><span class="n">N.one_mem</span><span class="o">,</span><span class="w"> </span><span class="mi">1</span><span class="o">,</span><span class="w"> </span><span class="n">N.one_mem</span><span class="o">,</span><span class="w"> </span><span class="n">rfl</span><span class="o">⟩</span> <span class="w"> </span><span class="n">symm</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="o">⟨</span><span class="n">w</span><span class="o">,</span><span class="w"> </span><span class="n">hw</span><span class="o">,</span><span class="w"> </span><span class="n">z</span><span class="o">,</span><span class="w"> </span><span class="n">hz</span><span class="o">,</span><span class="w"> </span><span class="n">h</span><span class="o">⟩</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">⟨</span><span class="n">z</span><span class="o">,</span><span class="w"> </span><span class="n">hz</span><span class="o">,</span><span class="w"> </span><span class="n">w</span><span class="o">,</span><span class="w"> </span><span class="n">hw</span><span class="o">,</span><span class="w"> </span><span class="n">h.symm</span><span class="o">⟩</span> <span class="w"> </span><span class="n">trans</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="o">}</span> <span class="kd">instance</span><span class="w"> </span><span class="o">[</span><span class="n">CommMonoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">HasQuotient</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="o">(</span><span class="n">Submonoid</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">quotient'</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">Quotient</span><span class="w"> </span><span class="n">N.Setoid</span> <span class="kd">def</span><span class="w"> </span><span class="n">QuotientMonoid.mk</span><span class="w"> </span><span class="o">[</span><span class="n">CommMonoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Submonoid</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Quotient.mk</span><span class="w"> </span><span class="n">N.Setoid</span> <span class="kd">instance</span><span class="w"> </span><span class="o">[</span><span class="n">CommMonoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Submonoid</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Monoid</span><span class="w"> </span><span class="o">(</span><span class="n">M</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">N</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">mul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Quotient.map₂'</span><span class="w"> </span><span class="o">(</span><span class="bp">·</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="bp">·</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="o">)</span> <span class="w"> </span><span class="n">mul_assoc</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">QuotientMonoid.mk</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="mi">1</span> <span class="w"> </span><span class="n">one_mul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">mul_one</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> </section>
-
-
-
@@ -18,7 +18,7 @@<script src="_static/jquery.js?v=5d32c60e"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/documentation_options.js?v=2709fde1"></script> <script src="_static/doctools.js?v=888ff710"></script> <script src="_static/doctools.js?v=9a2dae69"></script> <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script>
-
@@ -145,9 +145,9 @@ argument (in other words, in square brackets).By default, <code class="docutils literal notranslate"><span class="pre">Monoid</span></code> uses multiplicative notation for the operation; for additive notation use <code class="docutils literal notranslate"><span class="pre">AddMonoid</span></code> instead. The commutative versions of these structures add the prefix <code class="docutils literal notranslate"><span class="pre">Comm</span></code> before <code class="docutils literal notranslate"><span class="pre">Monoid</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">M</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">*</span> <span class="mi">1</span> <span class="bp">=</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">mul_one</span> <span class="n">x</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">M</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">mul_one</span><span class="w"> </span><span class="n">x</span> <span class="kd">example</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">AddCommMonoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">M</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">y</span> <span class="bp">=</span> <span class="n">y</span> <span class="bp">+</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">add_comm</span> <span class="n">x</span> <span class="n">y</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">M</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">AddCommMonoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">add_comm</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span> </pre></div> </div> <p>Note that although <code class="docutils literal notranslate"><span class="pre">AddMonoid</span></code> is found in the library,
-
@@ -156,19 +156,19 @@ it is generally confusing to use additive notation with a non-commutative operat<code class="docutils literal notranslate"><span class="pre">M</span> <span class="pre">→*</span> <span class="pre">N</span></code>. Lean will automatically see such a morphism as a function from <code class="docutils literal notranslate"><span class="pre">M</span></code> to <code class="docutils literal notranslate"><span class="pre">N</span></code> when we apply it to elements of <code class="docutils literal notranslate"><span class="pre">M</span></code>. The additive version is called <code class="docutils literal notranslate"><span class="pre">AddMonoidHom</span></code> and written <code class="docutils literal notranslate"><span class="pre">M</span> <span class="pre">→+</span> <span class="pre">N</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">M</span> <span class="n">N</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">N</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">M</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">M</span> <span class="bp">→*</span> <span class="n">N</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">y</span> <span class="o">:=</span> <span class="n">f.map_mul</span> <span class="n">x</span> <span class="n">y</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">N</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">f.map_mul</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span> <span class="kd">example</span> <span class="o">{</span><span class="n">M</span> <span class="n">N</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">AddMonoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">AddMonoid</span> <span class="n">N</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">M</span> <span class="bp">→+</span> <span class="n">N</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="mi">0</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="n">f.map_zero</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">AddMonoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">AddMonoid</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="bp">→+</span><span class="w"> </span><span class="n">N</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">f.map_zero</span> </pre></div> </div> <p>These morphisms are bundled maps, i.e. they package together a map and some of its properties. Remember that <a class="reference internal" href="C07_Hierarchies.html#section-hierarchies-morphisms"><span class="std std-numref">Section 7.2</span></a> explains bundled maps; here we simply note the slightly unfortunate consequence that we cannot use ordinary function composition to compose maps. Instead, we need to use <code class="docutils literal notranslate"><span class="pre">MonoidHom.comp</span></code> and <code class="docutils literal notranslate"><span class="pre">AddMonoidHom.comp</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">M</span> <span class="n">N</span> <span class="n">P</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">AddMonoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">[</span><span class="n">AddMonoid</span> <span class="n">N</span><span class="o">]</span> <span class="o">[</span><span class="n">AddMonoid</span> <span class="n">P</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">M</span> <span class="bp">→+</span> <span class="n">N</span><span class="o">)</span> <span class="o">(</span><span class="n">g</span> <span class="o">:</span> <span class="n">N</span> <span class="bp">→+</span> <span class="n">P</span><span class="o">)</span> <span class="o">:</span> <span class="n">M</span> <span class="bp">→+</span> <span class="n">P</span> <span class="o">:=</span> <span class="n">g.comp</span> <span class="n">f</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">AddMonoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">AddMonoid</span><span class="w"> </span><span class="n">N</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">AddMonoid</span><span class="w"> </span><span class="n">P</span><span class="o">]</span> <span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="bp">→+</span><span class="w"> </span><span class="n">N</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="bp">→+</span><span class="w"> </span><span class="n">P</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="bp">→+</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">g.comp</span><span class="w"> </span><span class="n">f</span> </pre></div> </div> </section>
-
@@ -176,31 +176,31 @@ composition to compose maps. Instead, we need to use <code class="docutils liter<h3><span class="section-number">8.1.2. </span>Groups and their morphisms<a class="headerlink" href="#groups-and-their-morphisms" title="Link to this heading"></a></h3> <p>We will have much more to say about groups, which are monoids with the extra property that every element has an inverse.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">x</span><span class="bp">⁻¹</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="n">mul_inv_self</span> <span class="n">x</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">x</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">mul_inv_self</span><span class="w"> </span><span class="n">x</span> </pre></div> </div> <p id="index-2">Similar to the <code class="docutils literal notranslate"><span class="pre">ring</span></code> tactic that we saw earlier, there is a <code class="docutils literal notranslate"><span class="pre">group</span></code> tactic that proves any identity that holds in any group. (Equivalently, it proves the identities that hold in free groups.)</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">*</span> <span class="o">(</span><span class="n">y</span> <span class="bp">*</span> <span class="n">z</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">z</span><span class="o">)</span><span class="bp">⁻¹</span> <span class="bp">*</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span> <span class="bp">*</span> <span class="n">x</span><span class="bp">⁻¹</span><span class="o">)</span><span class="bp">⁻¹</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">group</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">y</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">z</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">z</span><span class="o">)</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">x</span><span class="bp">⁻¹</span><span class="o">)</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">group</span> </pre></div> </div> <p id="index-3">There is also a tactic for identities in commutative additive groups called <code class="docutils literal notranslate"><span class="pre">abel</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">AddCommGroup</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="n">z</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">z</span> <span class="bp">+</span> <span class="n">x</span> <span class="bp">+</span> <span class="o">(</span><span class="n">y</span> <span class="bp">-</span> <span class="n">z</span> <span class="bp">-</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">abel</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">AddCommGroup</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="o">(</span><span class="n">y</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">abel</span> </pre></div> </div> <p>Interestingly, a group morphism is nothing more than a monoid morphism between groups. So we can copy and paste one of our earlier examples, replacing <code class="docutils literal notranslate"><span class="pre">Monoid</span></code> with <code class="docutils literal notranslate"><span class="pre">Group</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">y</span> <span class="o">:=</span> <span class="n">f.map_mul</span> <span class="n">x</span> <span class="n">y</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">H</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">f.map_mul</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span> </pre></div> </div> <p>Of course we do get some new properties, such as this one:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="o">(</span><span class="n">x</span><span class="bp">⁻¹</span><span class="o">)</span> <span class="bp">=</span> <span class="o">(</span><span class="n">f</span> <span class="n">x</span><span class="o">)</span><span class="bp">⁻¹</span> <span class="o">:=</span> <span class="n">f.map_inv</span> <span class="n">x</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">H</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="bp">⁻¹</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="bp">⁻¹</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">f.map_inv</span><span class="w"> </span><span class="n">x</span> </pre></div> </div> <p>You may be worried that constructing group morphisms will require us to do unnecessary work since
-
@@ -208,9 +208,9 @@ the definition of monoid morphism enforces that neutral elements are sent to neuwhile this is automatic in the case of group morphisms. In practice the extra work is not hard, but, to avoid it, there is a function building a group morphism from a function between groups that is compatible with the composition laws.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="n">y</span><span class="o">,</span> <span class="n">f</span> <span class="o">(</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">f</span> <span class="n">y</span><span class="o">)</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span> <span class="o">:=</span> <span class="n">MonoidHom.mk'</span> <span class="n">f</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">H</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">MonoidHom.mk'</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>There is also a type <code class="docutils literal notranslate"><span class="pre">MulEquiv</span></code> of group (or monoid) isomorphisms denoted by <code class="docutils literal notranslate"><span class="pre">≃*</span></code> (and
-
@@ -221,17 +221,17 @@ the identity isomorphism of <code class="docutils literal notranslate"><span claUsing anonymous projector notation, the first two can be written <code class="docutils literal notranslate"><span class="pre">f.symm</span></code> and <code class="docutils literal notranslate"><span class="pre">f.trans</span> <span class="pre">g</span></code> respectively. Elements of this type are automatically coerced to morphisms and functions when necessary.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">≃*</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">f.trans</span> <span class="n">f.symm</span> <span class="bp">=</span> <span class="n">MulEquiv.refl</span> <span class="n">G</span> <span class="o">:=</span> <span class="n">f.self_trans_symm</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">H</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">≃*</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">f.trans</span><span class="w"> </span><span class="n">f.symm</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">MulEquiv.refl</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">f.self_trans_symm</span> </pre></div> </div> <p>One can use <code class="docutils literal notranslate"><span class="pre">MulEquiv.ofBijective</span></code> to build an isomorphism from a bijective morphism. Doing so makes the inverse function noncomputable.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">Function.Bijective</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">≃*</span> <span class="n">H</span> <span class="o">:=</span> <span class="n">MulEquiv.ofBijective</span> <span class="n">f</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span><span class="w"> </span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">H</span><span class="o">]</span> <span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Function.Bijective</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">≃*</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">MulEquiv.ofBijective</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> </section>
-
@@ -239,13 +239,13 @@ Doing so makes the inverse function noncomputable.</p><h3><span class="section-number">8.1.3. </span>Subgroups<a class="headerlink" href="#subgroups" title="Link to this heading"></a></h3> <p>Just as group morphisms are bundled, a subgroup of <code class="docutils literal notranslate"><span class="pre">G</span></code> is also a bundled structure consisting of a set in <code class="docutils literal notranslate"><span class="pre">G</span></code> with the relevant closure properties.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">{</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">G</span><span class="o">}</span> <span class="o">(</span><span class="n">hx</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">hy</span> <span class="o">:</span> <span class="n">y</span> <span class="bp">∈</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">y</span> <span class="bp">∈</span> <span class="n">H</span> <span class="o">:=</span> <span class="n">H.mul_mem</span> <span class="n">hx</span> <span class="n">hy</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hx</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hy</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">H.mul_mem</span><span class="w"> </span><span class="n">hx</span><span class="w"> </span><span class="n">hy</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">G</span><span class="o">}</span> <span class="o">(</span><span class="n">hx</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span><span class="bp">⁻¹</span> <span class="bp">∈</span> <span class="n">H</span> <span class="o">:=</span> <span class="n">H.inv_mem</span> <span class="n">hx</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hx</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">x</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">H.inv_mem</span><span class="w"> </span><span class="n">hx</span> </pre></div> </div> <p>In the example above, it is important to understand that <code class="docutils literal notranslate"><span class="pre">Subgroup</span> <span class="pre">G</span></code> is the type of subgroups
-
@@ -258,29 +258,29 @@ equal in the same way it is used to prove that two sets are equal.</p><p>To state and prove, for example, that <code class="docutils literal notranslate"><span class="pre">ℤ</span></code> is an additive subgroup of <code class="docutils literal notranslate"><span class="pre">ℚ</span></code>, what we really want is to construct a term of type <code class="docutils literal notranslate"><span class="pre">AddSubgroup</span> <span class="pre">ℚ</span></code> whose projection to <code class="docutils literal notranslate"><span class="pre">Set</span> <span class="pre">ℚ</span></code> is <code class="docutils literal notranslate"><span class="pre">ℤ</span></code>, or, more precisely, the image of <code class="docutils literal notranslate"><span class="pre">ℤ</span></code> in <code class="docutils literal notranslate"><span class="pre">ℚ</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">AddSubgroup</span> <span class="n">ℚ</span> <span class="n">where</span> <span class="n">carrier</span> <span class="o">:=</span> <span class="n">Set.range</span> <span class="o">((</span><span class="bp">↑</span><span class="o">)</span> <span class="o">:</span> <span class="n">ℤ</span> <span class="bp">→</span> <span class="n">ℚ</span><span class="o">)</span> <span class="n">add_mem'</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rintro</span> <span class="n">_</span> <span class="n">_</span> <span class="o">⟨</span><span class="n">n</span><span class="o">,</span> <span class="n">rfl</span><span class="o">⟩</span> <span class="o">⟨</span><span class="n">m</span><span class="o">,</span> <span class="n">rfl</span><span class="o">⟩</span> <span class="n">use</span> <span class="n">n</span> <span class="bp">+</span> <span class="n">m</span> <span class="n">simp</span> <span class="n">zero_mem'</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">use</span> <span class="mi">0</span> <span class="n">simp</span> <span class="n">neg_mem'</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rintro</span> <span class="n">_</span> <span class="o">⟨</span><span class="n">n</span><span class="o">,</span> <span class="n">rfl</span><span class="o">⟩</span> <span class="n">use</span> <span class="bp">-</span><span class="n">n</span> <span class="n">simp</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">AddSubgroup</span><span class="w"> </span><span class="n">ℚ</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">carrier</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Set.range</span><span class="w"> </span><span class="o">((</span><span class="bp">↑</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℤ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℚ</span><span class="o">)</span> <span class="w"> </span><span class="n">add_mem'</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">⟨</span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">rfl</span><span class="o">⟩</span><span class="w"> </span><span class="o">⟨</span><span class="n">m</span><span class="o">,</span><span class="w"> </span><span class="n">rfl</span><span class="o">⟩</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">m</span> <span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">zero_mem'</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="mi">0</span> <span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">neg_mem'</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">⟨</span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">rfl</span><span class="o">⟩</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="bp">-</span><span class="n">n</span> <span class="w"> </span><span class="n">simp</span> </pre></div> </div> <p>Using type classes, Mathlib knows that a subgroup of a group inherits a group structure.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">Group</span> <span class="n">H</span> <span class="o">:=</span> <span class="n">inferInstance</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Group</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">inferInstance</span> </pre></div> </div> <p>This example is subtle. The object <code class="docutils literal notranslate"><span class="pre">H</span></code> is not a type, but Lean automatically coerces it to a type by interpreting it as a subtype of <code class="docutils literal notranslate"><span class="pre">G</span></code>. So the above example can be restated more explicitly as:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">Group</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">//</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">H</span><span class="o">}</span> <span class="o">:=</span> <span class="n">inferInstance</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Group</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">//</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">H</span><span class="o">}</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">inferInstance</span> </pre></div> </div> <p>An important benefit of having a type <code class="docutils literal notranslate"><span class="pre">Subgroup</span> <span class="pre">G</span></code> instead of a predicate
-
@@ -292,8 +292,8 @@ have used the lattice operation <code class="docutils literal notranslate"><spanlemmas about lattices to the construction.</p> <p>Let us check that the set underlying the infimum of two subgroups is indeed, by definition, their intersection.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="n">H'</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="o">((</span><span class="n">H</span> <span class="bp">⊓</span> <span class="n">H'</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">G</span><span class="o">)</span> <span class="bp">=</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">G</span><span class="o">)</span> <span class="bp">∩</span> <span class="o">(</span><span class="n">H'</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">G</span><span class="o">)</span> <span class="o">:=</span> <span class="n">rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">H</span><span class="w"> </span><span class="n">H'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="o">((</span><span class="n">H</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">H'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="o">(</span><span class="n">H'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p>It may look strange to have a different notation for what amounts to the intersection of the
-
@@ -301,36 +301,36 @@ underlying sets, but the correspondence does not carry over to the supremum operunion, since a union of subgroups is not, in general, a subgroup. Instead one needs to use the subgroup generated by the union, which is done using <code class="docutils literal notranslate"><span class="pre">Subgroup.closure</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="n">H'</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="o">((</span><span class="n">H</span> <span class="bp">⊔</span> <span class="n">H'</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">G</span><span class="o">)</span> <span class="bp">=</span> <span class="n">Subgroup.closure</span> <span class="o">((</span><span class="n">H</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">G</span><span class="o">)</span> <span class="bp">∪</span> <span class="o">(</span><span class="n">H'</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">G</span><span class="o">))</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">Subgroup.sup_eq_closure</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">H</span><span class="w"> </span><span class="n">H'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="o">((</span><span class="n">H</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">H'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">Subgroup.closure</span><span class="w"> </span><span class="o">((</span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="bp">∪</span><span class="w"> </span><span class="o">(</span><span class="n">H'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">G</span><span class="o">))</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">Subgroup.sup_eq_closure</span><span class="o">]</span> </pre></div> </div> <p>Another subtlety is that <code class="docutils literal notranslate"><span class="pre">G</span></code> itself does not have type <code class="docutils literal notranslate"><span class="pre">Subgroup</span> <span class="pre">G</span></code>, so we need a way to talk about <code class="docutils literal notranslate"><span class="pre">G</span></code> seen as a subgroup of <code class="docutils literal notranslate"><span class="pre">G</span></code>. This is also provided by the lattice structure: the full subgroup is the top element of this lattice.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="o">(</span><span class="bp">⊤</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:=</span> <span class="n">trivial</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="o">(</span><span class="bp">⊤</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">trivial</span> </pre></div> </div> <p>Similarly the bottom element of this lattice is the subgroup whose only element is the neutral element.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="o">(</span><span class="bp">⊥</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="bp">↔</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="n">Subgroup.mem_bot</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="o">(</span><span class="bp">⊥</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Subgroup.mem_bot</span> </pre></div> </div> <p>As an exercise in manipulating groups and subgroups, you can define the conjugate of a subgroup by an element of the ambient group.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">conjugate</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span> <span class="n">where</span> <span class="n">carrier</span> <span class="o">:=</span> <span class="o">{</span><span class="n">a</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">|</span> <span class="bp">∃</span> <span class="n">h</span><span class="o">,</span> <span class="n">h</span> <span class="bp">∈</span> <span class="n">H</span> <span class="bp">∧</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">h</span> <span class="bp">*</span> <span class="n">x</span><span class="bp">⁻¹</span><span class="o">}</span> <span class="n">one_mem'</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">dsimp</span> <span class="gr">sorry</span> <span class="n">inv_mem'</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">dsimp</span> <span class="gr">sorry</span> <span class="n">mul_mem'</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">dsimp</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">conjugate</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">carrier</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">h</span><span class="o">,</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">x</span><span class="bp">⁻¹</span><span class="o">}</span> <span class="w"> </span><span class="n">one_mem'</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">dsimp</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">inv_mem'</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">dsimp</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">mul_mem'</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">dsimp</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Tying the previous two topics together, one can push forward and pull back subgroups using
-
@@ -338,55 +338,55 @@ group morphisms. The naming convention in Mathlib is to call those operations <cand <code class="docutils literal notranslate"><span class="pre">comap</span></code>. These are not the common mathematical terms, but they have the advantage of being shorter than “pushforward” and “direct image.”</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">G'</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">H</span> <span class="o">:=</span> <span class="n">Subgroup.map</span> <span class="n">f</span> <span class="n">G'</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">H</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">G'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Subgroup.map</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">G'</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">H'</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span> <span class="o">:=</span> <span class="n">Subgroup.comap</span> <span class="n">f</span> <span class="n">H'</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">H</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">H'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Subgroup.comap</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">H'</span> <span class="k">#check</span> <span class="n">Subgroup.mem_map</span> <span class="k">#check</span> <span class="n">Subgroup.mem_comap</span> <span class="k">#check</span><span class="w"> </span><span class="n">Subgroup.mem_map</span> <span class="k">#check</span><span class="w"> </span><span class="n">Subgroup.mem_comap</span> </pre></div> </div> <p>In particular, the preimage of the bottom subgroup under a morphism <code class="docutils literal notranslate"><span class="pre">f</span></code> is a subgroup called the <em>kernel</em> of <code class="docutils literal notranslate"><span class="pre">f</span></code>, and the range of <code class="docutils literal notranslate"><span class="pre">f</span></code> is also a subgroup.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">g</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">g</span> <span class="bp">∈</span> <span class="n">MonoidHom.ker</span> <span class="n">f</span> <span class="bp">↔</span> <span class="n">f</span> <span class="n">g</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="n">f.mem_ker</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">H</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">MonoidHom.ker</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">f.mem_ker</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">h</span> <span class="bp">∈</span> <span class="n">MonoidHom.range</span> <span class="n">f</span> <span class="bp">↔</span> <span class="bp">∃</span> <span class="n">g</span> <span class="o">:</span> <span class="n">G</span><span class="o">,</span> <span class="n">f</span> <span class="n">g</span> <span class="bp">=</span> <span class="n">h</span> <span class="o">:=</span> <span class="n">f.mem_range</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">H</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">MonoidHom.range</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">f.mem_range</span> </pre></div> </div> <p>As exercises in manipulating group morphisms and subgroups, let us prove some elementary properties. They are already proved in Mathlib, so do not use <code class="docutils literal notranslate"><span class="pre">exact?</span></code> too quickly if you want to benefit from these exercises.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">section</span> <span class="n">exercises</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">G</span> <span class="n">H</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">H</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">section</span><span class="w"> </span><span class="n">exercises</span> <span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">H</span><span class="o">]</span> <span class="kn">open</span> <span class="n">Subgroup</span> <span class="kn">open</span><span class="w"> </span><span class="n">Subgroup</span> <span class="kd">example</span> <span class="o">(</span><span class="n">φ</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">S</span> <span class="n">T</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">hST</span> <span class="o">:</span> <span class="n">S</span> <span class="bp">≤</span> <span class="n">T</span><span class="o">)</span> <span class="o">:</span> <span class="n">comap</span> <span class="n">φ</span> <span class="n">S</span> <span class="bp">≤</span> <span class="n">comap</span> <span class="n">φ</span> <span class="n">T</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">φ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">S</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hST</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">T</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">comap</span><span class="w"> </span><span class="n">φ</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">comap</span><span class="w"> </span><span class="n">φ</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">example</span> <span class="o">(</span><span class="n">φ</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">S</span> <span class="n">T</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">(</span><span class="n">hST</span> <span class="o">:</span> <span class="n">S</span> <span class="bp">≤</span> <span class="n">T</span><span class="o">)</span> <span class="o">:</span> <span class="n">map</span> <span class="n">φ</span> <span class="n">S</span> <span class="bp">≤</span> <span class="n">map</span> <span class="n">φ</span> <span class="n">T</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">φ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">S</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hST</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">T</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">map</span><span class="w"> </span><span class="n">φ</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">map</span><span class="w"> </span><span class="n">φ</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">K</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">K</span><span class="o">]</span> <span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">K</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">K</span><span class="o">]</span> <span class="c1">-- Remember you can use the `ext` tactic to prove an equality of subgroups.</span> <span class="kd">example</span> <span class="o">(</span><span class="n">φ</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">ψ</span> <span class="o">:</span> <span class="n">H</span> <span class="bp">→*</span> <span class="n">K</span><span class="o">)</span> <span class="o">(</span><span class="n">U</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">K</span><span class="o">)</span> <span class="o">:</span> <span class="n">comap</span> <span class="o">(</span><span class="n">ψ.comp</span> <span class="n">φ</span><span class="o">)</span> <span class="n">U</span> <span class="bp">=</span> <span class="n">comap</span> <span class="n">φ</span> <span class="o">(</span><span class="n">comap</span> <span class="n">ψ</span> <span class="n">U</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">φ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">ψ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">K</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">U</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">K</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">comap</span><span class="w"> </span><span class="o">(</span><span class="n">ψ.comp</span><span class="w"> </span><span class="n">φ</span><span class="o">)</span><span class="w"> </span><span class="n">U</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">comap</span><span class="w"> </span><span class="n">φ</span><span class="w"> </span><span class="o">(</span><span class="n">comap</span><span class="w"> </span><span class="n">ψ</span><span class="w"> </span><span class="n">U</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="c1">-- Pushing a subgroup along one homomorphism and then another is equal to</span> <span class="c1">-- pushing it forward along the composite of the homomorphisms.</span> <span class="kd">example</span> <span class="o">(</span><span class="n">φ</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">H</span><span class="o">)</span> <span class="o">(</span><span class="n">ψ</span> <span class="o">:</span> <span class="n">H</span> <span class="bp">→*</span> <span class="n">K</span><span class="o">)</span> <span class="o">(</span><span class="n">S</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">map</span> <span class="o">(</span><span class="n">ψ.comp</span> <span class="n">φ</span><span class="o">)</span> <span class="n">S</span> <span class="bp">=</span> <span class="n">map</span> <span class="n">ψ</span> <span class="o">(</span><span class="n">S.map</span> <span class="n">φ</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">φ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">ψ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">K</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">S</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">map</span><span class="w"> </span><span class="o">(</span><span class="n">ψ.comp</span><span class="w"> </span><span class="n">φ</span><span class="o">)</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">map</span><span class="w"> </span><span class="n">ψ</span><span class="w"> </span><span class="o">(</span><span class="n">S.map</span><span class="w"> </span><span class="n">φ</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">end</span> <span class="n">exercises</span> <span class="kd">end</span><span class="w"> </span><span class="n">exercises</span> </pre></div> </div> <p>Let us finish this introduction to subgroups in Mathlib with two very classical results.
-
@@ -394,32 +394,32 @@ Lagrange theorem states the cardinality of a subgroup of a finite group dividesthe group. Sylow’s first theorem is a famous partial converse to Lagrange’s theorem.</p> <p>While this corner of Mathlib is partly set up to allow computation, we can tell Lean to use nonconstructive logic anyway using the following <code class="docutils literal notranslate"><span class="pre">open</span> <span class="pre">scoped</span></code> command.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">scoped</span> <span class="n">Classical</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">scoped</span><span class="w"> </span><span class="n">Classical</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">G'</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">Nat.card</span> <span class="n">G'</span> <span class="bp">∣</span> <span class="n">Nat.card</span> <span class="n">G</span> <span class="o">:=</span> <span class="o">⟨</span><span class="n">G'.index</span><span class="o">,</span> <span class="n">mul_comm</span> <span class="n">G'.index</span> <span class="n">_</span> <span class="bp">▸</span> <span class="n">G'.index_mul_card.symm</span><span class="o">⟩</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">G'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.card</span><span class="w"> </span><span class="n">G'</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">Nat.card</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">⟨</span><span class="n">G'.index</span><span class="o">,</span><span class="w"> </span><span class="n">mul_comm</span><span class="w"> </span><span class="n">G'.index</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">▸</span><span class="w"> </span><span class="n">G'.index_mul_card.symm</span><span class="o">⟩</span> <span class="kn">open</span> <span class="n">Subgroup</span> <span class="kn">open</span><span class="w"> </span><span class="n">Subgroup</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Finite</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">p</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">{</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">[</span><span class="n">Fact</span> <span class="n">p.Prime</span><span class="o">]</span> <span class="o">(</span><span class="n">hdvd</span> <span class="o">:</span> <span class="n">p</span> <span class="bp">^</span> <span class="n">n</span> <span class="bp">∣</span> <span class="n">Nat.card</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">K</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">,</span> <span class="n">Nat.card</span> <span class="n">K</span> <span class="bp">=</span> <span class="n">p</span> <span class="bp">^</span> <span class="n">n</span> <span class="o">:=</span> <span class="n">Sylow.exists_subgroup_card_pow_prime</span> <span class="n">p</span> <span class="n">hdvd</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Finite</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Fact</span><span class="w"> </span><span class="n">p.Prime</span><span class="o">]</span> <span class="w"> </span><span class="o">(</span><span class="n">hdvd</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∣</span><span class="w"> </span><span class="n">Nat.card</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">K</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">,</span><span class="w"> </span><span class="n">Nat.card</span><span class="w"> </span><span class="n">K</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Sylow.exists_subgroup_card_pow_prime</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="n">hdvd</span> </pre></div> </div> <p>The next two exercises derive a corollary of Lagrange’s lemma. (This is also already in Mathlib, so do not use <code class="docutils literal notranslate"><span class="pre">exact?</span></code> too quickly.)</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">lemma</span> <span class="n">eq_bot_iff_card</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">{</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">}</span> <span class="o">:</span> <span class="n">H</span> <span class="bp">=</span> <span class="bp">⊥</span> <span class="bp">↔</span> <span class="n">Nat.card</span> <span class="n">H</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">suffices</span> <span class="o">(</span><span class="bp">∀</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">H</span><span class="o">,</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">↔</span> <span class="bp">∃</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">H</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">H</span><span class="o">,</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">x</span> <span class="kd">by</span> <span class="n">simpa</span> <span class="o">[</span><span class="n">eq_bot_iff_forall</span><span class="o">,</span> <span class="n">Nat.card_eq_one_iff_exists</span><span class="o">]</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">lemma</span><span class="w"> </span><span class="n">eq_bot_iff_card</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">}</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">⊥</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">Nat.card</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">suffices</span><span class="w"> </span><span class="o">(</span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">H</span><span class="o">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">H</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">H</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">simpa</span><span class="w"> </span><span class="o">[</span><span class="n">eq_bot_iff_forall</span><span class="o">,</span><span class="w"> </span><span class="n">Nat.card_eq_one_iff_exists</span><span class="o">]</span> <span class="w"> </span><span class="gr">sorry</span> <span class="k">#check</span> <span class="n">card_dvd_of_le</span> <span class="k">#check</span><span class="w"> </span><span class="n">card_dvd_of_le</span> <span class="kd">lemma</span> <span class="n">inf_bot_of_coprime</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="n">K</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="o">(</span><span class="n">Nat.card</span> <span class="n">H</span><span class="o">)</span><span class="bp">.</span><span class="n">Coprime</span> <span class="o">(</span><span class="n">Nat.card</span> <span class="n">K</span><span class="o">))</span> <span class="o">:</span> <span class="n">H</span> <span class="bp">⊓</span> <span class="n">K</span> <span class="bp">=</span> <span class="bp">⊥</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">lemma</span><span class="w"> </span><span class="n">inf_bot_of_coprime</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">H</span><span class="w"> </span><span class="n">K</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">Nat.card</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="bp">.</span><span class="n">Coprime</span><span class="w"> </span><span class="o">(</span><span class="n">Nat.card</span><span class="w"> </span><span class="n">K</span><span class="o">))</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">K</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">⊥</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> </section>
-
@@ -431,10 +431,10 @@ For instance, given any type <code class="docutils literal notranslate"><span clIn particular the symmetric group <span class="math notranslate nohighlight">\(\mathfrak{S}_n\)</span> is <code class="docutils literal notranslate"><span class="pre">Equiv.Perm</span> <span class="pre">(Fin</span> <span class="pre">n)</span></code>. One can state abstract results about this group, for instance saying that <code class="docutils literal notranslate"><span class="pre">Equiv.Perm</span> <span class="pre">X</span></code> is generated by cycles if <code class="docutils literal notranslate"><span class="pre">X</span></code> is finite.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">Equiv</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">Equiv</span> <span class="kd">example</span> <span class="o">{</span><span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Finite</span> <span class="n">X</span><span class="o">]</span> <span class="o">:</span> <span class="n">Subgroup.closure</span> <span class="o">{</span><span class="n">σ</span> <span class="o">:</span> <span class="n">Perm</span> <span class="n">X</span> <span class="bp">|</span> <span class="n">Perm.IsCycle</span> <span class="n">σ</span><span class="o">}</span> <span class="bp">=</span> <span class="bp">⊤</span> <span class="o">:=</span> <span class="n">Perm.closure_isCycle</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Finite</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup.closure</span><span class="w"> </span><span class="o">{</span><span class="n">σ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Perm</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">Perm.IsCycle</span><span class="w"> </span><span class="n">σ</span><span class="o">}</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">⊤</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Perm.closure_isCycle</span> </pre></div> </div> <p>One can be fully concrete and compute actual products of cycles. Below we use the <code class="docutils literal notranslate"><span class="pre">#simp</span></code> command,
-
@@ -442,20 +442,20 @@ which calls the <code class="docutils literal notranslate"><span class="pre">simcyclic permutation. In the example, the result is a permutation of <code class="docutils literal notranslate"><span class="pre">ℕ</span></code>. One could use a type ascription such as <code class="docutils literal notranslate"><span class="pre">(1</span> <span class="pre">:</span> <span class="pre">Fin</span> <span class="pre">5)</span></code> on the first number appearing to make it a computation in <code class="docutils literal notranslate"><span class="pre">Perm</span> <span class="pre">(Fin</span> <span class="pre">5)</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="bp">#</span><span class="n">simp</span> <span class="o">[</span><span class="n">mul_assoc</span><span class="o">]</span> <span class="n">c</span><span class="o">[</span><span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">]</span> <span class="bp">*</span> <span class="n">c</span><span class="o">[</span><span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="mi">4</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="bp">#</span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">mul_assoc</span><span class="o">]</span><span class="w"> </span><span class="n">c</span><span class="o">[</span><span class="mi">1</span><span class="o">,</span><span class="w"> </span><span class="mi">2</span><span class="o">,</span><span class="w"> </span><span class="mi">3</span><span class="o">]</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">c</span><span class="o">[</span><span class="mi">2</span><span class="o">,</span><span class="w"> </span><span class="mi">3</span><span class="o">,</span><span class="w"> </span><span class="mi">4</span><span class="o">]</span> </pre></div> </div> <p>Another way to work with concrete groups is to use free groups and group presentations. The free group on a type <code class="docutils literal notranslate"><span class="pre">α</span></code> is <code class="docutils literal notranslate"><span class="pre">FreeGroup</span> <span class="pre">α</span></code> and the inclusion map is <code class="docutils literal notranslate"><span class="pre">FreeGroup.of</span> <span class="pre">:</span> <span class="pre">α</span> <span class="pre">→</span> <span class="pre">FreeGroup</span> <span class="pre">α</span></code>. For instance let us define a type <code class="docutils literal notranslate"><span class="pre">S</span></code> with three elements denoted by <code class="docutils literal notranslate"><span class="pre">a</span></code>, <code class="docutils literal notranslate"><span class="pre">b</span></code> and <code class="docutils literal notranslate"><span class="pre">c</span></code>, and the element <code class="docutils literal notranslate"><span class="pre">ab⁻¹</span></code> of the corresponding free group.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">section</span> <span class="n">FreeGroup</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">section</span><span class="w"> </span><span class="n">FreeGroup</span> <span class="kd">inductive</span> <span class="n">S</span> <span class="bp">|</span> <span class="n">a</span> <span class="bp">|</span> <span class="n">b</span> <span class="bp">|</span> <span class="n">c</span> <span class="kd">inductive</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">c</span> <span class="kn">open</span> <span class="n">S</span> <span class="kn">open</span><span class="w"> </span><span class="n">S</span> <span class="kd">def</span> <span class="n">myElement</span> <span class="o">:</span> <span class="n">FreeGroup</span> <span class="n">S</span> <span class="o">:=</span> <span class="o">(</span><span class="bp">.</span><span class="n">of</span> <span class="n">a</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="bp">.</span><span class="n">of</span> <span class="n">b</span><span class="o">)</span><span class="bp">⁻¹</span> <span class="kd">def</span><span class="w"> </span><span class="n">myElement</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FreeGroup</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">(</span><span class="bp">.</span><span class="n">of</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="bp">.</span><span class="n">of</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="bp">⁻¹</span> </pre></div> </div> <p>Note that we gave the expected type of the definition so that Lean knows that <code class="docutils literal notranslate"><span class="pre">.of</span></code> means
-
@@ -463,10 +463,10 @@ by <code class="docutils literal notranslate"><span class="pre">a</span></code>,<p>The universal property of free groups is embodied as the equivalence <code class="docutils literal notranslate"><span class="pre">FreeGroup.lift</span></code>. For example, let us define the group morphism from <code class="docutils literal notranslate"><span class="pre">FreeGroup</span> <span class="pre">S</span></code> to <code class="docutils literal notranslate"><span class="pre">Perm</span> <span class="pre">(Fin</span> <span class="pre">5)</span></code> that sends <code class="docutils literal notranslate"><span class="pre">a</span></code> to <code class="docutils literal notranslate"><span class="pre">c[1,</span> <span class="pre">2,</span> <span class="pre">3]</span></code>, <code class="docutils literal notranslate"><span class="pre">b</span></code> to <code class="docutils literal notranslate"><span class="pre">c[2,</span> <span class="pre">3,</span> <span class="pre">1]</span></code>, and <code class="docutils literal notranslate"><span class="pre">c</span></code> to <code class="docutils literal notranslate"><span class="pre">c[2,</span> <span class="pre">3]</span></code>,</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">myMorphism</span> <span class="o">:</span> <span class="n">FreeGroup</span> <span class="n">S</span> <span class="bp">→*</span> <span class="n">Perm</span> <span class="o">(</span><span class="n">Fin</span> <span class="mi">5</span><span class="o">)</span> <span class="o">:=</span> <span class="n">FreeGroup.lift</span> <span class="k">fun</span> <span class="bp">|</span> <span class="bp">.</span><span class="n">a</span> <span class="bp">=></span> <span class="n">c</span><span class="o">[</span><span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">]</span> <span class="bp">|</span> <span class="bp">.</span><span class="n">b</span> <span class="bp">=></span> <span class="n">c</span><span class="o">[</span><span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="mi">1</span><span class="o">]</span> <span class="bp">|</span> <span class="bp">.</span><span class="n">c</span> <span class="bp">=></span> <span class="n">c</span><span class="o">[</span><span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">myMorphism</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">FreeGroup</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">Perm</span><span class="w"> </span><span class="o">(</span><span class="n">Fin</span><span class="w"> </span><span class="mi">5</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">FreeGroup.lift</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="bp">.</span><span class="n">a</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="n">c</span><span class="o">[</span><span class="mi">1</span><span class="o">,</span><span class="w"> </span><span class="mi">2</span><span class="o">,</span><span class="w"> </span><span class="mi">3</span><span class="o">]</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="bp">.</span><span class="n">b</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="n">c</span><span class="o">[</span><span class="mi">2</span><span class="o">,</span><span class="w"> </span><span class="mi">3</span><span class="o">,</span><span class="w"> </span><span class="mi">1</span><span class="o">]</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="bp">.</span><span class="n">c</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="n">c</span><span class="o">[</span><span class="mi">2</span><span class="o">,</span><span class="w"> </span><span class="mi">3</span><span class="o">]</span> </pre></div> </div> <p>As a last concrete example, let us see how to define a group generated by a single element whose
-
@@ -478,25 +478,25 @@ i.e. a set of elements of some free group, and returns a group that is this freeby a normal subgroup generated by relations. (We will see how to handle more general quotients in <a class="reference internal" href="#quotient-groups"><span class="std std-numref">Section 8.1.6</span></a>.) Since we somehow hide this behind a definition, we use <code class="docutils literal notranslate"><span class="pre">deriving</span> <span class="pre">Group</span></code> to force creation of a group instance on <code class="docutils literal notranslate"><span class="pre">myGroup</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">myGroup</span> <span class="o">:=</span> <span class="n">PresentedGroup</span> <span class="o">{</span><span class="bp">.</span><span class="n">of</span> <span class="o">()</span> <span class="bp">^</span> <span class="mi">3</span><span class="o">}</span> <span class="n">deriving</span> <span class="n">Group</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">myGroup</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">PresentedGroup</span><span class="w"> </span><span class="o">{</span><span class="bp">.</span><span class="n">of</span><span class="w"> </span><span class="o">()</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">3</span><span class="o">}</span><span class="w"> </span><span class="n">deriving</span><span class="w"> </span><span class="n">Group</span> </pre></div> </div> <p>The universal property of presented groups ensures that morphisms out of this group can be built from functions that send the relations to the neutral element of the target group. So we need such a function and a proof that the condition holds. Then we can feed this proof to <code class="docutils literal notranslate"><span class="pre">PresentedGroup.toGroup</span></code> to get the desired group morphism.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">myMap</span> <span class="o">:</span> <span class="n">Unit</span> <span class="bp">→</span> <span class="n">Perm</span> <span class="o">(</span><span class="n">Fin</span> <span class="mi">5</span><span class="o">)</span> <span class="bp">|</span> <span class="o">()</span> <span class="bp">=></span> <span class="n">c</span><span class="o">[</span><span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">myMap</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Unit</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Perm</span><span class="w"> </span><span class="o">(</span><span class="n">Fin</span><span class="w"> </span><span class="mi">5</span><span class="o">)</span> <span class="bp">|</span><span class="w"> </span><span class="o">()</span><span class="w"> </span><span class="bp">=></span><span class="w"> </span><span class="n">c</span><span class="o">[</span><span class="mi">1</span><span class="o">,</span><span class="w"> </span><span class="mi">2</span><span class="o">,</span><span class="w"> </span><span class="mi">3</span><span class="o">]</span> <span class="kd">lemma</span> <span class="n">compat_myMap</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">r</span> <span class="bp">∈</span> <span class="o">({</span><span class="bp">.</span><span class="n">of</span> <span class="o">()</span> <span class="bp">^</span> <span class="mi">3</span><span class="o">}</span> <span class="o">:</span> <span class="n">Set</span> <span class="o">(</span><span class="n">FreeGroup</span> <span class="n">Unit</span><span class="o">)),</span> <span class="n">FreeGroup.lift</span> <span class="n">myMap</span> <span class="n">r</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rintro</span> <span class="n">_</span> <span class="n">rfl</span> <span class="n">simp</span> <span class="n">decide</span> <span class="kd">lemma</span><span class="w"> </span><span class="n">compat_myMap</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="o">({</span><span class="bp">.</span><span class="n">of</span><span class="w"> </span><span class="o">()</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">3</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="o">(</span><span class="n">FreeGroup</span><span class="w"> </span><span class="n">Unit</span><span class="o">)),</span><span class="w"> </span><span class="n">FreeGroup.lift</span><span class="w"> </span><span class="n">myMap</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">rfl</span> <span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="n">decide</span> <span class="kd">def</span> <span class="n">myNewMorphism</span> <span class="o">:</span> <span class="n">myGroup</span> <span class="bp">→*</span> <span class="n">Perm</span> <span class="o">(</span><span class="n">Fin</span> <span class="mi">5</span><span class="o">)</span> <span class="o">:=</span> <span class="n">PresentedGroup.toGroup</span> <span class="n">compat_myMap</span> <span class="kd">def</span><span class="w"> </span><span class="n">myNewMorphism</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">myGroup</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">Perm</span><span class="w"> </span><span class="o">(</span><span class="n">Fin</span><span class="w"> </span><span class="mi">5</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">PresentedGroup.toGroup</span><span class="w"> </span><span class="n">compat_myMap</span> <span class="kd">end</span> <span class="n">FreeGroup</span> <span class="kd">end</span><span class="w"> </span><span class="n">FreeGroup</span> </pre></div> </div> </section>
-
@@ -513,31 +513,31 @@ requires some contortions, such as defining type synonyms, each of which carriestype class instances.</p> <p>This allows us in particular to use <code class="docutils literal notranslate"><span class="pre">g</span> <span class="pre">•</span> <span class="pre">x</span></code> to denote the action of a group element <code class="docutils literal notranslate"><span class="pre">g</span></code> on a point <code class="docutils literal notranslate"><span class="pre">x</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span> <span class="kn">section</span> <span class="n">GroupActions</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span><span class="w"> </span><span class="kn">section</span><span class="w"> </span><span class="n">GroupActions</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">MulAction</span> <span class="n">G</span> <span class="n">X</span><span class="o">]</span> <span class="o">(</span><span class="n">g</span> <span class="n">g'</span><span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">)</span> <span class="o">:</span> <span class="n">g</span> <span class="bp">•</span> <span class="o">(</span><span class="n">g'</span> <span class="bp">•</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="o">(</span><span class="n">g</span> <span class="bp">*</span> <span class="n">g'</span><span class="o">)</span> <span class="bp">•</span> <span class="n">x</span> <span class="o">:=</span> <span class="o">(</span><span class="n">mul_smul</span> <span class="n">g</span> <span class="n">g'</span> <span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">symm</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">MulAction</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="n">g'</span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="o">(</span><span class="n">g'</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g'</span><span class="o">)</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">(</span><span class="n">mul_smul</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">g'</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">symm</span> </pre></div> </div> <p>There is also a version for additive group called <code class="docutils literal notranslate"><span class="pre">AddAction</span></code>, where the action is denoted by <code class="docutils literal notranslate"><span class="pre">+ᵥ</span></code>. This is used for instance in the definition of affine spaces.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">AddGroup</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">AddAction</span> <span class="n">G</span> <span class="n">X</span><span class="o">]</span> <span class="o">(</span><span class="n">g</span> <span class="n">g'</span> <span class="o">:</span> <span class="n">G</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">)</span> <span class="o">:</span> <span class="n">g</span> <span class="bp">+ᵥ</span> <span class="o">(</span><span class="n">g'</span> <span class="bp">+ᵥ</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="o">(</span><span class="n">g</span> <span class="bp">+</span> <span class="n">g'</span><span class="o">)</span> <span class="bp">+ᵥ</span> <span class="n">x</span> <span class="o">:=</span> <span class="o">(</span><span class="n">add_vadd</span> <span class="n">g</span> <span class="n">g'</span> <span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">symm</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">AddGroup</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">AddAction</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="n">g'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">+ᵥ</span><span class="w"> </span><span class="o">(</span><span class="n">g'</span><span class="w"> </span><span class="bp">+ᵥ</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g'</span><span class="o">)</span><span class="w"> </span><span class="bp">+ᵥ</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">(</span><span class="n">add_vadd</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">g'</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">symm</span> </pre></div> </div> <p>The underlying group morphism is called <code class="docutils literal notranslate"><span class="pre">MulAction.toPermHom</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">MulAction</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">MulAction</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">MulAction</span> <span class="n">G</span> <span class="n">X</span><span class="o">]</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">Equiv.Perm</span> <span class="n">X</span> <span class="o">:=</span> <span class="n">toPermHom</span> <span class="n">G</span> <span class="n">X</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">MulAction</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">Equiv.Perm</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">toPermHom</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">X</span> </pre></div> </div> <p>As an illustration let us see how to define the Cayley isomorphism embedding of any group <code class="docutils literal notranslate"><span class="pre">G</span></code> into a permutation group, namely <code class="docutils literal notranslate"><span class="pre">Perm</span> <span class="pre">G</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">CayleyIsoMorphism</span> <span class="o">(</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">≃*</span> <span class="o">(</span><span class="n">toPermHom</span> <span class="n">G</span> <span class="n">G</span><span class="o">)</span><span class="bp">.</span><span class="n">range</span> <span class="o">:=</span> <span class="n">Equiv.Perm.subgroupOfMulAction</span> <span class="n">G</span> <span class="n">G</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">CayleyIsoMorphism</span><span class="w"> </span><span class="o">(</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">≃*</span><span class="w"> </span><span class="o">(</span><span class="n">toPermHom</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="bp">.</span><span class="n">range</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Equiv.Perm.subgroupOfMulAction</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">G</span> </pre></div> </div> <p>Note that nothing before the above definition required having a group rather than a monoid (or any
-
@@ -545,7 +545,7 @@ type endowed with a multiplication operation really).</p><p>The group condition really enters the picture when we will want to partition <code class="docutils literal notranslate"><span class="pre">X</span></code> into orbits. The corresponding equivalence relation on <code class="docutils literal notranslate"><span class="pre">X</span></code> is called <code class="docutils literal notranslate"><span class="pre">MulAction.orbitRel</span></code>. It is not declared as a global instance.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">MulAction</span> <span class="n">G</span> <span class="n">X</span><span class="o">]</span> <span class="o">:</span> <span class="n">Setoid</span> <span class="n">X</span> <span class="o">:=</span> <span class="n">orbitRel</span> <span class="n">G</span> <span class="n">X</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">MulAction</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Setoid</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">orbitRel</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">X</span> </pre></div> </div> <p>Using this we can state that <code class="docutils literal notranslate"><span class="pre">X</span></code> is partitioned into orbits under the action of <code class="docutils literal notranslate"><span class="pre">G</span></code>.
-
@@ -554,9 +554,9 @@ More precisely, we get a bijection between <code class="docutils literal notranswhere <code class="docutils literal notranslate"><span class="pre">Quotient.out'</span> <span class="pre">ω</span></code> simply chooses an element that projects to <code class="docutils literal notranslate"><span class="pre">ω</span></code>. Recall that elements of this dependent product are pairs <code class="docutils literal notranslate"><span class="pre">⟨ω,</span> <span class="pre">x⟩</span></code> where the type <code class="docutils literal notranslate"><span class="pre">orbit</span> <span class="pre">G</span> <span class="pre">(Quotient.out'</span> <span class="pre">ω)</span></code> of <code class="docutils literal notranslate"><span class="pre">x</span></code> depends on <code class="docutils literal notranslate"><span class="pre">ω</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">MulAction</span> <span class="n">G</span> <span class="n">X</span><span class="o">]</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">≃</span> <span class="o">(</span><span class="n">ω</span> <span class="o">:</span> <span class="n">orbitRel.Quotient</span> <span class="n">G</span> <span class="n">X</span><span class="o">)</span> <span class="bp">×</span> <span class="o">(</span><span class="n">orbit</span> <span class="n">G</span> <span class="o">(</span><span class="n">Quotient.out'</span> <span class="n">ω</span><span class="o">))</span> <span class="o">:=</span> <span class="n">MulAction.selfEquivSigmaOrbits</span> <span class="n">G</span> <span class="n">X</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">MulAction</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">≃</span><span class="w"> </span><span class="o">(</span><span class="n">ω</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">orbitRel.Quotient</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="bp">×</span><span class="w"> </span><span class="o">(</span><span class="n">orbit</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="o">(</span><span class="n">Quotient.out'</span><span class="w"> </span><span class="n">ω</span><span class="o">))</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">MulAction.selfEquivSigmaOrbits</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">X</span> </pre></div> </div> <p>In particular, when X is finite, this can be combined with <code class="docutils literal notranslate"><span class="pre">Fintype.card_congr</span></code> and
-
@@ -566,35 +566,35 @@ Furthermore, the orbits are in bijection with the quotient of <code class="docutstabilizers by left translation. This action of a subgroup by left-translation is used to define quotients of a group by a subgroup with notation <cite>/</cite> so we can use the following concise statement.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">MulAction</span> <span class="n">G</span> <span class="n">X</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">)</span> <span class="o">:</span> <span class="n">orbit</span> <span class="n">G</span> <span class="n">x</span> <span class="bp">≃</span> <span class="n">G</span> <span class="bp">⧸</span> <span class="n">stabilizer</span> <span class="n">G</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">MulAction.orbitEquivQuotientStabilizer</span> <span class="n">G</span> <span class="n">x</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">MulAction</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">orbit</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≃</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">stabilizer</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">MulAction.orbitEquivQuotientStabilizer</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">x</span> </pre></div> </div> <p>An important special case of combining the above two results is when <code class="docutils literal notranslate"><span class="pre">X</span></code> is a group <code class="docutils literal notranslate"><span class="pre">G</span></code> equipped with the action of a subgroup <code class="docutils literal notranslate"><span class="pre">H</span></code> by translation. In this case all stabilizers are trivial so every orbit is in bijection with <code class="docutils literal notranslate"><span class="pre">H</span></code> and we get:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">≃</span> <span class="o">(</span><span class="n">G</span> <span class="bp">⧸</span> <span class="n">H</span><span class="o">)</span> <span class="bp">×</span> <span class="n">H</span> <span class="o">:=</span> <span class="n">groupEquivQuotientProdSubgroup</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">≃</span><span class="w"> </span><span class="o">(</span><span class="n">G</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="bp">×</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">groupEquivQuotientProdSubgroup</span> </pre></div> </div> <p>This is the conceptual variant of the version of Lagrange theorem that we saw above. Note this version makes no finiteness assumption.</p> <p>As an exercise for this section, let us build the action of a group on its subgroup by conjugation, using our definition of <code class="docutils literal notranslate"><span class="pre">conjugate</span></code> from a previous exercise.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span> <span class="kd">lemma</span> <span class="n">conjugate_one</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">conjugate</span> <span class="mi">1</span> <span class="n">H</span> <span class="bp">=</span> <span class="n">H</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">lemma</span><span class="w"> </span><span class="n">conjugate_one</span><span class="w"> </span><span class="o">(</span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">conjugate</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">instance</span> <span class="o">:</span> <span class="n">MulAction</span> <span class="n">G</span> <span class="o">(</span><span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="n">where</span> <span class="n">smul</span> <span class="o">:=</span> <span class="n">conjugate</span> <span class="n">one_smul</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">mul_smul</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">instance</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MulAction</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="o">(</span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">smul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">conjugate</span> <span class="w"> </span><span class="n">one_smul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">mul_smul</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">end</span> <span class="n">GroupActions</span> <span class="kd">end</span><span class="w"> </span><span class="n">GroupActions</span> </pre></div> </div> </section>
-
@@ -606,19 +606,19 @@ map is a group morphism if and only if <code class="docutils literal notranslatethen unique).</p> <p>The normality assumption is a type class <code class="docutils literal notranslate"><span class="pre">Subgroup.Normal</span></code> so that type class inference can use it to derive the group structure on the quotient.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span> <span class="kn">section</span> <span class="n">QuotientGroup</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span><span class="w"> </span><span class="kn">section</span><span class="w"> </span><span class="n">QuotientGroup</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">[</span><span class="n">H.Normal</span><span class="o">]</span> <span class="o">:</span> <span class="n">Group</span> <span class="o">(</span><span class="n">G</span> <span class="bp">⧸</span> <span class="n">H</span><span class="o">)</span> <span class="o">:=</span> <span class="n">inferInstance</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">H.Normal</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Group</span><span class="w"> </span><span class="o">(</span><span class="n">G</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">inferInstance</span> <span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">[</span><span class="n">H.Normal</span><span class="o">]</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">G</span> <span class="bp">⧸</span> <span class="n">H</span> <span class="o">:=</span> <span class="n">QuotientGroup.mk'</span> <span class="n">H</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">H.Normal</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">QuotientGroup.mk'</span><span class="w"> </span><span class="n">H</span> </pre></div> </div> <p>The universal property of quotient groups is accessed through <code class="docutils literal notranslate"><span class="pre">QuotientGroup.lift</span></code>: a group morphism <code class="docutils literal notranslate"><span class="pre">φ</span></code> descends to <code class="docutils literal notranslate"><span class="pre">G</span> <span class="pre">⧸</span> <span class="pre">N</span></code> as soon as its kernel contains <code class="docutils literal notranslate"><span class="pre">N</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">N</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">)</span> <span class="o">[</span><span class="n">N.Normal</span><span class="o">]</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">φ</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">M</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">N</span> <span class="bp">≤</span> <span class="n">MonoidHom.ker</span> <span class="n">φ</span><span class="o">)</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">⧸</span> <span class="n">N</span> <span class="bp">→*</span> <span class="n">M</span> <span class="o">:=</span> <span class="n">QuotientGroup.lift</span> <span class="n">N</span> <span class="n">φ</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">N.Normal</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">M</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">φ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">MonoidHom.ker</span><span class="w"> </span><span class="n">φ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">QuotientGroup.lift</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="n">φ</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>The fact that the target group is called <code class="docutils literal notranslate"><span class="pre">M</span></code> is the above snippet is a clue that having a
-
@@ -626,9 +626,9 @@ monoid structure on <code class="docutils literal notranslate"><span class="pre"<p>An important special case is when <code class="docutils literal notranslate"><span class="pre">N</span> <span class="pre">=</span> <span class="pre">ker</span> <span class="pre">φ</span></code>. In that case the descended morphism is injective and we get a group isomorphism onto its image. This result is often called the first isomorphism theorem.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">φ</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">M</span><span class="o">)</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">⧸</span> <span class="n">MonoidHom.ker</span> <span class="n">φ</span> <span class="bp">→*</span> <span class="n">MonoidHom.range</span> <span class="n">φ</span> <span class="o">:=</span> <span class="n">QuotientGroup.quotientKerEquivRange</span> <span class="n">φ</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">M</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">φ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">MonoidHom.ker</span><span class="w"> </span><span class="n">φ</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">MonoidHom.range</span><span class="w"> </span><span class="n">φ</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">QuotientGroup.quotientKerEquivRange</span><span class="w"> </span><span class="n">φ</span> </pre></div> </div> <p>Applying the universal property to a composition of a morphism <code class="docutils literal notranslate"><span class="pre">φ</span> <span class="pre">:</span> <span class="pre">G</span> <span class="pre">→*</span> <span class="pre">G'</span></code>
-
@@ -638,18 +638,18 @@ The condition required on <code class="docutils literal notranslate"><span class<code class="docutils literal notranslate"><span class="pre">N'</span></code>.” But this is equivalent to asking that <code class="docutils literal notranslate"><span class="pre">φ</span></code> should pull <code class="docutils literal notranslate"><span class="pre">N'</span></code> back inside <code class="docutils literal notranslate"><span class="pre">N</span></code>, and the latter condition is nicer to work with since the definition of pullback does not involve an existential quantifier.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="n">G'</span><span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G'</span><span class="o">]</span> <span class="o">{</span><span class="n">N</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">}</span> <span class="o">[</span><span class="n">N.Normal</span><span class="o">]</span> <span class="o">{</span><span class="n">N'</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G'</span><span class="o">}</span> <span class="o">[</span><span class="n">N'.Normal</span><span class="o">]</span> <span class="o">{</span><span class="n">φ</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→*</span> <span class="n">G'</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">N</span> <span class="bp">≤</span> <span class="n">Subgroup.comap</span> <span class="n">φ</span> <span class="n">N'</span><span class="o">)</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">⧸</span> <span class="n">N</span> <span class="bp">→*</span> <span class="n">G'</span> <span class="bp">⧸</span> <span class="n">N'</span><span class="o">:=</span> <span class="n">QuotientGroup.map</span> <span class="n">N</span> <span class="n">N'</span> <span class="n">φ</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="n">G'</span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G'</span><span class="o">]</span> <span class="w"> </span><span class="o">{</span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">N.Normal</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">N'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G'</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">N'.Normal</span><span class="o">]</span> <span class="w"> </span><span class="o">{</span><span class="n">φ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">G'</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">Subgroup.comap</span><span class="w"> </span><span class="n">φ</span><span class="w"> </span><span class="n">N'</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">G'</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">N'</span><span class="o">:=</span> <span class="w"> </span><span class="n">QuotientGroup.map</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="n">N'</span><span class="w"> </span><span class="n">φ</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>One subtle point to keep in mind is that the type <code class="docutils literal notranslate"><span class="pre">G</span> <span class="pre">⧸</span> <span class="pre">N</span></code> really depends on <code class="docutils literal notranslate"><span class="pre">N</span></code> (up to definitional equality), so having a proof that two normal subgroups <code class="docutils literal notranslate"><span class="pre">N</span></code> and <code class="docutils literal notranslate"><span class="pre">M</span></code> are equal is not enough to make the corresponding quotients equal. However the universal properties does give an isomorphism in this case.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">{</span><span class="n">M</span> <span class="n">N</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">}</span> <span class="o">[</span><span class="n">M.Normal</span><span class="o">]</span> <span class="o">[</span><span class="n">N.Normal</span><span class="o">]</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">M</span> <span class="bp">=</span> <span class="n">N</span><span class="o">)</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">⧸</span> <span class="n">M</span> <span class="bp">≃*</span> <span class="n">G</span> <span class="bp">⧸</span> <span class="n">N</span> <span class="o">:=</span> <span class="n">QuotientGroup.quotientMulEquivOfEq</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">M</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">M.Normal</span><span class="o">]</span> <span class="w"> </span><span class="o">[</span><span class="n">N.Normal</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">N</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="bp">≃*</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">QuotientGroup.quotientMulEquivOfEq</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>As a final series of exercises for this section, we will prove that if <code class="docutils literal notranslate"><span class="pre">H</span></code> and <code class="docutils literal notranslate"><span class="pre">K</span></code> are disjoint
-
@@ -659,46 +659,46 @@ then <code class="docutils literal notranslate"><span class="pre">G</span></code<p>We start with playing a bit with Lagrange’s lemma, without assuming the subgroups are normal or disjoint.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">section</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Group</span> <span class="n">G</span><span class="o">]</span> <span class="o">{</span><span class="n">H</span> <span class="n">K</span> <span class="o">:</span> <span class="n">Subgroup</span> <span class="n">G</span><span class="o">}</span> <span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Group</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">H</span><span class="w"> </span><span class="n">K</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subgroup</span><span class="w"> </span><span class="n">G</span><span class="o">}</span> <span class="kn">open</span> <span class="n">MonoidHom</span> <span class="kn">open</span><span class="w"> </span><span class="n">MonoidHom</span> <span class="k">#check</span> <span class="n">Nat.card_pos</span> <span class="c1">-- The nonempty argument will be automatically inferred for subgroups</span> <span class="k">#check</span> <span class="n">Subgroup.index_eq_card</span> <span class="k">#check</span> <span class="n">Subgroup.index_mul_card</span> <span class="k">#check</span> <span class="n">Nat.eq_of_mul_eq_mul_right</span> <span class="k">#check</span><span class="w"> </span><span class="n">Nat.card_pos</span><span class="w"> </span><span class="c1">-- The nonempty argument will be automatically inferred for subgroups</span> <span class="k">#check</span><span class="w"> </span><span class="n">Subgroup.index_eq_card</span> <span class="k">#check</span><span class="w"> </span><span class="n">Subgroup.index_mul_card</span> <span class="k">#check</span><span class="w"> </span><span class="n">Nat.eq_of_mul_eq_mul_right</span> <span class="kd">lemma</span> <span class="n">aux_card_eq</span> <span class="o">[</span><span class="n">Finite</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="n">Nat.card</span> <span class="n">G</span> <span class="bp">=</span> <span class="n">Nat.card</span> <span class="n">H</span> <span class="bp">*</span> <span class="n">Nat.card</span> <span class="n">K</span><span class="o">)</span> <span class="o">:</span> <span class="n">Nat.card</span> <span class="o">(</span><span class="n">G</span> <span class="bp">⧸</span> <span class="n">H</span><span class="o">)</span> <span class="bp">=</span> <span class="n">Nat.card</span> <span class="n">K</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">lemma</span><span class="w"> </span><span class="n">aux_card_eq</span><span class="w"> </span><span class="o">[</span><span class="n">Finite</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.card</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">Nat.card</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">Nat.card</span><span class="w"> </span><span class="n">K</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Nat.card</span><span class="w"> </span><span class="o">(</span><span class="n">G</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">Nat.card</span><span class="w"> </span><span class="n">K</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>From now on, we assume that our subgroups are normal and disjoint, and we assume the cardinality condition. Now we construct the first building block of the desired isomorphism.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">[</span><span class="n">H.Normal</span><span class="o">]</span> <span class="o">[</span><span class="n">K.Normal</span><span class="o">]</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">Disjoint</span> <span class="n">H</span> <span class="n">K</span><span class="o">)</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="n">Nat.card</span> <span class="n">G</span> <span class="bp">=</span> <span class="n">Nat.card</span> <span class="n">H</span> <span class="bp">*</span> <span class="n">Nat.card</span> <span class="n">K</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">[</span><span class="n">H.Normal</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">K.Normal</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Fintype</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Disjoint</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="n">K</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.card</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">Nat.card</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">Nat.card</span><span class="w"> </span><span class="n">K</span><span class="o">)</span> <span class="k">#check</span> <span class="n">Nat.bijective_iff_injective_and_card</span> <span class="k">#check</span> <span class="n">ker_eq_bot_iff</span> <span class="k">#check</span> <span class="n">restrict</span> <span class="k">#check</span> <span class="n">ker_restrict</span> <span class="k">#check</span><span class="w"> </span><span class="n">Nat.bijective_iff_injective_and_card</span> <span class="k">#check</span><span class="w"> </span><span class="n">ker_eq_bot_iff</span> <span class="k">#check</span><span class="w"> </span><span class="n">restrict</span> <span class="k">#check</span><span class="w"> </span><span class="n">ker_restrict</span> <span class="kd">def</span> <span class="n">iso₁</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">G</span><span class="o">]</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">Disjoint</span> <span class="n">H</span> <span class="n">K</span><span class="o">)</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="n">Nat.card</span> <span class="n">G</span> <span class="bp">=</span> <span class="n">Nat.card</span> <span class="n">H</span> <span class="bp">*</span> <span class="n">Nat.card</span> <span class="n">K</span><span class="o">)</span> <span class="o">:</span> <span class="n">K</span> <span class="bp">≃*</span> <span class="n">G</span> <span class="bp">⧸</span> <span class="n">H</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">def</span><span class="w"> </span><span class="n">iso₁</span><span class="w"> </span><span class="o">[</span><span class="n">Fintype</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Disjoint</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="n">K</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Nat.card</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">Nat.card</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">Nat.card</span><span class="w"> </span><span class="n">K</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">K</span><span class="w"> </span><span class="bp">≃*</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Now we can define our second building block. We will need <code class="docutils literal notranslate"><span class="pre">MonoidHom.prod</span></code>, which builds a morphism from <code class="docutils literal notranslate"><span class="pre">G₀</span></code> to <code class="docutils literal notranslate"><span class="pre">G₁</span> <span class="pre">×</span> <span class="pre">G₂</span></code> out of morphisms from <code class="docutils literal notranslate"><span class="pre">G₀</span></code> to <code class="docutils literal notranslate"><span class="pre">G₁</span></code> and <code class="docutils literal notranslate"><span class="pre">G₂</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">iso₂</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">≃*</span> <span class="o">(</span><span class="n">G</span> <span class="bp">⧸</span> <span class="n">K</span><span class="o">)</span> <span class="bp">×</span> <span class="o">(</span><span class="n">G</span> <span class="bp">⧸</span> <span class="n">H</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">iso₂</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">≃*</span><span class="w"> </span><span class="o">(</span><span class="n">G</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">K</span><span class="o">)</span><span class="w"> </span><span class="bp">×</span><span class="w"> </span><span class="o">(</span><span class="n">G</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>We are ready to put all pieces together.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">MulEquiv.prodCongr</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="n">MulEquiv.prodCongr</span> <span class="kd">def</span> <span class="n">finalIso</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">≃*</span> <span class="n">H</span> <span class="bp">×</span> <span class="n">K</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">def</span><span class="w"> </span><span class="n">finalIso</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">≃*</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="bp">×</span><span class="w"> </span><span class="n">K</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> </section>
-
@@ -710,7 +710,7 @@ morphisms from <code class="docutils literal notranslate"><span class="pre">G<p>The type of ring structures on a type <code class="docutils literal notranslate"><span class="pre">R</span></code> is <code class="docutils literal notranslate"><span class="pre">Ring</span> <span class="pre">R</span></code>. The variant where multiplication is assumed to be commutative is <code class="docutils literal notranslate"><span class="pre">CommRing</span> <span class="pre">R</span></code>. We have already seen that the <code class="docutils literal notranslate"><span class="pre">ring</span></code> tactic will prove any equality that follows from the axioms of a commutative ring.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">x</span> <span class="bp">+</span> <span class="n">y</span><span class="o">)</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">=</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">y</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ring</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">ring</span> </pre></div> </div> <p>More exotic variants do not require that the addition on <code class="docutils literal notranslate"><span class="pre">R</span></code> forms a group but only an additive
-
@@ -720,7 +720,7 @@ of functions taking values in the natural numbers.Another important example is the type of ideals in a ring, which will be discussed below. The name of the <code class="docutils literal notranslate"><span class="pre">ring</span></code> tactic is doubly misleading, since it assumes commutativity but works in semirings as well. In other words, it applies to any <code class="docutils literal notranslate"><span class="pre">CommSemiring</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">x</span> <span class="bp">+</span> <span class="n">y</span><span class="o">)</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">=</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">y</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">x</span> <span class="bp">*</span> <span class="n">y</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">ring</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">ring</span> </pre></div> </div> <p>There are also versions of the ring and semiring classes that do not assume the existence of a
-
@@ -737,27 +737,27 @@ This implementation detail is relevant mainly when defining computable functionssituations one can use <code class="docutils literal notranslate"><span class="pre">IsUnit.unit</span> <span class="pre">{x</span> <span class="pre">:</span> <span class="pre">M}</span> <span class="pre">:</span> <span class="pre">IsUnit</span> <span class="pre">x</span> <span class="pre">→</span> <span class="pre">Mˣ</span></code> to build a unit. In the commutative case, one also has <code class="docutils literal notranslate"><span class="pre">Units.mkOfMulEqOne</span> <span class="pre">(x</span> <span class="pre">y</span> <span class="pre">:</span> <span class="pre">M)</span> <span class="pre">:</span> <span class="pre">x</span> <span class="pre">*</span> <span class="pre">y</span> <span class="pre">=</span> <span class="pre">1</span> <span class="pre">→</span> <span class="pre">Mˣ</span></code> which builds <code class="docutils literal notranslate"><span class="pre">x</span></code> seen as unit.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℤ</span><span class="bp">ˣ</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">1</span> <span class="bp">∨</span> <span class="n">x</span> <span class="bp">=</span> <span class="bp">-</span><span class="mi">1</span> <span class="o">:=</span> <span class="n">Int.units_eq_one_or</span> <span class="n">x</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℤ</span><span class="bp">ˣ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">∨</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">-</span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Int.units_eq_one_or</span><span class="w"> </span><span class="n">x</span> <span class="kd">example</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">M</span><span class="bp">ˣ</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">M</span><span class="o">)</span> <span class="bp">*</span> <span class="n">x</span><span class="bp">⁻¹</span> <span class="bp">=</span> <span class="mi">1</span> <span class="o">:=</span> <span class="n">Units.mul_inv</span> <span class="n">x</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">M</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="bp">ˣ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">x</span><span class="bp">⁻¹</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Units.mul_inv</span><span class="w"> </span><span class="n">x</span> <span class="kd">example</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Monoid</span> <span class="n">M</span><span class="o">]</span> <span class="o">:</span> <span class="n">Group</span> <span class="n">M</span><span class="bp">ˣ</span> <span class="o">:=</span> <span class="n">inferInstance</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">M</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Monoid</span><span class="w"> </span><span class="n">M</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Group</span><span class="w"> </span><span class="n">M</span><span class="bp">ˣ</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">inferInstance</span> </pre></div> </div> <p>The type of ring morphisms between two (semi)-rings <code class="docutils literal notranslate"><span class="pre">R</span></code> and <code class="docutils literal notranslate"><span class="pre">S</span></code> is <code class="docutils literal notranslate"><span class="pre">RingHom</span> <span class="pre">R</span> <span class="pre">S</span></code>, with notation <code class="docutils literal notranslate"><span class="pre">R</span> <span class="pre">→+*</span> <span class="pre">S</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="n">S</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">S</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">→+*</span> <span class="n">S</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="o">(</span><span class="n">x</span> <span class="bp">+</span> <span class="n">y</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">f</span> <span class="n">y</span> <span class="o">:=</span> <span class="n">f.map_add</span> <span class="n">x</span> <span class="n">y</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Ring</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Ring</span><span class="w"> </span><span class="n">S</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="bp">→+*</span><span class="w"> </span><span class="n">S</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">f.map_add</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span> <span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="n">S</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">S</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">→+*</span> <span class="n">S</span><span class="o">)</span> <span class="o">:</span> <span class="n">R</span><span class="bp">ˣ</span> <span class="bp">→*</span> <span class="n">S</span><span class="bp">ˣ</span> <span class="o">:=</span> <span class="n">Units.map</span> <span class="n">f</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Ring</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Ring</span><span class="w"> </span><span class="n">S</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="bp">→+*</span><span class="w"> </span><span class="n">S</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="bp">ˣ</span><span class="w"> </span><span class="bp">→*</span><span class="w"> </span><span class="n">S</span><span class="bp">ˣ</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Units.map</span><span class="w"> </span><span class="n">f</span> </pre></div> </div> <p>The isomorphism variant is <code class="docutils literal notranslate"><span class="pre">RingEquiv</span></code>, with notation <code class="docutils literal notranslate"><span class="pre">≃+*</span></code>.</p> <p>As with submonoids and subgroups, there is a <code class="docutils literal notranslate"><span class="pre">Subring</span> <span class="pre">R</span></code> type for subrings of a ring <code class="docutils literal notranslate"><span class="pre">R</span></code>, but this type is a lot less useful than the type of subgroups since one cannot quotient a ring by a subring.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">S</span> <span class="o">:</span> <span class="n">Subring</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">Ring</span> <span class="n">S</span> <span class="o">:=</span> <span class="n">inferInstance</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Ring</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">S</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Subring</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Ring</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">inferInstance</span> </pre></div> </div> <p>Also notice that <code class="docutils literal notranslate"><span class="pre">RingHom.range</span></code> produces a subring.</p>
-
@@ -774,40 +774,40 @@ ideals. But anonymous projection notation won’t always work as expected. Fone cannot replace <code class="docutils literal notranslate"><span class="pre">Ideal.Quotient.mk</span> <span class="pre">I</span></code> by <code class="docutils literal notranslate"><span class="pre">I.Quotient.mk</span></code> in the snippet below because there are two <code class="docutils literal notranslate"><span class="pre">.``s</span> <span class="pre">and</span> <span class="pre">so</span> <span class="pre">it</span> <span class="pre">will</span> <span class="pre">parse</span> <span class="pre">as</span> <span class="pre">``(Ideal.Quotient</span> <span class="pre">I).mk</span></code>; but <code class="docutils literal notranslate"><span class="pre">Ideal.Quotient</span></code> by itself doesn’t exist.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">I</span> <span class="o">:</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">→+*</span> <span class="n">R</span> <span class="bp">⧸</span> <span class="n">I</span> <span class="o">:=</span> <span class="n">Ideal.Quotient.mk</span> <span class="n">I</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">I</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Ideal</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="bp">→+*</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Ideal.Quotient.mk</span><span class="w"> </span><span class="n">I</span> <span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">{</span><span class="n">a</span> <span class="o">:</span> <span class="n">R</span><span class="o">}</span> <span class="o">{</span><span class="n">I</span> <span class="o">:</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">}</span> <span class="o">:</span> <span class="n">Ideal.Quotient.mk</span> <span class="n">I</span> <span class="n">a</span> <span class="bp">=</span> <span class="mi">0</span> <span class="bp">↔</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">I</span> <span class="o">:=</span> <span class="n">Ideal.Quotient.eq_zero_iff_mem</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">I</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Ideal</span><span class="w"> </span><span class="n">R</span><span class="o">}</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Ideal.Quotient.mk</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Ideal.Quotient.eq_zero_iff_mem</span> </pre></div> </div> <p>The universal property of quotient rings is <code class="docutils literal notranslate"><span class="pre">Ideal.Quotient.lift</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="n">S</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">S</span><span class="o">]</span> <span class="o">(</span><span class="n">I</span> <span class="o">:</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">→+*</span> <span class="n">S</span><span class="o">)</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">I</span> <span class="bp">≤</span> <span class="n">RingHom.ker</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">⧸</span> <span class="n">I</span> <span class="bp">→+*</span> <span class="n">S</span> <span class="o">:=</span> <span class="n">Ideal.Quotient.lift</span> <span class="n">I</span> <span class="n">f</span> <span class="n">H</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">S</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">I</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Ideal</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="bp">→+*</span><span class="w"> </span><span class="n">S</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">RingHom.ker</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">→+*</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Ideal.Quotient.lift</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">H</span> </pre></div> </div> <p>In particular it leads to the first isomorphism theorem for rings.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="n">S</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">S</span><span class="o">](</span><span class="n">f</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">→+*</span> <span class="n">S</span><span class="o">)</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">⧸</span> <span class="n">RingHom.ker</span> <span class="n">f</span> <span class="bp">≃+*</span> <span class="n">f.range</span> <span class="o">:=</span> <span class="n">RingHom.quotientKerEquivRange</span> <span class="n">f</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">S</span><span class="o">](</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="bp">→+*</span><span class="w"> </span><span class="n">S</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">RingHom.ker</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">≃+*</span><span class="w"> </span><span class="n">f.range</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">RingHom.quotientKerEquivRange</span><span class="w"> </span><span class="n">f</span> </pre></div> </div> <p>Ideals form a complete lattice structure with the inclusion relation, as well as a semiring structure. These two structures interact nicely.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">{</span><span class="n">I</span> <span class="n">J</span> <span class="o">:</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">}</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">I</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Ideal</span><span class="w"> </span><span class="n">R</span><span class="o">}</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">I</span> <span class="bp">+</span> <span class="n">J</span> <span class="bp">=</span> <span class="n">I</span> <span class="bp">⊔</span> <span class="n">J</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">⊔</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">rfl</span> <span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">R</span><span class="o">}</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">I</span> <span class="bp">+</span> <span class="n">J</span> <span class="bp">↔</span> <span class="bp">∃</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">I</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">b</span> <span class="bp">∈</span> <span class="n">J</span><span class="o">,</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">x</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="o">[</span><span class="n">Submodule.mem_sup</span><span class="o">]</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">I</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">J</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">Submodule.mem_sup</span><span class="o">]</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">I</span> <span class="bp">*</span> <span class="n">J</span> <span class="bp">≤</span> <span class="n">J</span> <span class="o">:=</span> <span class="n">Ideal.mul_le_left</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Ideal.mul_le_left</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">I</span> <span class="bp">*</span> <span class="n">J</span> <span class="bp">≤</span> <span class="n">I</span> <span class="o">:=</span> <span class="n">Ideal.mul_le_right</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Ideal.mul_le_right</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">I</span> <span class="bp">*</span> <span class="n">J</span> <span class="bp">≤</span> <span class="n">I</span> <span class="bp">⊓</span> <span class="n">J</span> <span class="o">:=</span> <span class="n">Ideal.mul_le_inf</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Ideal.mul_le_inf</span> </pre></div> </div> <p>One can use ring morphisms to push ideals forward and pull them back using <code class="docutils literal notranslate"><span class="pre">Ideal.map</span></code> and
-
@@ -815,123 +815,123 @@ structure. These two structures interact nicely.</p>the latter is more convenient to use since it does not involve an existential quantifier. This explains why it is used to state the condition that allows us to build morphisms between quotient rings.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="n">S</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">S</span><span class="o">]</span> <span class="o">(</span><span class="n">I</span> <span class="o">:</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">J</span> <span class="o">:</span> <span class="n">Ideal</span> <span class="n">S</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">→+*</span> <span class="n">S</span><span class="o">)</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">I</span> <span class="bp">≤</span> <span class="n">Ideal.comap</span> <span class="n">f</span> <span class="n">J</span><span class="o">)</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">⧸</span> <span class="n">I</span> <span class="bp">→+*</span> <span class="n">S</span> <span class="bp">⧸</span> <span class="n">J</span> <span class="o">:=</span> <span class="n">Ideal.quotientMap</span> <span class="n">J</span> <span class="n">f</span> <span class="n">H</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">S</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">I</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Ideal</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">J</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Ideal</span><span class="w"> </span><span class="n">S</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="bp">→+*</span><span class="w"> </span><span class="n">S</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">Ideal.comap</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">J</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">→+*</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Ideal.quotientMap</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">H</span> </pre></div> </div> <p>One subtle point is that the type <code class="docutils literal notranslate"><span class="pre">R</span> <span class="pre">⧸</span> <span class="pre">I</span></code> really depends on <code class="docutils literal notranslate"><span class="pre">I</span></code> (up to definitional equality), so having a proof that two ideals <code class="docutils literal notranslate"><span class="pre">I</span></code> and <code class="docutils literal notranslate"><span class="pre">J</span></code> are equal is not enough to make the corresponding quotients equal. However, the universal properties do provide an isomorphism in this case.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">{</span><span class="n">I</span> <span class="n">J</span> <span class="o">:</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">I</span> <span class="bp">=</span> <span class="n">J</span><span class="o">)</span> <span class="o">:</span> <span class="n">R</span> <span class="bp">⧸</span> <span class="n">I</span> <span class="bp">≃+*</span> <span class="n">R</span> <span class="bp">⧸</span> <span class="n">J</span> <span class="o">:=</span> <span class="n">Ideal.quotEquivOfEq</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">I</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Ideal</span><span class="w"> </span><span class="n">R</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">J</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">≃+*</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Ideal.quotEquivOfEq</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>We can now present the Chinese remainder isomorphism as an example. Pay attention to the difference between the indexed infimum symbol <code class="docutils literal notranslate"><span class="pre">⨅</span></code> and the big product of types symbol <code class="docutils literal notranslate"><span class="pre">Π</span></code>. Depending on your font, those can be pretty hard to distinguish.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">{</span><span class="n">ι</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">ι</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">i</span> <span class="n">j</span><span class="o">,</span> <span class="n">i</span> <span class="bp">≠</span> <span class="n">j</span> <span class="bp">→</span> <span class="n">IsCoprime</span> <span class="o">(</span><span class="n">f</span> <span class="n">i</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="n">j</span><span class="o">))</span> <span class="o">:</span> <span class="o">(</span><span class="n">R</span> <span class="bp">⧸</span> <span class="bp">⨅</span> <span class="n">i</span><span class="o">,</span> <span class="n">f</span> <span class="n">i</span><span class="o">)</span> <span class="bp">≃+*</span> <span class="bp">Π</span> <span class="n">i</span><span class="o">,</span> <span class="n">R</span> <span class="bp">⧸</span> <span class="n">f</span> <span class="n">i</span> <span class="o">:=</span> <span class="n">Ideal.quotientInfRingEquivPiQuotient</span> <span class="n">f</span> <span class="n">hf</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">ι</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Fintype</span><span class="w"> </span><span class="n">ι</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Ideal</span><span class="w"> </span><span class="n">R</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="n">j</span><span class="o">,</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">IsCoprime</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">j</span><span class="o">))</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">R</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="bp">⨅</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">≃+*</span><span class="w"> </span><span class="bp">Π</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Ideal.quotientInfRingEquivPiQuotient</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">hf</span> </pre></div> </div> <p>The elementary version of the Chinese remainder theorem, a statement about <code class="docutils literal notranslate"><span class="pre">ZMod</span></code>, can be easily deduced from the previous one:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">BigOperators</span> <span class="n">PiNotation</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">BigOperators</span><span class="w"> </span><span class="n">PiNotation</span> <span class="kd">example</span> <span class="o">{</span><span class="n">ι</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">ι</span><span class="o">]</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">coprime</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">i</span> <span class="n">j</span><span class="o">,</span> <span class="n">i</span> <span class="bp">≠</span> <span class="n">j</span> <span class="bp">→</span> <span class="o">(</span><span class="n">a</span> <span class="n">i</span><span class="o">)</span><span class="bp">.</span><span class="n">Coprime</span> <span class="o">(</span><span class="n">a</span> <span class="n">j</span><span class="o">))</span> <span class="o">:</span> <span class="n">ZMod</span> <span class="o">(</span><span class="bp">∏</span> <span class="n">i</span><span class="o">,</span> <span class="n">a</span> <span class="n">i</span><span class="o">)</span> <span class="bp">≃+*</span> <span class="bp">Π</span> <span class="n">i</span><span class="o">,</span> <span class="n">ZMod</span> <span class="o">(</span><span class="n">a</span> <span class="n">i</span><span class="o">)</span> <span class="o">:=</span> <span class="n">ZMod.prodEquivPi</span> <span class="n">a</span> <span class="n">coprime</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">ι</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Fintype</span><span class="w"> </span><span class="n">ι</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">coprime</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="n">j</span><span class="o">,</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="bp">.</span><span class="n">Coprime</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">j</span><span class="o">))</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">ZMod</span><span class="w"> </span><span class="o">(</span><span class="bp">∏</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">≃+*</span><span class="w"> </span><span class="bp">Π</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">ZMod</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">ZMod.prodEquivPi</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">coprime</span> </pre></div> </div> <p>As a series of exercises, we will reprove the Chinese remainder theorem in the general case.</p> <p>We first need to define the map appearing in the theorem, as a ring morphism, using the universal property of quotient rings.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">ι</span> <span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="kn">open</span> <span class="n">Ideal</span> <span class="n">Quotient</span> <span class="n">Function</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">ι</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span> <span class="kn">open</span><span class="w"> </span><span class="n">Ideal</span><span class="w"> </span><span class="n">Quotient</span><span class="w"> </span><span class="n">Function</span> <span class="k">#check</span> <span class="k">Pi</span><span class="bp">.</span><span class="n">ringHom</span> <span class="k">#check</span> <span class="n">ker_Pi_Quotient_mk</span> <span class="k">#check</span><span class="w"> </span><span class="k">Pi</span><span class="bp">.</span><span class="n">ringHom</span> <span class="k">#check</span><span class="w"> </span><span class="n">ker_Pi_Quotient_mk</span> <span class="sd">/-- The homomorphism from ``R ⧸ ⨅ i, I i`` to ``Π i, R ⧸ I i`` featured in the Chinese</span> <span class="sd"> Remainder Theorem. -/</span> <span class="kd">def</span> <span class="n">chineseMap</span> <span class="o">(</span><span class="n">I</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">R</span> <span class="bp">⧸</span> <span class="bp">⨅</span> <span class="n">i</span><span class="o">,</span> <span class="n">I</span> <span class="n">i</span><span class="o">)</span> <span class="bp">→+*</span> <span class="bp">Π</span> <span class="n">i</span><span class="o">,</span> <span class="n">R</span> <span class="bp">⧸</span> <span class="n">I</span> <span class="n">i</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">def</span><span class="w"> </span><span class="n">chineseMap</span><span class="w"> </span><span class="o">(</span><span class="n">I</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Ideal</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">R</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="bp">⨅</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">→+*</span><span class="w"> </span><span class="bp">Π</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Make sure the following next two lemmas can be proven by <code class="docutils literal notranslate"><span class="pre">rfl</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">lemma</span> <span class="n">chineseMap_mk</span> <span class="o">(</span><span class="n">I</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">chineseMap</span> <span class="n">I</span> <span class="o">(</span><span class="n">Quotient.mk</span> <span class="n">_</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="k">fun</span> <span class="n">i</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">↦</span> <span class="n">Ideal.Quotient.mk</span> <span class="o">(</span><span class="n">I</span> <span class="n">i</span><span class="o">)</span> <span class="n">x</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">lemma</span><span class="w"> </span><span class="n">chineseMap_mk</span><span class="w"> </span><span class="o">(</span><span class="n">I</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Ideal</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">chineseMap</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="o">(</span><span class="n">Quotient.mk</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">Ideal.Quotient.mk</span><span class="w"> </span><span class="o">(</span><span class="n">I</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> <span class="kd">lemma</span> <span class="n">chineseMap_mk'</span> <span class="o">(</span><span class="n">I</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">i</span> <span class="o">:</span> <span class="n">ι</span><span class="o">)</span> <span class="o">:</span> <span class="n">chineseMap</span> <span class="n">I</span> <span class="o">(</span><span class="n">mk</span> <span class="n">_</span> <span class="n">x</span><span class="o">)</span> <span class="n">i</span> <span class="bp">=</span> <span class="n">mk</span> <span class="o">(</span><span class="n">I</span> <span class="n">i</span><span class="o">)</span> <span class="n">x</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">lemma</span><span class="w"> </span><span class="n">chineseMap_mk'</span><span class="w"> </span><span class="o">(</span><span class="n">I</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Ideal</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">i</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">chineseMap</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="o">(</span><span class="n">mk</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">mk</span><span class="w"> </span><span class="o">(</span><span class="n">I</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>The next lemma proves the easy half of the Chinese remainder theorem, without any assumption on the family of ideals. The proof is less than one line long.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">injective_lift_iff</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="n">injective_lift_iff</span> <span class="kd">lemma</span> <span class="n">chineseMap_inj</span> <span class="o">(</span><span class="n">I</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">Injective</span> <span class="o">(</span><span class="n">chineseMap</span> <span class="n">I</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="kd">lemma</span><span class="w"> </span><span class="n">chineseMap_inj</span><span class="w"> </span><span class="o">(</span><span class="n">I</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Ideal</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Injective</span><span class="w"> </span><span class="o">(</span><span class="n">chineseMap</span><span class="w"> </span><span class="n">I</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>We are now ready for the heart of the theorem, which will show the surjectivity of our <code class="docutils literal notranslate"><span class="pre">chineseMap</span></code>. First we need to know the different ways one can express the coprimality (also called co-maximality assumption). Only the first two will be needed below.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">IsCoprime</span> <span class="k">#check</span> <span class="n">isCoprime_iff_add</span> <span class="k">#check</span> <span class="n">isCoprime_iff_exists</span> <span class="k">#check</span> <span class="n">isCoprime_iff_sup_eq</span> <span class="k">#check</span> <span class="n">isCoprime_iff_codisjoint</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="n">IsCoprime</span> <span class="k">#check</span><span class="w"> </span><span class="n">isCoprime_iff_add</span> <span class="k">#check</span><span class="w"> </span><span class="n">isCoprime_iff_exists</span> <span class="k">#check</span><span class="w"> </span><span class="n">isCoprime_iff_sup_eq</span> <span class="k">#check</span><span class="w"> </span><span class="n">isCoprime_iff_codisjoint</span> </pre></div> </div> <p>We take the opportunity to use induction on <code class="docutils literal notranslate"><span class="pre">Finset</span></code>. Relevant lemmas on <code class="docutils literal notranslate"><span class="pre">Finset</span></code> are given below. Remember that the <code class="docutils literal notranslate"><span class="pre">ring</span></code> tactic works for semirings and that the ideals of a ring form a semiring.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">Finset.mem_insert_of_mem</span> <span class="k">#check</span> <span class="n">Finset.mem_insert_self</span> <span class="kd">theorem</span> <span class="n">isCoprime_Inf</span> <span class="o">{</span><span class="n">I</span> <span class="o">:</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">}</span> <span class="o">{</span><span class="n">J</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">}</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Finset</span> <span class="n">ι</span><span class="o">}</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">j</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="n">IsCoprime</span> <span class="n">I</span> <span class="o">(</span><span class="n">J</span> <span class="n">j</span><span class="o">))</span> <span class="o">:</span> <span class="n">IsCoprime</span> <span class="n">I</span> <span class="o">(</span><span class="bp">⨅</span> <span class="n">j</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="n">J</span> <span class="n">j</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">classical</span> <span class="n">simp_rw</span> <span class="o">[</span><span class="n">isCoprime_iff_add</span><span class="o">]</span> <span class="n">at</span> <span class="bp">*</span> <span class="n">induction</span> <span class="n">s</span> <span class="n">using</span> <span class="n">Finset.induction</span> <span class="k">with</span> <span class="bp">|</span> <span class="n">empty</span> <span class="bp">=></span> <span class="n">simp</span> <span class="bp">|</span> <span class="bp">@</span><span class="n">insert</span> <span class="n">i</span> <span class="n">s</span> <span class="n">_</span> <span class="n">hs</span> <span class="bp">=></span> <span class="n">rw</span> <span class="o">[</span><span class="n">Finset.iInf_insert</span><span class="o">,</span> <span class="n">inf_comm</span><span class="o">,</span> <span class="n">one_eq_top</span><span class="o">,</span> <span class="n">eq_top_iff</span><span class="o">,</span> <span class="bp">←</span> <span class="n">one_eq_top</span><span class="o">]</span> <span class="n">set</span> <span class="n">K</span> <span class="o">:=</span> <span class="bp">⨅</span> <span class="n">j</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="n">J</span> <span class="n">j</span> <span class="k">calc</span> <span class="mi">1</span> <span class="bp">=</span> <span class="n">I</span> <span class="bp">+</span> <span class="n">K</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">_</span> <span class="bp">=</span> <span class="n">I</span> <span class="bp">+</span> <span class="n">K</span> <span class="bp">*</span> <span class="o">(</span><span class="n">I</span> <span class="bp">+</span> <span class="n">J</span> <span class="n">i</span><span class="o">)</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">_</span> <span class="bp">=</span> <span class="o">(</span><span class="mi">1</span> <span class="bp">+</span> <span class="n">K</span><span class="o">)</span> <span class="bp">*</span> <span class="n">I</span> <span class="bp">+</span> <span class="n">K</span> <span class="bp">*</span> <span class="n">J</span> <span class="n">i</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">_</span> <span class="bp">≤</span> <span class="n">I</span> <span class="bp">+</span> <span class="n">K</span> <span class="bp">⊓</span> <span class="n">J</span> <span class="n">i</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="n">Finset.mem_insert_of_mem</span> <span class="k">#check</span><span class="w"> </span><span class="n">Finset.mem_insert_self</span> <span class="kd">theorem</span><span class="w"> </span><span class="n">isCoprime_Inf</span><span class="w"> </span><span class="o">{</span><span class="n">I</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Ideal</span><span class="w"> </span><span class="n">R</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">J</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Ideal</span><span class="w"> </span><span class="n">R</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Finset</span><span class="w"> </span><span class="n">ι</span><span class="o">}</span> <span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">IsCoprime</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="o">(</span><span class="n">J</span><span class="w"> </span><span class="n">j</span><span class="o">))</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsCoprime</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="o">(</span><span class="bp">⨅</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="n">j</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">classical</span> <span class="w"> </span><span class="n">simp_rw</span><span class="w"> </span><span class="o">[</span><span class="n">isCoprime_iff_add</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="bp">*</span> <span class="w"> </span><span class="n">induction</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">using</span><span class="w"> </span><span class="n">Finset.induction</span><span class="w"> </span><span class="k">with</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">empty</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="n">simp</span> <span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="bp">@</span><span class="n">insert</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">hs</span><span class="w"> </span><span class="bp">=></span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">Finset.iInf_insert</span><span class="o">,</span><span class="w"> </span><span class="n">inf_comm</span><span class="o">,</span><span class="w"> </span><span class="n">one_eq_top</span><span class="o">,</span><span class="w"> </span><span class="n">eq_top_iff</span><span class="o">,</span><span class="w"> </span><span class="bp">←</span><span class="w"> </span><span class="n">one_eq_top</span><span class="o">]</span> <span class="w"> </span><span class="n">set</span><span class="w"> </span><span class="n">K</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="bp">⨅</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="n">j</span> <span class="w"> </span><span class="k">calc</span> <span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">K</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">K</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">I</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="mi">1</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">K</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">K</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">K</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">J</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>We can now prove surjectivity of the map appearing in the Chinese remainder theorem.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">lemma</span> <span class="n">chineseMap_surj</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">ι</span><span class="o">]</span> <span class="o">{</span><span class="n">I</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">}</span> <span class="o">(</span><span class="n">hI</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">i</span> <span class="n">j</span><span class="o">,</span> <span class="n">i</span> <span class="bp">≠</span> <span class="n">j</span> <span class="bp">→</span> <span class="n">IsCoprime</span> <span class="o">(</span><span class="n">I</span> <span class="n">i</span><span class="o">)</span> <span class="o">(</span><span class="n">I</span> <span class="n">j</span><span class="o">))</span> <span class="o">:</span> <span class="n">Surjective</span> <span class="o">(</span><span class="n">chineseMap</span> <span class="n">I</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">classical</span> <span class="n">intro</span> <span class="n">g</span> <span class="n">choose</span> <span class="n">f</span> <span class="n">hf</span> <span class="n">using</span> <span class="k">fun</span> <span class="n">i</span> <span class="bp">↦</span> <span class="n">Ideal.Quotient.mk_surjective</span> <span class="o">(</span><span class="n">g</span> <span class="n">i</span><span class="o">)</span> <span class="k">have</span> <span class="n">key</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">i</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">e</span> <span class="o">:</span> <span class="n">R</span><span class="o">,</span> <span class="n">mk</span> <span class="o">(</span><span class="n">I</span> <span class="n">i</span><span class="o">)</span> <span class="n">e</span> <span class="bp">=</span> <span class="mi">1</span> <span class="bp">∧</span> <span class="bp">∀</span> <span class="n">j</span><span class="o">,</span> <span class="n">j</span> <span class="bp">≠</span> <span class="n">i</span> <span class="bp">→</span> <span class="n">mk</span> <span class="o">(</span><span class="n">I</span> <span class="n">j</span><span class="o">)</span> <span class="n">e</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">i</span> <span class="k">have</span> <span class="n">hI'</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">j</span> <span class="bp">∈</span> <span class="o">({</span><span class="n">i</span><span class="o">}</span> <span class="o">:</span> <span class="n">Finset</span> <span class="n">ι</span><span class="o">)</span><span class="bp">ᶜ</span><span class="o">,</span> <span class="n">IsCoprime</span> <span class="o">(</span><span class="n">I</span> <span class="n">i</span><span class="o">)</span> <span class="o">(</span><span class="n">I</span> <span class="n">j</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="gr">sorry</span> <span class="n">choose</span> <span class="n">e</span> <span class="n">he</span> <span class="n">using</span> <span class="n">key</span> <span class="n">use</span> <span class="n">mk</span> <span class="n">_</span> <span class="o">(</span><span class="bp">∑</span> <span class="n">i</span><span class="o">,</span> <span class="n">f</span> <span class="n">i</span> <span class="bp">*</span> <span class="n">e</span> <span class="n">i</span><span class="o">)</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">lemma</span><span class="w"> </span><span class="n">chineseMap_surj</span><span class="w"> </span><span class="o">[</span><span class="n">Fintype</span><span class="w"> </span><span class="n">ι</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">I</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Ideal</span><span class="w"> </span><span class="n">R</span><span class="o">}</span> <span class="w"> </span><span class="o">(</span><span class="n">hI</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="n">j</span><span class="o">,</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">IsCoprime</span><span class="w"> </span><span class="o">(</span><span class="n">I</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">I</span><span class="w"> </span><span class="n">j</span><span class="o">))</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Surjective</span><span class="w"> </span><span class="o">(</span><span class="n">chineseMap</span><span class="w"> </span><span class="n">I</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">classical</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">g</span> <span class="w"> </span><span class="n">choose</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">hf</span><span class="w"> </span><span class="n">using</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">Ideal.Quotient.mk_surjective</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="n">i</span><span class="o">)</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">,</span><span class="w"> </span><span class="n">mk</span><span class="w"> </span><span class="o">(</span><span class="n">I</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">j</span><span class="o">,</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">mk</span><span class="w"> </span><span class="o">(</span><span class="n">I</span><span class="w"> </span><span class="n">j</span><span class="o">)</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">i</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">hI'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="o">({</span><span class="n">i</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Finset</span><span class="w"> </span><span class="n">ι</span><span class="o">)</span><span class="bp">ᶜ</span><span class="o">,</span><span class="w"> </span><span class="n">IsCoprime</span><span class="w"> </span><span class="o">(</span><span class="n">I</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">I</span><span class="w"> </span><span class="n">j</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">choose</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="n">he</span><span class="w"> </span><span class="n">using</span><span class="w"> </span><span class="n">key</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">mk</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">(</span><span class="bp">∑</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="n">i</span><span class="o">)</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Now all the pieces come together in the following:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span> <span class="kd">def</span> <span class="n">chineseIso</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">ι</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Ideal</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">i</span> <span class="n">j</span><span class="o">,</span> <span class="n">i</span> <span class="bp">≠</span> <span class="n">j</span> <span class="bp">→</span> <span class="n">IsCoprime</span> <span class="o">(</span><span class="n">f</span> <span class="n">i</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="n">j</span><span class="o">))</span> <span class="o">:</span> <span class="o">(</span><span class="n">R</span> <span class="bp">⧸</span> <span class="bp">⨅</span> <span class="n">i</span><span class="o">,</span> <span class="n">f</span> <span class="n">i</span><span class="o">)</span> <span class="bp">≃+*</span> <span class="bp">Π</span> <span class="n">i</span><span class="o">,</span> <span class="n">R</span> <span class="bp">⧸</span> <span class="n">f</span> <span class="n">i</span> <span class="o">:=</span> <span class="o">{</span> <span class="n">Equiv.ofBijective</span> <span class="n">_</span> <span class="o">⟨</span><span class="n">chineseMap_inj</span> <span class="n">f</span><span class="o">,</span> <span class="n">chineseMap_surj</span> <span class="n">hf</span><span class="o">⟩,</span> <span class="n">chineseMap</span> <span class="n">f</span> <span class="k">with</span> <span class="o">}</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">noncomputable</span><span class="w"> </span><span class="kd">def</span><span class="w"> </span><span class="n">chineseIso</span><span class="w"> </span><span class="o">[</span><span class="n">Fintype</span><span class="w"> </span><span class="n">ι</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Ideal</span><span class="w"> </span><span class="n">R</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="n">j</span><span class="o">,</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">IsCoprime</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">j</span><span class="o">))</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">R</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="bp">⨅</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">≃+*</span><span class="w"> </span><span class="bp">Π</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="bp">⧸</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">Equiv.ofBijective</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">⟨</span><span class="n">chineseMap_inj</span><span class="w"> </span><span class="n">f</span><span class="o">,</span><span class="w"> </span><span class="n">chineseMap_surj</span><span class="w"> </span><span class="n">hf</span><span class="o">⟩,</span> <span class="w"> </span><span class="n">chineseMap</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">}</span> </pre></div> </div> </section>
-
@@ -948,13 +948,13 @@ Note that this notion of algebra is sometimes called an <em>associative unital aexistence of more general notions of algebra.</p> <p>The fact that <code class="docutils literal notranslate"><span class="pre">algebraMap</span> <span class="pre">R</span> <span class="pre">A</span></code> is ring morphism packages together a lot of properties of scalar multiplication, such as the following:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="n">A</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">A</span><span class="o">]</span> <span class="o">[</span><span class="n">Algebra</span> <span class="n">R</span> <span class="n">A</span><span class="o">]</span> <span class="o">(</span><span class="n">r</span> <span class="n">r'</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">A</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">r</span> <span class="bp">+</span> <span class="n">r'</span><span class="o">)</span> <span class="bp">•</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">r</span> <span class="bp">•</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">r'</span> <span class="bp">•</span> <span class="n">a</span> <span class="o">:=</span> <span class="n">add_smul</span> <span class="n">r</span> <span class="n">r'</span> <span class="n">a</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Ring</span><span class="w"> </span><span class="n">A</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Algebra</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="n">A</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="n">r'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">A</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">r'</span><span class="o">)</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">r'</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">add_smul</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="n">r'</span><span class="w"> </span><span class="n">a</span> <span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="n">A</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">Ring</span> <span class="n">A</span><span class="o">]</span> <span class="o">[</span><span class="n">Algebra</span> <span class="n">R</span> <span class="n">A</span><span class="o">]</span> <span class="o">(</span><span class="n">r</span> <span class="n">r'</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">A</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">r</span> <span class="bp">*</span> <span class="n">r'</span><span class="o">)</span> <span class="bp">•</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">r</span> <span class="bp">•</span> <span class="n">r'</span> <span class="bp">•</span> <span class="n">a</span> <span class="o">:=</span> <span class="n">mul_smul</span> <span class="n">r</span> <span class="n">r'</span> <span class="n">a</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Ring</span><span class="w"> </span><span class="n">A</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">Algebra</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="n">A</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="n">r'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">A</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">r'</span><span class="o">)</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">r'</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">mul_smul</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="n">r'</span><span class="w"> </span><span class="n">a</span> </pre></div> </div> <p>The morphisms between two <code class="docutils literal notranslate"><span class="pre">R</span></code>-algebras <code class="docutils literal notranslate"><span class="pre">A</span></code> and <code class="docutils literal notranslate"><span class="pre">B</span></code> are ring morphisms
-
@@ -969,11 +969,11 @@ which can be written as <code class="docutils literal notranslate"><span class="The algebra structure map from <code class="docutils literal notranslate"><span class="pre">R</span></code> to <code class="docutils literal notranslate"><span class="pre">R[X]</span></code> is denoted by <code class="docutils literal notranslate"><span class="pre">C</span></code>, which stands for “constant” since the corresponding polynomial functions are always constant. The indeterminate is denoted by <code class="docutils literal notranslate"><span class="pre">X</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">Polynomial</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">Polynomial</span> <span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">:</span> <span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">]</span> <span class="o">:=</span> <span class="n">X</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">X</span> <span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">r</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:=</span> <span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="n">r</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="n">r</span> </pre></div> </div> <p>In the first example above, it is crucial that we give Lean the expected type since it cannot be
-
@@ -982,15 +982,15 @@ algebra can be inferred from our use of <code class="docutils literal notranslat<p>Because <code class="docutils literal notranslate"><span class="pre">C</span></code> is a ring morphism from <code class="docutils literal notranslate"><span class="pre">R</span></code> to <code class="docutils literal notranslate"><span class="pre">R[X]</span></code>, we can use all ring morphisms lemmas such as <code class="docutils literal notranslate"><span class="pre">map_zero</span></code>, <code class="docutils literal notranslate"><span class="pre">map_one</span></code>, <code class="docutils literal notranslate"><span class="pre">map_mul</span></code>, and <code class="docutils literal notranslate"><span class="pre">map_pow</span></code> before computing in the ring <code class="docutils literal notranslate"><span class="pre">R[X]</span></code>. For example:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">r</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">X</span> <span class="bp">+</span> <span class="n">C</span> <span class="n">r</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="n">r</span><span class="o">)</span> <span class="bp">=</span> <span class="n">X</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">-</span> <span class="n">C</span> <span class="o">(</span><span class="n">r</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">C.map_pow</span><span class="o">]</span> <span class="n">ring</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">X</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="n">r</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">X</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="n">r</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">C.map_pow</span><span class="o">]</span> <span class="w"> </span><span class="n">ring</span> </pre></div> </div> <p>You can access coefficients using <code class="docutils literal notranslate"><span class="pre">Polynomial.coeff</span></code></p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">r</span><span class="o">:</span><span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">C</span> <span class="n">r</span><span class="o">)</span><span class="bp">.</span><span class="n">coeff</span> <span class="mi">0</span> <span class="bp">=</span> <span class="n">r</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="o">:</span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">C</span><span class="w"> </span><span class="n">r</span><span class="o">)</span><span class="bp">.</span><span class="n">coeff</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span> <span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">:</span> <span class="o">(</span><span class="n">X</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="mi">2</span> <span class="bp">*</span> <span class="n">X</span> <span class="bp">+</span> <span class="n">C</span> <span class="mi">3</span> <span class="o">:</span> <span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">])</span><span class="bp">.</span><span class="n">coeff</span> <span class="mi">1</span> <span class="bp">=</span> <span class="mi">2</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">X</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">])</span><span class="bp">.</span><span class="n">coeff</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span> </pre></div> </div> <p>Defining the degree of a polynomial is always tricky because of the special case of the zero
-
@@ -1002,36 +1002,36 @@ degree of the zero polynomial, and it is absorbent for addition. (It is almost amultiplication, except that <code class="docutils literal notranslate"><span class="pre">⊥</span> <span class="pre">*</span> <span class="pre">0</span> <span class="pre">=</span> <span class="pre">0</span></code>.)</p> <p>Morally speaking, the <code class="docutils literal notranslate"><span class="pre">degree</span></code> version is the correct one. For instance, it allows us to state the expected formula for the degree of a product (assuming the base ring has no zero divisor).</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Semiring</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">NoZeroDivisors</span> <span class="n">R</span><span class="o">]</span> <span class="o">{</span><span class="n">p</span> <span class="n">q</span> <span class="o">:</span> <span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">]}</span> <span class="o">:</span> <span class="n">degree</span> <span class="o">(</span><span class="n">p</span> <span class="bp">*</span> <span class="n">q</span><span class="o">)</span> <span class="bp">=</span> <span class="n">degree</span> <span class="n">p</span> <span class="bp">+</span> <span class="n">degree</span> <span class="n">q</span> <span class="o">:=</span> <span class="n">Polynomial.degree_mul</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Semiring</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">NoZeroDivisors</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">p</span><span class="w"> </span><span class="n">q</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">]}</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">degree</span><span class="w"> </span><span class="o">(</span><span class="n">p</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">q</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">degree</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">degree</span><span class="w"> </span><span class="n">q</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Polynomial.degree_mul</span> </pre></div> </div> <p>Whereas the version for <code class="docutils literal notranslate"><span class="pre">natDegree</span></code> needs to assume non-zero polynomials.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Semiring</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">NoZeroDivisors</span> <span class="n">R</span><span class="o">]</span> <span class="o">{</span><span class="n">p</span> <span class="n">q</span> <span class="o">:</span> <span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">]}</span> <span class="o">(</span><span class="n">hp</span> <span class="o">:</span> <span class="n">p</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">(</span><span class="n">hq</span> <span class="o">:</span> <span class="n">q</span> <span class="bp">≠</span> <span class="mi">0</span><span class="o">)</span> <span class="o">:</span> <span class="n">natDegree</span> <span class="o">(</span><span class="n">p</span> <span class="bp">*</span> <span class="n">q</span><span class="o">)</span> <span class="bp">=</span> <span class="n">natDegree</span> <span class="n">p</span> <span class="bp">+</span> <span class="n">natDegree</span> <span class="n">q</span> <span class="o">:=</span> <span class="n">Polynomial.natDegree_mul</span> <span class="n">hp</span> <span class="n">hq</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Semiring</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">NoZeroDivisors</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">p</span><span class="w"> </span><span class="n">q</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">]}</span><span class="w"> </span><span class="o">(</span><span class="n">hp</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hq</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">q</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">natDegree</span><span class="w"> </span><span class="o">(</span><span class="n">p</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">q</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">natDegree</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">natDegree</span><span class="w"> </span><span class="n">q</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Polynomial.natDegree_mul</span><span class="w"> </span><span class="n">hp</span><span class="w"> </span><span class="n">hq</span> </pre></div> </div> <p>However, <code class="docutils literal notranslate"><span class="pre">ℕ</span></code> is much nicer to use than <code class="docutils literal notranslate"><span class="pre">WithBot</span> <span class="pre">ℕ</span></code>, so Mathlib makes both versions available and provides lemmas to convert between them. Also, <code class="docutils literal notranslate"><span class="pre">natDegree</span></code> is the more convenient definition to use when computing the degree of a composition. Composition of polynomial is <code class="docutils literal notranslate"><span class="pre">Polynomial.comp</span></code> and we have:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Semiring</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">NoZeroDivisors</span> <span class="n">R</span><span class="o">]</span> <span class="o">{</span><span class="n">p</span> <span class="n">q</span> <span class="o">:</span> <span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">]}</span> <span class="o">:</span> <span class="n">natDegree</span> <span class="o">(</span><span class="n">comp</span> <span class="n">p</span> <span class="n">q</span><span class="o">)</span> <span class="bp">=</span> <span class="n">natDegree</span> <span class="n">p</span> <span class="bp">*</span> <span class="n">natDegree</span> <span class="n">q</span> <span class="o">:=</span> <span class="n">Polynomial.natDegree_comp</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Semiring</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">NoZeroDivisors</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">p</span><span class="w"> </span><span class="n">q</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">]}</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">natDegree</span><span class="w"> </span><span class="o">(</span><span class="n">comp</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="n">q</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">natDegree</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">natDegree</span><span class="w"> </span><span class="n">q</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Polynomial.natDegree_comp</span> </pre></div> </div> <p>Polynomials give rise to polynomial functions: any polynomial can be evaluated on <code class="docutils literal notranslate"><span class="pre">R</span></code> using <code class="docutils literal notranslate"><span class="pre">Polynomial.eval</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">P</span><span class="o">:</span> <span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">])</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:=</span> <span class="n">P.eval</span> <span class="n">x</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">P</span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">])</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">P.eval</span><span class="w"> </span><span class="n">x</span> <span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">r</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="n">r</span><span class="o">)</span><span class="bp">.</span><span class="n">eval</span> <span class="n">r</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">X</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="n">r</span><span class="o">)</span><span class="bp">.</span><span class="n">eval</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span> </pre></div> </div> <p>In particular, there is a predicate, <code class="docutils literal notranslate"><span class="pre">IsRoot</span></code>, that holds for elements <code class="docutils literal notranslate"><span class="pre">r</span></code> in <code class="docutils literal notranslate"><span class="pre">R</span></code> where a polynomial vanishes.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">P</span> <span class="o">:</span> <span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">])</span> <span class="o">(</span><span class="n">r</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="n">IsRoot</span> <span class="n">P</span> <span class="n">r</span> <span class="bp">↔</span> <span class="n">P.eval</span> <span class="n">r</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="n">Iff.rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">P</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">[</span><span class="n">X</span><span class="o">])</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsRoot</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">P.eval</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">Iff.rfl</span> </pre></div> </div> <p>We would like to say that, assuming <code class="docutils literal notranslate"><span class="pre">R</span></code> has no zero divisor, a polynomial has at most as many
-
@@ -1041,12 +1041,12 @@ So Mathlib defines <code class="docutils literal notranslate"><span class="pre">i.e. the finite set that is defined to be empty if <code class="docutils literal notranslate"><span class="pre">P</span></code> is zero and the roots of <code class="docutils literal notranslate"><span class="pre">P</span></code>, with multiplicities, otherwise. This is defined only when the underlying ring is a domain since otherwise the definition does not have good properties.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">IsDomain</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">r</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="n">r</span><span class="o">)</span><span class="bp">.</span><span class="n">roots</span> <span class="bp">=</span> <span class="o">{</span><span class="n">r</span><span class="o">}</span> <span class="o">:=</span> <span class="n">roots_X_sub_C</span> <span class="n">r</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">IsDomain</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">X</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="n">r</span><span class="o">)</span><span class="bp">.</span><span class="n">roots</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">{</span><span class="n">r</span><span class="o">}</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">roots_X_sub_C</span><span class="w"> </span><span class="n">r</span> <span class="kd">example</span> <span class="o">{</span><span class="n">R</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CommRing</span> <span class="n">R</span><span class="o">]</span> <span class="o">[</span><span class="n">IsDomain</span> <span class="n">R</span><span class="o">]</span> <span class="o">(</span><span class="n">r</span> <span class="o">:</span> <span class="n">R</span><span class="o">)</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">):</span> <span class="o">((</span><span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="n">r</span><span class="o">)</span> <span class="bp">^</span> <span class="n">n</span><span class="o">)</span><span class="bp">.</span><span class="n">roots</span> <span class="bp">=</span> <span class="n">n</span> <span class="bp">•</span> <span class="o">{</span><span class="n">r</span><span class="o">}</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CommRing</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">IsDomain</span><span class="w"> </span><span class="n">R</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">R</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">):</span> <span class="w"> </span><span class="o">((</span><span class="n">X</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="n">r</span><span class="o">)</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="bp">.</span><span class="n">roots</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="o">{</span><span class="n">r</span><span class="o">}</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span> </pre></div> </div> <p>Both <code class="docutils literal notranslate"><span class="pre">Polynomial.eval</span></code> and <code class="docutils literal notranslate"><span class="pre">Polynomial.roots</span></code> consider only the coefficients ring. They do not
-
@@ -1057,37 +1057,37 @@ every element of <code class="docutils literal notranslate"><span class="pre">a<has a coercion to functions, one can apply it to a polynomial. But <code class="docutils literal notranslate"><span class="pre">aeval</span></code> does not have a polynomial as an argument, so one cannot use dot notation like in <code class="docutils literal notranslate"><span class="pre">P.eval</span></code> above.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">aeval</span> <span class="n">Complex.I</span> <span class="o">(</span><span class="n">X</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="mi">1</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">aeval</span><span class="w"> </span><span class="n">Complex.I</span><span class="w"> </span><span class="o">(</span><span class="n">X</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span> </pre></div> </div> <p>The function corresponding to <code class="docutils literal notranslate"><span class="pre">roots</span></code> in this context is <code class="docutils literal notranslate"><span class="pre">aroots</span></code> which takes a polynomial and then an algebra and outputs a multiset (with the same caveat about the zero polynomial as for <code class="docutils literal notranslate"><span class="pre">roots</span></code>).</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">Complex</span> <span class="n">Polynomial</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">aroots</span> <span class="o">(</span><span class="n">X</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="mi">1</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span> <span class="n">ℂ</span> <span class="bp">=</span> <span class="o">{</span><span class="n">Complex.I</span><span class="o">,</span> <span class="bp">-</span><span class="n">I</span><span class="o">}</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">suffices</span> <span class="n">roots</span> <span class="o">(</span><span class="n">X</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="mi">1</span> <span class="o">:</span> <span class="n">ℂ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span> <span class="bp">=</span> <span class="o">{</span><span class="n">I</span><span class="o">,</span> <span class="bp">-</span><span class="n">I</span><span class="o">}</span> <span class="kd">by</span> <span class="n">simpa</span> <span class="o">[</span><span class="n">aroots_def</span><span class="o">]</span> <span class="k">have</span> <span class="n">factored</span> <span class="o">:</span> <span class="o">(</span><span class="n">X</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="mi">1</span> <span class="o">:</span> <span class="n">ℂ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span> <span class="bp">=</span> <span class="o">(</span><span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="n">I</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="o">(</span><span class="bp">-</span><span class="n">I</span><span class="o">))</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">C_neg</span><span class="o">]</span> <span class="n">linear_combination</span> <span class="k">show</span> <span class="o">(</span><span class="n">C</span> <span class="n">I</span> <span class="bp">*</span> <span class="n">C</span> <span class="n">I</span> <span class="o">:</span> <span class="n">ℂ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span> <span class="bp">=</span> <span class="bp">-</span><span class="mi">1</span> <span class="kd">by</span> <span class="n">simp</span> <span class="o">[</span><span class="bp">←</span> <span class="n">C_mul</span><span class="o">]</span> <span class="k">have</span> <span class="n">p_ne_zero</span> <span class="o">:</span> <span class="o">(</span><span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="n">I</span><span class="o">)</span> <span class="bp">*</span> <span class="o">(</span><span class="n">X</span> <span class="bp">-</span> <span class="n">C</span> <span class="o">(</span><span class="bp">-</span><span class="n">I</span><span class="o">))</span> <span class="bp">≠</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">H</span> <span class="n">apply_fun</span> <span class="n">eval</span> <span class="mi">0</span> <span class="n">at</span> <span class="n">H</span> <span class="n">simp</span> <span class="o">[</span><span class="n">eval</span><span class="o">]</span> <span class="n">at</span> <span class="n">H</span> <span class="n">simp</span> <span class="n">only</span> <span class="o">[</span><span class="n">factored</span><span class="o">,</span> <span class="n">roots_mul</span> <span class="n">p_ne_zero</span><span class="o">,</span> <span class="n">roots_X_sub_C</span><span class="o">]</span> <span class="n">rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">Complex</span><span class="w"> </span><span class="n">Polynomial</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">aroots</span><span class="w"> </span><span class="o">(</span><span class="n">X</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span><span class="w"> </span><span class="n">ℂ</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">{</span><span class="n">Complex.I</span><span class="o">,</span><span class="w"> </span><span class="bp">-</span><span class="n">I</span><span class="o">}</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">suffices</span><span class="w"> </span><span class="n">roots</span><span class="w"> </span><span class="o">(</span><span class="n">X</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℂ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">{</span><span class="n">I</span><span class="o">,</span><span class="w"> </span><span class="bp">-</span><span class="n">I</span><span class="o">}</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simpa</span><span class="w"> </span><span class="o">[</span><span class="n">aroots_def</span><span class="o">]</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">factored</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">X</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℂ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">X</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="n">I</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">X</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="o">(</span><span class="bp">-</span><span class="n">I</span><span class="o">))</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">C_neg</span><span class="o">]</span> <span class="w"> </span><span class="n">linear_combination</span><span class="w"> </span><span class="k">show</span><span class="w"> </span><span class="o">(</span><span class="n">C</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℂ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">-</span><span class="mi">1</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="bp">←</span><span class="w"> </span><span class="n">C_mul</span><span class="o">]</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">p_ne_zero</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">X</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="n">I</span><span class="o">)</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="o">(</span><span class="n">X</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="o">(</span><span class="bp">-</span><span class="n">I</span><span class="o">))</span><span class="w"> </span><span class="bp">≠</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">H</span> <span class="w"> </span><span class="n">apply_fun</span><span class="w"> </span><span class="n">eval</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">H</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">eval</span><span class="o">]</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">H</span> <span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="n">only</span><span class="w"> </span><span class="o">[</span><span class="n">factored</span><span class="o">,</span><span class="w"> </span><span class="n">roots_mul</span><span class="w"> </span><span class="n">p_ne_zero</span><span class="o">,</span><span class="w"> </span><span class="n">roots_X_sub_C</span><span class="o">]</span> <span class="w"> </span><span class="n">rfl</span> <span class="c1">-- Mathlib knows about D'Alembert-Gauss theorem: ``ℂ`` is algebraically closed.</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">IsAlgClosed</span> <span class="n">ℂ</span> <span class="o">:=</span> <span class="n">inferInstance</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsAlgClosed</span><span class="w"> </span><span class="n">ℂ</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">inferInstance</span> </pre></div> </div> <p>More generally, given an ring morphism <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">:</span> <span class="pre">R</span> <span class="pre">→+*</span> <span class="pre">S</span></code> one can evaluate <code class="docutils literal notranslate"><span class="pre">P</span> <span class="pre">:</span> <span class="pre">R[X]</span></code> at a point in <code class="docutils literal notranslate"><span class="pre">S</span></code> using <code class="docutils literal notranslate"><span class="pre">Polynomial.eval₂</span></code>. This one produces an actual function from <code class="docutils literal notranslate"><span class="pre">R[X]</span></code> to <code class="docutils literal notranslate"><span class="pre">S</span></code> since it does not assume the existence of a <code class="docutils literal notranslate"><span class="pre">Algebra</span> <span class="pre">R</span> <span class="pre">S</span></code> instance, so dot notation works as you would expect.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="o">(</span><span class="n">Complex.ofReal</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→+*</span> <span class="n">ℂ</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">Complex.ofReal</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→+*</span><span class="w"> </span><span class="n">ℂ</span><span class="o">)</span> <span class="kd">example</span> <span class="o">:</span> <span class="o">(</span><span class="n">X</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="mi">1</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span><span class="bp">.</span><span class="n">eval₂</span> <span class="n">Complex.ofReal</span> <span class="n">Complex.I</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">X</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">[</span><span class="n">X</span><span class="o">])</span><span class="bp">.</span><span class="n">eval₂</span><span class="w"> </span><span class="n">Complex.ofReal</span><span class="w"> </span><span class="n">Complex.I</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span> </pre></div> </div> <p>Let us end by mentioning multivariate polynomials briefly. Given a commutative semiring <code class="docutils literal notranslate"><span class="pre">R</span></code>,
-
@@ -1097,9 +1097,9 @@ a type <code class="docutils literal notranslate"><span class="pre">σ</spanto <code class="docutils literal notranslate"><span class="pre">X</span> <span class="pre">i</span></code>.) For instance, if we want two indeterminates we can use <code class="docutils literal notranslate"><span class="pre">Fin</span> <span class="pre">2</span></code> as <code class="docutils literal notranslate"><span class="pre">σ</span></code> and write the polynomial defining the unit circle in <span class="math notranslate nohighlight">\(\mathbb{R}^2`\)</span> as:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">MvPolynomial</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">MvPolynomial</span> <span class="kd">def</span> <span class="n">circleEquation</span> <span class="o">:</span> <span class="n">MvPolynomial</span> <span class="o">(</span><span class="n">Fin</span> <span class="mi">2</span><span class="o">)</span> <span class="n">ℝ</span> <span class="o">:=</span> <span class="n">X</span> <span class="mi">0</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">X</span> <span class="mi">1</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">-</span> <span class="mi">1</span> <span class="kd">def</span><span class="w"> </span><span class="n">circleEquation</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MvPolynomial</span><span class="w"> </span><span class="o">(</span><span class="n">Fin</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="mi">1</span> </pre></div> </div> <p>Recall that function application has a very high precedence so the expression above is read as
-
@@ -1107,7 +1107,7 @@ For instance, if we want two indeterminates we can useWe can evaluate it to make sure the point with coordinates <span class="math notranslate nohighlight">\((1, 0)\)</span> is on the circle. Recall the <code class="docutils literal notranslate"><span class="pre">![...]</span></code> notation denotes elements of <code class="docutils literal notranslate"><span class="pre">Fin</span> <span class="pre">n</span> <span class="pre">→</span> <span class="pre">X</span></code> for some natural number <code class="docutils literal notranslate"><span class="pre">n</span></code> determined by the number of arguments and some type <code class="docutils literal notranslate"><span class="pre">X</span></code> determined by the type of arguments.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">MvPolynomial.eval</span> <span class="bp">!</span><span class="o">[</span><span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">]</span> <span class="n">circleEquation</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="o">[</span><span class="n">circleEquation</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MvPolynomial.eval</span><span class="w"> </span><span class="bp">!</span><span class="o">[</span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="mi">1</span><span class="o">]</span><span class="w"> </span><span class="n">circleEquation</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span><span class="w"> </span><span class="o">[</span><span class="n">circleEquation</span><span class="o">]</span> </pre></div> </div> </section>
-
-
-
@@ -18,7 +18,7 @@<script src="_static/jquery.js?v=5d32c60e"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/documentation_options.js?v=2709fde1"></script> <script src="_static/doctools.js?v=888ff710"></script> <script src="_static/doctools.js?v=9a2dae69"></script> <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script>
-
@@ -217,21 +217,21 @@ One manifestation of this view is that we can associate to any <code class="docuconsisting of all sets that contain <code class="docutils literal notranslate"><span class="pre">s</span></code>. This definition is already in Mathlib and has a notation <code class="docutils literal notranslate"><span class="pre">𝓟</span></code> (localized in the <code class="docutils literal notranslate"><span class="pre">Filter</span></code> namespace). For the purpose of demonstration, we ask you to take this opportunity to work out the definition here.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">principal</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">(</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">α</span><span class="o">)</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">α</span> <span class="n">where</span> <span class="n">sets</span> <span class="o">:=</span> <span class="o">{</span> <span class="n">t</span> <span class="bp">|</span> <span class="n">s</span> <span class="bp">⊆</span> <span class="n">t</span> <span class="o">}</span> <span class="n">univ_sets</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">sets_of_superset</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">inter_sets</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">principal</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">α</span> <span class="w"> </span><span class="n">where</span> <span class="w"> </span><span class="n">sets</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">}</span> <span class="w"> </span><span class="n">univ_sets</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">sets_of_superset</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">inter_sets</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>For our second example, we ask you to define the filter <code class="docutils literal notranslate"><span class="pre">atTop</span> <span class="pre">:</span> <span class="pre">Filter</span> <span class="pre">ℕ</span></code>. (We could use any type with a preorder instead of <code class="docutils literal notranslate"><span class="pre">ℕ</span></code>.)</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">ℕ</span> <span class="o">:=</span> <span class="o">{</span> <span class="n">sets</span> <span class="o">:=</span> <span class="o">{</span> <span class="n">s</span> <span class="bp">|</span> <span class="bp">∃</span> <span class="n">a</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">b</span><span class="o">,</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">b</span> <span class="bp">→</span> <span class="n">b</span> <span class="bp">∈</span> <span class="n">s</span> <span class="o">}</span> <span class="n">univ_sets</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">sets_of_superset</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">inter_sets</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="o">}</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">sets</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">}</span> <span class="w"> </span><span class="n">univ_sets</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">sets_of_superset</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">inter_sets</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span><span class="w"> </span><span class="o">}</span> </pre></div> </div> <p>We can also directly define the filter <code class="docutils literal notranslate"><span class="pre">𝓝</span> <span class="pre">x</span></code> of neighborhoods of any <code class="docutils literal notranslate"><span class="pre">x</span> <span class="pre">:</span> <span class="pre">ℝ</span></code>.
-
@@ -242,8 +242,8 @@ defined in Mathlib as <code class="docutils literal notranslate"><span class="pr<p>With these examples, we can already define what is means for a function <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">:</span> <span class="pre">X</span> <span class="pre">→</span> <span class="pre">Y</span></code> to converge to some <code class="docutils literal notranslate"><span class="pre">G</span> <span class="pre">:</span> <span class="pre">Filter</span> <span class="pre">Y</span></code> along some <code class="docutils literal notranslate"><span class="pre">F</span> <span class="pre">:</span> <span class="pre">Filter</span> <span class="pre">X</span></code>, as follows:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">Tendsto₁</span> <span class="o">{</span><span class="n">X</span> <span class="n">Y</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">)</span> <span class="o">(</span><span class="n">F</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">X</span><span class="o">)</span> <span class="o">(</span><span class="n">G</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">Y</span><span class="o">)</span> <span class="o">:=</span> <span class="bp">∀</span> <span class="n">V</span> <span class="bp">∈</span> <span class="n">G</span><span class="o">,</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">V</span> <span class="bp">∈</span> <span class="n">F</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">Tendsto₁</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">Y</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">V</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">G</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">V</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">F</span> </pre></div> </div> <p>When <code class="docutils literal notranslate"><span class="pre">X</span></code> is <code class="docutils literal notranslate"><span class="pre">ℕ</span></code> and <code class="docutils literal notranslate"><span class="pre">Y</span></code> is <code class="docutils literal notranslate"><span class="pre">ℝ</span></code>, <code class="docutils literal notranslate"><span class="pre">Tendsto₁</span> <span class="pre">u</span> <span class="pre">atTop</span> <span class="pre">(𝓝</span> <span class="pre">x)</span></code> is equivalent to saying that the sequence <code class="docutils literal notranslate"><span class="pre">u</span> <span class="pre">:</span> <span class="pre">ℕ</span> <span class="pre">→</span> <span class="pre">ℝ</span></code>
-
@@ -263,12 +263,12 @@ In this examples file we’ve opened the <code class="docutils literal notra<code class="docutils literal notranslate"><span class="pre">Filter.map</span></code> can be written as <code class="docutils literal notranslate"><span class="pre">map</span></code>. This means that we can rewrite the definition of <code class="docutils literal notranslate"><span class="pre">Tendsto</span></code> using the order relation on <code class="docutils literal notranslate"><span class="pre">Filter</span> <span class="pre">Y</span></code>, which is reversed inclusion of the set of members. In other words, given <code class="docutils literal notranslate"><span class="pre">G</span> <span class="pre">H</span> <span class="pre">:</span> <span class="pre">Filter</span> <span class="pre">Y</span></code>, we have <code class="docutils literal notranslate"><span class="pre">G</span> <span class="pre">≤</span> <span class="pre">H</span> <span class="pre">↔</span> <span class="pre">∀</span> <span class="pre">V</span> <span class="pre">:</span> <span class="pre">Set</span> <span class="pre">Y,</span> <span class="pre">V</span> <span class="pre">∈</span> <span class="pre">H</span> <span class="pre">→</span> <span class="pre">V</span> <span class="pre">∈</span> <span class="pre">G</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span> <span class="n">Tendsto₂</span> <span class="o">{</span><span class="n">X</span> <span class="n">Y</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">)</span> <span class="o">(</span><span class="n">F</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">X</span><span class="o">)</span> <span class="o">(</span><span class="n">G</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">Y</span><span class="o">)</span> <span class="o">:=</span> <span class="n">map</span> <span class="n">f</span> <span class="n">F</span> <span class="bp">≤</span> <span class="n">G</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">def</span><span class="w"> </span><span class="n">Tendsto₂</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">Y</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">map</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">G</span> <span class="kd">example</span> <span class="o">{</span><span class="n">X</span> <span class="n">Y</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">)</span> <span class="o">(</span><span class="n">F</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">X</span><span class="o">)</span> <span class="o">(</span><span class="n">G</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">Y</span><span class="o">)</span> <span class="o">:</span> <span class="n">Tendsto₂</span> <span class="n">f</span> <span class="n">F</span> <span class="n">G</span> <span class="bp">↔</span> <span class="n">Tendsto₁</span> <span class="n">f</span> <span class="n">F</span> <span class="n">G</span> <span class="o">:=</span> <span class="n">Iff.rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">Y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Tendsto₂</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">Tendsto₁</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Iff.rfl</span> </pre></div> </div> <p>It may seem that the order relation on filters is backward. But recall that we can view filters on <code class="docutils literal notranslate"><span class="pre">X</span></code> as
-
@@ -284,11 +284,11 @@ The inequality means the “direct image under <code class="docutils literalIt also leverages the algebraic properties of the pushforward operation. First, each <code class="docutils literal notranslate"><span class="pre">Filter.map</span> <span class="pre">f</span></code> is monotone. And, second, <code class="docutils literal notranslate"><span class="pre">Filter.map</span></code> is compatible with composition.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="o">(</span><span class="bp">@</span><span class="n">Filter.map_mono</span> <span class="o">:</span> <span class="bp">∀</span> <span class="o">{</span><span class="n">α</span> <span class="n">β</span><span class="o">}</span> <span class="o">{</span><span class="n">m</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">β</span><span class="o">},</span> <span class="n">Monotone</span> <span class="o">(</span><span class="n">map</span> <span class="n">m</span><span class="o">))</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="bp">@</span><span class="n">Filter.map_mono</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="n">β</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">β</span><span class="o">},</span><span class="w"> </span><span class="n">Monotone</span><span class="w"> </span><span class="o">(</span><span class="n">map</span><span class="w"> </span><span class="n">m</span><span class="o">))</span> <span class="k">#check</span> <span class="o">(</span><span class="bp">@</span><span class="n">Filter.map_map</span> <span class="o">:</span> <span class="bp">∀</span> <span class="o">{</span><span class="n">α</span> <span class="n">β</span> <span class="n">γ</span><span class="o">}</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">α</span><span class="o">}</span> <span class="o">{</span><span class="n">m</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">β</span><span class="o">}</span> <span class="o">{</span><span class="n">m'</span> <span class="o">:</span> <span class="n">β</span> <span class="bp">→</span> <span class="n">γ</span><span class="o">},</span> <span class="n">map</span> <span class="n">m'</span> <span class="o">(</span><span class="n">map</span> <span class="n">m</span> <span class="n">f</span><span class="o">)</span> <span class="bp">=</span> <span class="n">map</span> <span class="o">(</span><span class="n">m'</span> <span class="bp">∘</span> <span class="n">m</span><span class="o">)</span> <span class="n">f</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="bp">@</span><span class="n">Filter.map_map</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="n">γ</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">α</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">β</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">m'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">γ</span><span class="o">},</span><span class="w"> </span><span class="n">map</span><span class="w"> </span><span class="n">m'</span><span class="w"> </span><span class="o">(</span><span class="n">map</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">map</span><span class="w"> </span><span class="o">(</span><span class="n">m'</span><span class="w"> </span><span class="bp">∘</span><span class="w"> </span><span class="n">m</span><span class="o">)</span><span class="w"> </span><span class="n">f</span><span class="o">)</span> </pre></div> </div> <p>Together these two properties allow us to prove that limits compose, yielding in one shot all 256 variants
-
@@ -297,9 +297,9 @@ You can practice proving the following statement using either the definitionof <code class="docutils literal notranslate"><span class="pre">Tendsto₁</span></code> in terms of the universal quantifier or the algebraic definition, together with the two lemmas above.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">X</span> <span class="n">Y</span> <span class="n">Z</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">{</span><span class="n">F</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">X</span><span class="o">}</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">Y</span><span class="o">}</span> <span class="o">{</span><span class="n">H</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">Z</span><span class="o">}</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">}</span> <span class="o">{</span><span class="n">g</span> <span class="o">:</span> <span class="n">Y</span> <span class="bp">→</span> <span class="n">Z</span><span class="o">}</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">Tendsto₁</span> <span class="n">f</span> <span class="n">F</span> <span class="n">G</span><span class="o">)</span> <span class="o">(</span><span class="n">hg</span> <span class="o">:</span> <span class="n">Tendsto₁</span> <span class="n">g</span> <span class="n">G</span> <span class="n">H</span><span class="o">)</span> <span class="o">:</span> <span class="n">Tendsto₁</span> <span class="o">(</span><span class="n">g</span> <span class="bp">∘</span> <span class="n">f</span><span class="o">)</span> <span class="n">F</span> <span class="n">H</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="n">Z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">Z</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Z</span><span class="o">}</span> <span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Tendsto₁</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Tendsto₁</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="n">H</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Tendsto₁</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="bp">∘</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>The pushforward construction uses a map to push filters from the map source to the map target.
-
@@ -318,19 +318,19 @@ This operation could be used to provided another formulation of <code class="doc<code class="docutils literal notranslate"><span class="pre">x₀</span> <span class="pre">:</span> <span class="pre">ℝ</span></code> and <code class="docutils literal notranslate"><span class="pre">y₀</span> <span class="pre">:</span> <span class="pre">ℝ</span></code>, and suppose we want to state that <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">x</span></code> approaches <code class="docutils literal notranslate"><span class="pre">y₀</span></code> when <code class="docutils literal notranslate"><span class="pre">x</span></code> approaches <code class="docutils literal notranslate"><span class="pre">x₀</span></code> within the rational numbers. We can pull the filter <code class="docutils literal notranslate"><span class="pre">𝓝</span> <span class="pre">x₀</span></code> back to <code class="docutils literal notranslate"><span class="pre">ℚ</span></code> using the coercion map <code class="docutils literal notranslate"><span class="pre">(↑)</span> <span class="pre">:</span> <span class="pre">ℚ</span> <span class="pre">→</span> <span class="pre">ℝ</span></code> and state <code class="docutils literal notranslate"><span class="pre">Tendsto</span> <span class="pre">(f</span> <span class="pre">∘</span> <span class="pre">(↑)</span> <span class="pre">:</span> <span class="pre">ℚ</span> <span class="pre">→</span> <span class="pre">ℝ)</span> <span class="pre">(comap</span> <span class="pre">(↑)</span> <span class="pre">(𝓝</span> <span class="pre">x₀))</span> <span class="pre">(𝓝</span> <span class="pre">y₀)</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">x₀</span> <span class="n">y₀</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x₀</span><span class="w"> </span><span class="n">y₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span> <span class="k">#check</span> <span class="n">comap</span> <span class="o">((</span><span class="bp">↑</span><span class="o">)</span> <span class="o">:</span> <span class="n">ℚ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">x₀</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="n">comap</span><span class="w"> </span><span class="o">((</span><span class="bp">↑</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℚ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">x₀</span><span class="o">)</span> <span class="k">#check</span> <span class="n">Tendsto</span> <span class="o">(</span><span class="n">f</span> <span class="bp">∘</span> <span class="o">(</span><span class="bp">↑</span><span class="o">))</span> <span class="o">(</span><span class="n">comap</span> <span class="o">((</span><span class="bp">↑</span><span class="o">)</span> <span class="o">:</span> <span class="n">ℚ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">x₀</span><span class="o">))</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">y₀</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="bp">∘</span><span class="w"> </span><span class="o">(</span><span class="bp">↑</span><span class="o">))</span><span class="w"> </span><span class="o">(</span><span class="n">comap</span><span class="w"> </span><span class="o">((</span><span class="bp">↑</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℚ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">x₀</span><span class="o">))</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">y₀</span><span class="o">)</span> </pre></div> </div> <p>The pullback operation is also compatible with composition, but it is <em>contravariant</em>, which is to say, it reverses the order of the arguments.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">section</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="n">β</span> <span class="n">γ</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">(</span><span class="n">F</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">α</span><span class="o">)</span> <span class="o">{</span><span class="n">m</span> <span class="o">:</span> <span class="n">γ</span> <span class="bp">→</span> <span class="n">β</span><span class="o">}</span> <span class="o">{</span><span class="n">n</span> <span class="o">:</span> <span class="n">β</span> <span class="bp">→</span> <span class="n">α</span><span class="o">}</span> <span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="n">γ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">γ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">β</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span><span class="o">}</span> <span class="k">#check</span> <span class="o">(</span><span class="n">comap_comap</span> <span class="o">:</span> <span class="n">comap</span> <span class="n">m</span> <span class="o">(</span><span class="n">comap</span> <span class="n">n</span> <span class="n">F</span><span class="o">)</span> <span class="bp">=</span> <span class="n">comap</span> <span class="o">(</span><span class="n">n</span> <span class="bp">∘</span> <span class="n">m</span><span class="o">)</span> <span class="n">F</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">comap_comap</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">comap</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">(</span><span class="n">comap</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">comap</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">∘</span><span class="w"> </span><span class="n">m</span><span class="o">)</span><span class="w"> </span><span class="n">F</span><span class="o">)</span> <span class="kd">end</span> </pre></div>
-
@@ -338,8 +338,8 @@ which is to say, it reverses the order of the arguments.</p><p>Let’s now shift attention to the plane <code class="docutils literal notranslate"><span class="pre">ℝ</span> <span class="pre">×</span> <span class="pre">ℝ</span></code> and try to understand how the neighborhoods of a point <code class="docutils literal notranslate"><span class="pre">(x₀,</span> <span class="pre">y₀)</span></code> are related to <code class="docutils literal notranslate"><span class="pre">𝓝</span> <span class="pre">x₀</span></code> and <code class="docutils literal notranslate"><span class="pre">𝓝</span> <span class="pre">y₀</span></code>. There is a product operation <code class="docutils literal notranslate"><span class="pre">Filter.prod</span> <span class="pre">:</span> <span class="pre">Filter</span> <span class="pre">X</span> <span class="pre">→</span> <span class="pre">Filter</span> <span class="pre">Y</span> <span class="pre">→</span> <span class="pre">Filter</span> <span class="pre">(X</span> <span class="pre">×</span> <span class="pre">Y)</span></code>, denoted by <code class="docutils literal notranslate"><span class="pre">×ˢ</span></code>, which answers this question:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="bp">𝓝</span> <span class="o">(</span><span class="n">x₀</span><span class="o">,</span> <span class="n">y₀</span><span class="o">)</span> <span class="bp">=</span> <span class="bp">𝓝</span> <span class="n">x₀</span> <span class="bp">×ˢ</span> <span class="bp">𝓝</span> <span class="n">y₀</span> <span class="o">:=</span> <span class="n">nhds_prod_eq</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="o">(</span><span class="n">x₀</span><span class="o">,</span><span class="w"> </span><span class="n">y₀</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="n">x₀</span><span class="w"> </span><span class="bp">×ˢ</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="n">y₀</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">nhds_prod_eq</span> </pre></div> </div> <p>The product operation is defined in terms of the pullback operation and the <code class="docutils literal notranslate"><span class="pre">inf</span></code> operation:</p>
-
@@ -353,12 +353,12 @@ Thus the <code class="docutils literal notranslate"><span class="pre">inf</span>to give algebraic proofs about convergence without ever referring to members of filters. You can practice doing this in a proof of the following lemma, unfolding the definition of <code class="docutils literal notranslate"><span class="pre">Tendsto</span></code> and <code class="docutils literal notranslate"><span class="pre">Filter.prod</span></code> if needed.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">le_inf_iff</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="n">le_inf_iff</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℝ</span> <span class="bp">×</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">x₀</span> <span class="n">y₀</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">Tendsto</span> <span class="n">f</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="o">(</span><span class="n">x₀</span><span class="o">,</span> <span class="n">y₀</span><span class="o">))</span> <span class="bp">↔</span> <span class="n">Tendsto</span> <span class="o">(</span><span class="n">Prod.fst</span> <span class="bp">∘</span> <span class="n">f</span><span class="o">)</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">x₀</span><span class="o">)</span> <span class="bp">∧</span> <span class="n">Tendsto</span> <span class="o">(</span><span class="n">Prod.snd</span> <span class="bp">∘</span> <span class="n">f</span><span class="o">)</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">y₀</span><span class="o">)</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">×</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x₀</span><span class="w"> </span><span class="n">y₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="o">(</span><span class="n">x₀</span><span class="o">,</span><span class="w"> </span><span class="n">y₀</span><span class="o">))</span><span class="w"> </span><span class="bp">↔</span> <span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="o">(</span><span class="n">Prod.fst</span><span class="w"> </span><span class="bp">∘</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">x₀</span><span class="o">)</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="o">(</span><span class="n">Prod.snd</span><span class="w"> </span><span class="bp">∘</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">y₀</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>The ordered type <code class="docutils literal notranslate"><span class="pre">Filter</span> <span class="pre">X</span></code> is actually a <em>complete</em> lattice,
-
@@ -411,8 +411,8 @@ a predicate on <code class="docutils literal notranslate"><span class="pre">_In the case of <code class="docutils literal notranslate"><span class="pre">𝓝</span> <span class="pre">x₀</span></code>, we want <code class="docutils literal notranslate"><span class="pre">ι</span></code> to be <code class="docutils literal notranslate"><span class="pre">ℝ</span></code>, we write <code class="docutils literal notranslate"><span class="pre">ε</span></code> for <code class="docutils literal notranslate"><span class="pre">i</span></code>, and the predicate should select the positive values of <code class="docutils literal notranslate"><span class="pre">ε</span></code>. So the fact that the sets <code class="docutils literal notranslate"><span class="pre">Ioo</span>  <span class="pre">(x₀</span> <span class="pre">-</span> <span class="pre">ε)</span> <span class="pre">(x₀</span> <span class="pre">+</span> <span class="pre">ε)</span></code> form a basis for the neighborhood topology on <code class="docutils literal notranslate"><span class="pre">ℝ</span></code> is stated as follows:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">x₀</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">HasBasis</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">x₀</span><span class="o">)</span> <span class="o">(</span><span class="k">fun</span> <span class="n">ε</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">↦</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">ε</span><span class="o">)</span> <span class="k">fun</span> <span class="n">ε</span> <span class="bp">↦</span> <span class="n">Ioo</span> <span class="o">(</span><span class="n">x₀</span> <span class="bp">-</span> <span class="n">ε</span><span class="o">)</span> <span class="o">(</span><span class="n">x₀</span> <span class="bp">+</span> <span class="n">ε</span><span class="o">)</span> <span class="o">:=</span> <span class="n">nhds_basis_Ioo_pos</span> <span class="n">x₀</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">HasBasis</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">x₀</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="o">)</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">Ioo</span><span class="w"> </span><span class="o">(</span><span class="n">x₀</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">ε</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x₀</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">ε</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">nhds_basis_Ioo_pos</span><span class="w"> </span><span class="n">x₀</span> </pre></div> </div> <p>There is also a nice basis for the filter <code class="docutils literal notranslate"><span class="pre">atTop</span></code>. The lemma
-
@@ -421,11 +421,11 @@ us to reformulate a statement of the form <code class="docutils literal notranslgiven bases for <code class="docutils literal notranslate"><span class="pre">F</span></code> and <code class="docutils literal notranslate"><span class="pre">G</span></code>. Putting these pieces together gives us essentially the notion of convergence that we used in <a class="reference internal" href="C03_Logic.html#sequences-and-convergence"><span class="std std-numref">Section 3.6</span></a>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">u</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">x₀</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">Tendsto</span> <span class="n">u</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">x₀</span><span class="o">)</span> <span class="bp">↔</span> <span class="bp">∀</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">N</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">n</span> <span class="bp">≥</span> <span class="n">N</span><span class="o">,</span> <span class="n">u</span> <span class="n">n</span> <span class="bp">∈</span> <span class="n">Ioo</span> <span class="o">(</span><span class="n">x₀</span> <span class="bp">-</span> <span class="n">ε</span><span class="o">)</span> <span class="o">(</span><span class="n">x₀</span> <span class="bp">+</span> <span class="n">ε</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">have</span> <span class="o">:</span> <span class="n">atTop.HasBasis</span> <span class="o">(</span><span class="k">fun</span> <span class="n">_</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">↦</span> <span class="n">True</span><span class="o">)</span> <span class="n">Ici</span> <span class="o">:=</span> <span class="n">atTop_basis</span> <span class="n">rw</span> <span class="o">[</span><span class="n">this.tendsto_iff</span> <span class="o">(</span><span class="n">nhds_basis_Ioo_pos</span> <span class="n">x₀</span><span class="o">)]</span> <span class="n">simp</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">x₀</span><span class="o">)</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">N</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="n">N</span><span class="o">,</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">Ioo</span><span class="w"> </span><span class="o">(</span><span class="n">x₀</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">ε</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x₀</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">ε</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">atTop.HasBasis</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">True</span><span class="o">)</span><span class="w"> </span><span class="n">Ici</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">atTop_basis</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">this.tendsto_iff</span><span class="w"> </span><span class="o">(</span><span class="n">nhds_basis_Ioo_pos</span><span class="w"> </span><span class="n">x₀</span><span class="o">)]</span> <span class="w"> </span><span class="n">simp</span> </pre></div> </div> <p>We now show how filters facilitate working with properties that hold for sufficiently large numbers
-
@@ -445,9 +445,9 @@ but we can use the more suggestive notation <code class="docutils literal notranHere the superscripted <code class="docutils literal notranslate"><span class="pre">f</span></code> stands for “Filter.” You can think of the notation as saying that for all <code class="docutils literal notranslate"><span class="pre">n</span></code> in the “set of very large numbers,” <code class="docutils literal notranslate"><span class="pre">P</span> <span class="pre">n</span></code> holds. The <code class="docutils literal notranslate"><span class="pre">∀ᶠ</span></code> notation stands for <code class="docutils literal notranslate"><span class="pre">Filter.Eventually</span></code>, and the lemma <code class="docutils literal notranslate"><span class="pre">Filter.Eventually.and</span></code> uses the intersection property of filters to do what we just described:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">P</span> <span class="n">Q</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="kt">Prop</span><span class="o">)</span> <span class="o">(</span><span class="n">hP</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">n</span> <span class="k">in</span> <span class="n">atTop</span><span class="o">,</span> <span class="n">P</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">hQ</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">n</span> <span class="k">in</span> <span class="n">atTop</span><span class="o">,</span> <span class="n">Q</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">n</span> <span class="k">in</span> <span class="n">atTop</span><span class="o">,</span> <span class="n">P</span> <span class="n">n</span> <span class="bp">∧</span> <span class="n">Q</span> <span class="n">n</span> <span class="o">:=</span> <span class="n">hP.and</span> <span class="n">hQ</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">P</span><span class="w"> </span><span class="n">Q</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="kt">Prop</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hP</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">atTop</span><span class="o">,</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hQ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">atTop</span><span class="o">,</span><span class="w"> </span><span class="n">Q</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">atTop</span><span class="o">,</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">Q</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">hP.and</span><span class="w"> </span><span class="n">hQ</span> </pre></div> </div> <p>This notation is so convenient and intuitive that we also have specializations
-
@@ -458,13 +458,13 @@ two sequences of real numbers, and let us show that ifFirst we’ll use the generic <code class="docutils literal notranslate"><span class="pre">Eventually</span></code> and then the one specialized for the equality predicate, <code class="docutils literal notranslate"><span class="pre">EventuallyEq</span></code>. The two statements are definitionally equivalent so the same proof work in both cases.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">u</span> <span class="n">v</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">n</span> <span class="k">in</span> <span class="n">atTop</span><span class="o">,</span> <span class="n">u</span> <span class="n">n</span> <span class="bp">=</span> <span class="n">v</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">x₀</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">Tendsto</span> <span class="n">u</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">x₀</span><span class="o">)</span> <span class="bp">↔</span> <span class="n">Tendsto</span> <span class="n">v</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">x₀</span><span class="o">)</span> <span class="o">:=</span> <span class="n">tendsto_congr'</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">atTop</span><span class="o">,</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">x₀</span><span class="o">)</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">x₀</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">tendsto_congr'</span><span class="w"> </span><span class="n">h</span> <span class="kd">example</span> <span class="o">(</span><span class="n">u</span> <span class="n">v</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">u</span> <span class="bp">=ᶠ</span><span class="o">[</span><span class="n">atTop</span><span class="o">]</span> <span class="n">v</span><span class="o">)</span> <span class="o">(</span><span class="n">x₀</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">Tendsto</span> <span class="n">u</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">x₀</span><span class="o">)</span> <span class="bp">↔</span> <span class="n">Tendsto</span> <span class="n">v</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">x₀</span><span class="o">)</span> <span class="o">:=</span> <span class="n">tendsto_congr'</span> <span class="n">h</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">=ᶠ</span><span class="o">[</span><span class="n">atTop</span><span class="o">]</span><span class="w"> </span><span class="n">v</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">x₀</span><span class="o">)</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">x₀</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">tendsto_congr'</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>It is instructive to review the definition of filters in terms of <code class="docutils literal notranslate"><span class="pre">Eventually</span></code>.
-
@@ -474,25 +474,25 @@ Given <code class="docutils literal notranslate"><span class="pre">F</span> <spa<li><p>the condition <code class="docutils literal notranslate"><span class="pre">U</span> <span class="pre">∈</span> <span class="pre">F</span> <span class="pre">→</span> <span class="pre">U</span> <span class="pre">⊆</span> <span class="pre">V</span> <span class="pre">→</span> <span class="pre">V</span> <span class="pre">∈</span> <span class="pre">F</span></code> ensures <code class="docutils literal notranslate"><span class="pre">(∀ᶠ</span> <span class="pre">x</span> <span class="pre">in</span> <span class="pre">F,</span> <span class="pre">P</span> <span class="pre">x)</span> <span class="pre">→</span> <span class="pre">(∀</span> <span class="pre">x,</span> <span class="pre">P</span> <span class="pre">x</span> <span class="pre">→</span> <span class="pre">Q</span> <span class="pre">x)</span> <span class="pre">→</span> <span class="pre">∀ᶠ</span> <span class="pre">x</span> <span class="pre">in</span> <span class="pre">F,</span> <span class="pre">Q</span> <span class="pre">x</span></code>, and</p></li> <li><p>the condition <code class="docutils literal notranslate"><span class="pre">U</span> <span class="pre">∈</span> <span class="pre">F</span> <span class="pre">→</span> <span class="pre">V</span> <span class="pre">∈</span> <span class="pre">F</span> <span class="pre">→</span> <span class="pre">U</span> <span class="pre">∩</span> <span class="pre">V</span> <span class="pre">∈</span> <span class="pre">F</span></code> ensures <code class="docutils literal notranslate"><span class="pre">(∀ᶠ</span> <span class="pre">x</span> <span class="pre">in</span> <span class="pre">F,</span> <span class="pre">P</span> <span class="pre">x)</span> <span class="pre">→</span> <span class="pre">(∀ᶠ</span> <span class="pre">x</span> <span class="pre">in</span> <span class="pre">F,</span> <span class="pre">Q</span> <span class="pre">x)</span> <span class="pre">→</span> <span class="pre">∀ᶠ</span> <span class="pre">x</span> <span class="pre">in</span> <span class="pre">F,</span> <span class="pre">P</span> <span class="pre">x</span> <span class="pre">∧</span> <span class="pre">Q</span> <span class="pre">x</span></code>.</p></li> </ul> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">eventually_of_forall</span> <span class="k">#check</span> <span class="n">Eventually.mono</span> <span class="k">#check</span> <span class="n">Eventually.and</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="n">eventually_of_forall</span> <span class="k">#check</span><span class="w"> </span><span class="n">Eventually.mono</span> <span class="k">#check</span><span class="w"> </span><span class="n">Eventually.and</span> </pre></div> </div> <p>The second item, corresponding to <code class="docutils literal notranslate"><span class="pre">Eventually.mono</span></code>, supports nice ways of using filters, especially when combined with <code class="docutils literal notranslate"><span class="pre">Eventually.and</span></code>. The <code class="docutils literal notranslate"><span class="pre">filter_upwards</span></code> tactic allows us to combine them. Compare:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">P</span> <span class="n">Q</span> <span class="n">R</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="kt">Prop</span><span class="o">)</span> <span class="o">(</span><span class="n">hP</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">n</span> <span class="k">in</span> <span class="n">atTop</span><span class="o">,</span> <span class="n">P</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">hQ</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">n</span> <span class="k">in</span> <span class="n">atTop</span><span class="o">,</span> <span class="n">Q</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">hR</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">n</span> <span class="k">in</span> <span class="n">atTop</span><span class="o">,</span> <span class="n">P</span> <span class="n">n</span> <span class="bp">∧</span> <span class="n">Q</span> <span class="n">n</span> <span class="bp">→</span> <span class="n">R</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">n</span> <span class="k">in</span> <span class="n">atTop</span><span class="o">,</span> <span class="n">R</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="o">(</span><span class="n">hP.and</span> <span class="o">(</span><span class="n">hQ.and</span> <span class="n">hR</span><span class="o">))</span><span class="bp">.</span><span class="n">mono</span> <span class="n">rintro</span> <span class="n">n</span> <span class="o">⟨</span><span class="n">h</span><span class="o">,</span> <span class="n">h'</span><span class="o">,</span> <span class="n">h''</span><span class="o">⟩</span> <span class="n">exact</span> <span class="n">h''</span> <span class="o">⟨</span><span class="n">h</span><span class="o">,</span> <span class="n">h'</span><span class="o">⟩</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">P</span><span class="w"> </span><span class="n">Q</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="kt">Prop</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hP</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">atTop</span><span class="o">,</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hQ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">atTop</span><span class="o">,</span><span class="w"> </span><span class="n">Q</span><span class="w"> </span><span class="n">n</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">hR</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">atTop</span><span class="o">,</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">Q</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">atTop</span><span class="o">,</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="o">(</span><span class="n">hP.and</span><span class="w"> </span><span class="o">(</span><span class="n">hQ.and</span><span class="w"> </span><span class="n">hR</span><span class="o">))</span><span class="bp">.</span><span class="n">mono</span> <span class="w"> </span><span class="n">rintro</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">⟨</span><span class="n">h</span><span class="o">,</span><span class="w"> </span><span class="n">h'</span><span class="o">,</span><span class="w"> </span><span class="n">h''</span><span class="o">⟩</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h''</span><span class="w"> </span><span class="o">⟨</span><span class="n">h</span><span class="o">,</span><span class="w"> </span><span class="n">h'</span><span class="o">⟩</span> <span class="kd">example</span> <span class="o">(</span><span class="n">P</span> <span class="n">Q</span> <span class="n">R</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="kt">Prop</span><span class="o">)</span> <span class="o">(</span><span class="n">hP</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">n</span> <span class="k">in</span> <span class="n">atTop</span><span class="o">,</span> <span class="n">P</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">hQ</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">n</span> <span class="k">in</span> <span class="n">atTop</span><span class="o">,</span> <span class="n">Q</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">hR</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">n</span> <span class="k">in</span> <span class="n">atTop</span><span class="o">,</span> <span class="n">P</span> <span class="n">n</span> <span class="bp">∧</span> <span class="n">Q</span> <span class="n">n</span> <span class="bp">→</span> <span class="n">R</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">n</span> <span class="k">in</span> <span class="n">atTop</span><span class="o">,</span> <span class="n">R</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">filter_upwards</span> <span class="o">[</span><span class="n">hP</span><span class="o">,</span> <span class="n">hQ</span><span class="o">,</span> <span class="n">hR</span><span class="o">]</span> <span class="k">with</span> <span class="n">n</span> <span class="n">h</span> <span class="n">h'</span> <span class="n">h''</span> <span class="n">exact</span> <span class="n">h''</span> <span class="o">⟨</span><span class="n">h</span><span class="o">,</span> <span class="n">h'</span><span class="o">⟩</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">P</span><span class="w"> </span><span class="n">Q</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="kt">Prop</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hP</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">atTop</span><span class="o">,</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hQ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">atTop</span><span class="o">,</span><span class="w"> </span><span class="n">Q</span><span class="w"> </span><span class="n">n</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">hR</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">atTop</span><span class="o">,</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">Q</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">atTop</span><span class="o">,</span><span class="w"> </span><span class="n">R</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">filter_upwards</span><span class="w"> </span><span class="o">[</span><span class="n">hP</span><span class="o">,</span><span class="w"> </span><span class="n">hQ</span><span class="o">,</span><span class="w"> </span><span class="n">hR</span><span class="o">]</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="n">h'</span><span class="w"> </span><span class="n">h''</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">h''</span><span class="w"> </span><span class="o">⟨</span><span class="n">h</span><span class="o">,</span><span class="w"> </span><span class="n">h'</span><span class="o">⟩</span> </pre></div> </div> <p>Readers who know about measure theory will note that the filter <code class="docutils literal notranslate"><span class="pre">μ.ae</span></code> of sets whose complement has measure zero
-
@@ -517,13 +517,13 @@ topology library.See if you can prove it using the quoted lemmas, using the fact that <code class="docutils literal notranslate"><span class="pre">ClusterPt</span> <span class="pre">x</span> <span class="pre">F</span></code> means <code class="docutils literal notranslate"><span class="pre">(𝓝</span> <span class="pre">x</span> <span class="pre">⊓</span> <span class="pre">F).NeBot</span></code> and that, by definition, the assumption <code class="docutils literal notranslate"><span class="pre">∀ᶠ</span> <span class="pre">n</span> <span class="pre">in</span> <span class="pre">atTop,</span> <span class="pre">u</span> <span class="pre">n</span> <span class="pre">∈</span> <span class="pre">M</span></code> means <code class="docutils literal notranslate"><span class="pre">M</span> <span class="pre">∈</span> <span class="pre">map</span> <span class="pre">u</span> <span class="pre">atTop</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span> <span class="n">mem_closure_iff_clusterPt</span> <span class="k">#check</span> <span class="n">le_principal_iff</span> <span class="k">#check</span> <span class="n">neBot_of_le</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="k">#check</span><span class="w"> </span><span class="n">mem_closure_iff_clusterPt</span> <span class="k">#check</span><span class="w"> </span><span class="n">le_principal_iff</span> <span class="k">#check</span><span class="w"> </span><span class="n">neBot_of_le</span> <span class="kd">example</span> <span class="o">(</span><span class="n">u</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">M</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">hux</span> <span class="o">:</span> <span class="n">Tendsto</span> <span class="n">u</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">x</span><span class="o">))</span> <span class="o">(</span><span class="n">huM</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">n</span> <span class="k">in</span> <span class="n">atTop</span><span class="o">,</span> <span class="n">u</span> <span class="n">n</span> <span class="bp">∈</span> <span class="n">M</span><span class="o">)</span> <span class="o">:</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">closure</span> <span class="n">M</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">M</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hux</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">x</span><span class="o">))</span> <span class="w"> </span><span class="o">(</span><span class="n">huM</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">atTop</span><span class="o">,</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">closure</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> </section>
-
@@ -533,13 +533,13 @@ by definition, the assumption <code class="docutils literal notranslate"><span cmetric spaces. A metric space is a type <code class="docutils literal notranslate"><span class="pre">X</span></code> equipped with a distance function <code class="docutils literal notranslate"><span class="pre">dist</span> <span class="pre">:</span> <span class="pre">X</span> <span class="pre">→</span> <span class="pre">X</span> <span class="pre">→</span> <span class="pre">ℝ</span></code> which is a generalization of the function <code class="docutils literal notranslate"><span class="pre">fun</span> <span class="pre">x</span> <span class="pre">y</span> <span class="pre">↦</span> <span class="pre">|x</span> <span class="pre">-</span> <span class="pre">y|</span></code> from the case where <code class="docutils literal notranslate"><span class="pre">X</span> <span class="pre">=</span> <span class="pre">ℝ</span></code>.</p> <p>Introducing such a space is easy and we will check all properties required from the distance function.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">X</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">dist</span> <span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">dist_nonneg</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">dist</span> <span class="n">a</span> <span class="n">b</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">dist_eq_zero</span> <span class="o">:</span> <span class="n">dist</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">=</span> <span class="mi">0</span> <span class="bp">↔</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">b</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">dist_comm</span> <span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">dist</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">dist</span> <span class="n">b</span> <span class="n">a</span><span class="o">)</span> <span class="k">#check</span> <span class="o">(</span><span class="n">dist_triangle</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="o">:</span> <span class="n">dist</span> <span class="n">a</span> <span class="n">c</span> <span class="bp">≤</span> <span class="n">dist</span> <span class="n">a</span> <span class="n">b</span> <span class="bp">+</span> <span class="n">dist</span> <span class="n">b</span> <span class="n">c</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">dist</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">dist_nonneg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">dist_eq_zero</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">dist_comm</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">a</span><span class="o">)</span> <span class="k">#check</span><span class="w"> </span><span class="o">(</span><span class="n">dist_triangle</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">c</span><span class="o">)</span> </pre></div> </div> <p>Note we also have variants where the distance can be infinite or where <code class="docutils literal notranslate"><span class="pre">dist</span> <span class="pre">a</span> <span class="pre">b</span></code> can be zero without having <code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre">=</span> <span class="pre">b</span></code> or both.
-
@@ -551,14 +551,14 @@ will be explained as part of the calculus chapter.</p><p>Using distance functions, we can already define convergent sequences and continuous functions between metric spaces. They are actually defined in a more general setting covered in the next section, but we have lemmas recasting the definition in terms of distances.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">u</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">X</span><span class="o">}</span> <span class="o">{</span><span class="n">a</span> <span class="o">:</span> <span class="n">X</span><span class="o">}</span> <span class="o">:</span> <span class="n">Tendsto</span> <span class="n">u</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">a</span><span class="o">)</span> <span class="bp">↔</span> <span class="bp">∀</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">N</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">n</span> <span class="bp">≥</span> <span class="n">N</span><span class="o">,</span> <span class="n">dist</span> <span class="o">(</span><span class="n">u</span> <span class="n">n</span><span class="o">)</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">ε</span> <span class="o">:=</span> <span class="n">Metric.tendsto_atTop</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">u</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">N</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="n">N</span><span class="o">,</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Metric.tendsto_atTop</span> <span class="kd">example</span> <span class="o">{</span><span class="n">X</span> <span class="n">Y</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">Y</span><span class="o">]</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">}</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="n">f</span> <span class="bp">↔</span> <span class="bp">∀</span> <span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">δ</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">x'</span><span class="o">,</span> <span class="n">dist</span> <span class="n">x'</span> <span class="n">x</span> <span class="bp"><</span> <span class="n">δ</span> <span class="bp">→</span> <span class="n">dist</span> <span class="o">(</span><span class="n">f</span> <span class="n">x'</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="bp"><</span> <span class="n">ε</span> <span class="o">:=</span> <span class="n">Metric.continuous_iff</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">Y</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">↔</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">δ</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x'</span><span class="o">,</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">x'</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">δ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">x'</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Metric.continuous_iff</span> </pre></div> </div> <p id="index-3">A <em>lot</em> of lemmas have some continuity assumptions, so we end up proving a lot of continuity results and there
-
@@ -566,8 +566,8 @@ is a <code class="docutils literal notranslate"><span class="pre">continuity</spin an exercise below. Notice that Lean knows how to treat a product of two metric spaces as a metric space, so it makes sense to consider continuous functions from <code class="docutils literal notranslate"><span class="pre">X</span> <span class="pre">×</span> <span class="pre">X</span></code> to <code class="docutils literal notranslate"><span class="pre">ℝ</span></code>. In particular the (uncurried version of the) distance function is such a function.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">X</span> <span class="n">Y</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">Y</span><span class="o">]</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">}</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="k">fun</span> <span class="n">p</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">×</span> <span class="n">X</span> <span class="bp">↦</span> <span class="n">dist</span> <span class="o">(</span><span class="n">f</span> <span class="n">p.1</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="n">p.2</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">continuity</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">Y</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">×</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">continuity</span> </pre></div> </div> <p>This tactic is a bit slow, so it is also useful to know
-
@@ -581,9 +581,9 @@ We can do the same for the second component to get continuity of <code class="dothose two continuities using <code class="docutils literal notranslate"><span class="pre">Continuous.prod_mk</span></code> to get <code class="docutils literal notranslate"><span class="pre">(hf.comp</span> <span class="pre">continuous_fst).prod_mk</span> <span class="pre">(hf.comp</span> <span class="pre">continuous_snd)</span> <span class="pre">:</span> <span class="pre">Continuous</span> <span class="pre">(fun</span> <span class="pre">p</span> <span class="pre">:</span> <span class="pre">X</span> <span class="pre">×</span> <span class="pre">X</span> <span class="pre">↦</span> <span class="pre">(f</span> <span class="pre">p.1,</span> <span class="pre">f</span> <span class="pre">p.2))</span></code> and compose once more to get our full proof.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">X</span> <span class="n">Y</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">Y</span><span class="o">]</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">}</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="k">fun</span> <span class="n">p</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">×</span> <span class="n">X</span> <span class="bp">↦</span> <span class="n">dist</span> <span class="o">(</span><span class="n">f</span> <span class="n">p.1</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="n">p.2</span><span class="o">)</span> <span class="o">:=</span> <span class="n">continuous_dist.comp</span> <span class="o">((</span><span class="n">hf.comp</span> <span class="n">continuous_fst</span><span class="o">)</span><span class="bp">.</span><span class="n">prod_mk</span> <span class="o">(</span><span class="n">hf.comp</span> <span class="n">continuous_snd</span><span class="o">))</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">Y</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">×</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">continuous_dist.comp</span><span class="w"> </span><span class="o">((</span><span class="n">hf.comp</span><span class="w"> </span><span class="n">continuous_fst</span><span class="o">)</span><span class="bp">.</span><span class="n">prod_mk</span><span class="w"> </span><span class="o">(</span><span class="n">hf.comp</span><span class="w"> </span><span class="n">continuous_snd</span><span class="o">))</span> </pre></div> </div> <p>The combination of <code class="docutils literal notranslate"><span class="pre">Continuous.prod_mk</span></code> and <code class="docutils literal notranslate"><span class="pre">continuous_dist</span></code> via <code class="docutils literal notranslate"><span class="pre">Continuous.comp</span></code> feels clunky,
-
@@ -599,15 +599,15 @@ composition and refuse to apply this lemma. It is especially bad at this when pr<code class="docutils literal notranslate"><span class="pre">Continuous.dist</span> <span class="pre">{f</span> <span class="pre">g</span> <span class="pre">:</span> <span class="pre">X</span> <span class="pre">→</span> <span class="pre">Y}</span> <span class="pre">:</span> <span class="pre">Continuous</span> <span class="pre">f</span> <span class="pre">→</span> <span class="pre">Continuous</span> <span class="pre">g</span> <span class="pre">→</span> <span class="pre">Continuous</span> <span class="pre">(fun</span> <span class="pre">x</span> <span class="pre">↦</span> <span class="pre">dist</span> <span class="pre">(f</span> <span class="pre">x)</span> <span class="pre">(g</span> <span class="pre">x))</span></code> which is nicer to Lean’s elaborator and also provides a shorter proof when directly providing a full proof term, as can be seen from the following two new proofs of the above statement:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">X</span> <span class="n">Y</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">Y</span><span class="o">]</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">}</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="k">fun</span> <span class="n">p</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">×</span> <span class="n">X</span> <span class="bp">↦</span> <span class="n">dist</span> <span class="o">(</span><span class="n">f</span> <span class="n">p.1</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="n">p.2</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">apply</span> <span class="n">Continuous.dist</span> <span class="n">exact</span> <span class="n">hf.comp</span> <span class="n">continuous_fst</span> <span class="n">exact</span> <span class="n">hf.comp</span> <span class="n">continuous_snd</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">Y</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">×</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">apply</span><span class="w"> </span><span class="n">Continuous.dist</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">hf.comp</span><span class="w"> </span><span class="n">continuous_fst</span> <span class="w"> </span><span class="n">exact</span><span class="w"> </span><span class="n">hf.comp</span><span class="w"> </span><span class="n">continuous_snd</span> <span class="kd">example</span> <span class="o">{</span><span class="n">X</span> <span class="n">Y</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">Y</span><span class="o">]</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">}</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="k">fun</span> <span class="n">p</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">×</span> <span class="n">X</span> <span class="bp">↦</span> <span class="n">dist</span> <span class="o">(</span><span class="n">f</span> <span class="n">p.1</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="n">p.2</span><span class="o">)</span> <span class="o">:=</span> <span class="o">(</span><span class="n">hf.comp</span> <span class="n">continuous_fst</span><span class="o">)</span><span class="bp">.</span><span class="n">dist</span> <span class="o">(</span><span class="n">hf.comp</span> <span class="n">continuous_snd</span><span class="o">)</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">Y</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">×</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">(</span><span class="n">hf.comp</span><span class="w"> </span><span class="n">continuous_fst</span><span class="o">)</span><span class="bp">.</span><span class="n">dist</span><span class="w"> </span><span class="o">(</span><span class="n">hf.comp</span><span class="w"> </span><span class="n">continuous_snd</span><span class="o">)</span> </pre></div> </div> <p>Note that, without the elaboration issue coming from composition, another way to compress
-
@@ -617,66 +617,66 @@ as an alternate proof term <code class="docutils literal notranslate"><span clasto type, let us wrap this discussion with a last bit of compression offered by <code class="docutils literal notranslate"><span class="pre">Continuous.fst'</span></code> which allows to compress <code class="docutils literal notranslate"><span class="pre">hf.comp</span> <span class="pre">continuous_fst</span></code> to <code class="docutils literal notranslate"><span class="pre">hf.fst'</span></code> (and the same with <code class="docutils literal notranslate"><span class="pre">snd</span></code>) and get our final proof, now bordering obfuscation.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">X</span> <span class="n">Y</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">Y</span><span class="o">]</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">}</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="k">fun</span> <span class="n">p</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">×</span> <span class="n">X</span> <span class="bp">↦</span> <span class="n">dist</span> <span class="o">(</span><span class="n">f</span> <span class="n">p.1</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="n">p.2</span><span class="o">)</span> <span class="o">:=</span> <span class="n">hf.fst'.dist</span> <span class="n">hf.snd'</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">Y</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">×</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">hf.fst'.dist</span><span class="w"> </span><span class="n">hf.snd'</span> </pre></div> </div> <p>It’s your turn now to prove some continuity lemma. After trying the continuity tactic, you will need <code class="docutils literal notranslate"><span class="pre">Continuous.add</span></code>, <code class="docutils literal notranslate"><span class="pre">continuous_pow</span></code> and <code class="docutils literal notranslate"><span class="pre">continuous_id</span></code> to do it by hand.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="k">fun</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">↦</span> <span class="n">f</span> <span class="o">(</span><span class="n">x</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">+</span> <span class="n">x</span><span class="o">)</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>So far we saw continuity as a global notion, but one can also define continuity at a point.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">X</span> <span class="n">Y</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">Y</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">X</span><span class="o">)</span> <span class="o">:</span> <span class="n">ContinuousAt</span> <span class="n">f</span> <span class="n">a</span> <span class="bp">↔</span> <span class="bp">∀</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">δ</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="bp">∀</span> <span class="o">{</span><span class="n">x</span><span class="o">},</span> <span class="n">dist</span> <span class="n">x</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">δ</span> <span class="bp">→</span> <span class="n">dist</span> <span class="o">(</span><span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="n">a</span><span class="o">)</span> <span class="bp"><</span> <span class="n">ε</span> <span class="o">:=</span> <span class="n">Metric.continuousAt_iff</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">Y</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">ContinuousAt</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">δ</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="o">},</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">δ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Metric.continuousAt_iff</span> </pre></div> </div> </section> <section id="balls-open-sets-and-closed-sets"> <h3><span class="section-number">9.2.2. </span>Balls, open sets and closed sets<a class="headerlink" href="#balls-open-sets-and-closed-sets" title="Link to this heading"></a></h3> <p>Once we have a distance function, the most important geometric definitions are (open) balls and closed balls.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">(</span><span class="n">r</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">Metric.ball</span> <span class="n">a</span> <span class="n">r</span> <span class="bp">=</span> <span class="o">{</span> <span class="n">b</span> <span class="bp">|</span> <span class="n">dist</span> <span class="n">b</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">r</span> <span class="o">}</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Metric.ball</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">Metric.closedBall</span> <span class="n">a</span> <span class="n">r</span> <span class="bp">=</span> <span class="o">{</span> <span class="n">b</span> <span class="bp">|</span> <span class="n">dist</span> <span class="n">b</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">r</span> <span class="o">}</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Metric.closedBall</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p>Note that <cite>r</cite> is any real number here, there is no sign restriction. Of course some statements do require a radius condition.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">hr</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">r</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">Metric.ball</span> <span class="n">a</span> <span class="n">r</span> <span class="o">:=</span> <span class="n">Metric.mem_ball_self</span> <span class="n">hr</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">hr</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">r</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">Metric.ball</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Metric.mem_ball_self</span><span class="w"> </span><span class="n">hr</span> <span class="kd">example</span> <span class="o">(</span><span class="n">hr</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">r</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">Metric.closedBall</span> <span class="n">a</span> <span class="n">r</span> <span class="o">:=</span> <span class="n">Metric.mem_closedBall_self</span> <span class="n">hr</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">hr</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">r</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">Metric.closedBall</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Metric.mem_closedBall_self</span><span class="w"> </span><span class="n">hr</span> </pre></div> </div> <p>Once we have balls, we can define open sets. They are actually defined in a more general setting covered in the next section, but we have lemmas recasting the definition in terms of balls.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">)</span> <span class="o">:</span> <span class="n">IsOpen</span> <span class="n">s</span> <span class="bp">↔</span> <span class="bp">∀</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="n">Metric.ball</span> <span class="n">x</span> <span class="n">ε</span> <span class="bp">⊆</span> <span class="n">s</span> <span class="o">:=</span> <span class="n">Metric.isOpen_iff</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsOpen</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="n">Metric.ball</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Metric.isOpen_iff</span> </pre></div> </div> <p>Then closed sets are sets whose complement is open. Their important property is they are closed under limits. The closure of a set is the smallest closed set containing it.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">:</span> <span class="n">IsClosed</span> <span class="n">s</span> <span class="bp">↔</span> <span class="n">IsOpen</span> <span class="o">(</span><span class="n">s</span><span class="bp">ᶜ</span><span class="o">)</span> <span class="o">:=</span> <span class="n">isOpen_compl_iff.symm</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsClosed</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">IsOpen</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="bp">ᶜ</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">isOpen_compl_iff.symm</span> <span class="kd">example</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hs</span> <span class="o">:</span> <span class="n">IsClosed</span> <span class="n">s</span><span class="o">)</span> <span class="o">{</span><span class="n">u</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hu</span> <span class="o">:</span> <span class="n">Tendsto</span> <span class="n">u</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">a</span><span class="o">))</span> <span class="o">(</span><span class="n">hus</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="n">u</span> <span class="n">n</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">s</span> <span class="o">:=</span> <span class="n">hs.mem_of_tendsto</span> <span class="n">hu</span> <span class="o">(</span><span class="n">eventually_of_forall</span> <span class="n">hus</span><span class="o">)</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsClosed</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">u</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hu</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">a</span><span class="o">))</span> <span class="w"> </span><span class="o">(</span><span class="n">hus</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">hs.mem_of_tendsto</span><span class="w"> </span><span class="n">hu</span><span class="w"> </span><span class="o">(</span><span class="n">eventually_of_forall</span><span class="w"> </span><span class="n">hus</span><span class="o">)</span> <span class="kd">example</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">closure</span> <span class="n">s</span> <span class="bp">↔</span> <span class="bp">∀</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">b</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">Metric.ball</span> <span class="n">b</span> <span class="n">ε</span> <span class="o">:=</span> <span class="n">Metric.mem_closure_iff</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">closure</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">Metric.ball</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Metric.mem_closure_iff</span> </pre></div> </div> <p>Do the next exercise without using <cite>mem_closure_iff_seq_limit</cite></p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">u</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hu</span> <span class="o">:</span> <span class="n">Tendsto</span> <span class="n">u</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">a</span><span class="o">))</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hs</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="n">u</span> <span class="n">n</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">)</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">closure</span> <span class="n">s</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">u</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hu</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">a</span><span class="o">))</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">closure</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Remember from the filters sections that neighborhood filters play a big role in Mathlib.
-
@@ -684,11 +684,11 @@ In the metric space context, the crucial point is that balls provide bases for tThe main lemmas here are <code class="docutils literal notranslate"><span class="pre">Metric.nhds_basis_ball</span></code> and <code class="docutils literal notranslate"><span class="pre">Metric.nhds_basis_closedBall</span></code> that claim this for open and closed balls with positive radius. The center point is an implicit argument so we can invoke <code class="docutils literal notranslate"><span class="pre">Filter.HasBasis.mem_iff</span></code> as in the following example.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">}</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∈</span> <span class="bp">𝓝</span> <span class="n">x</span> <span class="bp">↔</span> <span class="bp">∃</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="n">Metric.ball</span> <span class="n">x</span> <span class="n">ε</span> <span class="bp">⊆</span> <span class="n">s</span> <span class="o">:=</span> <span class="n">Metric.nhds_basis_ball.mem_iff</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="n">Metric.ball</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Metric.nhds_basis_ball.mem_iff</span> <span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">}</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∈</span> <span class="bp">𝓝</span> <span class="n">x</span> <span class="bp">↔</span> <span class="bp">∃</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="n">Metric.closedBall</span> <span class="n">x</span> <span class="n">ε</span> <span class="bp">⊆</span> <span class="n">s</span> <span class="o">:=</span> <span class="n">Metric.nhds_basis_closedBall.mem_iff</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="n">Metric.closedBall</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Metric.nhds_basis_closedBall.mem_iff</span> </pre></div> </div> </section>
-
@@ -707,30 +707,30 @@ claims for compact sets in general metric spaces. In the second statement we onlneed continuity on the given set so we will use <code class="docutils literal notranslate"><span class="pre">ContinuousOn</span></code> instead of <code class="docutils literal notranslate"><span class="pre">Continuous</span></code>, and we will give separate statements for the minimum and the maximum. Of course all these results are deduced from more general versions, some of which will be discussed in later sections.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">IsCompact</span> <span class="o">(</span><span class="n">Set.Icc</span> <span class="mi">0</span> <span class="mi">1</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:=</span> <span class="n">isCompact_Icc</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsCompact</span><span class="w"> </span><span class="o">(</span><span class="n">Set.Icc</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">isCompact_Icc</span> <span class="kd">example</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hs</span> <span class="o">:</span> <span class="n">IsCompact</span> <span class="n">s</span><span class="o">)</span> <span class="o">{</span><span class="n">u</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hu</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="n">u</span> <span class="n">n</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">φ</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℕ</span><span class="o">,</span> <span class="n">StrictMono</span> <span class="n">φ</span> <span class="bp">∧</span> <span class="n">Tendsto</span> <span class="o">(</span><span class="n">u</span> <span class="bp">∘</span> <span class="n">φ</span><span class="o">)</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">a</span><span class="o">)</span> <span class="o">:=</span> <span class="n">hs.tendsto_subseq</span> <span class="n">hu</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsCompact</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">u</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hu</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">φ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="n">StrictMono</span><span class="w"> </span><span class="n">φ</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="bp">∘</span><span class="w"> </span><span class="n">φ</span><span class="o">)</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">hs.tendsto_subseq</span><span class="w"> </span><span class="n">hu</span> <span class="kd">example</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hs</span> <span class="o">:</span> <span class="n">IsCompact</span> <span class="n">s</span><span class="o">)</span> <span class="o">(</span><span class="n">hs'</span> <span class="o">:</span> <span class="n">s.Nonempty</span><span class="o">)</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">hfs</span> <span class="o">:</span> <span class="n">ContinuousOn</span> <span class="n">f</span> <span class="n">s</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">y</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">≤</span> <span class="n">f</span> <span class="n">y</span> <span class="o">:=</span> <span class="n">hs.exists_forall_le</span> <span class="n">hs'</span> <span class="n">hfs</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsCompact</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hs'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s.Nonempty</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span> <span class="w"> </span><span class="o">(</span><span class="n">hfs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ContinuousOn</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">hs.exists_forall_le</span><span class="w"> </span><span class="n">hs'</span><span class="w"> </span><span class="n">hfs</span> <span class="kd">example</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hs</span> <span class="o">:</span> <span class="n">IsCompact</span> <span class="n">s</span><span class="o">)</span> <span class="o">(</span><span class="n">hs'</span> <span class="o">:</span> <span class="n">s.Nonempty</span><span class="o">)</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">hfs</span> <span class="o">:</span> <span class="n">ContinuousOn</span> <span class="n">f</span> <span class="n">s</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">y</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="n">f</span> <span class="n">y</span> <span class="bp">≤</span> <span class="n">f</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">hs.exists_forall_ge</span> <span class="n">hs'</span> <span class="n">hfs</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsCompact</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hs'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s.Nonempty</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span> <span class="w"> </span><span class="o">(</span><span class="n">hfs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ContinuousOn</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">hs.exists_forall_ge</span><span class="w"> </span><span class="n">hs'</span><span class="w"> </span><span class="n">hfs</span> <span class="kd">example</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hs</span> <span class="o">:</span> <span class="n">IsCompact</span> <span class="n">s</span><span class="o">)</span> <span class="o">:</span> <span class="n">IsClosed</span> <span class="n">s</span> <span class="o">:=</span> <span class="n">hs.isClosed</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsCompact</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsClosed</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">hs.isClosed</span> </pre></div> </div> <p>We can also specify that a metric spaces is globally compact, using an extra <code class="docutils literal notranslate"><span class="pre">Prop</span></code>-valued type class:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">[</span><span class="n">CompactSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">:</span> <span class="n">IsCompact</span> <span class="o">(</span><span class="n">univ</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">)</span> <span class="o">:=</span> <span class="n">isCompact_univ</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">CompactSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsCompact</span><span class="w"> </span><span class="o">(</span><span class="n">univ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">isCompact_univ</span> </pre></div> </div> <p>In a compact metric space any closed set is compact, this is <code class="docutils literal notranslate"><span class="pre">IsClosed.isCompact</span></code>.</p>
-
@@ -740,10 +740,10 @@ are deduced from more general versions, some of which will be discussed in later<p>We now turn to uniformity notions on metric spaces : uniformly continuous functions, Cauchy sequences and completeness. Again those are defined in a more general context but we have lemmas in the metric name space to access their elementary definitions. We start with uniform continuity.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">{</span><span class="n">Y</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">Y</span><span class="o">]</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">}</span> <span class="o">:</span> <span class="n">UniformContinuous</span> <span class="n">f</span> <span class="bp">↔</span> <span class="bp">∀</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">δ</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="bp">∀</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">X</span><span class="o">},</span> <span class="n">dist</span> <span class="n">a</span> <span class="n">b</span> <span class="bp"><</span> <span class="n">δ</span> <span class="bp">→</span> <span class="n">dist</span> <span class="o">(</span><span class="n">f</span> <span class="n">a</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="n">b</span><span class="o">)</span> <span class="bp"><</span> <span class="n">ε</span> <span class="o">:=</span> <span class="n">Metric.uniformContinuous_iff</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">Y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">Y</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">UniformContinuous</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">↔</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">δ</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">},</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">δ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Metric.uniformContinuous_iff</span> </pre></div> </div> <p>In order to practice manipulating all those definitions, we will prove that continuous
-
@@ -759,10 +759,10 @@ And <code class="docutils literal notranslate"><span class="pre">K</span></code>If <code class="docutils literal notranslate"><span class="pre">K</span></code> is empty then we are clearly done (we can set <code class="docutils literal notranslate"><span class="pre">δ</span> <span class="pre">=</span> <span class="pre">1</span></code> for instance). So let’s assume <code class="docutils literal notranslate"><span class="pre">K</span></code> is not empty, and use the extreme value theorem to choose <code class="docutils literal notranslate"><span class="pre">(x₀,</span> <span class="pre">x₁)</span></code> attaining the infimum of the distance function on <code class="docutils literal notranslate"><span class="pre">K</span></code>. We can then set <code class="docutils literal notranslate"><span class="pre">δ</span> <span class="pre">=</span> <span class="pre">dist</span> <span class="pre">x₀</span> <span class="pre">x₁</span></code> and check everything works.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">[</span><span class="n">CompactSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">{</span><span class="n">Y</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">MetricSpace</span> <span class="n">Y</span><span class="o">]</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">}</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">UniformContinuous</span> <span class="n">f</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">CompactSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span> <span class="w"> </span><span class="o">{</span><span class="n">Y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">Y</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span> <span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">UniformContinuous</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> </section>
-
@@ -772,88 +772,88 @@ of the distance function on <code class="docutils literal notranslate"><span claThere are a couple of equivalent ways to state that idea. In particular converging sequences are Cauchy. The converse is true only in so-called <em>complete</em> spaces.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">u</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">X</span><span class="o">)</span> <span class="o">:</span> <span class="n">CauchySeq</span> <span class="n">u</span> <span class="bp">↔</span> <span class="bp">∀</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">N</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">m</span> <span class="bp">≥</span> <span class="n">N</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">n</span> <span class="bp">≥</span> <span class="n">N</span><span class="o">,</span> <span class="n">dist</span> <span class="o">(</span><span class="n">u</span> <span class="n">m</span><span class="o">)</span> <span class="o">(</span><span class="n">u</span> <span class="n">n</span><span class="o">)</span> <span class="bp"><</span> <span class="n">ε</span> <span class="o">:=</span> <span class="n">Metric.cauchySeq_iff</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">CauchySeq</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="n">N</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="n">N</span><span class="o">,</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="n">m</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Metric.cauchySeq_iff</span> <span class="kd">example</span> <span class="o">(</span><span class="n">u</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">X</span><span class="o">)</span> <span class="o">:</span> <span class="n">CauchySeq</span> <span class="n">u</span> <span class="bp">↔</span> <span class="bp">∀</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">N</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">n</span> <span class="bp">≥</span> <span class="n">N</span><span class="o">,</span> <span class="n">dist</span> <span class="o">(</span><span class="n">u</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">u</span> <span class="n">N</span><span class="o">)</span> <span class="bp"><</span> <span class="n">ε</span> <span class="o">:=</span> <span class="n">Metric.cauchySeq_iff'</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">CauchySeq</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="n">N</span><span class="o">,</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="n">N</span><span class="o">)</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Metric.cauchySeq_iff'</span> <span class="kd">example</span> <span class="o">[</span><span class="n">CompleteSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">(</span><span class="n">u</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">X</span><span class="o">)</span> <span class="o">(</span><span class="n">hu</span> <span class="o">:</span> <span class="n">CauchySeq</span> <span class="n">u</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span><span class="o">,</span> <span class="n">Tendsto</span> <span class="n">u</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">x</span><span class="o">)</span> <span class="o">:=</span> <span class="n">cauchySeq_tendsto_of_complete</span> <span class="n">hu</span> <span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">CompleteSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hu</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">CauchySeq</span><span class="w"> </span><span class="n">u</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">cauchySeq_tendsto_of_complete</span><span class="w"> </span><span class="n">hu</span> </pre></div> </div> <p>We’ll practice using this definition by proving a convenient criterion which is a special case of a criterion appearing in Mathlib. This is also a good opportunity to practice using big sums in a geometric context. In addition to the explanations from the filters section, you will probably need <code class="docutils literal notranslate"><span class="pre">tendsto_pow_atTop_nhds_0_of_lt_1</span></code>, <code class="docutils literal notranslate"><span class="pre">Tendsto.mul</span></code> and <code class="docutils literal notranslate"><span class="pre">dist_le_range_sum_dist</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">cauchySeq_of_le_geometric_two'</span> <span class="o">{</span><span class="n">u</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hu</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">,</span> <span class="n">dist</span> <span class="o">(</span><span class="n">u</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">u</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">))</span> <span class="bp">≤</span> <span class="o">(</span><span class="mi">1</span> <span class="bp">/</span> <span class="mi">2</span><span class="o">)</span> <span class="bp">^</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">CauchySeq</span> <span class="n">u</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">Metric.cauchySeq_iff'</span><span class="o">]</span> <span class="n">intro</span> <span class="n">ε</span> <span class="n">ε_pos</span> <span class="n">obtain</span> <span class="o">⟨</span><span class="n">N</span><span class="o">,</span> <span class="n">hN</span><span class="o">⟩</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">N</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">,</span> <span class="mi">1</span> <span class="bp">/</span> <span class="mi">2</span> <span class="bp">^</span> <span class="n">N</span> <span class="bp">*</span> <span class="mi">2</span> <span class="bp"><</span> <span class="n">ε</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">use</span> <span class="n">N</span> <span class="n">intro</span> <span class="n">n</span> <span class="n">hn</span> <span class="n">obtain</span> <span class="o">⟨</span><span class="n">k</span><span class="o">,</span> <span class="n">rfl</span> <span class="o">:</span> <span class="n">n</span> <span class="bp">=</span> <span class="n">N</span> <span class="bp">+</span> <span class="n">k</span><span class="o">⟩</span> <span class="o">:=</span> <span class="n">le_iff_exists_add.mp</span> <span class="n">hn</span> <span class="k">calc</span> <span class="n">dist</span> <span class="o">(</span><span class="n">u</span> <span class="o">(</span><span class="n">N</span> <span class="bp">+</span> <span class="n">k</span><span class="o">))</span> <span class="o">(</span><span class="n">u</span> <span class="n">N</span><span class="o">)</span> <span class="bp">=</span> <span class="n">dist</span> <span class="o">(</span><span class="n">u</span> <span class="o">(</span><span class="n">N</span> <span class="bp">+</span> <span class="mi">0</span><span class="o">))</span> <span class="o">(</span><span class="n">u</span> <span class="o">(</span><span class="n">N</span> <span class="bp">+</span> <span class="n">k</span><span class="o">))</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">_</span> <span class="bp">≤</span> <span class="bp">∑</span> <span class="n">i</span> <span class="k">in</span> <span class="n">range</span> <span class="n">k</span><span class="o">,</span> <span class="n">dist</span> <span class="o">(</span><span class="n">u</span> <span class="o">(</span><span class="n">N</span> <span class="bp">+</span> <span class="n">i</span><span class="o">))</span> <span class="o">(</span><span class="n">u</span> <span class="o">(</span><span class="n">N</span> <span class="bp">+</span> <span class="o">(</span><span class="n">i</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)))</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">_</span> <span class="bp">≤</span> <span class="bp">∑</span> <span class="n">i</span> <span class="k">in</span> <span class="n">range</span> <span class="n">k</span><span class="o">,</span> <span class="o">(</span><span class="mi">1</span> <span class="bp">/</span> <span class="mi">2</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="bp">^</span> <span class="o">(</span><span class="n">N</span> <span class="bp">+</span> <span class="n">i</span><span class="o">)</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">_</span> <span class="bp">=</span> <span class="mi">1</span> <span class="bp">/</span> <span class="mi">2</span> <span class="bp">^</span> <span class="n">N</span> <span class="bp">*</span> <span class="bp">∑</span> <span class="n">i</span> <span class="k">in</span> <span class="n">range</span> <span class="n">k</span><span class="o">,</span> <span class="o">(</span><span class="mi">1</span> <span class="bp">/</span> <span class="mi">2</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="bp">^</span> <span class="n">i</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">_</span> <span class="bp">≤</span> <span class="mi">1</span> <span class="bp">/</span> <span class="mi">2</span> <span class="bp">^</span> <span class="n">N</span> <span class="bp">*</span> <span class="mi">2</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">_</span> <span class="bp"><</span> <span class="n">ε</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">cauchySeq_of_le_geometric_two'</span><span class="w"> </span><span class="o">{</span><span class="n">u</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">X</span><span class="o">}</span> <span class="w"> </span><span class="o">(</span><span class="n">hu</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">))</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="o">(</span><span class="mi">1</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">CauchySeq</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">Metric.cauchySeq_iff'</span><span class="o">]</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="n">ε_pos</span> <span class="w"> </span><span class="n">obtain</span><span class="w"> </span><span class="o">⟨</span><span class="n">N</span><span class="o">,</span><span class="w"> </span><span class="n">hN</span><span class="o">⟩</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">N</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">hn</span> <span class="w"> </span><span class="n">obtain</span><span class="w"> </span><span class="o">⟨</span><span class="n">k</span><span class="o">,</span><span class="w"> </span><span class="n">rfl</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">k</span><span class="o">⟩</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">le_iff_exists_add.mp</span><span class="w"> </span><span class="n">hn</span> <span class="w"> </span><span class="k">calc</span> <span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="o">(</span><span class="n">N</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">k</span><span class="o">))</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="n">N</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="o">(</span><span class="n">N</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">0</span><span class="o">))</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="o">(</span><span class="n">N</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">k</span><span class="o">))</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="bp">∑</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="n">k</span><span class="o">,</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="o">(</span><span class="n">N</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">i</span><span class="o">))</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="o">(</span><span class="n">N</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="o">(</span><span class="n">i</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)))</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="bp">∑</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="n">k</span><span class="o">,</span><span class="w"> </span><span class="o">(</span><span class="mi">1</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="o">(</span><span class="n">N</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="bp">∑</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">range</span><span class="w"> </span><span class="n">k</span><span class="o">,</span><span class="w"> </span><span class="o">(</span><span class="mi">1</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>We are ready for the final boss of this section: Baire’s theorem for complete metric spaces! The proof skeleton below shows interesting techniques. It uses the <code class="docutils literal notranslate"><span class="pre">choose</span></code> tactic in its exclamation mark variant (you should experiment with removing this exclamation mark) and it shows how to define something inductively in the middle of a proof using <code class="docutils literal notranslate"><span class="pre">Nat.rec_on</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">Metric</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">Metric</span> <span class="kd">example</span> <span class="o">[</span><span class="n">CompleteSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">Set</span> <span class="n">X</span><span class="o">)</span> <span class="o">(</span><span class="n">ho</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="n">IsOpen</span> <span class="o">(</span><span class="n">f</span> <span class="n">n</span><span class="o">))</span> <span class="o">(</span><span class="n">hd</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="n">Dense</span> <span class="o">(</span><span class="n">f</span> <span class="n">n</span><span class="o">))</span> <span class="o">:</span> <span class="n">Dense</span> <span class="o">(</span><span class="bp">⋂</span> <span class="n">n</span><span class="o">,</span> <span class="n">f</span> <span class="n">n</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="k">let</span> <span class="n">B</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℝ</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">n</span> <span class="bp">↦</span> <span class="o">(</span><span class="mi">1</span> <span class="bp">/</span> <span class="mi">2</span><span class="o">)</span> <span class="bp">^</span> <span class="n">n</span> <span class="k">have</span> <span class="n">Bpos</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">B</span> <span class="n">n</span> <span class="gr">sorry</span> <span class="c">/-</span><span class="cm"> Translate the density assumption into two functions `center` and `radius` associating</span> <span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">CompleteSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">ho</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">IsOpen</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">n</span><span class="o">))</span><span class="w"> </span><span class="o">(</span><span class="n">hd</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">Dense</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">n</span><span class="o">))</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Dense</span><span class="w"> </span><span class="o">(</span><span class="bp">⋂</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">(</span><span class="mi">1</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="n">n</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">Bpos</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="n">n</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="c">/-</span><span class="cm"> Translate the density assumption into two functions `center` and `radius` associating</span> <span class="cm"> to any n, x, δ, δpos a center and a positive radius such that</span> <span class="cm"> `closedBall center radius` is included both in `f n` and in `closedBall x δ`.</span> <span class="cm"> We can also require `radius ≤ (1/2)^(n+1)`, to ensure we get a Cauchy sequence later. -/</span> <span class="k">have</span> <span class="o">:</span> <span class="bp">∀</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">),</span> <span class="bp">∀</span> <span class="n">δ</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">y</span> <span class="o">:</span> <span class="n">X</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">r</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="n">r</span> <span class="bp">≤</span> <span class="n">B</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">)</span> <span class="bp">∧</span> <span class="n">closedBall</span> <span class="n">y</span> <span class="n">r</span> <span class="bp">⊆</span> <span class="n">closedBall</span> <span class="n">x</span> <span class="n">δ</span> <span class="bp">∩</span> <span class="n">f</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="n">choose</span><span class="bp">!</span> <span class="n">center</span> <span class="n">radius</span> <span class="n">Hpos</span> <span class="n">HB</span> <span class="n">Hball</span> <span class="n">using</span> <span class="n">this</span> <span class="n">intro</span> <span class="n">x</span> <span class="n">rw</span> <span class="o">[</span><span class="n">mem_closure_iff_nhds_basis</span> <span class="n">nhds_basis_closedBall</span><span class="o">]</span> <span class="n">intro</span> <span class="n">ε</span> <span class="n">εpos</span> <span class="c">/-</span><span class="cm"> `ε` is positive. We have to find a point in the ball of radius `ε` around `x`</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">),</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">δ</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">)</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">closedBall</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">closedBall</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">δ</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">choose</span><span class="bp">!</span><span class="w"> </span><span class="n">center</span><span class="w"> </span><span class="n">radius</span><span class="w"> </span><span class="n">Hpos</span><span class="w"> </span><span class="n">HB</span><span class="w"> </span><span class="n">Hball</span><span class="w"> </span><span class="n">using</span><span class="w"> </span><span class="n">this</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">x</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">mem_closure_iff_nhds_basis</span><span class="w"> </span><span class="n">nhds_basis_closedBall</span><span class="o">]</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="n">εpos</span> <span class="w"> </span><span class="c">/-</span><span class="cm"> `ε` is positive. We have to find a point in the ball of radius `ε` around `x`</span> <span class="cm"> belonging to all `f n`. For this, we construct inductively a sequence</span> <span class="cm"> `F n = (c n, r n)` such that the closed ball `closedBall (c n) (r n)` is included</span> <span class="cm"> in the previous ball and in `f n`, and such that `r n` is small enough to ensure</span> <span class="cm"> that `c n` is a Cauchy sequence. Then `c n` converges to a limit which belongs</span> <span class="cm"> to all the `f n`. -/</span> <span class="k">let</span> <span class="n">F</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">X</span> <span class="bp">×</span> <span class="n">ℝ</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">n</span> <span class="bp">↦</span> <span class="n">Nat.recOn</span> <span class="n">n</span> <span class="o">(</span><span class="n">Prod.mk</span> <span class="n">x</span> <span class="o">(</span><span class="n">min</span> <span class="n">ε</span> <span class="o">(</span><span class="n">B</span> <span class="mi">0</span><span class="o">)))</span> <span class="k">fun</span> <span class="n">n</span> <span class="n">p</span> <span class="bp">↦</span> <span class="n">Prod.mk</span> <span class="o">(</span><span class="n">center</span> <span class="n">n</span> <span class="n">p.1</span> <span class="n">p.2</span><span class="o">)</span> <span class="o">(</span><span class="n">radius</span> <span class="n">n</span> <span class="n">p.1</span> <span class="n">p.2</span><span class="o">)</span> <span class="k">let</span> <span class="n">c</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">X</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">n</span> <span class="bp">↦</span> <span class="o">(</span><span class="n">F</span> <span class="n">n</span><span class="o">)</span><span class="bp">.</span><span class="mi">1</span> <span class="k">let</span> <span class="n">r</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℝ</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">n</span> <span class="bp">↦</span> <span class="o">(</span><span class="n">F</span> <span class="n">n</span><span class="o">)</span><span class="bp">.</span><span class="mi">2</span> <span class="k">have</span> <span class="n">rpos</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">r</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="n">rB</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="n">r</span> <span class="n">n</span> <span class="bp">≤</span> <span class="n">B</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="n">incl</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="n">closedBall</span> <span class="o">(</span><span class="n">c</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">))</span> <span class="o">(</span><span class="n">r</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">))</span> <span class="bp">⊆</span> <span class="n">closedBall</span> <span class="o">(</span><span class="n">c</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">r</span> <span class="n">n</span><span class="o">)</span> <span class="bp">∩</span> <span class="n">f</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="n">cdist</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="n">dist</span> <span class="o">(</span><span class="n">c</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">c</span> <span class="o">(</span><span class="n">n</span> <span class="bp">+</span> <span class="mi">1</span><span class="o">))</span> <span class="bp">≤</span> <span class="n">B</span> <span class="n">n</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="o">:</span> <span class="n">CauchySeq</span> <span class="n">c</span> <span class="o">:=</span> <span class="n">cauchySeq_of_le_geometric_two'</span> <span class="n">cdist</span> <span class="c1">-- as the sequence `c n` is Cauchy in a complete space, it converges to a limit `y`.</span> <span class="n">rcases</span> <span class="n">cauchySeq_tendsto_of_complete</span> <span class="n">this</span> <span class="k">with</span> <span class="o">⟨</span><span class="n">y</span><span class="o">,</span> <span class="n">ylim</span><span class="o">⟩</span> <span class="c1">-- this point `y` will be the desired point. We will check that it belongs to all</span> <span class="c1">-- `f n` and to `ball x ε`.</span> <span class="n">use</span> <span class="n">y</span> <span class="k">have</span> <span class="n">I</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">m</span> <span class="bp">≥</span> <span class="n">n</span><span class="o">,</span> <span class="n">closedBall</span> <span class="o">(</span><span class="n">c</span> <span class="n">m</span><span class="o">)</span> <span class="o">(</span><span class="n">r</span> <span class="n">m</span><span class="o">)</span> <span class="bp">⊆</span> <span class="n">closedBall</span> <span class="o">(</span><span class="n">c</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">r</span> <span class="n">n</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="n">yball</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="n">y</span> <span class="bp">∈</span> <span class="n">closedBall</span> <span class="o">(</span><span class="n">c</span> <span class="n">n</span><span class="o">)</span> <span class="o">(</span><span class="n">r</span> <span class="n">n</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="gr">sorry</span> <span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">×</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">↦</span> <span class="w"> </span><span class="n">Nat.recOn</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">(</span><span class="n">Prod.mk</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">(</span><span class="n">min</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="o">(</span><span class="n">B</span><span class="w"> </span><span class="mi">0</span><span class="o">)))</span> <span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">Prod.mk</span><span class="w"> </span><span class="o">(</span><span class="n">center</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">1</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">radius</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">1</span><span class="w"> </span><span class="n">p</span><span class="bp">.</span><span class="mi">2</span><span class="o">)</span> <span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">(</span><span class="n">F</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="bp">.</span><span class="mi">1</span> <span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="o">(</span><span class="n">F</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="bp">.</span><span class="mi">2</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">rpos</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">rB</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">incl</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">closedBall</span><span class="w"> </span><span class="o">(</span><span class="n">c</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">))</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">))</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">closedBall</span><span class="w"> </span><span class="o">(</span><span class="n">c</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="bp">∩</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">cdist</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">dist</span><span class="w"> </span><span class="o">(</span><span class="n">c</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">c</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="mi">1</span><span class="o">))</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">CauchySeq</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">cauchySeq_of_le_geometric_two'</span><span class="w"> </span><span class="n">cdist</span> <span class="w"> </span><span class="c1">-- as the sequence `c n` is Cauchy in a complete space, it converges to a limit `y`.</span> <span class="w"> </span><span class="n">rcases</span><span class="w"> </span><span class="n">cauchySeq_tendsto_of_complete</span><span class="w"> </span><span class="n">this</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="o">⟨</span><span class="n">y</span><span class="o">,</span><span class="w"> </span><span class="n">ylim</span><span class="o">⟩</span> <span class="w"> </span><span class="c1">-- this point `y` will be the desired point. We will check that it belongs to all</span> <span class="w"> </span><span class="c1">-- `f n` and to `ball x ε`.</span> <span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">y</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="bp">≥</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">closedBall</span><span class="w"> </span><span class="o">(</span><span class="n">c</span><span class="w"> </span><span class="n">m</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="n">m</span><span class="o">)</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">closedBall</span><span class="w"> </span><span class="o">(</span><span class="n">c</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">yball</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">closedBall</span><span class="w"> </span><span class="o">(</span><span class="n">c</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">r</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> </section>
-
@@ -871,28 +871,28 @@ remember the notion of open sets (or equivalently the notion of closed sets). Fra topological space is a type equipped with a collection of sets that are called open sets. This collection has to satisfy a number of axioms presented below (this collection is slightly redundant but we will ignore that).</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">section</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">TopologicalSpace</span> <span class="n">X</span><span class="o">]</span> <span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">IsOpen</span> <span class="o">(</span><span class="n">univ</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">)</span> <span class="o">:=</span> <span class="n">isOpen_univ</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsOpen</span><span class="w"> </span><span class="o">(</span><span class="n">univ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">isOpen_univ</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">IsOpen</span> <span class="o">(</span><span class="bp">∅</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">)</span> <span class="o">:=</span> <span class="n">isOpen_empty</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsOpen</span><span class="w"> </span><span class="o">(</span><span class="bp">∅</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">isOpen_empty</span> <span class="kd">example</span> <span class="o">{</span><span class="n">ι</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hs</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">i</span><span class="o">,</span> <span class="n">IsOpen</span> <span class="o">(</span><span class="n">s</span> <span class="n">i</span><span class="o">))</span> <span class="o">:</span> <span class="n">IsOpen</span> <span class="o">(</span><span class="bp">⋃</span> <span class="n">i</span><span class="o">,</span> <span class="n">s</span> <span class="n">i</span><span class="o">)</span> <span class="o">:=</span> <span class="n">isOpen_iUnion</span> <span class="n">hs</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">ι</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">IsOpen</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="n">i</span><span class="o">))</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsOpen</span><span class="w"> </span><span class="o">(</span><span class="bp">⋃</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">isOpen_iUnion</span><span class="w"> </span><span class="n">hs</span> <span class="kd">example</span> <span class="o">{</span><span class="n">ι</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Fintype</span> <span class="n">ι</span><span class="o">]</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hs</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">i</span><span class="o">,</span> <span class="n">IsOpen</span> <span class="o">(</span><span class="n">s</span> <span class="n">i</span><span class="o">))</span> <span class="o">:</span> <span class="n">IsOpen</span> <span class="o">(</span><span class="bp">⋂</span> <span class="n">i</span><span class="o">,</span> <span class="n">s</span> <span class="n">i</span><span class="o">)</span> <span class="o">:=</span> <span class="n">isOpen_iInter_of_finite</span> <span class="n">hs</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">ι</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Fintype</span><span class="w"> </span><span class="n">ι</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">IsOpen</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="n">i</span><span class="o">))</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">IsOpen</span><span class="w"> </span><span class="o">(</span><span class="bp">⋂</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">isOpen_iInter_of_finite</span><span class="w"> </span><span class="n">hs</span> </pre></div> </div> <p>Closed sets are then defined as sets whose complement is open. A function between topological spaces is (globally) continuous if all preimages of open sets are open.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">Y</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">TopologicalSpace</span> <span class="n">Y</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">Y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">Y</span><span class="o">]</span> <span class="kd">example</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">}</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="n">f</span> <span class="bp">↔</span> <span class="bp">∀</span> <span class="n">s</span><span class="o">,</span> <span class="n">IsOpen</span> <span class="n">s</span> <span class="bp">→</span> <span class="n">IsOpen</span> <span class="o">(</span><span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">s</span><span class="o">)</span> <span class="o">:=</span> <span class="n">continuous_def</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">IsOpen</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">IsOpen</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">continuous_def</span> </pre></div> </div> <p>With this definition we already see that, compared to metric spaces, topological spaces only remember
-
@@ -910,22 +910,22 @@ that <code class="docutils literal notranslate"><span class="pre">f</span> <span<code class="docutils literal notranslate"><span class="pre">f</span></code> of the generalized set of points that are close to <code class="docutils literal notranslate"><span class="pre">x</span></code> is contained in the generalized set of points that are close to <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">x</span></code>. Recall this is spelled either <code class="docutils literal notranslate"><span class="pre">map</span> <span class="pre">f</span> <span class="pre">(𝓝</span> <span class="pre">x)</span> <span class="pre">≤</span> <span class="pre">𝓝</span> <span class="pre">(f</span> <span class="pre">x)</span></code> or <code class="docutils literal notranslate"><span class="pre">Tendsto</span> <span class="pre">f</span> <span class="pre">(𝓝</span> <span class="pre">x)</span> <span class="pre">(𝓝</span> <span class="pre">(f</span> <span class="pre">x))</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">}</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">}</span> <span class="o">:</span> <span class="n">ContinuousAt</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">↔</span> <span class="n">map</span> <span class="n">f</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">x</span><span class="o">)</span> <span class="bp">≤</span> <span class="bp">𝓝</span> <span class="o">(</span><span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="o">:=</span> <span class="n">Iff.rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ContinuousAt</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">map</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Iff.rfl</span> </pre></div> </div> <p>One can also spell it using both neighborhoods seen as ordinary sets and a neighborhood filter seen as a generalized set: “for any neighborhood <code class="docutils literal notranslate"><span class="pre">U</span></code> of <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">x</span></code>, all points close to <code class="docutils literal notranslate"><span class="pre">x</span></code> are sent to <code class="docutils literal notranslate"><span class="pre">U</span></code>”. Note that the proof is again <code class="docutils literal notranslate"><span class="pre">iff.rfl</span></code>, this point of view is definitionally equivalent to the previous one.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">}</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">}</span> <span class="o">:</span> <span class="n">ContinuousAt</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">↔</span> <span class="bp">∀</span> <span class="n">U</span> <span class="bp">∈</span> <span class="bp">𝓝</span> <span class="o">(</span><span class="n">f</span> <span class="n">x</span><span class="o">),</span> <span class="bp">∀ᶠ</span> <span class="n">x</span> <span class="k">in</span> <span class="bp">𝓝</span> <span class="n">x</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">U</span> <span class="o">:=</span> <span class="n">Iff.rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ContinuousAt</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">U</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">),</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">U</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Iff.rfl</span> </pre></div> </div> <p>We now explain how to go from one point of view to the other. In terms of open sets, we can simply define members of <code class="docutils literal notranslate"><span class="pre">𝓝</span> <span class="pre">x</span></code> as sets that contain an open set containing <code class="docutils literal notranslate"><span class="pre">x</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">}</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">∈</span> <span class="bp">𝓝</span> <span class="n">x</span> <span class="bp">↔</span> <span class="bp">∃</span> <span class="n">t</span><span class="o">,</span> <span class="n">t</span> <span class="bp">⊆</span> <span class="n">s</span> <span class="bp">∧</span> <span class="n">IsOpen</span> <span class="n">t</span> <span class="bp">∧</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">t</span> <span class="o">:=</span> <span class="n">mem_nhds_iff</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">t</span><span class="o">,</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">IsOpen</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">mem_nhds_iff</span> </pre></div> </div> <p>To go in the other direction we need to discuss the condition that <code class="docutils literal notranslate"><span class="pre">𝓝</span> <span class="pre">:</span> <span class="pre">X</span> <span class="pre">→</span> <span class="pre">Filter</span> <span class="pre">X</span></code> must satisfy
-
@@ -933,17 +933,17 @@ in order to be the neighborhood function of a topology.</p><p>The first constraint is that <code class="docutils literal notranslate"><span class="pre">𝓝</span> <span class="pre">x</span></code>, seen as a generalized set, contains the set <code class="docutils literal notranslate"><span class="pre">{x}</span></code> seen as the generalized set <code class="docutils literal notranslate"><span class="pre">pure</span> <span class="pre">x</span></code> (explaining this weird name would be too much of a digression, so we simply accept it for now). Another way to say it is that if a predicate holds for points close to <code class="docutils literal notranslate"><span class="pre">x</span></code> then it holds at <code class="docutils literal notranslate"><span class="pre">x</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">)</span> <span class="o">:</span> <span class="n">pure</span> <span class="n">x</span> <span class="bp">≤</span> <span class="bp">𝓝</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">pure_le_nhds</span> <span class="n">x</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">pure</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">pure_le_nhds</span><span class="w"> </span><span class="n">x</span> <span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">)</span> <span class="o">(</span><span class="n">P</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="kt">Prop</span><span class="o">)</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">y</span> <span class="k">in</span> <span class="bp">𝓝</span> <span class="n">x</span><span class="o">,</span> <span class="n">P</span> <span class="n">y</span><span class="o">)</span> <span class="o">:</span> <span class="n">P</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">h.self_of_nhds</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">P</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="kt">Prop</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">h.self_of_nhds</span> </pre></div> </div> <p>Then a more subtle requirement is that, for any predicate <code class="docutils literal notranslate"><span class="pre">P</span> <span class="pre">:</span> <span class="pre">X</span> <span class="pre">→</span> <span class="pre">Prop</span></code> and any <code class="docutils literal notranslate"><span class="pre">x</span></code>, if <code class="docutils literal notranslate"><span class="pre">P</span> <span class="pre">y</span></code> holds for <code class="docutils literal notranslate"><span class="pre">y</span></code> close to <code class="docutils literal notranslate"><span class="pre">x</span></code> then for <code class="docutils literal notranslate"><span class="pre">y</span></code> close to <code class="docutils literal notranslate"><span class="pre">x</span></code> and <code class="docutils literal notranslate"><span class="pre">z</span></code> close to <code class="docutils literal notranslate"><span class="pre">y</span></code>, <code class="docutils literal notranslate"><span class="pre">P</span> <span class="pre">z</span></code> holds. More precisely we have:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">P</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="kt">Prop</span><span class="o">}</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">y</span> <span class="k">in</span> <span class="bp">𝓝</span> <span class="n">x</span><span class="o">,</span> <span class="n">P</span> <span class="n">y</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">y</span> <span class="k">in</span> <span class="bp">𝓝</span> <span class="n">x</span><span class="o">,</span> <span class="bp">∀ᶠ</span> <span class="n">z</span> <span class="k">in</span> <span class="bp">𝓝</span> <span class="n">y</span><span class="o">,</span> <span class="n">P</span> <span class="n">z</span> <span class="o">:=</span> <span class="n">eventually_eventually_nhds.mpr</span> <span class="n">h</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">P</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="kt">Prop</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="n">y</span><span class="o">,</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">eventually_eventually_nhds.mpr</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>Those two results characterize the functions <code class="docutils literal notranslate"><span class="pre">X</span> <span class="pre">→</span> <span class="pre">Filter</span> <span class="pre">X</span></code> that are neighborhood functions for a topological space
-
@@ -951,10 +951,10 @@ structure on <code class="docutils literal notranslate"><span class="pre">X</spabut it will give back its input as a neighborhood function only if it satisfies the above two constraints. More precisely we have a lemma <code class="docutils literal notranslate"><span class="pre">TopologicalSpace.nhds_mkOfNhds</span></code> saying that in a different way and our next exercise deduces this different way from how we stated it above.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">Filter</span> <span class="n">α</span><span class="o">)</span> <span class="o">(</span><span class="n">H₀</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span><span class="o">,</span> <span class="n">pure</span> <span class="n">a</span> <span class="bp">≤</span> <span class="n">n</span> <span class="n">a</span><span class="o">)</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span> <span class="o">:</span> <span class="n">α</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">p</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="kt">Prop</span><span class="o">,</span> <span class="o">(</span><span class="bp">∀ᶠ</span> <span class="n">x</span> <span class="k">in</span> <span class="n">n</span> <span class="n">a</span><span class="o">,</span> <span class="n">p</span> <span class="n">x</span><span class="o">)</span> <span class="bp">→</span> <span class="bp">∀ᶠ</span> <span class="n">y</span> <span class="k">in</span> <span class="n">n</span> <span class="n">a</span><span class="o">,</span> <span class="bp">∀ᶠ</span> <span class="n">x</span> <span class="k">in</span> <span class="n">n</span> <span class="n">y</span><span class="o">,</span> <span class="n">p</span> <span class="n">x</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">a</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">s</span> <span class="bp">∈</span> <span class="n">n</span> <span class="n">a</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">t</span> <span class="bp">∈</span> <span class="n">n</span> <span class="n">a</span><span class="o">,</span> <span class="n">t</span> <span class="bp">⊆</span> <span class="n">s</span> <span class="bp">∧</span> <span class="bp">∀</span> <span class="n">a'</span> <span class="bp">∈</span> <span class="n">t</span><span class="o">,</span> <span class="n">s</span> <span class="bp">∈</span> <span class="n">n</span> <span class="n">a'</span> <span class="o">:=</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">H₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">pure</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">a</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="kt">Prop</span><span class="o">,</span><span class="w"> </span><span class="o">(</span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">y</span><span class="o">,</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a'</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">t</span><span class="o">,</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">a'</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Note that <code class="docutils literal notranslate"><span class="pre">TopologicalSpace.mkOfNhds</span></code> is not so frequently used, but it still good to know in what
-
@@ -976,17 +976,17 @@ sequences of functions is a respectable notion of convergence. But there is no da map <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">:</span> <span class="pre">X</span> <span class="pre">→</span> <span class="pre">(ℝ</span> <span class="pre">→</span> <span class="pre">ℝ)</span></code> is continuous if and only if <code class="docutils literal notranslate"><span class="pre">fun</span> <span class="pre">x</span> <span class="pre">↦</span> <span class="pre">f</span> <span class="pre">x</span> <span class="pre">t</span></code> is continuous for every <code class="docutils literal notranslate"><span class="pre">t</span> <span class="pre">:</span> <span class="pre">ℝ</span></code>.</p> <p>We now review the data used to solve all those issues. First we can use any map <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">:</span> <span class="pre">X</span> <span class="pre">→</span> <span class="pre">Y</span></code> to push or pull topologies from one side to the other. Those two operations form a Galois connection.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">X</span> <span class="n">Y</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">)</span> <span class="o">:</span> <span class="n">TopologicalSpace</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">TopologicalSpace</span> <span class="n">Y</span> <span class="o">:=</span> <span class="n">TopologicalSpace.coinduced</span> <span class="n">f</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">TopologicalSpace.coinduced</span><span class="w"> </span><span class="n">f</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">)</span> <span class="o">:</span> <span class="n">TopologicalSpace</span> <span class="n">Y</span> <span class="bp">→</span> <span class="n">TopologicalSpace</span> <span class="n">X</span> <span class="o">:=</span> <span class="n">TopologicalSpace.induced</span> <span class="n">f</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">TopologicalSpace.induced</span><span class="w"> </span><span class="n">f</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">)</span> <span class="o">(</span><span class="n">T_X</span> <span class="o">:</span> <span class="n">TopologicalSpace</span> <span class="n">X</span><span class="o">)</span> <span class="o">(</span><span class="n">T_Y</span> <span class="o">:</span> <span class="n">TopologicalSpace</span> <span class="n">Y</span><span class="o">)</span> <span class="o">:</span> <span class="n">TopologicalSpace.coinduced</span> <span class="n">f</span> <span class="n">T_X</span> <span class="bp">≤</span> <span class="n">T_Y</span> <span class="bp">↔</span> <span class="n">T_X</span> <span class="bp">≤</span> <span class="n">TopologicalSpace.induced</span> <span class="n">f</span> <span class="n">T_Y</span> <span class="o">:=</span> <span class="n">coinduced_le_iff_le_induced</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">T_X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">T_Y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">Y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">TopologicalSpace.coinduced</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">T_X</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">T_Y</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">T_X</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">TopologicalSpace.induced</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">T_Y</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">coinduced_le_iff_le_induced</span> </pre></div> </div> <p>Those operations are compactible with composition of functions.
-
@@ -1002,14 +1002,14 @@ on neighborhoods more than open sets so, for any <code class="docutils literal nAnd we know the order relation on <code class="docutils literal notranslate"><span class="pre">Filter</span> <span class="pre">X</span></code> is designed to ensure an order preserving <code class="docutils literal notranslate"><span class="pre">principal</span> <span class="pre">:</span> <span class="pre">Set</span> <span class="pre">X</span> <span class="pre">→</span> <span class="pre">Filter</span> <span class="pre">X</span></code>, allowing to see filters as generalized sets. So the order relation we do use on <code class="docutils literal notranslate"><span class="pre">TopologicalSpace</span> <span class="pre">X</span></code> is opposite to the one coming from <code class="docutils literal notranslate"><span class="pre">Set</span> <span class="pre">(Set</span> <span class="pre">X)</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">T</span> <span class="n">T'</span> <span class="o">:</span> <span class="n">TopologicalSpace</span> <span class="n">X</span><span class="o">}</span> <span class="o">:</span> <span class="n">T</span> <span class="bp">≤</span> <span class="n">T'</span> <span class="bp">↔</span> <span class="bp">∀</span> <span class="n">s</span><span class="o">,</span> <span class="n">T'.IsOpen</span> <span class="n">s</span> <span class="bp">→</span> <span class="n">T.IsOpen</span> <span class="n">s</span> <span class="o">:=</span> <span class="n">Iff.rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">T</span><span class="w"> </span><span class="n">T'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">T'</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">T'.IsOpen</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">T.IsOpen</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Iff.rfl</span> </pre></div> </div> <p>Now we can recover continuity by combining the push-forward (or pull-back) operation with the order relation.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">T_X</span> <span class="o">:</span> <span class="n">TopologicalSpace</span> <span class="n">X</span><span class="o">)</span> <span class="o">(</span><span class="n">T_Y</span> <span class="o">:</span> <span class="n">TopologicalSpace</span> <span class="n">Y</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">)</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="n">f</span> <span class="bp">↔</span> <span class="n">TopologicalSpace.coinduced</span> <span class="n">f</span> <span class="n">T_X</span> <span class="bp">≤</span> <span class="n">T_Y</span> <span class="o">:=</span> <span class="n">continuous_iff_coinduced_le</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">T_X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">T_Y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">Y</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">TopologicalSpace.coinduced</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">T_X</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">T_Y</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">continuous_iff_coinduced_le</span> </pre></div> </div> <p>With this definition and the compatibility of push-forward and composition, we
-
@@ -1020,11 +1020,11 @@ a function <span class="math notranslate nohighlight">\(g : Y → Z\)</span>\[\begin{split}g \text{ continuous } &⇔ g_*(f_*T_X) ≤ T_Z \\ &⇔ (g ∘ f)_* T_X ≤ T_Z \\ &⇔ g ∘ f \text{ continuous}\end{split}\]</div> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">Z</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">)</span> <span class="o">(</span><span class="n">T_X</span> <span class="o">:</span> <span class="n">TopologicalSpace</span> <span class="n">X</span><span class="o">)</span> <span class="o">(</span><span class="n">T_Z</span> <span class="o">:</span> <span class="n">TopologicalSpace</span> <span class="n">Z</span><span class="o">)</span> <span class="o">(</span><span class="n">g</span> <span class="o">:</span> <span class="n">Y</span> <span class="bp">→</span> <span class="n">Z</span><span class="o">)</span> <span class="o">:</span> <span class="bp">@</span><span class="n">Continuous</span> <span class="n">Y</span> <span class="n">Z</span> <span class="o">(</span><span class="n">TopologicalSpace.coinduced</span> <span class="n">f</span> <span class="n">T_X</span><span class="o">)</span> <span class="n">T_Z</span> <span class="n">g</span> <span class="bp">↔</span> <span class="bp">@</span><span class="n">Continuous</span> <span class="n">X</span> <span class="n">Z</span> <span class="n">T_X</span> <span class="n">T_Z</span> <span class="o">(</span><span class="n">g</span> <span class="bp">∘</span> <span class="n">f</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">rw</span> <span class="o">[</span><span class="n">continuous_iff_coinduced_le</span><span class="o">,</span> <span class="n">coinduced_compose</span><span class="o">,</span> <span class="n">continuous_iff_coinduced_le</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">Z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">T_X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">T_Z</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">Z</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Z</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">@</span><span class="n">Continuous</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="n">Z</span><span class="w"> </span><span class="o">(</span><span class="n">TopologicalSpace.coinduced</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">T_X</span><span class="o">)</span><span class="w"> </span><span class="n">T_Z</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">↔</span> <span class="w"> </span><span class="bp">@</span><span class="n">Continuous</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="n">Z</span><span class="w"> </span><span class="n">T_X</span><span class="w"> </span><span class="n">T_Z</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="bp">∘</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">rw</span><span class="w"> </span><span class="o">[</span><span class="n">continuous_iff_coinduced_le</span><span class="o">,</span><span class="w"> </span><span class="n">coinduced_compose</span><span class="o">,</span><span class="w"> </span><span class="n">continuous_iff_coinduced_le</span><span class="o">]</span> </pre></div> </div> <p>So we already get quotient topologies (using the projection map as <code class="docutils literal notranslate"><span class="pre">f</span></code>). This wasn’t using that
-
@@ -1041,10 +1041,10 @@ Let us explore that constraint “on paper” using notation <span class&⇔ ∀ i, f_* T_Z ≤ (p_i)^*T_{X_i}\\ &⇔ f_* T_Z ≤ \inf \left[(p_i)^*T_{X_i}\right]\end{split}\]</div> <p>So we see that what is the topology we want on <code class="docutils literal notranslate"><span class="pre">Π</span> <span class="pre">i,</span> <span class="pre">X</span> <span class="pre">i</span></code>:</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">ι</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="o">(</span><span class="n">X</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="o">(</span><span class="n">T_X</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">i</span><span class="o">,</span> <span class="n">TopologicalSpace</span> <span class="o">(</span><span class="n">X</span> <span class="n">i</span><span class="o">))</span> <span class="o">:</span> <span class="o">(</span><span class="k">Pi</span><span class="bp">.</span><span class="n">topologicalSpace</span> <span class="o">:</span> <span class="n">TopologicalSpace</span> <span class="o">(</span><span class="bp">∀</span> <span class="n">i</span><span class="o">,</span> <span class="n">X</span> <span class="n">i</span><span class="o">))</span> <span class="bp">=</span> <span class="bp">⨅</span> <span class="n">i</span><span class="o">,</span> <span class="n">TopologicalSpace.induced</span> <span class="o">(</span><span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">x</span> <span class="n">i</span><span class="o">)</span> <span class="o">(</span><span class="n">T_X</span> <span class="n">i</span><span class="o">)</span> <span class="o">:=</span> <span class="n">rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">ι</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">T_X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="o">(</span><span class="n">X</span><span class="w"> </span><span class="n">i</span><span class="o">))</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="o">(</span><span class="k">Pi</span><span class="bp">.</span><span class="n">topologicalSpace</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="o">(</span><span class="bp">∀</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="n">i</span><span class="o">))</span><span class="w"> </span><span class="bp">=</span> <span class="w"> </span><span class="bp">⨅</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">TopologicalSpace.induced</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">T_X</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p>This ends our tour of how Mathlib thinks that topological spaces fix defects of the theory of metric spaces
-
@@ -1059,19 +1059,19 @@ is closer to what metric spaces do. The most important is <code class="docutilsthat will ensure that limits are unique. A stronger separation property is <code class="docutils literal notranslate"><span class="pre">T3Space</span></code> that ensures in addition the <cite>RegularSpace</cite> property: each point has a basis of closed neighborhoods.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">[</span><span class="n">TopologicalSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">[</span><span class="n">T2Space</span> <span class="n">X</span><span class="o">]</span> <span class="o">{</span><span class="n">u</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">X</span><span class="o">}</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">ha</span> <span class="o">:</span> <span class="n">Tendsto</span> <span class="n">u</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">a</span><span class="o">))</span> <span class="o">(</span><span class="n">hb</span> <span class="o">:</span> <span class="n">Tendsto</span> <span class="n">u</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">b</span><span class="o">))</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">b</span> <span class="o">:=</span> <span class="n">tendsto_nhds_unique</span> <span class="n">ha</span> <span class="n">hb</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">T2Space</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">u</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">ha</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">a</span><span class="o">))</span> <span class="w"> </span><span class="o">(</span><span class="n">hb</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">b</span><span class="o">))</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">tendsto_nhds_unique</span><span class="w"> </span><span class="n">ha</span><span class="w"> </span><span class="n">hb</span> <span class="kd">example</span> <span class="o">[</span><span class="n">TopologicalSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">[</span><span class="n">RegularSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">X</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">a</span><span class="o">)</span><span class="bp">.</span><span class="n">HasBasis</span> <span class="o">(</span><span class="k">fun</span> <span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span> <span class="bp">↦</span> <span class="n">s</span> <span class="bp">∈</span> <span class="bp">𝓝</span> <span class="n">a</span> <span class="bp">∧</span> <span class="n">IsClosed</span> <span class="n">s</span><span class="o">)</span> <span class="n">id</span> <span class="o">:=</span> <span class="n">closed_nhds_basis</span> <span class="n">a</span> <span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">RegularSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="bp">.</span><span class="n">HasBasis</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">IsClosed</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">closed_nhds_basis</span><span class="w"> </span><span class="n">a</span> </pre></div> </div> <p>Note that, in every topological space, each point has a basis of open neighborhood, by definition.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">[</span><span class="n">TopologicalSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">}</span> <span class="o">:</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">HasBasis</span> <span class="o">(</span><span class="k">fun</span> <span class="n">t</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span> <span class="bp">↦</span> <span class="n">t</span> <span class="bp">∈</span> <span class="bp">𝓝</span> <span class="n">x</span> <span class="bp">∧</span> <span class="n">IsOpen</span> <span class="n">t</span><span class="o">)</span> <span class="n">id</span> <span class="o">:=</span> <span class="n">nhds_basis_opens'</span> <span class="n">x</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">HasBasis</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">IsOpen</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">nhds_basis_opens'</span><span class="w"> </span><span class="n">x</span> </pre></div> </div> <p>Our main goal is now to prove the basic theorem which allows extension by continuity.
-
@@ -1089,11 +1089,11 @@ The assumption “tends to <span class="math notranslate nohighlight">\(x\)<<code class="docutils literal notranslate"><span class="pre">comap</span> <span class="pre">(↑)</span> <span class="pre">(𝓝</span> <span class="pre">x)</span></code>.</p> <p>Let’s first prove an auxiliary lemma, extracted to simplify the context (in particular we don’t need Y to be a topological space here).</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span> <span class="n">aux</span> <span class="o">{</span><span class="n">X</span> <span class="n">Y</span> <span class="n">A</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">TopologicalSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">{</span><span class="n">c</span> <span class="o">:</span> <span class="n">A</span> <span class="bp">→</span> <span class="n">X</span><span class="o">}</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">A</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">}</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">}</span> <span class="o">{</span><span class="n">F</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">Y</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">Tendsto</span> <span class="n">f</span> <span class="o">(</span><span class="n">comap</span> <span class="n">c</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">x</span><span class="o">))</span> <span class="n">F</span><span class="o">)</span> <span class="o">{</span><span class="n">V'</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">Y</span><span class="o">}</span> <span class="o">(</span><span class="n">V'_in</span> <span class="o">:</span> <span class="n">V'</span> <span class="bp">∈</span> <span class="n">F</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">V</span> <span class="bp">∈</span> <span class="bp">𝓝</span> <span class="n">x</span><span class="o">,</span> <span class="n">IsOpen</span> <span class="n">V</span> <span class="bp">∧</span> <span class="n">c</span> <span class="bp">⁻¹'</span> <span class="n">V</span> <span class="bp">⊆</span> <span class="n">f</span> <span class="bp">⁻¹'</span> <span class="n">V'</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">theorem</span><span class="w"> </span><span class="n">aux</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">X</span><span class="o">}</span> <span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span> <span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">comap</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">x</span><span class="o">))</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">V'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">V'_in</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">V'</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">V</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">IsOpen</span><span class="w"> </span><span class="n">V</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">V</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⁻¹'</span><span class="w"> </span><span class="n">V'</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>Let’s now turn to the main proof of the extension by continuity theorem.</p>
-
@@ -1119,23 +1119,23 @@ Because we know <code class="docutils literal notranslate"><span class="pre">Ten<code class="docutils literal notranslate"><span class="pre">φ</span> <span class="pre">y</span> <span class="pre">∈</span> <span class="pre">closure</span> <span class="pre">V'</span></code> and, since <code class="docutils literal notranslate"><span class="pre">V'</span></code> is closed, we have proved <code class="docutils literal notranslate"><span class="pre">φ</span> <span class="pre">y</span> <span class="pre">∈</span> <span class="pre">V'</span></code>.</p> <p>It remains to prove that <code class="docutils literal notranslate"><span class="pre">φ</span></code> extends <code class="docutils literal notranslate"><span class="pre">f</span></code>. This is where the continuity of <code class="docutils literal notranslate"><span class="pre">f</span></code> enters the discussion, together with the fact that <code class="docutils literal notranslate"><span class="pre">Y</span></code> is Hausdorff.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">[</span><span class="n">TopologicalSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">[</span><span class="n">TopologicalSpace</span> <span class="n">Y</span><span class="o">]</span> <span class="o">[</span><span class="n">T3Space</span> <span class="n">Y</span><span class="o">]</span> <span class="o">{</span><span class="n">A</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hA</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span><span class="o">,</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">closure</span> <span class="n">A</span><span class="o">)</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">A</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">}</span> <span class="o">(</span><span class="n">f_cont</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">c</span> <span class="o">:</span> <span class="n">Y</span><span class="o">,</span> <span class="n">Tendsto</span> <span class="n">f</span> <span class="o">(</span><span class="n">comap</span> <span class="o">(</span><span class="bp">↑</span><span class="o">)</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">x</span><span class="o">))</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">c</span><span class="o">))</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">φ</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">,</span> <span class="n">Continuous</span> <span class="n">φ</span> <span class="bp">∧</span> <span class="bp">∀</span> <span class="n">a</span> <span class="o">:</span> <span class="n">A</span><span class="o">,</span> <span class="n">φ</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">a</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">Y</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">T3Space</span><span class="w"> </span><span class="n">Y</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">A</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span> <span class="w"> </span><span class="o">(</span><span class="n">hA</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">closure</span><span class="w"> </span><span class="n">A</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">f_cont</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="n">f</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Y</span><span class="o">,</span><span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">comap</span><span class="w"> </span><span class="o">(</span><span class="bp">↑</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">x</span><span class="o">))</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">c</span><span class="o">))</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">φ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">,</span><span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="n">φ</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">A</span><span class="o">,</span><span class="w"> </span><span class="n">φ</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="gr">sorry</span> <span class="k">#check</span> <span class="n">HasBasis.tendsto_right_iff</span> <span class="k">#check</span><span class="w"> </span><span class="n">HasBasis.tendsto_right_iff</span> </pre></div> </div> <p>In addition to separation property, the main kind of assumption you can make on a topological space to bring it closer to metric spaces is countability assumption. The main one is first countability asking that every point has a countable neighborhood basis. In particular this ensures that closure of sets can be understood using sequences.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">[</span><span class="n">TopologicalSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">[</span><span class="n">FirstCountableTopology</span> <span class="n">X</span><span class="o">]</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">{</span><span class="n">a</span> <span class="o">:</span> <span class="n">X</span><span class="o">}</span> <span class="o">:</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">closure</span> <span class="n">s</span> <span class="bp">↔</span> <span class="bp">∃</span> <span class="n">u</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">X</span><span class="o">,</span> <span class="o">(</span><span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="n">u</span> <span class="n">n</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">)</span> <span class="bp">∧</span> <span class="n">Tendsto</span> <span class="n">u</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">a</span><span class="o">)</span> <span class="o">:=</span> <span class="n">mem_closure_iff_seq_limit</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">FirstCountableTopology</span><span class="w"> </span><span class="n">X</span><span class="o">]</span> <span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">closure</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">X</span><span class="o">,</span><span class="w"> </span><span class="o">(</span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">mem_closure_iff_seq_limit</span> </pre></div> </div> </section>
-
@@ -1148,14 +1148,14 @@ a point <code class="docutils literal notranslate"><span class="pre">x</span> <swith the generalized set of points that are close to <code class="docutils literal notranslate"><span class="pre">x</span></code>.</p> <p>Then we can say that a set <code class="docutils literal notranslate"><span class="pre">s</span></code> is compact if every nonempty generalized set <code class="docutils literal notranslate"><span class="pre">F</span></code> contained in <code class="docutils literal notranslate"><span class="pre">s</span></code>, ie such that <code class="docutils literal notranslate"><span class="pre">F</span> <span class="pre">≤</span> <span class="pre">𝓟</span> <span class="pre">s</span></code>, has a cluster point in <code class="docutils literal notranslate"><span class="pre">s</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">[</span><span class="n">TopologicalSpace</span> <span class="n">X</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">[</span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span> <span class="kd">example</span> <span class="o">{</span><span class="n">F</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">X</span><span class="o">}</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">}</span> <span class="o">:</span> <span class="n">ClusterPt</span> <span class="n">x</span> <span class="n">F</span> <span class="bp">↔</span> <span class="n">NeBot</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">x</span> <span class="bp">⊓</span> <span class="n">F</span><span class="o">)</span> <span class="o">:=</span> <span class="n">Iff.rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ClusterPt</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">NeBot</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Iff.rfl</span> <span class="kd">example</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">:</span> <span class="n">IsCompact</span> <span class="n">s</span> <span class="bp">↔</span> <span class="bp">∀</span> <span class="o">(</span><span class="n">F</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">X</span><span class="o">)</span> <span class="o">[</span><span class="n">NeBot</span> <span class="n">F</span><span class="o">],</span> <span class="n">F</span> <span class="bp">≤</span> <span class="bp">𝓟</span> <span class="n">s</span> <span class="bp">→</span> <span class="bp">∃</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="n">ClusterPt</span> <span class="n">a</span> <span class="n">F</span> <span class="o">:=</span> <span class="n">Iff.rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">IsCompact</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">(</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">NeBot</span><span class="w"> </span><span class="n">F</span><span class="o">],</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">𝓟</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">ClusterPt</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Iff.rfl</span> </pre></div> </div> <p>For instance if <code class="docutils literal notranslate"><span class="pre">F</span></code> is <code class="docutils literal notranslate"><span class="pre">map</span> <span class="pre">u</span> <span class="pre">atTop</span></code>, the image under <code class="docutils literal notranslate"><span class="pre">u</span> <span class="pre">:</span> <span class="pre">ℕ</span> <span class="pre">→</span> <span class="pre">X</span></code> of <code class="docutils literal notranslate"><span class="pre">atTop</span></code>, the generalized set
-
@@ -1164,36 +1164,36 @@ large enough. Saying that <code class="docutils literal notranslate"><span classintersects the set of points that are close to <code class="docutils literal notranslate"><span class="pre">x</span></code>. In case <code class="docutils literal notranslate"><span class="pre">𝓝</span> <span class="pre">x</span></code> has a countable basis, we can interpret this as saying that <code class="docutils literal notranslate"><span class="pre">u</span></code> has a subsequence converging to <code class="docutils literal notranslate"><span class="pre">x</span></code>, and we get back what compactness looks like in metric spaces.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">[</span><span class="n">FirstCountableTopology</span> <span class="n">X</span><span class="o">]</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">{</span><span class="n">u</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hs</span> <span class="o">:</span> <span class="n">IsCompact</span> <span class="n">s</span><span class="o">)</span> <span class="o">(</span><span class="n">hu</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="n">u</span> <span class="n">n</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">a</span> <span class="bp">∈</span> <span class="n">s</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">φ</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">ℕ</span><span class="o">,</span> <span class="n">StrictMono</span> <span class="n">φ</span> <span class="bp">∧</span> <span class="n">Tendsto</span> <span class="o">(</span><span class="n">u</span> <span class="bp">∘</span> <span class="n">φ</span><span class="o">)</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="n">a</span><span class="o">)</span> <span class="o">:=</span> <span class="n">hs.tendsto_subseq</span> <span class="n">hu</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">FirstCountableTopology</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">u</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsCompact</span><span class="w"> </span><span class="n">s</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">hu</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">φ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="n">StrictMono</span><span class="w"> </span><span class="n">φ</span><span class="w"> </span><span class="bp">∧</span><span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="o">(</span><span class="n">u</span><span class="w"> </span><span class="bp">∘</span><span class="w"> </span><span class="n">φ</span><span class="o">)</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">hs.tendsto_subseq</span><span class="w"> </span><span class="n">hu</span> </pre></div> </div> <p>Cluster points behave nicely with continuous functions.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">[</span><span class="n">TopologicalSpace</span> <span class="n">Y</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">[</span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">Y</span><span class="o">]</span> <span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">X</span><span class="o">}</span> <span class="o">{</span><span class="n">F</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">X</span><span class="o">}</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">Y</span><span class="o">}</span> <span class="o">(</span><span class="n">H</span> <span class="o">:</span> <span class="n">ClusterPt</span> <span class="n">x</span> <span class="n">F</span><span class="o">)</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">}</span> <span class="o">(</span><span class="n">hfx</span> <span class="o">:</span> <span class="n">ContinuousAt</span> <span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">Tendsto</span> <span class="n">f</span> <span class="n">F</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">ClusterPt</span> <span class="o">(</span><span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="n">G</span> <span class="o">:=</span> <span class="n">ClusterPt.map</span> <span class="n">H</span> <span class="n">hfx</span> <span class="n">hf</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">H</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ClusterPt</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span> <span class="w"> </span><span class="o">(</span><span class="n">hfx</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ContinuousAt</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ClusterPt</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">ClusterPt.map</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="n">hfx</span><span class="w"> </span><span class="n">hf</span> </pre></div> </div> <p>As an exercise, we will prove that the image of a compact set under a continuous map is compact. In addition to what we saw already, you should use <code class="docutils literal notranslate"><span class="pre">Filter.push_pull</span></code> and <code class="docutils literal notranslate"><span class="pre">NeBot.of_map</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">[</span><span class="n">TopologicalSpace</span> <span class="n">Y</span><span class="o">]</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">Y</span><span class="o">}</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="n">f</span><span class="o">)</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hs</span> <span class="o">:</span> <span class="n">IsCompact</span> <span class="n">s</span><span class="o">)</span> <span class="o">:</span> <span class="n">IsCompact</span> <span class="o">(</span><span class="n">f</span> <span class="bp">''</span> <span class="n">s</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">intro</span> <span class="n">F</span> <span class="n">F_ne</span> <span class="n">F_le</span> <span class="k">have</span> <span class="n">map_eq</span> <span class="o">:</span> <span class="n">map</span> <span class="n">f</span> <span class="o">(</span><span class="bp">𝓟</span> <span class="n">s</span> <span class="bp">⊓</span> <span class="n">comap</span> <span class="n">f</span> <span class="n">F</span><span class="o">)</span> <span class="bp">=</span> <span class="bp">𝓟</span> <span class="o">(</span><span class="n">f</span> <span class="bp">''</span> <span class="n">s</span><span class="o">)</span> <span class="bp">⊓</span> <span class="n">F</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="n">Hne</span> <span class="o">:</span> <span class="o">(</span><span class="bp">𝓟</span> <span class="n">s</span> <span class="bp">⊓</span> <span class="n">comap</span> <span class="n">f</span> <span class="n">F</span><span class="o">)</span><span class="bp">.</span><span class="n">NeBot</span> <span class="o">:=</span> <span class="kd">by</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="n">Hle</span> <span class="o">:</span> <span class="bp">𝓟</span> <span class="n">s</span> <span class="bp">⊓</span> <span class="n">comap</span> <span class="n">f</span> <span class="n">F</span> <span class="bp">≤</span> <span class="bp">𝓟</span> <span class="n">s</span> <span class="o">:=</span> <span class="n">inf_le_left</span> <span class="gr">sorry</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">Y</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Y</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsCompact</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">IsCompact</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="n">intro</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="n">F_ne</span><span class="w"> </span><span class="n">F_le</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">map_eq</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">map</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">𝓟</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">comap</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">𝓟</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">Hne</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="n">𝓟</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">comap</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="bp">.</span><span class="n">NeBot</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">Hle</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">𝓟</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊓</span><span class="w"> </span><span class="n">comap</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">𝓟</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="n">inf_le_left</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> <p>One can also express compactness in terms of open covers: <code class="docutils literal notranslate"><span class="pre">s</span></code> is compact if every family of open sets that cover <code class="docutils literal notranslate"><span class="pre">s</span></code> has a finite covering sub-family.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">ι</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">X</span><span class="o">}</span> <span class="o">(</span><span class="n">hs</span> <span class="o">:</span> <span class="n">IsCompact</span> <span class="n">s</span><span class="o">)</span> <span class="o">(</span><span class="n">U</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Set</span> <span class="n">X</span><span class="o">)</span> <span class="o">(</span><span class="n">hUo</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">i</span><span class="o">,</span> <span class="n">IsOpen</span> <span class="o">(</span><span class="n">U</span> <span class="n">i</span><span class="o">))</span> <span class="o">(</span><span class="n">hsU</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">⊆</span> <span class="bp">⋃</span> <span class="n">i</span><span class="o">,</span> <span class="n">U</span> <span class="n">i</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">t</span> <span class="o">:</span> <span class="n">Finset</span> <span class="n">ι</span><span class="o">,</span> <span class="n">s</span> <span class="bp">⊆</span> <span class="bp">⋃</span> <span class="n">i</span> <span class="bp">∈</span> <span class="n">t</span><span class="o">,</span> <span class="n">U</span> <span class="n">i</span> <span class="o">:=</span> <span class="n">hs.elim_finite_subcover</span> <span class="n">U</span> <span class="n">hUo</span> <span class="n">hsU</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">ι</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsCompact</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">U</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">X</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hUo</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">IsOpen</span><span class="w"> </span><span class="o">(</span><span class="n">U</span><span class="w"> </span><span class="n">i</span><span class="o">))</span> <span class="w"> </span><span class="o">(</span><span class="n">hsU</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="bp">⋃</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">U</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Finset</span><span class="w"> </span><span class="n">ι</span><span class="o">,</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="bp">⋃</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">t</span><span class="o">,</span><span class="w"> </span><span class="n">U</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">hs.elim_finite_subcover</span><span class="w"> </span><span class="n">U</span><span class="w"> </span><span class="n">hUo</span><span class="w"> </span><span class="n">hsU</span> </pre></div> </div> </section>
-
-
-
@@ -18,7 +18,7 @@<script src="_static/jquery.js?v=5d32c60e"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/documentation_options.js?v=2709fde1"></script> <script src="_static/doctools.js?v=888ff710"></script> <script src="_static/doctools.js?v=9a2dae69"></script> <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script>
-
@@ -114,10 +114,10 @@ a much broader setting.</p>between talking about the derivative of <code class="docutils literal notranslate"><span class="pre">f</span></code> at a single point and talking about the derivative function. In Mathlib, the first notion is represented as follows.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">Real</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">Real</span> <span class="sd">/-- The sin function has derivative 1 at 0. -/</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">HasDerivAt</span> <span class="n">sin</span> <span class="mi">1</span> <span class="mi">0</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simpa</span> <span class="n">using</span> <span class="n">hasDerivAt_sin</span> <span class="mi">0</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">HasDerivAt</span><span class="w"> </span><span class="n">sin</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simpa</span><span class="w"> </span><span class="n">using</span><span class="w"> </span><span class="n">hasDerivAt_sin</span><span class="w"> </span><span class="mi">0</span> </pre></div> </div> <p>We can also express that <code class="docutils literal notranslate"><span class="pre">f</span></code> is differentiable at a point without
-
@@ -127,8 +127,8 @@ We specify <code class="docutils literal notranslate"><span class="pre">ℝ<when talking about functions from <code class="docutils literal notranslate"><span class="pre">ℂ</span></code> to <code class="docutils literal notranslate"><span class="pre">ℂ</span></code>, we want to be able to distinguish between being differentiable in the real sense and being differentiable in the sense of the complex derivative.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">DifferentiableAt</span> <span class="n">ℝ</span> <span class="n">sin</span> <span class="n">x</span> <span class="o">:=</span> <span class="o">(</span><span class="n">hasDerivAt_sin</span> <span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">differentiableAt</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">DifferentiableAt</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="n">sin</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">(</span><span class="n">hasDerivAt_sin</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">differentiableAt</span> </pre></div> </div> <p>It would be inconvenient to have to provide a proof of differentiability
-
@@ -136,19 +136,19 @@ every time we want to refer to a derivative.So Mathlib provides a function <code class="docutils literal notranslate"><span class="pre">deriv</span> <span class="pre">f</span> <span class="pre">:</span> <span class="pre">ℝ</span> <span class="pre">→</span> <span class="pre">ℝ</span></code> that is defined for any function <code class="docutils literal notranslate"><span class="pre">f</span> <span class="pre">:</span> <span class="pre">ℝ</span> <span class="pre">→</span> <span class="pre">ℝ</span></code> but is defined to take the value <code class="docutils literal notranslate"><span class="pre">0</span></code> at any point where <code class="docutils literal notranslate"><span class="pre">f</span></code> is not differentiable.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">{</span><span class="n">x</span> <span class="n">a</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">HasDerivAt</span> <span class="n">f</span> <span class="n">a</span> <span class="n">x</span><span class="o">)</span> <span class="o">:</span> <span class="n">deriv</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">a</span> <span class="o">:=</span> <span class="n">h.deriv</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">HasDerivAt</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">deriv</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">h.deriv</span> <span class="kd">example</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">¬</span><span class="n">DifferentiableAt</span> <span class="n">ℝ</span> <span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="o">:</span> <span class="n">deriv</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="n">deriv_zero_of_not_differentiableAt</span> <span class="n">h</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">¬</span><span class="n">DifferentiableAt</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">deriv</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">deriv_zero_of_not_differentiableAt</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>Of course there are many lemmas about <code class="docutils literal notranslate"><span class="pre">deriv</span></code> that do require differentiability assumptions. For instance, you should think about a counterexample to the next lemma without the differentiability assumptions.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">f</span> <span class="n">g</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">DifferentiableAt</span> <span class="n">ℝ</span> <span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="o">(</span><span class="n">hg</span> <span class="o">:</span> <span class="n">DifferentiableAt</span> <span class="n">ℝ</span> <span class="n">g</span> <span class="n">x</span><span class="o">)</span> <span class="o">:</span> <span class="n">deriv</span> <span class="o">(</span><span class="n">f</span> <span class="bp">+</span> <span class="n">g</span><span class="o">)</span> <span class="n">x</span> <span class="bp">=</span> <span class="n">deriv</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">deriv</span> <span class="n">g</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">deriv_add</span> <span class="n">hf</span> <span class="n">hg</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">DifferentiableAt</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">DifferentiableAt</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">deriv</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">deriv</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">deriv</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">deriv_add</span><span class="w"> </span><span class="n">hf</span><span class="w"> </span><span class="n">hg</span> </pre></div> </div> <p>Interestingly, however, there are statements that can avoid differentiability
-
@@ -157,29 +157,29 @@ of the fact that the value of <code class="docutils literal notranslate"><span cnot differentiable. So making sense of the following statement requires knowing the precise definition of <code class="docutils literal notranslate"><span class="pre">deriv</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">{</span><span class="n">a</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="n">IsLocalMin</span> <span class="n">f</span> <span class="n">a</span><span class="o">)</span> <span class="o">:</span> <span class="n">deriv</span> <span class="n">f</span> <span class="n">a</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="n">h.deriv_eq_zero</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsLocalMin</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">deriv</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">h.deriv_eq_zero</span> </pre></div> </div> <p>We can even state Rolle’s theorem without any differentiability assumptions, which seems even weirder.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">Set</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">Set</span> <span class="kd">example</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">hab</span> <span class="o">:</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">b</span><span class="o">)</span> <span class="o">(</span><span class="n">hfc</span> <span class="o">:</span> <span class="n">ContinuousOn</span> <span class="n">f</span> <span class="o">(</span><span class="n">Icc</span> <span class="n">a</span> <span class="n">b</span><span class="o">))</span> <span class="o">(</span><span class="n">hfI</span> <span class="o">:</span> <span class="n">f</span> <span class="n">a</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">c</span> <span class="bp">∈</span> <span class="n">Ioo</span> <span class="n">a</span> <span class="n">b</span><span class="o">,</span> <span class="n">deriv</span> <span class="n">f</span> <span class="n">c</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="n">exists_deriv_eq_zero</span> <span class="n">hab</span> <span class="n">hfc</span> <span class="n">hfI</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hab</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hfc</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ContinuousOn</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">Icc</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="o">))</span><span class="w"> </span><span class="o">(</span><span class="n">hfI</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">Ioo</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">deriv</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">exists_deriv_eq_zero</span><span class="w"> </span><span class="n">hab</span><span class="w"> </span><span class="n">hfc</span><span class="w"> </span><span class="n">hfI</span> </pre></div> </div> <p>Of course, this trick does not work for the general mean value theorem.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">hab</span> <span class="o">:</span> <span class="n">a</span> <span class="bp"><</span> <span class="n">b</span><span class="o">)</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">ContinuousOn</span> <span class="n">f</span> <span class="o">(</span><span class="n">Icc</span> <span class="n">a</span> <span class="n">b</span><span class="o">))</span> <span class="o">(</span><span class="n">hf'</span> <span class="o">:</span> <span class="n">DifferentiableOn</span> <span class="n">ℝ</span> <span class="n">f</span> <span class="o">(</span><span class="n">Ioo</span> <span class="n">a</span> <span class="n">b</span><span class="o">))</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">c</span> <span class="bp">∈</span> <span class="n">Ioo</span> <span class="n">a</span> <span class="n">b</span><span class="o">,</span> <span class="n">deriv</span> <span class="n">f</span> <span class="n">c</span> <span class="bp">=</span> <span class="o">(</span><span class="n">f</span> <span class="n">b</span> <span class="bp">-</span> <span class="n">f</span> <span class="n">a</span><span class="o">)</span> <span class="bp">/</span> <span class="o">(</span><span class="n">b</span> <span class="bp">-</span> <span class="n">a</span><span class="o">)</span> <span class="o">:=</span> <span class="n">exists_deriv_eq_slope</span> <span class="n">f</span> <span class="n">hab</span> <span class="n">hf</span> <span class="n">hf'</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hab</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ContinuousOn</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">Icc</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="o">))</span> <span class="w"> </span><span class="o">(</span><span class="n">hf'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">DifferentiableOn</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">Ioo</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="o">))</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">Ioo</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">deriv</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">exists_deriv_eq_slope</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">hab</span><span class="w"> </span><span class="n">hf</span><span class="w"> </span><span class="n">hf'</span> </pre></div> </div> <p>Lean can automatically compute some simple derivatives using the <code class="docutils literal notranslate"><span class="pre">simp</span></code> tactic.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">deriv</span> <span class="o">(</span><span class="k">fun</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">↦</span> <span class="n">x</span> <span class="bp">^</span> <span class="mi">5</span><span class="o">)</span> <span class="mi">6</span> <span class="bp">=</span> <span class="mi">5</span> <span class="bp">*</span> <span class="mi">6</span> <span class="bp">^</span> <span class="mi">4</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">deriv</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">5</span><span class="o">)</span><span class="w"> </span><span class="mi">6</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="mi">6</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">deriv</span> <span class="n">sin</span> <span class="n">π</span> <span class="bp">=</span> <span class="bp">-</span><span class="mi">1</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">simp</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">deriv</span><span class="w"> </span><span class="n">sin</span><span class="w"> </span><span class="n">π</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">-</span><span class="mi">1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">simp</span> </pre></div> </div> </section>
-
@@ -192,41 +192,41 @@ seems even weirder.</p>We start with the notion of a <em>normed group</em>, which is an additive commutative group equipped with a real-valued norm function satisfying the following conditions.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">E</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedAddCommGroup</span> <span class="n">E</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">E</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedAddCommGroup</span><span class="w"> </span><span class="n">E</span><span class="o">]</span> <span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">E</span><span class="o">)</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="bp">‖</span><span class="n">x</span><span class="bp">‖</span> <span class="o">:=</span> <span class="n">norm_nonneg</span> <span class="n">x</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="bp">‖</span><span class="n">x</span><span class="bp">‖</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">norm_nonneg</span><span class="w"> </span><span class="n">x</span> <span class="kd">example</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">E</span><span class="o">}</span> <span class="o">:</span> <span class="bp">‖</span><span class="n">x</span><span class="bp">‖</span> <span class="bp">=</span> <span class="mi">0</span> <span class="bp">↔</span> <span class="n">x</span> <span class="bp">=</span> <span class="mi">0</span> <span class="o">:=</span> <span class="n">norm_eq_zero</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">‖</span><span class="n">x</span><span class="bp">‖</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">norm_eq_zero</span> <span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">E</span><span class="o">)</span> <span class="o">:</span> <span class="bp">‖</span><span class="n">x</span> <span class="bp">+</span> <span class="n">y</span><span class="bp">‖</span> <span class="bp">≤</span> <span class="bp">‖</span><span class="n">x</span><span class="bp">‖</span> <span class="bp">+</span> <span class="bp">‖</span><span class="n">y</span><span class="bp">‖</span> <span class="o">:=</span> <span class="n">norm_add_le</span> <span class="n">x</span> <span class="n">y</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">‖</span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="bp">‖</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="bp">‖</span><span class="n">x</span><span class="bp">‖</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="bp">‖</span><span class="n">y</span><span class="bp">‖</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">norm_add_le</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span> </pre></div> </div> <p>Every normed space is a metric space with distance function <span class="math notranslate nohighlight">\(d(x, y) = \| x - y \|\)</span>, and hence it is also a topological space. Lean and Mathlib know this.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">:</span> <span class="n">MetricSpace</span> <span class="n">E</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">infer_instance</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MetricSpace</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">infer_instance</span> <span class="kd">example</span> <span class="o">{</span><span class="n">X</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">TopologicalSpace</span> <span class="n">X</span><span class="o">]</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">X</span> <span class="bp">→</span> <span class="n">E</span><span class="o">}</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="n">f</span><span class="o">)</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="bp">‖</span><span class="n">f</span> <span class="n">x</span><span class="bp">‖</span> <span class="o">:=</span> <span class="n">hf.norm</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">X</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">TopologicalSpace</span><span class="w"> </span><span class="n">X</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">E</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="bp">‖</span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="bp">‖</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">hf.norm</span> </pre></div> </div> <p>In order to use the notion of a norm with concepts from linear algebra, we add the assumption <code class="docutils literal notranslate"><span class="pre">NormedSpace</span> <span class="pre">ℝ</span> <span class="pre">E</span></code> on top of <code class="docutils literal notranslate"><span class="pre">NormedAddGroup</span> <span class="pre">E</span></code>. This stipulates that <code class="docutils literal notranslate"><span class="pre">E</span></code> is a vector space over <code class="docutils literal notranslate"><span class="pre">ℝ</span></code> and that scalar multiplication satisfies the following condition.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">[</span><span class="n">NormedSpace</span> <span class="n">ℝ</span> <span class="n">E</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">[</span><span class="n">NormedSpace</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="n">E</span><span class="o">]</span> <span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">E</span><span class="o">)</span> <span class="o">:</span> <span class="bp">‖</span><span class="n">a</span> <span class="bp">•</span> <span class="n">x</span><span class="bp">‖</span> <span class="bp">=</span> <span class="bp">|</span><span class="n">a</span><span class="bp">|</span> <span class="bp">*</span> <span class="bp">‖</span><span class="n">x</span><span class="bp">‖</span> <span class="o">:=</span> <span class="n">norm_smul</span> <span class="n">a</span> <span class="n">x</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">‖</span><span class="n">a</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">x</span><span class="bp">‖</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">|</span><span class="n">a</span><span class="bp">|</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="bp">‖</span><span class="n">x</span><span class="bp">‖</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">norm_smul</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">x</span> </pre></div> </div> <p>A complete normed space is known as a <em>Banach space</em>. Every finite-dimensional vector space is complete.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">[</span><span class="n">FiniteDimensional</span> <span class="n">ℝ</span> <span class="n">E</span><span class="o">]</span> <span class="o">:</span> <span class="n">CompleteSpace</span> <span class="n">E</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">infer_instance</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">[</span><span class="n">FiniteDimensional</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">CompleteSpace</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">infer_instance</span> </pre></div> </div> <p>In all the previous examples, we used the real numbers as the base field.
-
@@ -235,18 +235,18 @@ More generally, we can make sense of calculus with a vector space over anyreal-valued norm that is multiplicative and has the property that not every element has norm zero or one (equivalently, there is an element whose norm is bigger than one).</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="bp">𝕜</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="o">[</span><span class="n">NontriviallyNormedField</span> <span class="bp">𝕜</span><span class="o">]</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="bp">𝕜</span><span class="o">)</span> <span class="o">:</span> <span class="bp">‖</span><span class="n">x</span> <span class="bp">*</span> <span class="n">y</span><span class="bp">‖</span> <span class="bp">=</span> <span class="bp">‖</span><span class="n">x</span><span class="bp">‖</span> <span class="bp">*</span> <span class="bp">‖</span><span class="n">y</span><span class="bp">‖</span> <span class="o">:=</span> <span class="n">norm_mul</span> <span class="n">x</span> <span class="n">y</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">𝕜</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">NontriviallyNormedField</span><span class="w"> </span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">𝕜</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">‖</span><span class="n">x</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">y</span><span class="bp">‖</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">‖</span><span class="n">x</span><span class="bp">‖</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="bp">‖</span><span class="n">y</span><span class="bp">‖</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">norm_mul</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span> <span class="kd">example</span> <span class="o">(</span><span class="bp">𝕜</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="o">[</span><span class="n">NontriviallyNormedField</span> <span class="bp">𝕜</span><span class="o">]</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">x</span> <span class="o">:</span> <span class="bp">𝕜</span><span class="o">,</span> <span class="mi">1</span> <span class="bp"><</span> <span class="bp">‖</span><span class="n">x</span><span class="bp">‖</span> <span class="o">:=</span> <span class="n">NormedField.exists_one_lt_norm</span> <span class="bp">𝕜</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">𝕜</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">NontriviallyNormedField</span><span class="w"> </span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">𝕜</span><span class="o">,</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">‖</span><span class="n">x</span><span class="bp">‖</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">NormedField.exists_one_lt_norm</span><span class="w"> </span><span class="n">𝕜</span> </pre></div> </div> <p>A finite-dimensional vector space over a nontrivially normed field is complete as long as the field itself is complete.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="bp">𝕜</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="o">[</span><span class="n">NontriviallyNormedField</span> <span class="bp">𝕜</span><span class="o">]</span> <span class="o">(</span><span class="n">E</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">)</span> <span class="o">[</span><span class="n">NormedAddCommGroup</span> <span class="n">E</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedSpace</span> <span class="bp">𝕜</span> <span class="n">E</span><span class="o">]</span> <span class="o">[</span><span class="n">CompleteSpace</span> <span class="bp">𝕜</span><span class="o">]</span> <span class="o">[</span><span class="n">FiniteDimensional</span> <span class="bp">𝕜</span> <span class="n">E</span><span class="o">]</span> <span class="o">:</span> <span class="n">CompleteSpace</span> <span class="n">E</span> <span class="o">:=</span> <span class="n">FiniteDimensional.complete</span> <span class="bp">𝕜</span> <span class="n">E</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">𝕜</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">NontriviallyNormedField</span><span class="w"> </span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">E</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">NormedAddCommGroup</span><span class="w"> </span><span class="n">E</span><span class="o">]</span> <span class="w"> </span><span class="o">[</span><span class="n">NormedSpace</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">CompleteSpace</span><span class="w"> </span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">FiniteDimensional</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">CompleteSpace</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">FiniteDimensional.complete</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">E</span> </pre></div> </div> </section>
-
@@ -261,34 +261,34 @@ a structure that that includes the function itself and the propertiesof being linear and continuous. Lean will insert a coercion so that a continuous linear map can be treated as a function.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="bp">𝕜</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NontriviallyNormedField</span> <span class="bp">𝕜</span><span class="o">]</span> <span class="o">{</span><span class="n">E</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedAddCommGroup</span> <span class="n">E</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedSpace</span> <span class="bp">𝕜</span> <span class="n">E</span><span class="o">]</span> <span class="o">{</span><span class="n">F</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedAddCommGroup</span> <span class="n">F</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedSpace</span> <span class="bp">𝕜</span> <span class="n">F</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">𝕜</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NontriviallyNormedField</span><span class="w"> </span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">E</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedAddCommGroup</span><span class="w"> </span><span class="n">E</span><span class="o">]</span> <span class="w"> </span><span class="o">[</span><span class="n">NormedSpace</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedAddCommGroup</span><span class="w"> </span><span class="n">F</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">NormedSpace</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">F</span><span class="o">]</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">E</span> <span class="o">:=</span> <span class="n">ContinuousLinearMap.id</span> <span class="bp">𝕜</span> <span class="n">E</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">ContinuousLinearMap.id</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">E</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">F</span><span class="o">)</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span> <span class="n">F</span> <span class="o">:=</span> <span class="n">f</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">f</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">F</span><span class="o">)</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="n">f</span> <span class="o">:=</span> <span class="n">f.cont</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">f.cont</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">F</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span> <span class="n">y</span> <span class="o">:</span> <span class="n">E</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="o">(</span><span class="n">x</span> <span class="bp">+</span> <span class="n">y</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">+</span> <span class="n">f</span> <span class="n">y</span> <span class="o">:=</span> <span class="n">f.map_add</span> <span class="n">x</span> <span class="n">y</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">f.map_add</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">F</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="o">:</span> <span class="bp">𝕜</span><span class="o">)</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">E</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="o">(</span><span class="n">a</span> <span class="bp">•</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="n">a</span> <span class="bp">•</span> <span class="n">f</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">f.map_smul</span> <span class="n">a</span> <span class="n">x</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">𝕜</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">f.map_smul</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">x</span> </pre></div> </div> <p>Continuous linear maps have an operator norm that is characterized by the following properties.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">F</span><span class="o">)</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">F</span><span class="o">)</span> <span class="kd">example</span> <span class="o">(</span><span class="n">x</span> <span class="o">:</span> <span class="n">E</span><span class="o">)</span> <span class="o">:</span> <span class="bp">‖</span><span class="n">f</span> <span class="n">x</span><span class="bp">‖</span> <span class="bp">≤</span> <span class="bp">‖</span><span class="n">f</span><span class="bp">‖</span> <span class="bp">*</span> <span class="bp">‖</span><span class="n">x</span><span class="bp">‖</span> <span class="o">:=</span> <span class="n">f.le_op_norm</span> <span class="n">x</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">‖</span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="bp">‖</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="bp">‖</span><span class="n">f</span><span class="bp">‖</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="bp">‖</span><span class="n">x</span><span class="bp">‖</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">f.le_op_norm</span><span class="w"> </span><span class="n">x</span> <span class="kd">example</span> <span class="o">{</span><span class="n">M</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">hMp</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp">≤</span> <span class="n">M</span><span class="o">)</span> <span class="o">(</span><span class="n">hM</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span><span class="o">,</span> <span class="bp">‖</span><span class="n">f</span> <span class="n">x</span><span class="bp">‖</span> <span class="bp">≤</span> <span class="n">M</span> <span class="bp">*</span> <span class="bp">‖</span><span class="n">x</span><span class="bp">‖</span><span class="o">)</span> <span class="o">:</span> <span class="bp">‖</span><span class="n">f</span><span class="bp">‖</span> <span class="bp">≤</span> <span class="n">M</span> <span class="o">:=</span> <span class="n">f.op_norm_le_bound</span> <span class="n">hMp</span> <span class="n">hM</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">M</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hMp</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">M</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hM</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="bp">‖</span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="bp">‖</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="bp">‖</span><span class="n">x</span><span class="bp">‖</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">‖</span><span class="n">f</span><span class="bp">‖</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">M</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">f.op_norm_le_bound</span><span class="w"> </span><span class="n">hMp</span><span class="w"> </span><span class="n">hM</span> </pre></div> </div> <p>There is also a notion of bundled continuous linear <em>isomorphism</em>.
-
@@ -302,33 +302,33 @@ The main ingredient is Baire’s theorem<code class="docutils literal notranslate"><span class="pre">nonempty_interior_of_iUnion_of_closed</span></code>. (You proved a version of this in the topology chapter.) Minor ingredients include <code class="docutils literal notranslate"><span class="pre">continuous_linear_map.opNorm_le_of_shell</span></code>, <code class="docutils literal notranslate"><span class="pre">interior_subset</span></code> and <code class="docutils literal notranslate"><span class="pre">interior_iInter_subset</span></code> and <code class="docutils literal notranslate"><span class="pre">isClosed_le</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="bp">𝕜</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NontriviallyNormedField</span> <span class="bp">𝕜</span><span class="o">]</span> <span class="o">{</span><span class="n">E</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedAddCommGroup</span> <span class="n">E</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedSpace</span> <span class="bp">𝕜</span> <span class="n">E</span><span class="o">]</span> <span class="o">{</span><span class="n">F</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedAddCommGroup</span> <span class="n">F</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedSpace</span> <span class="bp">𝕜</span> <span class="n">F</span><span class="o">]</span> <span class="kn">open</span> <span class="n">Metric</span> <span class="kd">example</span> <span class="o">{</span><span class="n">ι</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">CompleteSpace</span> <span class="n">E</span><span class="o">]</span> <span class="o">{</span><span class="n">g</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">E</span> <span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">F</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">C</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">i</span><span class="o">,</span> <span class="bp">‖</span><span class="n">g</span> <span class="n">i</span> <span class="n">x</span><span class="bp">‖</span> <span class="bp">≤</span> <span class="n">C</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">C'</span><span class="o">,</span> <span class="bp">∀</span> <span class="n">i</span><span class="o">,</span> <span class="bp">‖</span><span class="n">g</span> <span class="n">i</span><span class="bp">‖</span> <span class="bp">≤</span> <span class="n">C'</span> <span class="o">:=</span> <span class="kd">by</span> <span class="c1">-- sequence of subsets consisting of those `x : E` with norms `‖g i x‖` bounded by `n`</span> <span class="k">let</span> <span class="n">e</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">Set</span> <span class="n">E</span> <span class="o">:=</span> <span class="k">fun</span> <span class="n">n</span> <span class="bp">↦</span> <span class="bp">⋂</span> <span class="n">i</span> <span class="o">:</span> <span class="n">ι</span><span class="o">,</span> <span class="o">{</span> <span class="n">x</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">|</span> <span class="bp">‖</span><span class="n">g</span> <span class="n">i</span> <span class="n">x</span><span class="bp">‖</span> <span class="bp">≤</span> <span class="n">n</span> <span class="o">}</span> <span class="c1">-- each of these sets is closed</span> <span class="k">have</span> <span class="n">hc</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">,</span> <span class="n">IsClosed</span> <span class="o">(</span><span class="n">e</span> <span class="n">n</span><span class="o">)</span> <span class="gr">sorry</span> <span class="c1">-- the union is the entire space; this is where we use `h`</span> <span class="k">have</span> <span class="n">hU</span> <span class="o">:</span> <span class="o">(</span><span class="bp">⋃</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">,</span> <span class="n">e</span> <span class="n">n</span><span class="o">)</span> <span class="bp">=</span> <span class="n">univ</span> <span class="gr">sorry</span> <span class="c">/-</span><span class="cm"> apply the Baire category theorem to conclude that for some `m : ℕ`,</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">𝕜</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NontriviallyNormedField</span><span class="w"> </span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">E</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedAddCommGroup</span><span class="w"> </span><span class="n">E</span><span class="o">]</span> <span class="w"> </span><span class="o">[</span><span class="n">NormedSpace</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedAddCommGroup</span><span class="w"> </span><span class="n">F</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">NormedSpace</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">F</span><span class="o">]</span> <span class="kn">open</span><span class="w"> </span><span class="n">Metric</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">ι</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">CompleteSpace</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">F</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">C</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="bp">‖</span><span class="n">g</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="n">x</span><span class="bp">‖</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">C</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">C'</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="bp">‖</span><span class="n">g</span><span class="w"> </span><span class="n">i</span><span class="bp">‖</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">C'</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span> <span class="w"> </span><span class="c1">-- sequence of subsets consisting of those `x : E` with norms `‖g i x‖` bounded by `n`</span> <span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="bp">⋂</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="o">,</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">|</span><span class="w"> </span><span class="bp">‖</span><span class="n">g</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="n">x</span><span class="bp">‖</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">}</span> <span class="w"> </span><span class="c1">-- each of these sets is closed</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">hc</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="n">IsClosed</span><span class="w"> </span><span class="o">(</span><span class="n">e</span><span class="w"> </span><span class="n">n</span><span class="o">)</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="c1">-- the union is the entire space; this is where we use `h`</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">hU</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">⋃</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">univ</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="c">/-</span><span class="cm"> apply the Baire category theorem to conclude that for some `m : ℕ`,</span> <span class="cm"> `e m` contains some `x` -/</span> <span class="n">obtain</span> <span class="o">⟨</span><span class="n">m</span><span class="o">,</span> <span class="n">x</span><span class="o">,</span> <span class="n">hx</span><span class="o">⟩</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">m</span><span class="o">,</span> <span class="bp">∃</span> <span class="n">x</span><span class="o">,</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">interior</span> <span class="o">(</span><span class="n">e</span> <span class="n">m</span><span class="o">)</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">obtain</span> <span class="o">⟨</span><span class="n">ε</span><span class="o">,</span> <span class="n">ε_pos</span><span class="o">,</span> <span class="n">hε</span><span class="o">⟩</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">ε</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="n">ball</span> <span class="n">x</span> <span class="n">ε</span> <span class="bp">⊆</span> <span class="n">interior</span> <span class="o">(</span><span class="n">e</span> <span class="n">m</span><span class="o">)</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">obtain</span> <span class="o">⟨</span><span class="n">k</span><span class="o">,</span> <span class="n">hk</span><span class="o">⟩</span> <span class="o">:</span> <span class="bp">∃</span> <span class="n">k</span> <span class="o">:</span> <span class="bp">𝕜</span><span class="o">,</span> <span class="mi">1</span> <span class="bp"><</span> <span class="bp">‖</span><span class="n">k</span><span class="bp">‖</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="c1">-- show all elements in the ball have norm bounded by `m` after applying any `g i`</span> <span class="k">have</span> <span class="n">real_norm_le</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">z</span> <span class="bp">∈</span> <span class="n">ball</span> <span class="n">x</span> <span class="n">ε</span><span class="o">,</span> <span class="bp">∀</span> <span class="o">(</span><span class="n">i</span> <span class="o">:</span> <span class="n">ι</span><span class="o">),</span> <span class="bp">‖</span><span class="n">g</span> <span class="n">i</span> <span class="n">z</span><span class="bp">‖</span> <span class="bp">≤</span> <span class="n">m</span> <span class="gr">sorry</span> <span class="k">have</span> <span class="n">εk_pos</span> <span class="o">:</span> <span class="mi">0</span> <span class="bp"><</span> <span class="n">ε</span> <span class="bp">/</span> <span class="bp">‖</span><span class="n">k</span><span class="bp">‖</span> <span class="o">:=</span> <span class="gr">sorry</span> <span class="n">refine'</span> <span class="o">⟨(</span><span class="n">m</span> <span class="bp">+</span> <span class="n">m</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="bp">/</span> <span class="o">(</span><span class="n">ε</span> <span class="bp">/</span> <span class="bp">‖</span><span class="n">k</span><span class="bp">‖</span><span class="o">),</span> <span class="k">fun</span> <span class="n">i</span> <span class="bp">↦</span> <span class="n">ContinuousLinearMap.opNorm_le_of_shell</span> <span class="n">ε_pos</span> <span class="n">_</span> <span class="n">hk</span> <span class="n">_</span><span class="o">⟩</span> <span class="gr">sorry</span> <span class="gr">sorry</span> <span class="w"> </span><span class="n">obtain</span><span class="w"> </span><span class="o">⟨</span><span class="n">m</span><span class="o">,</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">hx</span><span class="o">⟩</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">m</span><span class="o">,</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">interior</span><span class="w"> </span><span class="o">(</span><span class="n">e</span><span class="w"> </span><span class="n">m</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">obtain</span><span class="w"> </span><span class="o">⟨</span><span class="n">ε</span><span class="o">,</span><span class="w"> </span><span class="n">ε_pos</span><span class="o">,</span><span class="w"> </span><span class="n">hε</span><span class="o">⟩</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="n">ball</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">interior</span><span class="w"> </span><span class="o">(</span><span class="n">e</span><span class="w"> </span><span class="n">m</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">obtain</span><span class="w"> </span><span class="o">⟨</span><span class="n">k</span><span class="o">,</span><span class="w"> </span><span class="n">hk</span><span class="o">⟩</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">𝕜</span><span class="o">,</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="bp">‖</span><span class="n">k</span><span class="bp">‖</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="c1">-- show all elements in the ball have norm bounded by `m` after applying any `g i`</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">real_norm_le</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">ball</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">ε</span><span class="o">,</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="o">(</span><span class="n">i</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="o">),</span><span class="w"> </span><span class="bp">‖</span><span class="n">g</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="n">z</span><span class="bp">‖</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">m</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="k">have</span><span class="w"> </span><span class="n">εk_pos</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">ε</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="bp">‖</span><span class="n">k</span><span class="bp">‖</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="n">refine</span><span class="w"> </span><span class="o">⟨(</span><span class="n">m</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="o">(</span><span class="n">ε</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="bp">‖</span><span class="n">k</span><span class="bp">‖</span><span class="o">),</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">ContinuousLinearMap.opNorm_le_of_shell</span><span class="w"> </span><span class="n">ε_pos</span><span class="w"> </span><span class="bp">?</span><span class="n">_</span><span class="w"> </span><span class="n">hk</span><span class="w"> </span><span class="bp">?</span><span class="n">_</span><span class="o">⟩</span> <span class="w"> </span><span class="gr">sorry</span> <span class="w"> </span><span class="gr">sorry</span> </pre></div> </div> </section>
-
@@ -340,23 +340,23 @@ whose definitions are shown below.Opening the <code class="docutils literal notranslate"><span class="pre">asymptotics</span></code> locale allows us to use the corresponding notation. Here we will only use little o to define differentiability.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">Asymptotics</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">Asymptotics</span> <span class="kd">example</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">{</span><span class="n">E</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedGroup</span> <span class="n">E</span><span class="o">]</span> <span class="o">{</span><span class="n">F</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedGroup</span> <span class="n">F</span><span class="o">]</span> <span class="o">(</span><span class="n">c</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">l</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">α</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">E</span><span class="o">)</span> <span class="o">(</span><span class="n">g</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">F</span><span class="o">)</span> <span class="o">:</span> <span class="n">IsBigOWith</span> <span class="n">c</span> <span class="n">l</span> <span class="n">f</span> <span class="n">g</span> <span class="bp">↔</span> <span class="bp">∀ᶠ</span> <span class="n">x</span> <span class="k">in</span> <span class="n">l</span><span class="o">,</span> <span class="bp">‖</span><span class="n">f</span> <span class="n">x</span><span class="bp">‖</span> <span class="bp">≤</span> <span class="n">c</span> <span class="bp">*</span> <span class="bp">‖</span><span class="n">g</span> <span class="n">x</span><span class="bp">‖</span> <span class="o">:=</span> <span class="n">isBigOWith_iff</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">E</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedGroup</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedGroup</span><span class="w"> </span><span class="n">F</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">l</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">E</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IsBigOWith</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">l</span><span class="o">,</span><span class="w"> </span><span class="bp">‖</span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="bp">‖</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="bp">‖</span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="bp">‖</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">isBigOWith_iff</span> <span class="kd">example</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">{</span><span class="n">E</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedGroup</span> <span class="n">E</span><span class="o">]</span> <span class="o">{</span><span class="n">F</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedGroup</span> <span class="n">F</span><span class="o">]</span> <span class="o">(</span><span class="n">l</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">α</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">E</span><span class="o">)</span> <span class="o">(</span><span class="n">g</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">F</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">=</span><span class="n">O</span><span class="o">[</span><span class="n">l</span><span class="o">]</span> <span class="n">g</span> <span class="bp">↔</span> <span class="bp">∃</span> <span class="n">C</span><span class="o">,</span> <span class="n">IsBigOWith</span> <span class="n">C</span> <span class="n">l</span> <span class="n">f</span> <span class="n">g</span> <span class="o">:=</span> <span class="n">isBigO_iff_isBigOWith</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">E</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedGroup</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedGroup</span><span class="w"> </span><span class="n">F</span><span class="o">]</span> <span class="w"> </span><span class="o">(</span><span class="n">l</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">E</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">=</span><span class="n">O</span><span class="o">[</span><span class="n">l</span><span class="o">]</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∃</span><span class="w"> </span><span class="n">C</span><span class="o">,</span><span class="w"> </span><span class="n">IsBigOWith</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">isBigO_iff_isBigOWith</span> <span class="kd">example</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">{</span><span class="n">E</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedGroup</span> <span class="n">E</span><span class="o">]</span> <span class="o">{</span><span class="n">F</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedGroup</span> <span class="n">F</span><span class="o">]</span> <span class="o">(</span><span class="n">l</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">α</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">E</span><span class="o">)</span> <span class="o">(</span><span class="n">g</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">F</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">=</span><span class="n">o</span><span class="o">[</span><span class="n">l</span><span class="o">]</span> <span class="n">g</span> <span class="bp">↔</span> <span class="bp">∀</span> <span class="n">C</span> <span class="bp">></span> <span class="mi">0</span><span class="o">,</span> <span class="n">IsBigOWith</span> <span class="n">C</span> <span class="n">l</span> <span class="n">f</span> <span class="n">g</span> <span class="o">:=</span> <span class="n">isLittleO_iff_forall_isBigOWith</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">E</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedGroup</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedGroup</span><span class="w"> </span><span class="n">F</span><span class="o">]</span> <span class="w"> </span><span class="o">(</span><span class="n">l</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">E</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">=</span><span class="n">o</span><span class="o">[</span><span class="n">l</span><span class="o">]</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="bp">></span><span class="w"> </span><span class="mi">0</span><span class="o">,</span><span class="w"> </span><span class="n">IsBigOWith</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">isLittleO_iff_forall_isBigOWith</span> <span class="kd">example</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">{</span><span class="n">E</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedAddCommGroup</span> <span class="n">E</span><span class="o">]</span> <span class="o">(</span><span class="n">l</span> <span class="o">:</span> <span class="n">Filter</span> <span class="n">α</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="n">g</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">E</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">~</span><span class="o">[</span><span class="n">l</span><span class="o">]</span> <span class="n">g</span> <span class="bp">↔</span> <span class="o">(</span><span class="n">f</span> <span class="bp">-</span> <span class="n">g</span><span class="o">)</span> <span class="bp">=</span><span class="n">o</span><span class="o">[</span><span class="n">l</span><span class="o">]</span> <span class="n">g</span> <span class="o">:=</span> <span class="n">Iff.rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">E</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedAddCommGroup</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">l</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Filter</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">E</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">~</span><span class="o">[</span><span class="n">l</span><span class="o">]</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">g</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="n">o</span><span class="o">[</span><span class="n">l</span><span class="o">]</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Iff.rfl</span> </pre></div> </div> </section>
-
@@ -367,17 +367,17 @@ In analogy the elementary one-dimensional,Mathlib defines a predicate <code class="docutils literal notranslate"><span class="pre">HasFDerivAt</span></code> and a function <code class="docutils literal notranslate"><span class="pre">fderiv</span></code>. Here the letter “f” stands for <em>Fréchet</em>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">Topology</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">Topology</span> <span class="kd">variable</span> <span class="o">{</span><span class="bp">𝕜</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NontriviallyNormedField</span> <span class="bp">𝕜</span><span class="o">]</span> <span class="o">{</span><span class="n">E</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedAddCommGroup</span> <span class="n">E</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedSpace</span> <span class="bp">𝕜</span> <span class="n">E</span><span class="o">]</span> <span class="o">{</span><span class="n">F</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedAddCommGroup</span> <span class="n">F</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedSpace</span> <span class="bp">𝕜</span> <span class="n">F</span><span class="o">]</span> <span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">𝕜</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NontriviallyNormedField</span><span class="w"> </span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">E</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedAddCommGroup</span><span class="w"> </span><span class="n">E</span><span class="o">]</span> <span class="w"> </span><span class="o">[</span><span class="n">NormedSpace</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedAddCommGroup</span><span class="w"> </span><span class="n">F</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">NormedSpace</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">F</span><span class="o">]</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span> <span class="n">F</span><span class="o">)</span> <span class="o">(</span><span class="n">f'</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">F</span><span class="o">)</span> <span class="o">(</span><span class="n">x₀</span> <span class="o">:</span> <span class="n">E</span><span class="o">)</span> <span class="o">:</span> <span class="n">HasFDerivAt</span> <span class="n">f</span> <span class="n">f'</span> <span class="n">x₀</span> <span class="bp">↔</span> <span class="o">(</span><span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">f</span> <span class="n">x</span> <span class="bp">-</span> <span class="n">f</span> <span class="n">x₀</span> <span class="bp">-</span> <span class="n">f'</span> <span class="o">(</span><span class="n">x</span> <span class="bp">-</span> <span class="n">x₀</span><span class="o">))</span> <span class="bp">=</span><span class="n">o</span><span class="o">[</span><span class="bp">𝓝</span> <span class="n">x₀</span><span class="o">]</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">x</span> <span class="bp">-</span> <span class="n">x₀</span> <span class="o">:=</span> <span class="n">hasFDerivAtFilter_iff_isLittleO</span> <span class="bp">..</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">HasFDerivAt</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">f'</span><span class="w"> </span><span class="n">x₀</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x₀</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">f'</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">x₀</span><span class="o">))</span><span class="w"> </span><span class="bp">=</span><span class="n">o</span><span class="o">[</span><span class="n">𝓝</span><span class="w"> </span><span class="n">x₀</span><span class="o">]</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">x₀</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">hasFDerivAtFilter_iff_isLittleO</span><span class="w"> </span><span class="bp">..</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span> <span class="n">F</span><span class="o">)</span> <span class="o">(</span><span class="n">f'</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">F</span><span class="o">)</span> <span class="o">(</span><span class="n">x₀</span> <span class="o">:</span> <span class="n">E</span><span class="o">)</span> <span class="o">(</span><span class="n">hff'</span> <span class="o">:</span> <span class="n">HasFDerivAt</span> <span class="n">f</span> <span class="n">f'</span> <span class="n">x₀</span><span class="o">)</span> <span class="o">:</span> <span class="n">fderiv</span> <span class="bp">𝕜</span> <span class="n">f</span> <span class="n">x₀</span> <span class="bp">=</span> <span class="n">f'</span> <span class="o">:=</span> <span class="n">hff'.fderiv</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">x₀</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hff'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">HasFDerivAt</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">f'</span><span class="w"> </span><span class="n">x₀</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">fderiv</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x₀</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f'</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">hff'.fderiv</span> </pre></div> </div> <p>We also have iterated derivatives that take values in the type of multilinear maps
-
@@ -387,14 +387,14 @@ The type <code class="docutils literal notranslate"><span class="pre">WithTop</sis bigger than every natural number. So <span class="math notranslate nohighlight">\(\mathcal{C}^\infty\)</span> functions are functions <code class="docutils literal notranslate"><span class="pre">f</span></code> that satisfy <code class="docutils literal notranslate"><span class="pre">ContDiff</span> <span class="pre">𝕜</span> <span class="pre">⊤</span> <span class="pre">f</span></code>.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span> <span class="n">F</span><span class="o">)</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span> <span class="n">E</span><span class="o">[</span><span class="bp">×</span><span class="n">n</span><span class="o">]</span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">F</span> <span class="o">:=</span> <span class="n">iteratedFDeriv</span> <span class="bp">𝕜</span> <span class="n">n</span> <span class="n">f</span> <span class="kd">example</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">WithTop</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span> <span class="n">F</span><span class="o">}</span> <span class="o">:</span> <span class="n">ContDiff</span> <span class="bp">𝕜</span> <span class="n">n</span> <span class="n">f</span> <span class="bp">↔</span> <span class="o">(</span><span class="bp">∀</span> <span class="n">m</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">,</span> <span class="o">(</span><span class="n">m</span> <span class="o">:</span> <span class="n">WithTop</span> <span class="n">ℕ</span><span class="o">)</span> <span class="bp">≤</span> <span class="n">n</span> <span class="bp">→</span> <span class="n">Continuous</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">iteratedFDeriv</span> <span class="bp">𝕜</span> <span class="n">m</span> <span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="bp">∧</span> <span class="bp">∀</span> <span class="n">m</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">,</span> <span class="o">(</span><span class="n">m</span> <span class="o">:</span> <span class="n">WithTop</span> <span class="n">ℕ</span><span class="o">)</span> <span class="bp"><</span> <span class="n">n</span> <span class="bp">→</span> <span class="n">Differentiable</span> <span class="bp">𝕜</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="n">iteratedFDeriv</span> <span class="bp">𝕜</span> <span class="n">m</span> <span class="n">f</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">contDiff_iff_continuous_differentiable</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">E</span><span class="o">[</span><span class="bp">×</span><span class="n">n</span><span class="o">]</span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">iteratedFDeriv</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">f</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">WithTop</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">F</span><span class="o">}</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">ContDiff</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">↔</span> <span class="w"> </span><span class="o">(</span><span class="bp">∀</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">WithTop</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">iteratedFDeriv</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">∧</span> <span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">,</span><span class="w"> </span><span class="o">(</span><span class="n">m</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">WithTop</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="bp"><</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Differentiable</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">iteratedFDeriv</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">contDiff_iff_continuous_differentiable</span> </pre></div> </div> <p>There is a stricter notion of differentiability called
-
@@ -403,10 +403,10 @@ of the inverse function theorem and the statement of the implicit functiontheorem, both of which are in Mathlib. Over <code class="docutils literal notranslate"><span class="pre">ℝ</span></code> or <code class="docutils literal notranslate"><span class="pre">ℂ</span></code>, continuously differentiable functions are strictly differentiable.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="bp">𝕂</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">RCLike</span> <span class="bp">𝕂</span><span class="o">]</span> <span class="o">{</span><span class="n">E</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedAddCommGroup</span> <span class="n">E</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedSpace</span> <span class="bp">𝕂</span> <span class="n">E</span><span class="o">]</span> <span class="o">{</span><span class="n">F</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedAddCommGroup</span> <span class="n">F</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedSpace</span> <span class="bp">𝕂</span> <span class="n">F</span><span class="o">]</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span> <span class="n">F</span><span class="o">}</span> <span class="o">{</span><span class="n">x</span> <span class="o">:</span> <span class="n">E</span><span class="o">}</span> <span class="o">{</span><span class="n">n</span> <span class="o">:</span> <span class="n">WithTop</span> <span class="n">ℕ</span><span class="o">}</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">ContDiffAt</span> <span class="bp">𝕂</span> <span class="n">n</span> <span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="o">(</span><span class="n">hn</span> <span class="o">:</span> <span class="mi">1</span> <span class="bp">≤</span> <span class="n">n</span><span class="o">)</span> <span class="o">:</span> <span class="n">HasStrictFDerivAt</span> <span class="n">f</span> <span class="o">(</span><span class="n">fderiv</span> <span class="bp">𝕂</span> <span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">hf.hasStrictFDerivAt</span> <span class="n">hn</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">𝕂</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">RCLike</span><span class="w"> </span><span class="n">𝕂</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">E</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedAddCommGroup</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">NormedSpace</span><span class="w"> </span><span class="n">𝕂</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="w"> </span><span class="o">[</span><span class="n">NormedAddCommGroup</span><span class="w"> </span><span class="n">F</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">NormedSpace</span><span class="w"> </span><span class="n">𝕂</span><span class="w"> </span><span class="n">F</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">F</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">WithTop</span><span class="w"> </span><span class="n">ℕ</span><span class="o">}</span> <span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ContDiffAt</span><span class="w"> </span><span class="n">𝕂</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hn</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">HasStrictFDerivAt</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">fderiv</span><span class="w"> </span><span class="n">𝕂</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">hf.hasStrictFDerivAt</span><span class="w"> </span><span class="n">hn</span> </pre></div> </div> <p>The local inverse theorem is stated using an operation that produces an
-
@@ -416,26 +416,26 @@ point <code class="docutils literal notranslate"><span class="pre">a</span></cod<p>The first example below gets this local inverse. The next one states that it is indeed a local inverse from the left and from the right, and that it is strictly differentiable.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">section</span> <span class="n">LocalInverse</span> <span class="kd">variable</span> <span class="o">[</span><span class="n">CompleteSpace</span> <span class="n">E</span><span class="o">]</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span> <span class="n">F</span><span class="o">}</span> <span class="o">{</span><span class="n">f'</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">≃</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">F</span><span class="o">}</span> <span class="o">{</span><span class="n">a</span> <span class="o">:</span> <span class="n">E</span><span class="o">}</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">section</span><span class="w"> </span><span class="n">LocalInverse</span> <span class="kd">variable</span><span class="w"> </span><span class="o">[</span><span class="n">CompleteSpace</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">F</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">f'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">≃</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">F</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="o">}</span> <span class="kd">example</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">HasStrictFDerivAt</span> <span class="n">f</span> <span class="o">(</span><span class="n">f'</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">F</span><span class="o">)</span> <span class="n">a</span><span class="o">)</span> <span class="o">:</span> <span class="n">F</span> <span class="bp">→</span> <span class="n">E</span> <span class="o">:=</span> <span class="n">HasStrictFDerivAt.localInverse</span> <span class="n">f</span> <span class="n">f'</span> <span class="n">a</span> <span class="n">hf</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">HasStrictFDerivAt</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">f'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">HasStrictFDerivAt.localInverse</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">f'</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">hf</span> <span class="kd">example</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">HasStrictFDerivAt</span> <span class="n">f</span> <span class="o">(</span><span class="n">f'</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">F</span><span class="o">)</span> <span class="n">a</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">x</span> <span class="k">in</span> <span class="bp">𝓝</span> <span class="n">a</span><span class="o">,</span> <span class="n">hf.localInverse</span> <span class="n">f</span> <span class="n">f'</span> <span class="n">a</span> <span class="o">(</span><span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">hf.eventually_left_inverse</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">HasStrictFDerivAt</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">f'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">hf.localInverse</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">f'</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">hf.eventually_left_inverse</span> <span class="kd">example</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">HasStrictFDerivAt</span> <span class="n">f</span> <span class="o">(</span><span class="n">f'</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">F</span><span class="o">)</span> <span class="n">a</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∀ᶠ</span> <span class="n">x</span> <span class="k">in</span> <span class="bp">𝓝</span> <span class="o">(</span><span class="n">f</span> <span class="n">a</span><span class="o">),</span> <span class="n">f</span> <span class="o">(</span><span class="n">hf.localInverse</span> <span class="n">f</span> <span class="n">f'</span> <span class="n">a</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">hf.eventually_right_inverse</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">HasStrictFDerivAt</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">f'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">𝓝</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="o">),</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">hf.localInverse</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">f'</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">hf.eventually_right_inverse</span> <span class="kd">example</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span> <span class="n">F</span><span class="o">}</span> <span class="o">{</span><span class="n">f'</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">≃</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">F</span><span class="o">}</span> <span class="o">{</span><span class="n">a</span> <span class="o">:</span> <span class="n">E</span><span class="o">}</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">HasStrictFDerivAt</span> <span class="n">f</span> <span class="o">(</span><span class="n">f'</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">F</span><span class="o">)</span> <span class="n">a</span><span class="o">)</span> <span class="o">:</span> <span class="n">HasStrictFDerivAt</span> <span class="o">(</span><span class="n">HasStrictFDerivAt.localInverse</span> <span class="n">f</span> <span class="n">f'</span> <span class="n">a</span> <span class="n">hf</span><span class="o">)</span> <span class="o">(</span><span class="n">f'.symm</span> <span class="o">:</span> <span class="n">F</span> <span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">E</span><span class="o">)</span> <span class="o">(</span><span class="n">f</span> <span class="n">a</span><span class="o">)</span> <span class="o">:=</span> <span class="n">HasStrictFDerivAt.to_localInverse</span> <span class="n">hf</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">F</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">f'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">≃</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">F</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="o">}</span> <span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">HasStrictFDerivAt</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">f'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">HasStrictFDerivAt</span><span class="w"> </span><span class="o">(</span><span class="n">HasStrictFDerivAt.localInverse</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">f'</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">hf</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f'.symm</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">E</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">HasStrictFDerivAt.to_localInverse</span><span class="w"> </span><span class="n">hf</span> <span class="kd">end</span> <span class="n">LocalInverse</span> <span class="kd">end</span><span class="w"> </span><span class="n">LocalInverse</span> </pre></div> </div> <p>This has been only a quick tour of the differential calculus in Mathlib.
-
-
-
@@ -18,7 +18,7 @@<script src="_static/jquery.js?v=5d32c60e"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/documentation_options.js?v=2709fde1"></script> <script src="_static/doctools.js?v=888ff710"></script> <script src="_static/doctools.js?v=9a2dae69"></script> <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script>
-
@@ -99,16 +99,16 @@<span id="index-1"></span><span id="id2"></span><h2><span class="section-number">11.1. </span>Elementary Integration<a class="headerlink" href="#elementary-integration" title="Link to this heading"></a></h2> <p>We first focus on integration of functions on finite intervals in <code class="docutils literal notranslate"><span class="pre">ℝ</span></code>. We can integrate elementary functions.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">MeasureTheory</span> <span class="n">intervalIntegral</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">MeasureTheory</span><span class="w"> </span><span class="n">intervalIntegral</span> <span class="kn">open</span> <span class="n">Interval</span> <span class="kn">open</span><span class="w"> </span><span class="n">Interval</span> <span class="c1">-- this introduces the notation `[[a, b]]` for the segment from `min a b` to `max a b`</span> <span class="kd">example</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="bp">∫</span> <span class="n">x</span> <span class="k">in</span> <span class="n">a..b</span><span class="o">,</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="o">(</span><span class="n">b</span> <span class="bp">^</span> <span class="mi">2</span> <span class="bp">-</span> <span class="n">a</span> <span class="bp">^</span> <span class="mi">2</span><span class="o">)</span> <span class="bp">/</span> <span class="mi">2</span> <span class="o">:=</span> <span class="n">integral_id</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">∫</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">a</span><span class="bp">..</span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">^</span><span class="w"> </span><span class="mi">2</span><span class="o">)</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">integral_id</span> <span class="kd">example</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="o">(</span><span class="mi">0</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="bp">∉</span> <span class="o">[[</span><span class="n">a</span><span class="o">,</span> <span class="n">b</span><span class="o">]])</span> <span class="o">:</span> <span class="o">(</span><span class="bp">∫</span> <span class="n">x</span> <span class="k">in</span> <span class="n">a..b</span><span class="o">,</span> <span class="mi">1</span> <span class="bp">/</span> <span class="n">x</span><span class="o">)</span> <span class="bp">=</span> <span class="n">Real.log</span> <span class="o">(</span><span class="n">b</span> <span class="bp">/</span> <span class="n">a</span><span class="o">)</span> <span class="o">:=</span> <span class="n">integral_one_div</span> <span class="n">h</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="mi">0</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="bp">∉</span><span class="w"> </span><span class="o">[[</span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">b</span><span class="o">]])</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">∫</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">a</span><span class="bp">..</span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">Real.log</span><span class="w"> </span><span class="o">(</span><span class="n">b</span><span class="w"> </span><span class="bp">/</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">integral_one_div</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>The fundamental theorem of calculus relates integration and differentiation.
-
@@ -117,20 +117,20 @@ says that integration provides an inverse to differentiation and the second onespecifies how to compute integrals of derivatives. (These two parts are very closely related, but their optimal versions, which are not shown here, are not equivalent.)</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">Continuous</span> <span class="n">f</span><span class="o">)</span> <span class="o">(</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">deriv</span> <span class="o">(</span><span class="k">fun</span> <span class="n">u</span> <span class="bp">↦</span> <span class="bp">∫</span> <span class="n">x</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="k">in</span> <span class="n">a..u</span><span class="o">,</span> <span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="n">b</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">b</span> <span class="o">:=</span> <span class="o">(</span><span class="n">integral_hasStrictDerivAt_right</span> <span class="o">(</span><span class="n">hf.intervalIntegrable</span> <span class="n">_</span> <span class="n">_</span><span class="o">)</span> <span class="o">(</span><span class="n">hf.stronglyMeasurableAtFilter</span> <span class="n">_</span> <span class="n">_</span><span class="o">)</span> <span class="n">hf.continuousAt</span><span class="o">)</span><span class="bp">.</span><span class="n">hasDerivAt.deriv</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Continuous</span><span class="w"> </span><span class="n">f</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">deriv</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="bp">∫</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">a</span><span class="bp">..</span><span class="n">u</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="o">(</span><span class="n">integral_hasStrictDerivAt_right</span><span class="w"> </span><span class="o">(</span><span class="n">hf.intervalIntegrable</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">_</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hf.stronglyMeasurableAtFilter</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="n">_</span><span class="o">)</span> <span class="w"> </span><span class="n">hf.continuousAt</span><span class="o">)</span><span class="bp">.</span><span class="n">hasDerivAt.deriv</span> <span class="kd">example</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">{</span><span class="n">a</span> <span class="n">b</span> <span class="o">:</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">{</span><span class="n">f'</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="bp">∈</span> <span class="o">[[</span><span class="n">a</span><span class="o">,</span> <span class="n">b</span><span class="o">]],</span> <span class="n">HasDerivAt</span> <span class="n">f</span> <span class="o">(</span><span class="n">f'</span> <span class="n">x</span><span class="o">)</span> <span class="n">x</span><span class="o">)</span> <span class="o">(</span><span class="n">h'</span> <span class="o">:</span> <span class="n">IntervalIntegrable</span> <span class="n">f'</span> <span class="n">volume</span> <span class="n">a</span> <span class="n">b</span><span class="o">)</span> <span class="o">:</span> <span class="o">(</span><span class="bp">∫</span> <span class="n">y</span> <span class="k">in</span> <span class="n">a..b</span><span class="o">,</span> <span class="n">f'</span> <span class="n">y</span><span class="o">)</span> <span class="bp">=</span> <span class="n">f</span> <span class="n">b</span> <span class="bp">-</span> <span class="n">f</span> <span class="n">a</span> <span class="o">:=</span> <span class="n">integral_eq_sub_of_hasDerivAt</span> <span class="n">h</span> <span class="n">h'</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">f'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="o">[[</span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">b</span><span class="o">]],</span><span class="w"> </span><span class="n">HasDerivAt</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">f'</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="n">x</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">h'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">IntervalIntegrable</span><span class="w"> </span><span class="n">f'</span><span class="w"> </span><span class="n">volume</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">∫</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">a</span><span class="bp">..</span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">f'</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">integral_eq_sub_of_hasDerivAt</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="n">h'</span> </pre></div> </div> <p>Convolution is also defined in Mathlib and its basic properties are proved.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">Convolution</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">Convolution</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">g</span> <span class="o">:</span> <span class="n">ℝ</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">⋆</span> <span class="n">g</span> <span class="bp">=</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="bp">∫</span> <span class="n">t</span><span class="o">,</span> <span class="n">f</span> <span class="n">t</span> <span class="bp">*</span> <span class="n">g</span> <span class="o">(</span><span class="n">x</span> <span class="bp">-</span> <span class="n">t</span><span class="o">)</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⋆</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="bp">∫</span><span class="w"> </span><span class="n">t</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="bp">*</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> </pre></div> </div> </section>
-
@@ -151,28 +151,28 @@ Note that these axioms are redundant; if you <code class="docutils literal notrayou will see the ones that Mathlib uses. As the examples below show, countability assumptions can be expressed using the <code class="docutils literal notranslate"><span class="pre">Encodable</span></code> type class.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">MeasurableSpace</span> <span class="n">α</span><span class="o">]</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">MeasurableSpace</span><span class="w"> </span><span class="n">α</span><span class="o">]</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">MeasurableSet</span> <span class="o">(</span><span class="bp">∅</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">α</span><span class="o">)</span> <span class="o">:=</span> <span class="n">MeasurableSet.empty</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MeasurableSet</span><span class="w"> </span><span class="o">(</span><span class="bp">∅</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">MeasurableSet.empty</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">MeasurableSet</span> <span class="o">(</span><span class="n">univ</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">α</span><span class="o">)</span> <span class="o">:=</span> <span class="n">MeasurableSet.univ</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MeasurableSet</span><span class="w"> </span><span class="o">(</span><span class="n">univ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">MeasurableSet.univ</span> <span class="kd">example</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">α</span><span class="o">}</span> <span class="o">(</span><span class="n">hs</span> <span class="o">:</span> <span class="n">MeasurableSet</span> <span class="n">s</span><span class="o">)</span> <span class="o">:</span> <span class="n">MeasurableSet</span> <span class="o">(</span><span class="n">s</span><span class="bp">ᶜ</span><span class="o">)</span> <span class="o">:=</span> <span class="n">hs.compl</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MeasurableSet</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MeasurableSet</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="bp">ᶜ</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">hs.compl</span> <span class="kd">example</span> <span class="o">:</span> <span class="n">Encodable</span> <span class="n">ℕ</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">infer_instance</span> <span class="kd">example</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Encodable</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">infer_instance</span> <span class="kd">example</span> <span class="o">(</span><span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span><span class="o">)</span> <span class="o">:</span> <span class="n">Encodable</span> <span class="o">(</span><span class="n">Fin</span> <span class="n">n</span><span class="o">)</span> <span class="o">:=</span> <span class="kd">by</span> <span class="n">infer_instance</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Encodable</span><span class="w"> </span><span class="o">(</span><span class="n">Fin</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">by</span><span class="w"> </span><span class="n">infer_instance</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">ι</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">Encodable</span> <span class="n">ι</span><span class="o">]</span> <span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">ι</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">Encodable</span><span class="w"> </span><span class="n">ι</span><span class="o">]</span> <span class="kd">example</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Set</span> <span class="n">α</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">b</span><span class="o">,</span> <span class="n">MeasurableSet</span> <span class="o">(</span><span class="n">f</span> <span class="n">b</span><span class="o">))</span> <span class="o">:</span> <span class="n">MeasurableSet</span> <span class="o">(</span><span class="bp">⋃</span> <span class="n">b</span><span class="o">,</span> <span class="n">f</span> <span class="n">b</span><span class="o">)</span> <span class="o">:=</span> <span class="n">MeasurableSet.iUnion</span> <span class="n">h</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">MeasurableSet</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">b</span><span class="o">))</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MeasurableSet</span><span class="w"> </span><span class="o">(</span><span class="bp">⋃</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">MeasurableSet.iUnion</span><span class="w"> </span><span class="n">h</span> <span class="kd">example</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Set</span> <span class="n">α</span><span class="o">}</span> <span class="o">(</span><span class="n">h</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">b</span><span class="o">,</span> <span class="n">MeasurableSet</span> <span class="o">(</span><span class="n">f</span> <span class="n">b</span><span class="o">))</span> <span class="o">:</span> <span class="n">MeasurableSet</span> <span class="o">(</span><span class="bp">⋂</span> <span class="n">b</span><span class="o">,</span> <span class="n">f</span> <span class="n">b</span><span class="o">)</span> <span class="o">:=</span> <span class="n">MeasurableSet.iInter</span> <span class="n">h</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">h</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">MeasurableSet</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">b</span><span class="o">))</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MeasurableSet</span><span class="w"> </span><span class="o">(</span><span class="bp">⋂</span><span class="w"> </span><span class="n">b</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">b</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">MeasurableSet.iInter</span><span class="w"> </span><span class="n">h</span> </pre></div> </div> <p>Once a type is measurable, we can measure it. On paper, a measure on a set
-
@@ -186,18 +186,18 @@ So we extend the measure to any set <code class="docutils literal notranslate"><as the infimum of measures of measurable sets containing <code class="docutils literal notranslate"><span class="pre">s</span></code>. Of course, many lemmas still require measurability assumptions, but not all.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">MeasureTheory</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">μ</span> <span class="o">:</span> <span class="n">Measure</span> <span class="n">α</span><span class="o">}</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">MeasureTheory</span> <span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">μ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Measure</span><span class="w"> </span><span class="n">α</span><span class="o">}</span> <span class="kd">example</span> <span class="o">(</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">α</span><span class="o">)</span> <span class="o">:</span> <span class="n">μ</span> <span class="n">s</span> <span class="bp">=</span> <span class="bp">⨅</span> <span class="o">(</span><span class="n">t</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">α</span><span class="o">)</span> <span class="o">(</span><span class="n">_</span> <span class="o">:</span> <span class="n">s</span> <span class="bp">⊆</span> <span class="n">t</span><span class="o">)</span> <span class="o">(</span><span class="n">_</span> <span class="o">:</span> <span class="n">MeasurableSet</span> <span class="n">t</span><span class="o">),</span> <span class="n">μ</span> <span class="n">t</span> <span class="o">:=</span> <span class="n">measure_eq_iInf</span> <span class="n">s</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">μ</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">⨅</span><span class="w"> </span><span class="o">(</span><span class="n">t</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">_</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">⊆</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">_</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MeasurableSet</span><span class="w"> </span><span class="n">t</span><span class="o">),</span><span class="w"> </span><span class="n">μ</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">measure_eq_iInf</span><span class="w"> </span><span class="n">s</span> <span class="kd">example</span> <span class="o">(</span><span class="n">s</span> <span class="o">:</span> <span class="n">ι</span> <span class="bp">→</span> <span class="n">Set</span> <span class="n">α</span><span class="o">)</span> <span class="o">:</span> <span class="n">μ</span> <span class="o">(</span><span class="bp">⋃</span> <span class="n">i</span><span class="o">,</span> <span class="n">s</span> <span class="n">i</span><span class="o">)</span> <span class="bp">≤</span> <span class="bp">∑'</span> <span class="n">i</span><span class="o">,</span> <span class="n">μ</span> <span class="o">(</span><span class="n">s</span> <span class="n">i</span><span class="o">)</span> <span class="o">:=</span> <span class="n">measure_iUnion_le</span> <span class="n">s</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ι</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">μ</span><span class="w"> </span><span class="o">(</span><span class="bp">⋃</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="bp">∑'</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">μ</span><span class="w"> </span><span class="o">(</span><span class="n">s</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">measure_iUnion_le</span><span class="w"> </span><span class="n">s</span> <span class="kd">example</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">Set</span> <span class="n">α</span><span class="o">}</span> <span class="o">(</span><span class="n">hmeas</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">i</span><span class="o">,</span> <span class="n">MeasurableSet</span> <span class="o">(</span><span class="n">f</span> <span class="n">i</span><span class="o">))</span> <span class="o">(</span><span class="n">hdis</span> <span class="o">:</span> <span class="n">Pairwise</span> <span class="o">(</span><span class="n">Disjoint</span> <span class="n">on</span> <span class="n">f</span><span class="o">))</span> <span class="o">:</span> <span class="n">μ</span> <span class="o">(</span><span class="bp">⋃</span> <span class="n">i</span><span class="o">,</span> <span class="n">f</span> <span class="n">i</span><span class="o">)</span> <span class="bp">=</span> <span class="bp">∑'</span> <span class="n">i</span><span class="o">,</span> <span class="n">μ</span> <span class="o">(</span><span class="n">f</span> <span class="n">i</span><span class="o">)</span> <span class="o">:=</span> <span class="n">μ.m_iUnion</span> <span class="n">hmeas</span> <span class="n">hdis</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hmeas</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">MeasurableSet</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">i</span><span class="o">))</span><span class="w"> </span><span class="o">(</span><span class="n">hdis</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Pairwise</span><span class="w"> </span><span class="o">(</span><span class="n">Disjoint</span><span class="w"> </span><span class="n">on</span><span class="w"> </span><span class="n">f</span><span class="o">))</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">μ</span><span class="w"> </span><span class="o">(</span><span class="bp">⋃</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">∑'</span><span class="w"> </span><span class="n">i</span><span class="o">,</span><span class="w"> </span><span class="n">μ</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">i</span><span class="o">)</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">μ.m_iUnion</span><span class="w"> </span><span class="n">hmeas</span><span class="w"> </span><span class="n">hdis</span> </pre></div> </div> <p>Once a type has a measure associated with it, we say that a property <code class="docutils literal notranslate"><span class="pre">P</span></code>
-
@@ -206,8 +206,8 @@ has measure 0.The collection of properties that hold almost everywhere form a filter, but Mathlib introduces special notation for saying that a property holds almost everywhere.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">P</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="kt">Prop</span><span class="o">}</span> <span class="o">:</span> <span class="o">(</span><span class="bp">∀ᵐ</span> <span class="n">x</span> <span class="bp">∂</span><span class="n">μ</span><span class="o">,</span> <span class="n">P</span> <span class="n">x</span><span class="o">)</span> <span class="bp">↔</span> <span class="bp">∀ᶠ</span> <span class="n">x</span> <span class="k">in</span> <span class="n">ae</span> <span class="n">μ</span><span class="o">,</span> <span class="n">P</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">Iff.rfl</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">P</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="kt">Prop</span><span class="o">}</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">(</span><span class="bp">∀ᵐ</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∂</span><span class="n">μ</span><span class="o">,</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">↔</span><span class="w"> </span><span class="bp">∀ᶠ</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">ae</span><span class="w"> </span><span class="n">μ</span><span class="o">,</span><span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">Iff.rfl</span> </pre></div> </div> </section>
-
@@ -222,11 +222,11 @@ that an integral is equal to zero if the function in question isnot integrable. Most lemmas having to do with integrals have integrability assumptions.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">section</span> <span class="kd">variable</span> <span class="o">{</span><span class="n">E</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedAddCommGroup</span> <span class="n">E</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedSpace</span> <span class="n">ℝ</span> <span class="n">E</span><span class="o">]</span> <span class="o">[</span><span class="n">CompleteSpace</span> <span class="n">E</span><span class="o">]</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">E</span><span class="o">}</span> <span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">E</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedAddCommGroup</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">NormedSpace</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">CompleteSpace</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">E</span><span class="o">}</span> <span class="kd">example</span> <span class="o">{</span><span class="n">f</span> <span class="n">g</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">E</span><span class="o">}</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">Integrable</span> <span class="n">f</span> <span class="n">μ</span><span class="o">)</span> <span class="o">(</span><span class="n">hg</span> <span class="o">:</span> <span class="n">Integrable</span> <span class="n">g</span> <span class="n">μ</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∫</span> <span class="n">a</span><span class="o">,</span> <span class="n">f</span> <span class="n">a</span> <span class="bp">+</span> <span class="n">g</span> <span class="n">a</span> <span class="bp">∂</span><span class="n">μ</span> <span class="bp">=</span> <span class="bp">∫</span> <span class="n">a</span><span class="o">,</span> <span class="n">f</span> <span class="n">a</span> <span class="bp">∂</span><span class="n">μ</span> <span class="bp">+</span> <span class="bp">∫</span> <span class="n">a</span><span class="o">,</span> <span class="n">g</span> <span class="n">a</span> <span class="bp">∂</span><span class="n">μ</span> <span class="o">:=</span> <span class="n">integral_add</span> <span class="n">hf</span> <span class="n">hg</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">E</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Integrable</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">μ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hg</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Integrable</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">μ</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∫</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∂</span><span class="n">μ</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">∫</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∂</span><span class="n">μ</span><span class="w"> </span><span class="bp">+</span><span class="w"> </span><span class="bp">∫</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∂</span><span class="n">μ</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">integral_add</span><span class="w"> </span><span class="n">hf</span><span class="w"> </span><span class="n">hg</span> </pre></div> </div> <p>As an example of the complex interactions between our various conventions, let us see how to integrate constant functions.
-
@@ -236,41 +236,41 @@ the point at infinity, to zero.For any <code class="docutils literal notranslate"><span class="pre">s</span> <span class="pre">:</span> <span class="pre">Set</span> <span class="pre">α</span></code>, if <code class="docutils literal notranslate"><span class="pre">μ</span> <span class="pre">s</span> <span class="pre">=</span> <span class="pre">⊤</span></code>, then nonzero constant functions are not integrable on <code class="docutils literal notranslate"><span class="pre">s</span></code>. In that case, their integrals are equal to zero by definition, as is <code class="docutils literal notranslate"><span class="pre">(μ</span> <span class="pre">s).toReal</span></code>. So in all cases we have the following lemma.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">α</span><span class="o">}</span> <span class="o">(</span><span class="n">c</span> <span class="o">:</span> <span class="n">E</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∫</span> <span class="n">x</span> <span class="k">in</span> <span class="n">s</span><span class="o">,</span> <span class="n">c</span> <span class="bp">∂</span><span class="n">μ</span> <span class="bp">=</span> <span class="o">(</span><span class="n">μ</span> <span class="n">s</span><span class="o">)</span><span class="bp">.</span><span class="n">toReal</span> <span class="bp">•</span> <span class="n">c</span> <span class="o">:=</span> <span class="n">setIntegral_const</span> <span class="n">c</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">α</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">c</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="o">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∫</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="bp">∂</span><span class="n">μ</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="o">(</span><span class="n">μ</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="bp">.</span><span class="n">toReal</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">setIntegral_const</span><span class="w"> </span><span class="n">c</span> </pre></div> </div> <p>We now quickly explain how to access the most important theorems in integration theory, starting with the dominated convergence theorem. There are several versions in Mathlib, and here we only show the most basic one.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">Filter</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">Filter</span> <span class="kd">example</span> <span class="o">{</span><span class="n">F</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">→</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">E</span><span class="o">}</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">E</span><span class="o">}</span> <span class="o">(</span><span class="n">bound</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">→</span> <span class="n">ℝ</span><span class="o">)</span> <span class="o">(</span><span class="n">hmeas</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="n">AEStronglyMeasurable</span> <span class="o">(</span><span class="n">F</span> <span class="n">n</span><span class="o">)</span> <span class="n">μ</span><span class="o">)</span> <span class="o">(</span><span class="n">hint</span> <span class="o">:</span> <span class="n">Integrable</span> <span class="n">bound</span> <span class="n">μ</span><span class="o">)</span> <span class="o">(</span><span class="n">hbound</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">n</span><span class="o">,</span> <span class="bp">∀ᵐ</span> <span class="n">a</span> <span class="bp">∂</span><span class="n">μ</span><span class="o">,</span> <span class="bp">‖</span><span class="n">F</span> <span class="n">n</span> <span class="n">a</span><span class="bp">‖</span> <span class="bp">≤</span> <span class="n">bound</span> <span class="n">a</span><span class="o">)</span> <span class="o">(</span><span class="n">hlim</span> <span class="o">:</span> <span class="bp">∀ᵐ</span> <span class="n">a</span> <span class="bp">∂</span><span class="n">μ</span><span class="o">,</span> <span class="n">Tendsto</span> <span class="o">(</span><span class="k">fun</span> <span class="n">n</span> <span class="o">:</span> <span class="n">ℕ</span> <span class="bp">↦</span> <span class="n">F</span> <span class="n">n</span> <span class="n">a</span><span class="o">)</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="o">(</span><span class="n">f</span> <span class="n">a</span><span class="o">)))</span> <span class="o">:</span> <span class="n">Tendsto</span> <span class="o">(</span><span class="k">fun</span> <span class="n">n</span> <span class="bp">↦</span> <span class="bp">∫</span> <span class="n">a</span><span class="o">,</span> <span class="n">F</span> <span class="n">n</span> <span class="n">a</span> <span class="bp">∂</span><span class="n">μ</span><span class="o">)</span> <span class="n">atTop</span> <span class="o">(</span><span class="bp">𝓝</span> <span class="o">(</span><span class="bp">∫</span> <span class="n">a</span><span class="o">,</span> <span class="n">f</span> <span class="n">a</span> <span class="bp">∂</span><span class="n">μ</span><span class="o">))</span> <span class="o">:=</span> <span class="n">tendsto_integral_of_dominated_convergence</span> <span class="n">bound</span> <span class="n">hmeas</span> <span class="n">hint</span> <span class="n">hbound</span> <span class="n">hlim</span> <span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">E</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">E</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">bound</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">ℝ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hmeas</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="n">AEStronglyMeasurable</span><span class="w"> </span><span class="o">(</span><span class="n">F</span><span class="w"> </span><span class="n">n</span><span class="o">)</span><span class="w"> </span><span class="n">μ</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">hint</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Integrable</span><span class="w"> </span><span class="n">bound</span><span class="w"> </span><span class="n">μ</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">hbound</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">n</span><span class="o">,</span><span class="w"> </span><span class="bp">∀ᵐ</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∂</span><span class="n">μ</span><span class="o">,</span><span class="w"> </span><span class="bp">‖</span><span class="n">F</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">a</span><span class="bp">‖</span><span class="w"> </span><span class="bp">≤</span><span class="w"> </span><span class="n">bound</span><span class="w"> </span><span class="n">a</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">hlim</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀ᵐ</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∂</span><span class="n">μ</span><span class="o">,</span><span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ℕ</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">a</span><span class="o">)</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="o">)))</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">Tendsto</span><span class="w"> </span><span class="o">(</span><span class="k">fun</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="bp">∫</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∂</span><span class="n">μ</span><span class="o">)</span><span class="w"> </span><span class="n">atTop</span><span class="w"> </span><span class="o">(</span><span class="n">𝓝</span><span class="w"> </span><span class="o">(</span><span class="bp">∫</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="bp">∂</span><span class="n">μ</span><span class="o">))</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">tendsto_integral_of_dominated_convergence</span><span class="w"> </span><span class="n">bound</span><span class="w"> </span><span class="n">hmeas</span><span class="w"> </span><span class="n">hint</span><span class="w"> </span><span class="n">hbound</span><span class="w"> </span><span class="n">hlim</span> </pre></div> </div> <p>Then we have Fubini’s theorem for integrals on product type.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">α</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">MeasurableSpace</span> <span class="n">α</span><span class="o">]</span> <span class="o">{</span><span class="n">μ</span> <span class="o">:</span> <span class="n">Measure</span> <span class="n">α</span><span class="o">}</span> <span class="o">[</span><span class="n">SigmaFinite</span> <span class="n">μ</span><span class="o">]</span> <span class="o">{</span><span class="n">β</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">MeasurableSpace</span> <span class="n">β</span><span class="o">]</span> <span class="o">{</span><span class="n">ν</span> <span class="o">:</span> <span class="n">Measure</span> <span class="n">β</span><span class="o">}</span> <span class="o">[</span><span class="n">SigmaFinite</span> <span class="n">ν</span><span class="o">]</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">α</span> <span class="bp">×</span> <span class="n">β</span> <span class="bp">→</span> <span class="n">E</span><span class="o">)</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="n">Integrable</span> <span class="n">f</span> <span class="o">(</span><span class="n">μ.prod</span> <span class="n">ν</span><span class="o">))</span> <span class="o">:</span> <span class="bp">∫</span> <span class="n">z</span><span class="o">,</span> <span class="n">f</span> <span class="n">z</span> <span class="bp">∂</span> <span class="n">μ.prod</span> <span class="n">ν</span> <span class="bp">=</span> <span class="bp">∫</span> <span class="n">x</span><span class="o">,</span> <span class="bp">∫</span> <span class="n">y</span><span class="o">,</span> <span class="n">f</span> <span class="o">(</span><span class="n">x</span><span class="o">,</span> <span class="n">y</span><span class="o">)</span> <span class="bp">∂</span><span class="n">ν</span> <span class="bp">∂</span><span class="n">μ</span> <span class="o">:=</span> <span class="n">integral_prod</span> <span class="n">f</span> <span class="n">hf</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">α</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">MeasurableSpace</span><span class="w"> </span><span class="n">α</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">μ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Measure</span><span class="w"> </span><span class="n">α</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">SigmaFinite</span><span class="w"> </span><span class="n">μ</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">β</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="w"> </span><span class="o">[</span><span class="n">MeasurableSpace</span><span class="w"> </span><span class="n">β</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">ν</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Measure</span><span class="w"> </span><span class="n">β</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">SigmaFinite</span><span class="w"> </span><span class="n">ν</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">α</span><span class="w"> </span><span class="bp">×</span><span class="w"> </span><span class="n">β</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">E</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Integrable</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">μ.prod</span><span class="w"> </span><span class="n">ν</span><span class="o">))</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∫</span><span class="w"> </span><span class="n">z</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="bp">∂</span><span class="w"> </span><span class="n">μ.prod</span><span class="w"> </span><span class="n">ν</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">∫</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="bp">∫</span><span class="w"> </span><span class="n">y</span><span class="o">,</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">y</span><span class="o">)</span><span class="w"> </span><span class="bp">∂</span><span class="n">ν</span><span class="w"> </span><span class="bp">∂</span><span class="n">μ</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">integral_prod</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">hf</span> </pre></div> </div> <p>There is a very general version of convolution that applies to any continuous bilinear form.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span> <span class="n">Convolution</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kn">open</span><span class="w"> </span><span class="n">Convolution</span> <span class="kd">variable</span> <span class="o">{</span><span class="bp">𝕜</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">{</span><span class="n">G</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">{</span><span class="n">E</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">{</span><span class="n">E'</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">{</span><span class="n">F</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedAddCommGroup</span> <span class="n">E</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedAddCommGroup</span> <span class="n">E'</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedAddCommGroup</span> <span class="n">F</span><span class="o">]</span> <span class="o">[</span><span class="n">NontriviallyNormedField</span> <span class="bp">𝕜</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedSpace</span> <span class="bp">𝕜</span> <span class="n">E</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedSpace</span> <span class="bp">𝕜</span> <span class="n">E'</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedSpace</span> <span class="bp">𝕜</span> <span class="n">F</span><span class="o">]</span> <span class="o">[</span><span class="n">MeasurableSpace</span> <span class="n">G</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedSpace</span> <span class="n">ℝ</span> <span class="n">F</span><span class="o">]</span> <span class="o">[</span><span class="n">CompleteSpace</span> <span class="n">F</span><span class="o">]</span> <span class="o">[</span><span class="n">Sub</span> <span class="n">G</span><span class="o">]</span> <span class="kd">variable</span><span class="w"> </span><span class="o">{</span><span class="n">𝕜</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">G</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">E</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">E'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedAddCommGroup</span><span class="w"> </span><span class="n">E</span><span class="o">]</span> <span class="w"> </span><span class="o">[</span><span class="n">NormedAddCommGroup</span><span class="w"> </span><span class="n">E'</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">NormedAddCommGroup</span><span class="w"> </span><span class="n">F</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">NontriviallyNormedField</span><span class="w"> </span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">NormedSpace</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">E</span><span class="o">]</span> <span class="w"> </span><span class="o">[</span><span class="n">NormedSpace</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">E'</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">NormedSpace</span><span class="w"> </span><span class="n">𝕜</span><span class="w"> </span><span class="n">F</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">MeasurableSpace</span><span class="w"> </span><span class="n">G</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">NormedSpace</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="n">F</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">CompleteSpace</span><span class="w"> </span><span class="n">F</span><span class="o">]</span> <span class="w"> </span><span class="o">[</span><span class="n">Sub</span><span class="w"> </span><span class="n">G</span><span class="o">]</span> <span class="kd">example</span> <span class="o">(</span><span class="n">f</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→</span> <span class="n">E</span><span class="o">)</span> <span class="o">(</span><span class="n">g</span> <span class="o">:</span> <span class="n">G</span> <span class="bp">→</span> <span class="n">E'</span><span class="o">)</span> <span class="o">(</span><span class="n">L</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">E'</span> <span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="bp">𝕜</span><span class="o">]</span> <span class="n">F</span><span class="o">)</span> <span class="o">(</span><span class="n">μ</span> <span class="o">:</span> <span class="n">Measure</span> <span class="n">G</span><span class="o">)</span> <span class="o">:</span> <span class="n">f</span> <span class="bp">⋆</span><span class="o">[</span><span class="n">L</span><span class="o">,</span> <span class="n">μ</span><span class="o">]</span> <span class="n">g</span> <span class="bp">=</span> <span class="k">fun</span> <span class="n">x</span> <span class="bp">↦</span> <span class="bp">∫</span> <span class="n">t</span><span class="o">,</span> <span class="n">L</span> <span class="o">(</span><span class="n">f</span> <span class="n">t</span><span class="o">)</span> <span class="o">(</span><span class="n">g</span> <span class="o">(</span><span class="n">x</span> <span class="bp">-</span> <span class="n">t</span><span class="o">))</span> <span class="bp">∂</span><span class="n">μ</span> <span class="o">:=</span> <span class="n">rfl</span> <span class="kd">example</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">E</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">E'</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">L</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">E'</span><span class="w"> </span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">𝕜</span><span class="o">]</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">μ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Measure</span><span class="w"> </span><span class="n">G</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">⋆</span><span class="o">[</span><span class="n">L</span><span class="o">,</span><span class="w"> </span><span class="n">μ</span><span class="o">]</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">↦</span><span class="w"> </span><span class="bp">∫</span><span class="w"> </span><span class="n">t</span><span class="o">,</span><span class="w"> </span><span class="n">L</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">t</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="o">(</span><span class="n">x</span><span class="w"> </span><span class="bp">-</span><span class="w"> </span><span class="n">t</span><span class="o">))</span><span class="w"> </span><span class="bp">∂</span><span class="n">μ</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">rfl</span> </pre></div> </div> <p>Finally, Mathlib has a very general version of the change-of-variables formula.
-
@@ -278,13 +278,13 @@ In the statement below, <code class="docutils literal notranslate"><span class="<span class="math notranslate nohighlight">\(\sigma\)</span>-algebra on <code class="docutils literal notranslate"><span class="pre">E</span></code> is generated by the open sets of <code class="docutils literal notranslate"><span class="pre">E</span></code>, and <code class="docutils literal notranslate"><span class="pre">IsAddHaarMeasure</span> <span class="pre">μ</span></code> means that the measure <code class="docutils literal notranslate"><span class="pre">μ</span></code> is left-invariant, gives finite mass to compact sets, and give positive mass to open sets.</p> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span> <span class="o">{</span><span class="n">E</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedAddCommGroup</span> <span class="n">E</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedSpace</span> <span class="n">ℝ</span> <span class="n">E</span><span class="o">]</span> <span class="o">[</span><span class="n">FiniteDimensional</span> <span class="n">ℝ</span> <span class="n">E</span><span class="o">]</span> <span class="o">[</span><span class="n">MeasurableSpace</span> <span class="n">E</span><span class="o">]</span> <span class="o">[</span><span class="n">BorelSpace</span> <span class="n">E</span><span class="o">]</span> <span class="o">(</span><span class="n">μ</span> <span class="o">:</span> <span class="n">Measure</span> <span class="n">E</span><span class="o">)</span> <span class="o">[</span><span class="n">μ.IsAddHaarMeasure</span><span class="o">]</span> <span class="o">{</span><span class="n">F</span> <span class="o">:</span> <span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="o">[</span><span class="n">NormedAddCommGroup</span> <span class="n">F</span><span class="o">]</span> <span class="o">[</span><span class="n">NormedSpace</span> <span class="n">ℝ</span> <span class="n">F</span><span class="o">]</span> <span class="o">[</span><span class="n">CompleteSpace</span> <span class="n">F</span><span class="o">]</span> <span class="o">{</span><span class="n">s</span> <span class="o">:</span> <span class="n">Set</span> <span class="n">E</span><span class="o">}</span> <span class="o">{</span><span class="n">f</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span> <span class="n">E</span><span class="o">}</span> <span class="o">{</span><span class="n">f'</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span> <span class="n">E</span> <span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">ℝ</span><span class="o">]</span> <span class="n">E</span><span class="o">}</span> <span class="o">(</span><span class="n">hs</span> <span class="o">:</span> <span class="n">MeasurableSet</span> <span class="n">s</span><span class="o">)</span> <span class="o">(</span><span class="n">hf</span> <span class="o">:</span> <span class="bp">∀</span> <span class="n">x</span> <span class="o">:</span> <span class="n">E</span><span class="o">,</span> <span class="n">x</span> <span class="bp">∈</span> <span class="n">s</span> <span class="bp">→</span> <span class="n">HasFDerivWithinAt</span> <span class="n">f</span> <span class="o">(</span><span class="n">f'</span> <span class="n">x</span><span class="o">)</span> <span class="n">s</span> <span class="n">x</span><span class="o">)</span> <span class="o">(</span><span class="n">h_inj</span> <span class="o">:</span> <span class="n">InjOn</span> <span class="n">f</span> <span class="n">s</span><span class="o">)</span> <span class="o">(</span><span class="n">g</span> <span class="o">:</span> <span class="n">E</span> <span class="bp">→</span> <span class="n">F</span><span class="o">)</span> <span class="o">:</span> <span class="bp">∫</span> <span class="n">x</span> <span class="k">in</span> <span class="n">f</span> <span class="bp">''</span> <span class="n">s</span><span class="o">,</span> <span class="n">g</span> <span class="n">x</span> <span class="bp">∂</span><span class="n">μ</span> <span class="bp">=</span> <span class="bp">∫</span> <span class="n">x</span> <span class="k">in</span> <span class="n">s</span><span class="o">,</span> <span class="bp">|</span><span class="o">(</span><span class="n">f'</span> <span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">det</span><span class="bp">|</span> <span class="bp">•</span> <span class="n">g</span> <span class="o">(</span><span class="n">f</span> <span class="n">x</span><span class="o">)</span> <span class="bp">∂</span><span class="n">μ</span> <span class="o">:=</span> <span class="n">integral_image_eq_integral_abs_det_fderiv_smul</span> <span class="n">μ</span> <span class="n">hs</span> <span class="n">hf</span> <span class="n">h_inj</span> <span class="n">g</span> <div class="highlight-lean notranslate"><div class="highlight"><pre><span></span><span class="kd">example</span><span class="w"> </span><span class="o">{</span><span class="n">E</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span><span class="w"> </span><span class="o">[</span><span class="n">NormedAddCommGroup</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">NormedSpace</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">FiniteDimensional</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="n">E</span><span class="o">]</span> <span class="w"> </span><span class="o">[</span><span class="n">MeasurableSpace</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">BorelSpace</span><span class="w"> </span><span class="n">E</span><span class="o">]</span><span class="w"> </span><span class="o">(</span><span class="n">μ</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Measure</span><span class="w"> </span><span class="n">E</span><span class="o">)</span><span class="w"> </span><span class="o">[</span><span class="n">μ.IsAddHaarMeasure</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">F</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">Type</span><span class="bp">*</span><span class="o">}</span> <span class="w"> </span><span class="o">[</span><span class="n">NormedAddCommGroup</span><span class="w"> </span><span class="n">F</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">NormedSpace</span><span class="w"> </span><span class="n">ℝ</span><span class="w"> </span><span class="n">F</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">CompleteSpace</span><span class="w"> </span><span class="n">F</span><span class="o">]</span><span class="w"> </span><span class="o">{</span><span class="n">s</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">Set</span><span class="w"> </span><span class="n">E</span><span class="o">}</span><span class="w"> </span><span class="o">{</span><span class="n">f</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">E</span><span class="o">}</span> <span class="w"> </span><span class="o">{</span><span class="n">f'</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="n">L</span><span class="o">[</span><span class="n">ℝ</span><span class="o">]</span><span class="w"> </span><span class="n">E</span><span class="o">}</span><span class="w"> </span><span class="o">(</span><span class="n">hs</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">MeasurableSet</span><span class="w"> </span><span class="n">s</span><span class="o">)</span> <span class="w"> </span><span class="o">(</span><span class="n">hf</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="bp">∀</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="o">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∈</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">HasFDerivWithinAt</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">(</span><span class="n">f'</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">h_inj</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">InjOn</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">s</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="n">g</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="bp">→</span><span class="w"> </span><span class="n">F</span><span class="o">)</span><span class="w"> </span><span class="o">:</span> <span class="w"> </span><span class="bp">∫</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="bp">''</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="bp">∂</span><span class="n">μ</span><span class="w"> </span><span class="bp">=</span><span class="w"> </span><span class="bp">∫</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">s</span><span class="o">,</span><span class="w"> </span><span class="bp">|</span><span class="o">(</span><span class="n">f'</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="bp">.</span><span class="n">det</span><span class="bp">|</span><span class="w"> </span><span class="bp">•</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="o">(</span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="o">)</span><span class="w"> </span><span class="bp">∂</span><span class="n">μ</span><span class="w"> </span><span class="o">:=</span> <span class="w"> </span><span class="n">integral_image_eq_integral_abs_det_fderiv_smul</span><span class="w"> </span><span class="n">μ</span><span class="w"> </span><span class="n">hs</span><span class="w"> </span><span class="n">hf</span><span class="w"> </span><span class="n">h_inj</span><span class="w"> </span><span class="n">g</span> </pre></div> </div> </section>
-
-
-
@@ -4,7 +4,7 @@* * Sphinx stylesheet -- basic theme. * * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */
-
-
-
@@ -4,7 +4,7 @@* * Base JavaScript utilities for all Sphinx HTML documentation. * * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */
-
-
-
@@ -5,7 +5,7 @@* This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. * * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */
-
@@ -13,7 +13,7 @@var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; /* Non-minified version is copied as a separate JS file, is available */ /* Non-minified version is copied as a separate JS file, if available */ /** * Porter Stemmer
-
-
-
@@ -4,7 +4,7 @@* * Sphinx JavaScript utilities for the full-text search. * * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */
-
@@ -99,7 +99,7 @@ const _displayItem = (item, searchTerms, highlightTerms) => {.then((data) => { if (data) listItem.appendChild( Search.makeSearchSummary(data, searchTerms) Search.makeSearchSummary(data, searchTerms, anchor) ); // highlight search terms in the summary if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
-
@@ -116,8 +116,8 @@ const _finishSearch = (resultCount) => {); else Search.status.innerText = _( `Search finished, found ${resultCount} page(s) matching the search query.` ); "Search finished, found ${resultCount} page(s) matching the search query." ).replace('${resultCount}', resultCount); }; const _displayNextItem = ( results,
-
@@ -137,6 +137,22 @@ const _displayNextItem = (// search finished, update title and status message else _finishSearch(resultCount); }; // Helper function used by query() to order search results. // Each input is an array of [docname, title, anchor, descr, score, filename]. // Order the results by score (in opposite order of appearance, since the // `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. const _orderResultsByScoreThenName = (a, b) => { const leftScore = a[4]; const rightScore = b[4]; if (leftScore === rightScore) { // same score: sort alphabetically const leftTitle = a[1].toLowerCase(); const rightTitle = b[1].toLowerCase(); if (leftTitle === rightTitle) return 0; return leftTitle > rightTitle ? -1 : 1; // inverted is intentional } return leftScore > rightScore ? 1 : -1; }; /** * Default splitQuery function. Can be overridden in ``sphinx.search`` with a
-
@@ -160,13 +176,26 @@ const Search = {_queued_query: null, _pulse_status: -1, htmlToText: (htmlString) => { htmlToText: (htmlString, anchor) => { const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); for (const removalQuery of [".headerlink", "script", "style"]) { htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); } if (anchor) { const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); if (anchorContent) return anchorContent.textContent; console.warn( `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` ); } // if anchor not specified or not found, fall back to main content const docContent = htmlElement.querySelector('[role="main"]'); if (docContent !== undefined) return docContent.textContent; if (docContent) return docContent.textContent; console.warn( "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." ); return ""; },
-
@@ -239,16 +268,7 @@ const Search = {else Search.deferQuery(query); }, /** * execute search (requires search index to be loaded) */ query: (query) => { const filenames = Search._index.filenames; const docNames = Search._index.docnames; const titles = Search._index.titles; const allTitles = Search._index.alltitles; const indexEntries = Search._index.indexentries; _parseQuery: (query) => { // stem the search terms and add them to the correct list const stemmer = new Stemmer(); const searchTerms = new Set();
-
@@ -284,21 +304,38 @@ const Search = {// console.info("required: ", [...searchTerms]); // console.info("excluded: ", [...excludedTerms]); // array of [docname, title, anchor, descr, score, filename] let results = []; return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; }, /** * execute search (requires search index to be loaded) */ _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { const filenames = Search._index.filenames; const docNames = Search._index.docnames; const titles = Search._index.titles; const allTitles = Search._index.alltitles; const indexEntries = Search._index.indexentries; // Collect multiple result groups to be sorted separately and then ordered. // Each is an array of [docname, title, anchor, descr, score, filename]. const normalResults = []; const nonMainIndexResults = []; _removeChildren(document.getElementById("search-progress")); const queryLower = query.toLowerCase(); const queryLower = query.toLowerCase().trim(); for (const [title, foundTitles] of Object.entries(allTitles)) { if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { for (const [file, id] of foundTitles) { let score = Math.round(100 * queryLower.length / title.length) results.push([ const score = Math.round(Scorer.title * queryLower.length / title.length); const boost = titles[file] === title ? 1 : 0; // add a boost for document titles normalResults.push([ docNames[file], titles[file] !== title ? `${titles[file]} > ${title}` : title, id !== null ? "#" + id : "", null, score, score + boost, filenames[file], ]); }
-
@@ -308,46 +345,47 @@ const Search = {// search for explicit entries in index directives for (const [entry, foundEntries] of Object.entries(indexEntries)) { if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { for (const [file, id] of foundEntries) { let score = Math.round(100 * queryLower.length / entry.length) results.push([ for (const [file, id, isMain] of foundEntries) { const score = Math.round(100 * queryLower.length / entry.length); const result = [ docNames[file], titles[file], id ? "#" + id : "", null, score, filenames[file], ]); ]; if (isMain) { normalResults.push(result); } else { nonMainIndexResults.push(result); } } } } // lookup as object objectTerms.forEach((term) => results.push(...Search.performObjectSearch(term, objectTerms)) normalResults.push(...Search.performObjectSearch(term, objectTerms)) ); // lookup as search terms in fulltext results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); // let the scorer override scores with a custom scoring function if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); // now sort the results by score (in opposite order of appearance, since the // display function below uses pop() to retrieve items) and then // alphabetically results.sort((a, b) => { const leftScore = a[4]; const rightScore = b[4]; if (leftScore === rightScore) { // same score: sort alphabetically const leftTitle = a[1].toLowerCase(); const rightTitle = b[1].toLowerCase(); if (leftTitle === rightTitle) return 0; return leftTitle > rightTitle ? -1 : 1; // inverted is intentional } return leftScore > rightScore ? 1 : -1; }); if (Scorer.score) { normalResults.forEach((item) => (item[4] = Scorer.score(item))); nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); } // Sort each group of results by score and then alphabetically by name. normalResults.sort(_orderResultsByScoreThenName); nonMainIndexResults.sort(_orderResultsByScoreThenName); // Combine the result groups in (reverse) order. // Non-main index entries are typically arbitrary cross-references, // so display them after other results. let results = [...nonMainIndexResults, ...normalResults]; // remove duplicate search results // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
-
@@ -361,7 +399,12 @@ const Search = {return acc; }, []); results = results.reverse(); return results.reverse(); }, query: (query) => { const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); // for debugging //Search.lastresults = results.slice(); // a copy
-
@@ -466,14 +509,18 @@ const Search = {// add support for partial matches if (word.length > 2) { const escapedWord = _escapeRegExp(word); Object.keys(terms).forEach((term) => { if (term.match(escapedWord) && !terms[word]) arr.push({ files: terms[term], score: Scorer.partialTerm }); }); Object.keys(titleTerms).forEach((term) => { if (term.match(escapedWord) && !titleTerms[word]) arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); }); if (!terms.hasOwnProperty(word)) { Object.keys(terms).forEach((term) => { if (term.match(escapedWord)) arr.push({ files: terms[term], score: Scorer.partialTerm }); }); } if (!titleTerms.hasOwnProperty(word)) { Object.keys(titleTerms).forEach((term) => { if (term.match(escapedWord)) arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); }); } } // no match but word was a required one
-
@@ -496,9 +543,8 @@ const Search = {// create the mapping files.forEach((file) => { if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); else fileMap.set(file, [word]); if (!fileMap.has(file)) fileMap.set(file, [word]); else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); }); });
-
@@ -549,8 +595,8 @@ const Search = {* search summary for a given text. keywords is a list * of stemmed words. */ makeSearchSummary: (htmlText, keywords) => { const text = Search.htmlToText(htmlText); makeSearchSummary: (htmlText, keywords, anchor) => { const text = Search.htmlToText(htmlText, anchor); if (text === "") return null; const textLower = text.toLowerCase();
-
-
-
@@ -17,7 +17,7 @@<script src="_static/jquery.js?v=5d32c60e"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/documentation_options.js?v=2709fde1"></script> <script src="_static/doctools.js?v=888ff710"></script> <script src="_static/doctools.js?v=9a2dae69"></script> <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script src="_static/js/theme.js"></script> <link rel="index" title="Index" href="#" />
-
-
-
@@ -18,8 +18,9 @@<script src="_static/jquery.js?v=5d32c60e"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/documentation_options.js?v=2709fde1"></script> <script src="_static/doctools.js?v=888ff710"></script> <script src="_static/doctools.js?v=9a2dae69"></script> <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> <script src="_static/js/theme.js"></script> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" />
-
-
-
@@ -18,7 +18,7 @@<script src="_static/jquery.js?v=5d32c60e"></script> <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="_static/documentation_options.js?v=2709fde1"></script> <script src="_static/doctools.js?v=888ff710"></script> <script src="_static/doctools.js?v=9a2dae69"></script> <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script src="_static/js/theme.js"></script> <script src="_static/searchtools.js"></script>
-
-
-
@@ -1,1 +1,1 @@Search.setIndex({"docnames": ["C01_Introduction", "C02_Basics", "C03_Logic", "C04_Sets_and_Functions", "C05_Elementary_Number_Theory", "C06_Structures", "C07_Hierarchies", "C08_Groups_and_Rings", "C09_Topology", "C10_Differential_Calculus", "C11_Integration_and_Measure_Theory", "genindex", "index"], "filenames": ["C01_Introduction.rst", "C02_Basics.rst", "C03_Logic.rst", "C04_Sets_and_Functions.rst", "C05_Elementary_Number_Theory.rst", "C06_Structures.rst", "C07_Hierarchies.rst", "C08_Groups_and_Rings.rst", "C09_Topology.rst", "C10_Differential_Calculus.rst", "C11_Integration_and_Measure_Theory.rst", "genindex.rst", "index.rst"], "titles": ["<span class=\"section-number\">1. </span>Introduction", "<span class=\"section-number\">2. </span>Basics", "<span class=\"section-number\">3. </span>Logic", "<span class=\"section-number\">4. </span>Sets and Functions", "<span class=\"section-number\">5. </span>Elementary Number Theory", "<span class=\"section-number\">6. </span>Structures", "<span class=\"section-number\">7. </span>Hierarchies", "<span class=\"section-number\">8. </span>Groups and Rings", "<span class=\"section-number\">9. </span>Topology", "<span class=\"section-number\">10. </span>Differential Calculus", "<span class=\"section-number\">11. </span>Integration and Measure Theory", "Index", "Mathematics in Lean"], "terms": {"The": [0, 1, 4, 5, 6, 7, 8, 9, 10, 12], "goal": [0, 1, 2, 3, 4, 5, 8], "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "book": [0, 2, 8], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "teach": 0, "you": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "formal": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "mathemat": [0, 1, 2, 3, 4, 5, 6, 7, 8], "us": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12], "lean": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "4": [0, 1, 2, 4, 5, 7, 8, 9], "interact": [0, 5, 6, 7, 10], "proof": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "assist": [0, 2, 5], "It": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "assum": [0, 1, 2, 3, 4, 6, 7, 8], "know": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "some": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "doe": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "requir": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "much": [0, 2, 4, 6, 7, 8, 9], "although": [0, 3, 4, 5, 6, 7, 8], "we": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "cover": [0, 1, 3, 6, 7, 8, 9], "exampl": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12], "rang": [0, 2, 3, 4, 7, 8], "from": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "number": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12], "theori": [0, 1, 2, 3, 6, 7, 8, 9, 12], "measur": [0, 5, 8, 9, 12], "analysi": [0, 5, 9], "focu": [0, 1, 7, 8, 10], "elementari": [0, 3, 5, 7, 8, 12], "aspect": [0, 5, 7], "those": [0, 1, 2, 3, 5, 6, 7, 8, 9], "field": [0, 1, 5, 6, 7, 9], "hope": [0, 1], "thei": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "ar": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "familiar": [0, 1, 4, 5, 8, 9], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "pick": [0, 6], "them": [0, 1, 2, 3, 4, 5, 6, 7, 8], "up": [0, 2, 3, 4, 5, 6, 7, 8], "go": [0, 1, 2, 3, 4, 6, 8], "also": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "don": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "t": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "presuppos": 0, "ani": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "background": [0, 7], "method": [0, 2, 3, 4, 5], "seen": [0, 1, 2, 4, 5, 6, 7, 8], "kind": [0, 1, 6, 8], "comput": [0, 2, 3, 4, 5, 7, 9, 10], "program": [0, 1, 2], "write": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10], "definit": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "theorem": [0, 2, 4, 5, 7, 8, 9, 10, 12], "regiment": 0, "languag": [0, 1, 2, 3], "like": [0, 1, 2, 3, 4, 5, 6, 7, 8], "understand": [0, 2, 3, 4, 5, 6, 7, 8], "In": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "return": [0, 2, 3, 4, 5, 7, 8], "provid": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "feedback": 0, "inform": [0, 1, 2, 3, 5, 6, 8], "interpret": [0, 1, 4, 5, 7, 8], "express": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "guarante": [0, 3, 5], "well": [0, 1, 2, 3, 4, 5, 6, 7, 8], "form": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "ultim": 0, "certifi": 0, "correct": [0, 1, 7], "our": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "learn": [0, 1, 4, 5], "more": [0, 2, 3, 4, 5, 6, 7, 8, 9, 12], "about": [0, 2, 3, 4, 5, 6, 7, 8, 9, 12], "project": [0, 4, 5, 7, 8], "page": [0, 1, 4], "commun": [0, 4], "web": [0, 1, 4], "tutori": 0, "base": [0, 2, 3, 4, 6, 7, 8, 9], "": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "larg": [0, 6, 8], "ever": [0, 8], "grow": [0, 6, 7], "librari": [0, 1, 2, 3, 4, 5, 7, 8, 9], "mathlib": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "strongli": 0, "recommend": [0, 1, 3], "join": [0, 1, 5], "zulip": [0, 4], "onlin": 0, "chat": 0, "group": [0, 1, 2, 3, 4, 5, 6, 8, 9, 12], "haven": [0, 2, 6, 8], "alreadi": [0, 1, 2, 3, 4, 5, 6, 7, 8], "ll": [0, 2, 4, 6, 8], "find": [0, 1, 2, 4, 5, 6, 8], "live": [0, 5], "welcom": [0, 1], "enthusiast": 0, "happi": 0, "answer": [0, 5, 8], "question": [0, 4, 6, 8, 10], "offer": [0, 2, 5, 8], "moral": [0, 5, 7], "support": [0, 1, 2, 3, 4, 5, 6, 8], "read": [0, 1, 4, 5, 6, 7, 8], "pdf": 0, "html": 0, "version": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "design": [0, 1, 2, 3, 5, 7, 8], "run": 0, "insid": [0, 1, 2, 3, 7], "v": [0, 1, 2, 3, 5, 8], "code": [0, 1, 2, 3, 5, 6], "editor": [0, 1], "To": [0, 1, 2, 3, 4, 5, 6, 7, 8], "instal": [0, 6], "follow": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "instruct": [0, 1, 2, 8], "make": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "sure": [0, 1, 2, 3, 5, 6, 7], "have": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "git": 0, "fetch": 0, "mathematics_in_lean": 0, "repositori": [0, 1], "open": [0, 1, 2, 3, 4, 5, 7, 9, 10], "each": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "section": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "ha": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "an": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "associ": [0, 1, 2, 4, 5, 6, 7, 8, 10], "file": [0, 1, 4, 5, 6, 7, 8], "exercis": [0, 1, 2, 3, 5, 6, 7, 8, 9], "folder": 0, "mil": 0, "organ": 0, "chapter": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "copi": [0, 3, 4, 6, 7, 8], "experi": [0, 1, 8], "do": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "leav": [0, 1, 2, 3, 5, 6, 7], "origin": [0, 1, 5, 7], "intact": 0, "easier": [0, 1, 3, 4, 6, 8], "updat": 0, "chang": [0, 1, 2, 4, 5, 8, 10], "see": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "below": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10], "call": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "my_fil": 0, "whatev": [0, 2, 4], "want": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "creat": [0, 1, 4, 6], "your": [0, 1, 2, 3, 5, 6, 7, 8], "own": [0, 1, 4, 5, 6], "At": [0, 1, 2, 4, 5, 6], "point": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10], "textbook": [0, 1, 2], "side": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "panel": 0, "type": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "ctrl": [0, 1, 2, 4, 5], "shift": [0, 1, 6, 8], "p": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "command": [0, 1, 2, 3, 4, 5, 6, 7], "maco": 0, "doc": 0, "show": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "document": [0, 1, 3, 4, 6], "resourc": 0, "bar": [0, 1, 2], "appear": [0, 1, 2, 5, 6, 7, 8], "press": 0, "select": [0, 8], "soon": [0, 2, 6, 7, 8], "highlight": [0, 2], "menu": [0, 1], "window": [0, 1, 2, 5], "click": [0, 1, 3, 4, 5, 6], "altern": [0, 1, 2, 3, 4, 5, 6, 8], "cloud": 0, "gitpod": 0, "how": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "github": [0, 1], "still": [0, 1, 2, 3, 4, 5, 6, 8, 10], "work": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "describ": [0, 1, 2, 3, 4, 5, 6, 8], "abov": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "progress": [0, 1, 5, 7], "pull": [0, 7, 8], "lake": 0, "ex": [0, 2], "cach": 0, "content": [0, 1, 2, 4, 8], "which": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "why": [0, 2, 4, 6, 7, 8], "suggest": [0, 2, 4, 5, 8], "intend": [0, 1, 2, 5], "while": [0, 1, 2, 6, 7, 8], "contain": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10], "explan": [0, 7, 8], "hint": [0, 1, 2, 10], "text": [0, 3, 5, 8], "often": [0, 1, 2, 3, 4, 5, 6, 7, 8], "includ": [0, 1, 2, 3, 4, 6, 7, 8, 9], "one": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "eval": [0, 7], "hello": 0, "world": 0, "should": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "abl": [0, 1, 2, 3, 4, 5, 6, 7, 9], "correspond": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "If": [0, 1, 2, 3, 4, 5, 6, 8], "line": [0, 1, 2, 3, 4, 6, 7], "hover": [0, 1, 2, 3, 4, 5], "cursor": [0, 1, 2], "over": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "respons": [0, 1], "pop": 0, "encourag": [0, 1, 2, 3, 4, 5], "edit": 0, "try": [0, 1, 2, 3, 4, 5, 6, 8], "moreov": [0, 1, 4, 5, 8], "lot": [0, 1, 3, 5, 6, 7, 8], "challeng": [0, 1, 2, 3, 5, 9], "rush": 0, "past": [0, 1, 7], "just": [0, 1, 2, 3, 4, 5, 6, 7, 8], "through": [0, 1, 3, 4, 5, 6, 7, 8], "central": [0, 4], "all": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "when": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "feel": [0, 1, 2, 6, 8], "comfort": 0, "master": [0, 1, 4], "relev": [0, 1, 2, 4, 5, 6, 7, 8], "skill": [0, 1, 2, 3, 4], "free": [0, 1, 7, 8], "move": [0, 1, 2, 6, 8], "alwai": [0, 1, 2, 3, 5, 6, 7], "compar": [0, 5, 6, 8], "solut": [0, 1, 4, 6], "ones": [0, 1, 2, 3, 5, 10], "put": [0, 1, 2, 3, 4, 5, 6, 7, 8], "simpli": [0, 1, 2, 3, 4, 5, 6, 7, 8], "tool": [0, 1, 5, 6], "build": [0, 2, 4, 6, 7, 8, 12], "complex": [0, 1, 2, 4, 5, 7, 9, 10], "known": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "depend": [0, 2, 3, 4, 5, 6, 7, 8], "everi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "check": [0, 1, 2, 3, 4, 5, 6, 7, 8], "print": [0, 3, 4, 5, 10], "\u2115": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "These": [0, 1, 3, 4, 5, 7, 9, 10], "object": [0, 1, 2, 3, 4, 5, 7, 12], "2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "def": [0, 2, 3, 4, 5, 6, 7, 8], "f": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "3": [0, 1, 2, 3, 4, 5, 6, 7, 8], "prop": [0, 2, 3, 4, 5, 6, 7, 8, 10], "statement": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "fermatlasttheorem": 0, "y": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "z": [0, 1, 2, 5, 6, 7, 8, 9, 10], "n": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "0": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "where": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "itself": [0, 2, 3, 5, 6, 7, 8, 9], "Such": [0, 1, 2, 6], "proposit": [0, 2, 3, 4, 5], "easi": [0, 4, 5, 6, 7, 8], "rfl": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "hard": [0, 1, 3, 5, 6, 7], "sorri": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "manag": [0, 1, 4, 5, 8], "construct": [0, 2, 3, 4, 5, 6, 7, 8], "accept": [0, 1, 2, 8], "term": [0, 1, 2, 3, 4, 5, 7, 8], "done": [0, 2, 3, 4, 6, 7, 8], "someth": [0, 1, 2, 4, 6, 8], "veri": [0, 2, 4, 6, 7, 8, 10], "impress": 0, "cheat": [0, 1], "so": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "now": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "game": [0, 6], "left": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "rule": [0, 2, 4, 5, 6, 8], "complementari": 0, "companion": [0, 1], "prove": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12], "thorough": 0, "underli": [0, 1, 5, 6, 7], "logic": [0, 1, 3, 4, 5, 7, 12], "framework": 0, "core": [0, 4, 5], "syntax": [0, 1, 2, 4, 6], "peopl": [0, 1], "who": [0, 8], "prefer": [0, 1, 2, 3], "user": [0, 6], "manual": [0, 3, 4], "befor": [0, 1, 2, 3, 4, 5, 6, 7], "new": [0, 1, 2, 3, 4, 5, 6, 7, 8], "dishwash": 0, "person": 0, "hit": [0, 1], "button": 0, "figur": [0, 1, 2, 5], "out": [0, 1, 2, 3, 4, 5, 6, 7, 8], "activ": 0, "potscrubb": 0, "featur": [0, 2, 4, 7], "later": [0, 1, 2, 4, 5, 6, 7, 8], "sens": [0, 2, 3, 4, 5, 6, 7, 8, 9], "here": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "refer": [0, 1, 2, 4, 5, 6, 8, 9], "back": [0, 1, 2, 5, 6, 7, 8], "necessari": [0, 2, 4, 5, 7], "anoth": [0, 1, 2, 3, 4, 5, 6, 7, 8], "thing": [0, 1, 2, 3, 4, 5, 6, 8], "distinguish": [0, 5, 6, 7, 8, 9], "place": [0, 1, 2, 5, 8], "greater": [0, 1, 2, 3, 4, 8], "emphasi": [0, 6], "tactic": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "given": [0, 1, 2, 3, 4, 5, 6, 7, 8], "two": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "wai": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "down": [0, 3, 4, 6, 8], "themselv": [0, 4, 5], "suitabl": [0, 1, 2, 5, 8], "descript": [0, 1, 2, 4, 8], "thereof": 0, "For": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "repres": [0, 1, 2, 3, 4, 5, 6, 9], "fact": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12], "even": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10], "m": [0, 1, 2, 4, 6, 7, 8, 9], "nat": [0, 1, 2, 3, 4, 5, 7, 8], "fun": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10], "k": [0, 2, 4, 5, 7, 8, 9], "hk": [0, 9], "hmn": 0, "rw": [0, 2, 3, 4, 5, 6, 7, 8, 12], "mul_add": [0, 1, 4, 6], "l": [0, 1, 9, 10], "_": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "compress": [0, 1, 8], "singl": [0, 1, 2, 3, 4, 5, 6, 7, 9], "instead": [0, 1, 2, 3, 4, 5, 6, 7, 8], "style": [0, 1], "same": [0, 1, 2, 3, 4, 5, 6, 7, 8], "comment": [0, 4], "henc": [0, 2, 3, 4, 5, 6, 8, 9], "ignor": [0, 5, 7, 8], "sai": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "natur": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "rintro": [0, 2, 3, 4, 7, 8], "need": [0, 1, 2, 3, 4, 5, 6, 7, 8], "twice": [0, 1, 8], "let": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "substitut": [0, 2], "obviou": [0, 4, 5, 6], "ring": [0, 1, 2, 3, 4, 5, 6, 12], "As": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "enter": [0, 1, 2, 3, 7, 8], "displai": [0, 1, 2, 6], "state": [0, 1, 2, 3, 4, 6, 7, 8, 9], "separ": [0, 1, 2, 4, 5], "tell": [0, 2, 3, 4, 5, 6, 7], "what": [0, 1, 2, 3, 4, 5, 6, 7, 8], "establish": [0, 1, 2, 3, 4, 5], "task": [0, 2, 4, 5, 6, 8], "remain": [0, 1, 2, 3, 5, 6, 8], "replai": 0, "step": [0, 1, 2, 3, 4, 5, 6], "sinc": [0, 1, 2, 3, 4, 5, 6, 7, 8], "continu": [0, 1, 4, 5, 6, 10], "first": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "introduc": [0, 1, 2, 3, 4, 8, 10], "could": [0, 1, 2, 4, 5, 6, 7, 8], "renam": 0, "decompos": [0, 3], "hypothesi": [0, 1, 2, 3, 4], "assumpt": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10], "second": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "declar": [0, 1, 4, 5, 6, 7], "next": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "rewrit": [0, 1, 2, 3, 4, 5, 6, 8], "replac": [0, 1, 2, 3, 4, 6, 7], "solv": [0, 1, 2, 3, 4, 5, 6, 8], "result": [0, 1, 2, 3, 4, 5, 6, 7, 8], "abil": 0, "small": [0, 2, 4, 5, 8], "increment": [0, 1], "extrem": [0, 6, 8], "power": [0, 1, 3, 4, 5, 6], "reason": [0, 1, 2, 4, 5, 6, 7, 8], "quicker": 0, "than": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "There": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10], "isn": [0, 2, 3, 4, 6], "sharp": 0, "distinct": [0, 2, 3, 4, 5, 8], "between": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "insert": [0, 2, 4, 5, 7, 8, 9], "did": [0, 2, 6, 8], "phrase": [0, 1, 2, 4, 5], "convers": [0, 2, 4, 7, 8], "short": [0, 1, 2, 3, 4, 5], "middl": [0, 1, 2, 8], "That": [0, 4, 5, 6], "said": [0, 2, 4, 5], "reduc": [0, 2, 3, 4, 5], "liner": 0, "carri": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "But": [0, 1, 2, 3, 4, 5, 6, 7, 8], "substanti": 0, "autom": [0, 1, 5], "justifi": [0, 1, 2, 8], "longer": [0, 4, 5], "calcul": [0, 2, 4, 5, 12], "bigger": [0, 3, 9], "inferenti": 0, "invok": [0, 1, 8], "simplifi": [0, 2, 3, 4, 5, 8, 10], "specif": [0, 1, 3, 4, 5, 6], "pariti": 0, "automat": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "intro": [0, 1, 2, 3, 4, 5, 6, 7, 8], "simp": [0, 2, 3, 4, 5, 6, 7, 8, 9], "parity_simp": 0, "big": [0, 5, 7, 8, 9], "differ": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "onli": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "its": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "built": [0, 2, 6, 7], "wherea": [0, 1, 2, 3, 5, 7, 8], "top": [0, 6, 7, 8, 9], "meant": [0, 2, 6], "complet": [0, 1, 2, 3, 4, 6, 7, 9], "extens": [0, 1, 6, 8, 9], "rather": [0, 1, 2, 4, 5, 6, 7, 8], "think": [0, 1, 2, 3, 4, 5, 6, 8, 9], "basic": [0, 2, 4, 5, 8, 10, 12], "entri": [0, 5, 7], "brows": [0, 1, 4, 7], "frustrat": [0, 6], "curv": 0, "steep": 0, "newcom": 0, "avail": [0, 1, 2, 4, 5, 6, 7], "round": [0, 1, 5], "clock": 0, "doubt": 0, "enough": [0, 1, 2, 3, 4, 6, 7, 8], "too": [0, 1, 3, 5, 6, 7, 8], "contribut": [0, 3], "develop": [0, 1, 4, 7, 10], "mission": 0, "choos": [0, 2, 3, 4, 5, 6, 7, 8], "dive": 0, "come": [0, 1, 2, 3, 4, 5, 6, 7, 8], "forewarn": 0, "fundament": [0, 4, 5, 6, 10], "life": [0, 2], "mai": [0, 1, 2, 3, 5, 6, 7, 8, 9], "never": [0, 6], "acknowledg": 0, "grate": [0, 5], "gabriel": 0, "ebner": 0, "set": [0, 1, 2, 4, 5, 6, 7, 9, 10, 12], "infrastructur": 0, "scott": 0, "morrison": 0, "mario": 0, "carneiro": 0, "help": [0, 1, 2, 3, 4, 5, 6, 8], "port": 0, "takeshi": 0, "ab": [0, 2, 5, 7], "julian": 0, "berman": 0, "alex": 0, "best": 0, "thoma": 0, "brown": 0, "bulwi": 0, "cha": 0, "hanson": 0, "char": 0, "bryan": 0, "gin": 0, "ge": [0, 2, 5], "chen": 0, "steven": 0, "clontz": 0, "mauricio": 0, "collari": 0, "johan": 0, "commelin": 0, "mark": [0, 1, 2, 6, 8], "czubin": 0, "alexandru": 0, "duca": 0, "pierpaolo": 0, "frasa": 0, "deni": 0, "gorbachev": 0, "winston": 0, "de": 0, "greef": 0, "marc": 0, "huisinga": 0, "mathieu": 0, "guai": 0, "paquet": 0, "k\u00fclshammer": 0, "victor": 0, "liu": 0, "jimmi": 0, "lu": 0, "martin": 0, "c": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10], "giovanni": 0, "mascellani": 0, "john": 0, "mcdowel": 0, "isaiah": 0, "mindich": 0, "hunter": 0, "monro": 0, "pietro": 0, "monticon": 0, "oliv": 0, "nash": 0, "emanuel": 0, "natal": 0, "pim": 0, "ott": 0, "bartosz": 0, "piotrowski": 0, "nicola": 0, "rolland": 0, "keith": 0, "yannick": 0, "seurin": 0, "guilherm": 0, "silva": 0, "pedro": 0, "s\u00e1nchez": 0, "terraf": 0, "matthew": 0, "toohei": 0, "flori": 0, "van": 0, "doorn": 0, "eric": 0, "wieser": 0, "other": [0, 1, 2, 3, 4, 5, 6, 7, 8], "been": [0, 1, 2, 4, 5, 6, 9], "partial": [0, 1, 2, 3, 5, 6, 7], "hoskinson": 0, "center": [0, 8], "nut": 1, "bolt": 1, "gener": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "without": [1, 2, 4, 5, 6, 7, 8, 9], "u": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "net": 1, "hand": [1, 2, 3, 4, 5, 6, 8], "equal": [1, 2, 3, 4, 5, 6, 7, 8, 10], "right": [1, 2, 3, 4, 5, 6, 8, 9], "tantamount": [1, 3], "name": [1, 2, 3, 4, 5, 6, 7, 8, 9], "b": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "real": [1, 2, 3, 4, 5, 6, 8, 9, 10], "mul_assoc": [1, 2, 4, 5, 6, 7], "mul_comm": [1, 2, 4, 5, 6, 7], "elimin": 1, "explicitli": [1, 2, 3, 5, 6, 7, 8, 9], "purpos": [1, 2, 3, 4, 5, 6, 8], "illustr": [1, 2, 3, 4, 5, 7], "multipl": [1, 2, 3, 4, 5, 6, 7, 9], "written": [1, 2, 3, 4, 5, 6, 7, 8, 9], "howev": [1, 2, 5, 6, 7, 8, 9], "good": [1, 2, 3, 4, 5, 6, 7, 8], "mind": [1, 2, 5, 6, 7], "notat": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "convent": [1, 5, 7, 10], "parenthes": [1, 2, 3, 4], "\u211d": [1, 2, 3, 5, 6, 7, 8, 9, 10], "import": [1, 2, 3, 4, 5, 6, 7, 8, 10], "begin": [1, 2, 3, 4, 5, 6], "sake": [1, 4], "breviti": [1, 5], "suppress": 1, "happen": [1, 6, 8], "charact": [1, 3, 6], "r": [1, 2, 4, 5, 6, 7, 8], "symbol": [1, 2, 5, 6, 7], "doesn": [1, 2, 7, 8], "until": [1, 4, 6, 8], "space": [1, 2, 3, 5, 6, 7, 10, 12], "tab": [1, 3, 4], "kei": [1, 4, 5, 7, 8], "curiou": [1, 6], "abbrevi": [1, 2, 3, 5], "get": [1, 2, 3, 4, 6, 7, 8, 9, 12], "access": [1, 3, 5, 6, 7, 8, 10], "keyboard": 1, "easili": [1, 4, 5, 6, 7], "backslash": [1, 3], "lead": [1, 2, 4, 5, 6, 7, 8], "lean4": 1, "input": [1, 3, 8], "leader": 1, "report": 1, "current": [1, 2, 5, 6], "infoview": [1, 6], "A": [1, 2, 3, 4, 5, 6, 7, 8, 9], "typic": [1, 7], "might": [1, 2, 3, 4, 5, 7], "look": [1, 2, 3, 4, 6, 7, 8], "1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "h\u2081": [1, 2, 3, 4], "prime": [1, 2, 3, 5, 6, 7, 12], "h\u2082": [1, 3, 4], "h\u2083": [1, 3], "denot": [1, 3, 4, 6, 7, 8], "context": [1, 2, 4, 5, 6, 7, 8, 9, 10], "plai": [1, 3, 4, 6, 7, 8], "three": [1, 2, 4, 5, 7, 8], "label": [1, 2], "everyth": [1, 2, 6, 8], "identifi": [1, 2, 4], "subscript": 1, "h": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "legal": 1, "would": [1, 2, 3, 4, 5, 6, 7, 8, 9], "h1": [1, 2, 3, 4, 5], "h2": [1, 2, 3, 5], "h3": 1, "foo": [1, 5], "baz": 1, "last": [1, 2, 3, 4, 5, 6, 7, 8], "sometim": [1, 2, 3, 4, 5, 6, 7, 8], "target": [1, 6, 7, 8, 10], "combin": [1, 2, 5, 6, 7, 8], "practic": [1, 2, 3, 6, 7, 8], "mean": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "usual": [1, 2, 3, 4, 5, 7, 8, 10], "clear": [1, 2, 4, 5, 6], "case": [1, 2, 3, 4, 5, 6, 7, 8, 10], "With": [1, 3, 4, 6, 8], "arrow": [1, 2, 6, 8], "revers": [1, 2, 3, 5, 8], "note": [1, 2, 4, 5, 6, 7, 8, 10], "noth": [1, 2, 3, 4, 5, 6, 7], "argument": [1, 2, 3, 4, 5, 6, 7, 8], "tri": [1, 2, 4, 6], "match": [1, 2, 5], "pattern": [1, 2, 3, 5, 6], "local": [1, 2, 6, 8, 9], "d": [1, 2, 4, 5, 7, 9], "e": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "sub_self": [1, 2], "hyp": 1, "list": [1, 2, 3, 4, 5], "comma": 1, "squar": [1, 2, 4, 5, 6, 7], "bracket": [1, 2, 5, 6, 7], "after": [1, 2, 4, 6, 8, 9], "trick": [1, 2, 4, 6, 9], "variabl": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "onc": [1, 2, 3, 4, 5, 6, 7, 8, 10], "outsid": [1, 4], "inspect": 1, "reveal": 1, "inde": [1, 5, 6, 7, 8, 9], "delimit": 1, "scope": [1, 2, 3, 5, 7], "end": [1, 2, 3, 4, 5, 6, 7, 8, 9], "block": [1, 4, 7], "final": [1, 2, 3, 5, 7, 8, 10], "recal": [1, 2, 4, 5, 7, 8, 10], "introduct": [1, 2, 7, 8, 12], "determin": [1, 5, 7, 8], "both": [1, 2, 3, 4, 5, 6, 7, 8, 9], "expect": [1, 2, 3, 4, 5, 6, 7, 8], "rais": [1, 4], "error": [1, 2, 3, 6], "explain": [1, 2, 3, 4, 5, 6, 7, 8, 10], "output": [1, 7], "meanwhil": [1, 4], "take": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "two_mul": 1, "add_mul": [1, 6], "distribut": [1, 4, 5, 6], "addit": [1, 2, 4, 5, 6, 7, 8, 9, 10], "add_assoc": [1, 4, 5, 6], "precis": [1, 3, 7, 8, 9], "possibl": [1, 2, 3, 4, 5, 7, 8], "calc": [1, 2, 3, 5, 7, 8], "keyword": [1, 2, 4, 5], "notic": [1, 2, 3, 4, 5, 7, 8], "finicki": 1, "underscor": [1, 2, 3], "justif": [1, 2], "format": 1, "indic": [1, 2, 3, 5, 6], "indent": 1, "One": [1, 2, 3, 4, 5, 6, 7, 8], "outlin": [1, 2, 4, 8], "modulo": [1, 4, 5], "individu": 1, "pure": [1, 8], "littl": [1, 2, 8, 9], "underneath": [1, 3], "pow_two": [1, 4], "mul_sub": 1, "add_sub": 1, "sub_sub": 1, "add_zero": [1, 5, 6], "perform": [1, 2, 3], "exact": [1, 2, 3, 4, 5, 7, 8], "becaus": [1, 2, 3, 4, 5, 6, 7, 8, 9], "exactli": [1, 2, 3, 5, 6, 7, 8], "close": [1, 2, 3, 6, 7, 9, 10], "bit": [1, 2, 4, 6, 7, 8], "commut": [1, 2, 3, 4, 5, 6, 7, 9], "long": [1, 2, 3, 5, 6, 7, 9], "axiom": [1, 2, 3, 5, 6, 7, 8, 10], "indirectli": 1, "data": [1, 2, 4, 5, 6, 8], "similar": [1, 2, 3, 5, 6, 7, 8], "common": [1, 2, 3, 4, 5, 7, 8], "variat": [1, 3, 4, 5, 8, 9], "nth_rw": 1, "allow": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "particular": [1, 2, 5, 6, 7, 8], "instanc": [1, 2, 3, 4, 5, 6, 7, 8, 9], "enumer": [1, 2], "start": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12], "occurr": 1, "consist": [1, 3, 5, 6, 7, 8, 9], "collect": [1, 2, 3, 5, 8, 10], "oper": [1, 2, 3, 4, 5, 6, 7, 8, 9], "time": [1, 4, 5, 6, 8, 9, 10], "constant": [1, 2, 7, 10], "mapsto": [1, 5], "abelian": [1, 5, 6], "negat": [1, 5, 12], "invers": [1, 3, 5, 6, 7, 9, 10], "add_comm": [1, 4, 5, 6, 7], "zero_add": [1, 4, 5, 6], "add_left_neg": [1, 5], "mul_on": [1, 5, 6, 7], "one_mul": [1, 2, 5, 6], "being": [1, 3, 5, 7, 8, 9], "suffic": [1, 2, 3, 7, 8], "give": [1, 2, 3, 4, 6, 7, 8, 10], "element": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "concret": [1, 2, 4, 5, 6, 8], "integ": [1, 2, 4, 6, 7, 12], "abstract": [1, 2, 5, 6, 7, 8], "character": [1, 3, 4, 8, 9], "axiomat": [1, 2, 3, 5], "train": [1, 6], "recogn": [1, 2, 4, 5, 6, 8], "appropri": [1, 2, 3, 5, 6], "\u2124": [1, 4, 5, 6, 7], "ration": [1, 2, 4, 8], "\u211a": [1, 4, 7, 8], "\u2102": [1, 5, 7, 9], "extend": [1, 3, 4, 5, 6, 8, 10], "order": [1, 2, 3, 4, 5, 6, 8, 9], "Not": [1, 5, 8], "properti": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "hold": [1, 2, 3, 4, 5, 7, 8, 10], "arbitrari": [1, 2, 3, 4, 5, 7], "taken": [1, 2], "cours": [1, 2, 4, 6, 7, 8, 9, 10], "linear": [1, 2, 5, 7, 8], "matric": [1, 5, 7], "fail": [1, 2, 4, 5, 6, 8, 10], "commr": [1, 2, 5, 7], "unchang": [1, 2], "linarith": [1, 2, 4, 5], "permiss": 1, "strike": [1, 2], "balanc": 1, "concis": [1, 5, 7], "readabl": [1, 2, 3, 8], "strengthen": [1, 2, 4], "deriv": [1, 2, 4, 7, 9, 10], "most": [1, 2, 3, 4, 5, 6, 7, 8, 10], "organiz": 1, "mechan": [1, 2, 5], "namespac": [1, 2, 3, 4, 5, 7, 8], "full": [1, 2, 3, 4, 5, 6, 7, 8], "shorter": [1, 3, 4, 7, 8], "avoid": [1, 2, 3, 4, 5, 6, 7, 9], "due": [1, 6], "clash": 1, "myre": 1, "add_right_neg": 1, "effect": [1, 3, 6, 8], "temporarili": [1, 2], "reprov": [1, 7], "care": [1, 2, 3, 5], "earlier": [1, 7], "pai": [1, 2, 6, 7, 8], "attent": [1, 2, 4, 6, 7, 8], "curli": [1, 2], "implicit": [1, 2, 5, 6, 7, 8, 9], "moment": [1, 2, 5], "worri": [1, 3, 4, 5, 7], "neg_add_cancel_left": 1, "add_neg_cancel_right": 1, "add_left_cancel": 1, "add_right_cancel": 1, "plan": [1, 6, 8], "brace": 1, "imagin": 1, "situat": [1, 3, 6, 7, 8], "draw": [1, 5, 6], "conclus": [1, 2, 4], "hypothes": [1, 2, 3, 4, 5], "redund": [1, 5, 8, 10], "few": [1, 2, 3, 4, 8], "extra": [1, 2, 3, 5, 6, 7, 8], "oner": 1, "complic": [1, 2, 6, 7], "tediou": [1, 2, 6], "suppos": [1, 2, 3, 4, 5, 8], "infer": [1, 2, 3, 5, 6, 7], "mul_zero": [1, 5, 6], "serv": [1, 3, 4, 5, 10], "therefor": [1, 4, 5, 8], "promot": 1, "modular": 1, "subproof": 1, "wa": [1, 3, 7], "except": [1, 2, 5, 7], "ad": [1, 2, 3, 4, 5, 6, 8], "variant": [1, 2, 7, 8], "whose": [1, 2, 4, 5, 6, 7, 8, 9], "necessarili": [1, 10], "miss": [1, 3, 4], "piec": [1, 4, 5, 6, 7, 8], "either": [1, 2, 3, 5, 6, 8], "becom": [1, 4, 5, 6, 8], "technic": [1, 5, 6], "strictli": [1, 2, 9], "less": [1, 2, 3, 4, 5, 6, 7, 8], "script": 1, "slightli": [1, 6, 7, 8, 9], "clearer": [1, 3, 5], "human": 1, "reader": [1, 8], "maintain": 1, "evolv": 1, "rememb": [1, 2, 3, 4, 5, 6, 7, 8], "zero_mul": [1, 4, 5, 6], "By": [1, 3, 5, 6, 7], "neg_eq_of_add_eq_zero": 1, "eq_neg_of_add_eq_zero": 1, "neg_zero": 1, "neg_neg": 1, "had": [1, 6], "annot": [1, 2, 3, 4, 5, 6], "third": [1, 2, 3, 5, 8], "specifi": [1, 2, 3, 4, 5, 8, 9, 10], "imposs": 1, "default": [1, 2, 3, 4, 5, 6, 7, 9], "subtract": [1, 4, 5], "provabl": [1, 3, 6, 8], "sub_eq_add_neg": 1, "On": [1, 2, 3, 5, 6, 8, 10], "defin": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12], "reflex": [1, 2, 5], "present": [1, 2, 4, 7, 8], "forc": [1, 2, 3, 7], "unfold": [1, 2, 3, 4, 5, 8], "deal": [1, 2, 3, 4, 5, 8], "equat": [1, 2, 3, 4, 5], "interchang": 1, "self_sub": 1, "effort": [1, 4], "one_add_one_eq_two": 1, "norm_num": [1, 2, 4, 5], "strength": 1, "weaker": [1, 2], "notion": [1, 2, 3, 4, 5, 7, 8, 9, 10], "addgroup": [1, 5, 7], "otherwis": [1, 2, 3, 4, 5, 7], "addcommgroup": [1, 7], "commgroup": 1, "g": [1, 2, 3, 5, 6, 7, 8, 9, 10], "mul_left_inv": [1, 5], "\u00b9": [1, 3, 5, 6, 7, 8], "cocki": 1, "helper": 1, "along": [1, 4, 7, 8], "mul_right_inv": [1, 5], "mul_inv_rev": 1, "non": [1, 3, 6, 7, 8, 10], "abel": [1, 7], "noncomm_r": 1, "seem": [1, 2, 4, 6, 8, 9], "odd": [1, 2, 3, 4], "partli": [1, 6, 7], "histor": [1, 7], "conveni": [1, 2, 3, 5, 6, 7, 8], "great": [1, 5], "sort": [1, 3, 4], "inequ": [1, 2, 6, 8], "le": [1, 5, 6], "whenev": [1, 2, 4, 5], "consid": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "le_refl": [1, 2], "le_tran": [1, 2], "detail": [1, 2, 3, 4, 5, 6, 7], "unless": [1, 2, 5], "realli": [1, 2, 3, 4, 6, 7, 8], "insist": [1, 6], "discuss": [1, 2, 4, 5, 6, 7, 8, 9], "implic": [1, 8, 12], "h\u2080": [1, 2, 3, 4, 8], "dot": [1, 7, 8], "option": [1, 2, 4, 5, 6, 8], "within": [1, 2, 8], "visibl": 1, "must": [1, 5, 6, 8], "decreas": [1, 5], "fourth": [1, 2], "mode": [1, 2, 5], "entir": [1, 3, 5, 8, 9], "lt_of_le_of_lt": [1, 2], "lt_of_lt_of_l": 1, "lt_tran": [1, 2], "togeth": [1, 2, 3, 4, 5, 7, 8], "handl": [1, 3, 4, 6, 7], "arithmet": 1, "5": [1, 2, 5, 7, 8, 9], "pass": [1, 5], "exp_le_exp": 1, "mpr": [1, 2, 5, 8], "exp": [1, 3], "applic": [1, 2, 5, 7, 10], "function": [1, 2, 4, 5, 6, 7, 9, 10, 12], "compound": [1, 2, 8], "pars": [1, 3, 7], "exp_lt_exp": 1, "log_le_log": 1, "log": [1, 3, 10], "log_lt_log": 1, "add_le_add": [1, 2], "add_le_add_left": 1, "add_le_add_right": 1, "add_lt_add_of_le_of_lt": 1, "add_lt_add_of_lt_of_l": 1, "add_lt_add_left": 1, "add_lt_add_right": 1, "add_nonneg": [1, 5], "add_po": 1, "add_pos_of_pos_of_nonneg": 1, "exp_po": [1, 3], "bi": [1, 2, 5], "lr": 1, "iff": [1, 3, 7, 8, 9, 10, 12], "connect": [1, 3, 5, 8], "equival": [1, 2, 3, 4, 5, 7, 8, 9, 10], "mp": [1, 2, 3, 4, 8], "forward": [1, 2, 5, 7, 8], "direct": [1, 2, 3, 6, 7, 8, 9], "stand": [1, 2, 4, 5, 6, 7, 8, 9], "modu": 1, "ponen": 1, "respect": [1, 2, 3, 4, 5, 7, 8], "thu": [1, 3, 4, 5, 8], "again": [1, 2, 3, 4, 5, 6, 7, 8], "numer": [1, 4, 5], "constitut": 1, "part": [1, 2, 3, 4, 5, 6, 8, 10], "strategi": [1, 2, 4], "api": 1, "reli": [1, 2, 5, 8], "guess": [1, 2, 3, 4, 5], "cmd": [1, 2], "mac": [1, 2], "a_of_b_of_c": 1, "approxim": 1, "loud": 1, "probabl": [1, 5, 6, 8], "add_l": 1, "choic": [1, 2, 3, 5, 8], "exist": [1, 2, 3, 6, 7, 8], "jump": [1, 4, 5, 8], "nearbi": [1, 4], "sq_nonneg": 1, "delet": [1, 2, 3], "uncom": 1, "previou": [1, 2, 3, 5, 6, 7, 8, 9, 10], "confirm": [1, 2, 3, 4], "finish": [1, 2, 3, 4, 7], "job": 1, "pow_two_nonneg": [1, 2], "tend": [1, 8], "around": [1, 3, 6, 7, 8, 10], "binari": [1, 2, 4, 5, 6], "increas": 1, "worth": [1, 2, 5], "definition": [1, 4, 5, 6, 8], "principl": [1, 2, 3, 4, 6, 9], "favor": [1, 5], "timesav": 1, "clever": 1, "involv": [1, 2, 4, 5, 6, 7, 8], "nice": [1, 2, 4, 6, 7, 8], "idea": [1, 2, 3, 5, 6, 8], "abs_l": [1, 5], "constructor": [1, 2, 3, 4, 5, 6], "split": [1, 2, 3, 4], "conjunct": [1, 6, 12], "congratul": [1, 2, 4], "min": [1, 2, 8, 10], "uniqu": [1, 2, 3, 4, 5, 7, 8], "min_le_left": 1, "min_le_right": 1, "le_min": 1, "max": [1, 2, 6, 8, 10], "pair": [1, 2, 4, 5, 7, 8], "act": [1, 7], "curri": 1, "logician": 1, "haskel": 1, "bind": [1, 3], "tighter": [1, 3], "infix": [1, 6], "le_antisymm": [1, 2], "usag": 1, "inconsist": 1, "outer": 1, "level": [1, 2, 6], "nest": [1, 2], "bother": [1, 3], "repetit": [1, 6], "foreshadow": 1, "univers": [1, 3, 5, 7, 8, 12], "quantifi": [1, 3, 4, 5, 7, 8, 12], "desir": [1, 3, 6, 7, 8], "implicitli": [1, 2], "repeat": [1, 4, 5, 6], "mani": [1, 2, 3, 5, 6, 7, 8, 9, 10, 12], "shorten": [1, 2, 7], "Of": [1, 2, 4, 6, 7, 8, 9, 10], "interest": [1, 2, 3, 5, 6, 8], "vice": [1, 3], "versa": [1, 3], "word": [1, 2, 3, 4, 5, 7, 8], "switch": [1, 6], "transit": [1, 2, 5, 8], "total": 1, "satisfi": [1, 3, 4, 5, 6, 8, 9], "disjunct": [1, 3, 12], "stick": [1, 2, 8, 9], "aux": [1, 2, 4, 8], "valu": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "yield": [1, 2, 3, 4, 5, 8], "made": [1, 2, 3, 5, 8], "manifest": [1, 8], "triangl": [1, 2, 5], "abs_add": [1, 2], "add_sub_cancel_right": 1, "sub_add_cancel": 1, "relat": [1, 2, 3, 5, 6, 7, 8, 9, 10], "divis": [1, 2, 4, 5, 6], "Be": [1, 3], "ordinari": [1, 2, 4, 5, 7, 8], "unicod": [1, 3, 6], "obtain": [1, 2, 4, 5, 8, 9], "dvd": 1, "dvd_tran": 1, "dvd_mul_of_dvd_left": 1, "dvd_mul_left": 1, "expon": 1, "expand": [1, 2, 3, 4, 5, 6], "w": [1, 6], "greatest": [1, 5, 8], "divisor": [1, 2, 4, 5, 7], "gcd": [1, 2, 4], "least": [1, 5, 6, 8], "lcm": 1, "analog": [1, 2, 3, 4, 8], "divid": [1, 2, 4, 5, 7], "gcd_zero_right": 1, "gcd_zero_left": 1, "lcm_zero_right": 1, "lcm_zero_left": 1, "dvd_antisymm": 1, "complain": 1, "ambigu": [1, 5], "_root_": [1, 3, 4], "saw": [1, 5, 6, 7, 8], "govern": [1, 5], "class": [1, 4, 5, 6, 7, 8, 9, 10], "antisymmetr": [1, 2], "\u03b1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "partialord": [1, 2], "adopt": 1, "letter": [1, 5, 9], "\u03b2": [1, 2, 3, 5, 6, 8, 10], "\u03b3": [1, 2, 5, 8], "carrier": [1, 5, 6, 7], "greek": [1, 4], "especi": [1, 2, 5, 6, 7, 8], "strict": [1, 2], "somewhat": [1, 3, 8], "lt_irrefl": [1, 2], "lt_iff_le_and_n": 1, "lattic": [1, 5, 6, 7, 8], "inf_le_left": [1, 8], "inf_le_right": 1, "le_inf": 1, "le_sup_left": 1, "le_sup_right": 1, "sup_l": 1, "lower": [1, 2, 4], "bound": [1, 2, 3, 4, 5, 8, 9, 10], "upper": [1, 2], "glb": 1, "lub": 1, "infimum": [1, 6, 7, 8, 10], "supremum": [1, 4, 6, 7], "inf": [1, 6, 8], "sup": [1, 4, 8], "further": [1, 8], "matter": [1, 2], "meet": [1, 2, 3, 5], "keep": [1, 5, 6, 7], "dictionari": 1, "subset": [1, 2, 3, 5, 8, 9], "domain": [1, 2, 3, 4, 5, 7, 8], "boolean": 1, "truth": [1, 4], "fals": [1, 2, 3, 4, 6], "true": [1, 2, 3, 6, 8], "posit": [1, 3, 4, 5, 8, 10], "subspac": [1, 6], "vector": [1, 3, 6, 7, 9], "intersect": [1, 3, 5, 6, 7, 8, 10], "sum": [1, 2, 4, 5, 6, 7, 8], "inclus": [1, 3, 7, 8], "topologi": [1, 5, 6, 9, 12], "union": [1, 3, 4, 5, 6, 7, 9, 10], "intermedi": [1, 6, 8], "produc": [1, 2, 7, 9], "auto": [1, 6], "mysteri": [1, 5, 6], "unapp": 1, "tran": [1, 2, 4, 5, 6, 7], "issu": [1, 4, 5, 6, 8], "directli": [1, 2, 4, 5, 6, 8], "inf_comm": [1, 7], "inf_assoc": 1, "sup_comm": 1, "sup_assoc": 1, "absorpt": 1, "law": [1, 7], "absorb1": 1, "absorb2": 1, "found": [1, 5, 7, 9], "inf_sup_self": 1, "sup_inf_self": 1, "distriblattic": 1, "inf_sup_left": 1, "inf_sup_right": 1, "sup_inf_left": 1, "sup_inf_right": 1, "shown": [1, 5, 9, 10], "explicit": [1, 2, 5, 6, 8], "nondistribut": 1, "finit": [1, 3, 4, 5, 7, 8, 9, 10], "impli": [1, 2, 3, 4, 5, 8], "larger": [1, 8], "compat": [1, 7, 8], "strictorderedr": 1, "mul_po": [1, 4], "mul_nonneg": 1, "coupl": [1, 2, 6, 8], "metric": [1, 5, 9, 12], "equip": [1, 3, 5, 6, 7, 8, 9, 10], "distanc": [1, 2, 8, 9], "dist": [1, 8], "map": [1, 2, 3, 5, 6, 7, 8], "metricspac": [1, 8, 9], "dist_self": 1, "dist_comm": [1, 8], "dist_triangl": [1, 8], "nonneg": [1, 5], "nonneg_of_mul_nonneg_left": 1, "dist_nonneg": [1, 8], "dealt": 2, "simpl": [2, 4, 5, 6, 9], "absolut": 2, "\u03b5": [2, 8, 9], "though": [2, 3, 4, 5], "treat": [2, 3, 5, 6, 7, 8, 9], "appli": [2, 3, 4, 5, 6, 7, 8, 9, 10, 12], "my_lemma": 2, "\u03b4": [2, 8], "hb": [2, 8], "subsequ": [2, 4, 8], "lemma": [2, 4, 5, 6, 7, 8, 9, 10, 12], "mention": [2, 3, 5, 6, 7, 8], "my_lemma2": 2, "stage": [2, 5, 6], "my_lemma3": 2, "epo": 2, "ele1": 2, "xlt": 2, "ylt": 2, "essenti": [2, 3, 5, 7, 8], "colon": 2, "off": [2, 3, 4], "my_lemma4": 2, "abs_mul": 2, "mul_le_mul": 2, "abs_nonneg": 2, "mul_lt_mul_right": 2, "extract": [2, 8], "hidden": 2, "expos": [2, 8], "predic": [2, 3, 4, 6, 7, 8, 9], "fnub": 2, "fnlb": 2, "lambda": [2, 5], "hfa": 2, "hgb": 2, "dsimp": [2, 3, 5, 7], "simplif": [2, 3, 4], "contract": 2, "anyhow": 2, "control": 2, "transform": [2, 3], "rest": [2, 3, 5, 7, 8], "routin": 2, "nnf": 2, "nng": 2, "nna": 2, "codomain": [2, 4, 8], "structur": [2, 4, 6, 7, 8, 9, 10, 12], "monoid": [2, 3, 4, 6, 12], "fnub_add": 2, "orderedcanceladdcommmonoid": 2, "high": [2, 7], "monoton": [2, 6, 8], "nondecreas": [2, 4], "placehold": 2, "Or": [2, 3], "backward": [2, 8], "subgoal": 2, "mf": 2, "mg": 2, "aleb": 2, "flag": [2, 3], "squiggli": 2, "marker": 2, "nnc": 2, "bbb": [2, 5], "fneven": 2, "fnodd": 2, "ef": 2, "eg": 2, "og": 2, "rid": 2, "won": [2, 4, 6, 7, 8], "cannot": [2, 3, 4, 5, 6, 7, 8], "contrari": 2, "syntact": 2, "reduct": [2, 3, 5], "erw": 2, "harder": [2, 5], "spot": 2, "manipul": [2, 5, 7, 8], "foundat": [2, 3, 4, 5, 7], "mundan": 2, "assert": [2, 3, 6, 7], "contrast": [2, 3, 5, 6, 8], "zermelo": 2, "fraenkel": 2, "sin": [2, 9], "co": [2, 7], "zf": 2, "defect": [2, 6, 8], "theoret": [2, 3, 8], "motiv": 2, "detect": 2, "meaningless": 2, "independ": [2, 3, 5], "continuum": 2, "meta": [2, 6], "beyond": [2, 6, 9], "ask": [2, 4, 5, 6, 7, 8], "refl": [2, 3, 5, 6, 7], "setub": 2, "inject": [2, 3, 4, 6, 7, 8], "x_1": [2, 3], "x_2": [2, 3], "x\u2081": [2, 3, 5, 8], "x\u2082": [2, 3, 5], "add": [2, 4, 5, 6, 7, 8, 9], "nonzero": [2, 4, 5, 10], "sourc": [2, 8], "inspir": 2, "add_left_inj": 2, "composit": [2, 3, 5, 6, 7, 8], "injg": 2, "injf": [2, 3], "canon": [2, 3, 4, 5], "exhibit": [2, 8], "anonym": [2, 3, 4, 5, 7], "angl": 2, "certain": [2, 6, 8], "fnhasub": 2, "fnhaslb": 2, "ubf": 2, "ubg": 2, "rcase": [2, 3, 4, 8], "ubfa": 2, "ubgb": 2, "unpack": [2, 3], "main": [2, 6, 8, 9], "els": [2, 3, 4], "turn": [2, 3, 4, 5, 6, 8, 9], "fn_ub_add": 2, "lbf": 2, "lbg": 2, "recurs": [2, 3, 5, 12], "arbitrarili": [2, 8], "assign": [2, 3, 5, 6, 7], "compon": [2, 3, 5, 8, 10], "destruct": 2, "tag": [2, 3, 6], "chosen": [2, 5], "intern": [2, 5, 7], "primit": [2, 3], "scientist": 2, "sight": [2, 6], "hurt": 2, "chanc": 2, "yourself": [2, 5], "compani": 2, "old": [2, 5, 6], "chestnut": 2, "product": [2, 4, 5, 6, 7, 8, 10], "magic": [2, 5, 6], "verifi": 2, "sumofsquar": 2, "sumofsquares_mul": 2, "sosx": 2, "sosi": 2, "xeq": [2, 3], "yeq": 2, "insight": 2, "gaussian": [2, 7, 12], "sqrt": [2, 3, 4, 5], "norm": [2, 5, 8, 12], "reflect": 2, "di": [2, 5], "xy": [2, 5], "cryptic": 2, "easiest": [2, 4], "perspicu": 2, "6": [2, 4, 5, 6, 7, 8, 9], "divab": 2, "divbc": 2, "beq": 2, "ceq": 2, "And": [2, 4, 6, 8], "pretti": [2, 6, 7, 8], "Then": [2, 3, 5, 6, 7, 8, 10], "divac": 2, "alpha": [2, 3], "beta": [2, 3], "surject": [2, 3, 7, 8], "mul_div_cancel\u2080": 2, "field_simp": [2, 5], "denomin": [2, 4, 5], "hx": [2, 3, 5, 6, 7, 9], "surjg": 2, "surjf": [2, 3], "contradict": [2, 3, 4], "speak": [2, 5, 7, 8], "irreflex": 2, "asymmetri": 2, "lt_asymm": 2, "eventu": [2, 3, 8], "fnuba": 2, "not_le_of_gt": 2, "not_lt_of_g": [2, 4, 5], "lt_of_not_g": 2, "le_of_not_gt": 2, "snippet": [2, 4, 5, 7], "counterexampl": [2, 9], "monof": 2, "four": [2, 5], "valid": 2, "far": [2, 3, 6, 8], "q": [2, 4, 5, 6, 7, 8], "straightforward": [2, 6], "difficult": [2, 6], "conclud": [2, 9], "nonexist": 2, "contradictori": 2, "classic": [2, 3, 4, 7], "by_contra": [2, 4], "not_not": 2, "front": 2, "push": [2, 4, 7, 8], "inward": 2, "facilit": [2, 8], "push_neg": [2, 3, 4], "restat": [2, 6, 7], "contrapos": [2, 3, 4], "similarli": [2, 3, 4, 5, 7], "yet": [2, 3, 4, 5, 6, 8], "semicolon": [2, 4], "falso": 2, "anyth": [2, 5, 8], "elim": 2, "strang": [2, 4, 7], "fairli": 2, "reach": [2, 6], "37": 2, "exfalso": 2, "absurd": [2, 4], "slick": 2, "drop": 2, "manner": [2, 5], "analogi": [2, 5, 8, 9], "techniqu": [2, 8], "variou": [2, 3, 5, 6, 10], "xltz": 2, "zlty": 2, "10": [2, 9], "7": [2, 4, 5, 7], "behav": [2, 3, 6, 8], "roughli": [2, 3, 4], "friend": [2, 5], "were": [2, 4, 5, 8], "inscrut": [2, 3], "gadget": [2, 8], "auxiliari": [2, 8], "pow_eq_zero": [2, 4], "doubl": [2, 3], "symmetr": [2, 3, 7], "abs_lt": 2, "dvd_gcd_iff": 2, "8": [2, 4, 7, 8], "15": 2, "not_monotone_iff": 2, "aris": 2, "preorder": [2, 6, 8], "pre": 2, "lt_iff_le_not_l": 2, "repeatedli": [2, 8], "instanti": [2, 5, 6, 8], "inl": [2, 3], "inr": [2, 3], "branch": [2, 3, 6], "le_or_gt": 2, "abs_of_nonneg": [2, 5], "abs_of_neg": 2, "against": 2, "immedi": [2, 3, 5, 6], "attract": 2, "closer": [2, 8], "advantag": [2, 3, 4, 5, 7, 9], "myab": 2, "le_abs_self": 2, "neg_le_abs_self": 2, "enjoi": [2, 3, 4, 8], "pun": 2, "lt_ab": 2, "genuin": 2, "vertic": [2, 5], "lt_trichotomi": 2, "xgt": 2, "dvd_mul_right": [2, 4], "eq_zero_or_eq_zero_of_mul_eq_zero": 2, "zero": [2, 3, 4, 5, 6, 7, 8, 9, 10], "nontrivi": [2, 3, 4, 5, 8, 9], "integr": [2, 9, 12], "isdomain": [2, 7], "whether": [2, 3, 4, 6, 8], "em": [2, 3], "exclud": [2, 4], "by_cas": [2, 3, 4], "dispos": 2, "s_0": [2, 3], "s_1": 2, "s_2": 2, "ldot": [2, 3, 4], "varepsilon": [2, 8], "s_n": [2, 3], "render": [2, 4], "convergesto": 2, "ext": [2, 3, 4, 5, 6, 7], "enabl": [2, 3, 4, 5], "actual": [2, 3, 4, 6, 7, 8], "congr": 2, "reconcil": 2, "peel": 2, "convert": [2, 4, 7], "quit": [2, 6, 8], "zero_lt_on": [2, 4], "fill": [2, 3, 4, 5], "convergesto_const": 2, "\u03b5po": [2, 8], "nge": 2, "abs_zero": 2, "save": 2, "troubl": [2, 3, 5], "pen": [2, 7], "paper": [2, 3, 5, 7, 8, 10], "nt": 2, "maximum": [2, 4, 8], "implement": [2, 5, 6, 7, 9], "convergesto_add": 2, "ct": 2, "clean": [2, 8], "\u03b52po": 2, "ht": 2, "le_of_max_le_left": 2, "le_of_max_le_right": 2, "tricki": [2, 3, 4, 6, 7], "convergesto_mul_const": 2, "acpo": 2, "abs_po": 2, "exists_abs_le_of_convergesto": 2, "strong": [2, 4], "n\u2080": 2, "bpo": [2, 8], "pos\u2080": 2, "div_po": 2, "n\u2081": 2, "convergesto_mul": 2, "sketch": [2, 3, 4, 8], "limit": [2, 6, 8], "bold": 2, "scratch": 2, "convergesto_uniqu": 2, "sa": 2, "sb": 2, "abn": 2, "na": 2, "hna": 2, "nb": 2, "hnb": 2, "absa": 2, "absb": 2, "observ": [2, 4, 8], "everywher": [2, 3, 6, 8, 10], "linearord": 2, "9": [2, 8], "vastli": 2, "awai": [2, 5], "vocabulari": 3, "uniform": [3, 8, 9], "conceptu": [3, 7], "overload": 3, "verbos": 3, "system": [3, 4, 5, 6], "wrong": 3, "ss": 3, "sub": [3, 8, 10, 12], "cap": 3, "un": 3, "cup": 3, "univ": [3, 8, 9, 10], "empti": [3, 4, 5, 7, 8, 10], "member": [3, 8], "membership": [3, 4, 6, 7], "mem": 3, "notin": 3, "ident": [3, 4, 5, 6, 7, 8, 12], "databas": [3, 4, 6, 8], "unlik": [3, 4], "existenti": [3, 7, 12], "subset_def": 3, "inter_def": 3, "mem_setof": 3, "xu": 3, "mem_inter_iff": 3, "xsu": 3, "phenomenon": 3, "union_def": 3, "mem_union": [3, 4], "xtu": 3, "xt": 3, "unnecessari": [3, 7], "correctli": 3, "special": [3, 4, 5, 6, 7, 8, 10], "rewritten": 3, "diff_eq": 3, "mem_diff": 3, "xstu": 3, "xnt": 3, "xnu": 3, "extension": [3, 5], "unsurprisingli": 3, "harm": 3, "and_comm": 3, "antisymm": 3, "hood": [3, 5], "builder": 3, "trivial": [3, 4, 7, 8], "eq_two_or_odd": 3, "even_iff": 3, "confus": [3, 4, 6, 7, 8], "fortun": 3, "agre": 3, "prime_iff": 3, "symm": [3, 4, 5, 6, 7, 8, 9], "rwa": [3, 4, 5], "restrict": [3, 4, 7, 8], "signific": 3, "ball": [3, 9], "bex": 3, "bex_def": 3, "prime_x": 3, "slight": 3, "ssubt": 3, "index": [3, 6, 7, 8], "model": [3, 8], "sequenc": [3, 6, 8, 9, 12], "a_0": 3, "a_1": 3, "a_2": 3, "mem_iunion": 3, "xai": 3, "mem_iint": 3, "mem_iunion\u2082": 3, "mem_iinter\u2082": 3, "exists_prime_and_dvd": 3, "eq_univ": 3, "eq_univ_of_foral": 3, "exists_infinite_prim": 3, "\u2080": 3, "sunion": 3, "sinter": 3, "relationship": [3, 4], "sunion_eq_biunion": 3, "sinter_eq_biint": 3, "preimag": [3, 7, 8], "imag": [3, 4, 6, 7, 8], "tripl": 3, "mem_image_of_mem": 3, "galoi": [3, 5, 8], "image_subset_iff": 3, "represent": [3, 4, 5], "asid": 3, "raini": 3, "dai": 3, "behavior": [3, 6, 8], "nonempti": [3, 7, 8], "condit": [3, 4, 6, 7, 8, 9], "injon": [3, 10], "theme": 3, "rel": [3, 5], "relativ": 3, "xpo": 3, "ypo": 3, "exp_log": 3, "ingredi": [3, 5, 8, 9], "inhabit": [3, 5, 8], "appeal": [3, 6], "choose_spec": 3, "noncomput": [3, 5, 7], "inverse_spec": 3, "dif_po": 3, "dif_neg": 3, "if_po": 3, "if_neg": 3, "fulli": [3, 7, 8], "alon": 3, "leftinvers": 3, "rightinvers": 3, "hack": 3, "half": [3, 7], "dozen": 3, "condens": 3, "cantor": 3, "famou": [3, 7], "j": [3, 7], "intuit": [3, 8], "cardin": [3, 7], "biject": [3, 5, 7], "nineteenth": 3, "centuri": 3, "infinit": [3, 8, 12], "dedekind": 3, "quickli": [3, 7, 10], "behind": [3, 7], "problem": [3, 4, 5, 6, 8], "shade": 3, "region": 3, "diagram": 3, "circ": [3, 5], "scale": 3, "inner": 3, "smaller": [3, 4, 8], "concentr": 3, "unshad": 3, "compos": [3, 5, 7, 8], "disjoint": [3, 7, 10], "sound": [3, 5, 6], "plausibl": 3, "delic": 3, "improv": [3, 4], "confid": 3, "better": [3, 4, 5, 6, 8], "invfun": [3, 5], "leftinverse_invfun": 3, "invfun_eq": 3, "sbaux": 3, "sbset": 3, "s_": 3, "bigcup_": 3, "mathbb": [3, 4, 5, 7], "sbfun": 3, "complement": [3, 8, 10], "outermost": 3, "setminu": 3, "sb_right_inv": 3, "goe": [3, 4, 5, 6, 8], "neither": [3, 5, 6], "nor": [3, 5], "sb_inject": 3, "hf": [3, 7, 8, 9, 10], "a_def": 3, "h_def": 3, "hxeq": 3, "xa": 3, "wlog": 3, "x\u2081a": 3, "resolve_left": 3, "x\u2082a": 3, "not_imp_self": 3, "x\u2082na": 3, "x\u2082eq": 3, "hn": [3, 4, 8, 9], "sb_fun": 3, "bring": [3, 4, 8], "tradeoff": 3, "encapsul": [3, 5, 9], "symmetri": [3, 6], "dwell": 3, "sb_surject": 3, "hg": [3, 8, 9, 10], "gya": 3, "xmem": 3, "sweet": 3, "schroeder_bernstein": 3, "substant": 4, "ancient": 4, "fraction": 4, "lowest": 4, "2c": 4, "4c": 4, "factor": [4, 5, 7], "coprim": [4, 7], "smart": 4, "12": 4, "encount": [4, 6], "algebra": [4, 6, 8, 9, 10, 12], "prime_def_lt": 4, "eq_one_or_self_of_dvd": 4, "prime_p": 4, "17": 4, "commonli": [4, 5], "prime_two": 4, "prime_thre": 4, "broader": [4, 9], "irreduc": [4, 5], "coincid": [4, 5, 8], "rise": [4, 6, 7], "dvd_mul": 4, "even_of_even_sqr": 4, "dvd_of_dvd_pow": 4, "proce": [4, 6], "profici": 4, "prefix": [4, 6, 7], "search": [4, 5, 6], "engin": 4, "hesit": 4, "mul_right_inj": 4, "heart": [4, 7], "irration": 4, "dvd_gcd": 4, "coprime_mn": 4, "sqr_eq": 4, "meq": 4, "dvd_iff_exists_eq_mul_left": 4, "two_l": 4, "le_of_dvd": 4, "approach": [4, 5, 6, 8], "quick": [4, 7, 9], "ne": [4, 5], "occur": 4, "suffici": [4, 8], "primefactorslist": 4, "permut": [4, 7], "prime_of_mem_primefactorslist": 4, "prod_primefactorslist": 4, "primefactorslist_uniqu": 4, "talk": [4, 7, 8, 9], "factorization_mul": 4, "mnez": 4, "nnez": 4, "factorization_pow": 4, "black": [4, 6], "box": 4, "simpa": [4, 7, 9], "nnz": 4, "nsqr_nez": 4, "eq1": 4, "eq2": 4, "add_mul_mod_self_left": 4, "mul_mod_right": 4, "count_factors_mul_of_po": 4, "succ_ne_zero": 4, "succ": [4, 6], "successor": 4, "npow_nz": 4, "dvd_sub": 4, "anywai": [4, 7], "pow_eq": 4, "npowz": 4, "add_sub_cancel": 4, "understood": [4, 8], "quotient": [4, 5, 6, 8], "pictur": [4, 5, 7], "mediat": 4, "headach": 4, "contend": 4, "th": 4, "topic": [4, 5, 6, 7], "enat": 4, "infin": [4, 8, 10], "appreci": 4, "role": [4, 5, 8], "datatyp": 4, "freeli": 4, "translat": [4, 6, 7, 8], "mathematician": [4, 8], "inj": 4, "factori": 4, "fac": 4, "ih": 4, "fac_po": 4, "succ_po": 4, "dvd_fac": 4, "ipo": 4, "il": 4, "of_le_succ": 4, "dvd_mul_of_dvd_right": 4, "crude": 4, "remaind": [4, 5, 7], "pow_succ": 4, "pow_two_le_fac": 4, "finset": [4, 5, 7, 8], "bigoper": [4, 5, 7], "prod": [4, 7, 8, 10], "sum_range_zero": 4, "sum_range_succ": 4, "summat": 4, "prod_range_zero": 4, "prod_range_succ": 4, "deserv": 4, "danger": [4, 5], "ordinarili": [4, 5], "loop": 4, "indefinit": 4, "fix": [4, 6, 7, 8], "mul_left_comm": 4, "placement": 4, "re": [4, 5], "handi": 4, "sum_id": 4, "div_eq_of_eq_mul_right": 4, "sum_sqr": 4, "mynat": 4, "thumb": 4, "decid": [4, 7, 8], "preced": [4, 7], "truncat": 4, "exponenti": 4, "cut": 4, "predecessor": 4, "pred": 4, "mul": [4, 5, 6, 8], "succ_add": 4, "succ_mul": 4, "explor": [4, 8], "standard": [4, 5, 6, 8], "formul": [4, 7, 8], "quirki": 4, "among": 4, "annoi": [4, 6], "h0": 4, "succ_le_succ": 4, "zero_l": [4, 5], "interval_cas": 4, "interv": [4, 8, 10], "decis": [4, 7], "procedur": [4, 6], "revert": [4, 5], "minfac": 4, "smallest": [4, 6, 8], "strong_induction_on": 4, "subsum": 4, "exists_prime_factor": 4, "np": 4, "mltn": 4, "mdvdn": 4, "mne1": 4, "mz": 4, "zero_dvd_iff": 4, "mgt2": 4, "pp": 4, "pdvd": 4, "factorial_po": 4, "dvd_factori": 4, "primes_infinit": 4, "refin": [4, 9], "ple": 4, "p_1": 4, "p_n": 4, "prod_": 4, "p_i": [4, 8], "computation": 4, "test": 4, "decidableeq": 4, "abandon": 4, "ourselv": [4, 6], "subset_iff": 4, "mem_int": 4, "mem_sdiff": 4, "tauto": 4, "dispens": 4, "tautologi": 4, "dvd_prod_of_mem": 4, "eq_of_dvd_of_prim": 4, "prime_q": 4, "preserv": [4, 6, 8], "induction_on": 4, "singleton": 4, "prod_empti": 4, "prod_insert": 4, "mem_of_dvd_prod_prim": 4, "mem_insert": 4, "wrote": 4, "filter": [4, 9, 10, 12], "mem_filt": 4, "aim": [4, 7], "prod_po": 4, "_def": 4, "mem_": 4, "id": [4, 6, 8, 9], "bounded_of_ex_finset": 4, "qk": 4, "lt_succ_of_l": 4, "le_sup": 4, "ex_finset_of_bound": 4, "decidablepr": 4, "lt_succ_iff": 4, "congruent": 4, "p_k": 4, "loss": 4, "27": 4, "mod_4_eq_3_or_mod_4_eq_3": 4, "mul_mod": 4, "mod_lt": 4, "mul_mod_mod": 4, "two_le_of_mod_4_eq_3": 4, "neq": 4, "div_dvd_of_dvd": 4, "div_lt_self": 4, "exists_prime_factor_mod_4_eq_3": 4, "mge2": 4, "mul_div_cancel": 4, "home": [4, 5], "stretch": [4, 5], "remov": [4, 8], "eras": 4, "mem_eras": 4, "readi": [4, 6, 7, 8, 9], "dvd_add_iff_left": 4, "primes_mod_4_eq_3_infinit": 4, "p4": 4, "pltn": 4, "p4eq": 4, "pne3": 4, "seriou": [4, 6, 8], "feat": 4, "modern": [5, 7], "subject": 5, "consult": 5, "ann": 5, "baanen": 5, "abus": 5, "paramet": [5, 6], "broadest": 5, "possibli": 5, "constraint": [5, 8], "bundl": [5, 6, 7, 8, 9], "tupl": 5, "hy": [5, 6, 7], "hz": [5, 6], "mypoint1": 5, "mypoint2": 5, "mypoint3": 5, "mk": [5, 6, 7, 8], "former": 5, "latter": [5, 7, 8], "quot": [5, 8], "protect": 5, "add_x": 5, "addalt": 5, "eta": 5, "messier": 5, "view": [5, 6, 7, 8], "y\u2081": 5, "z\u2081": 5, "y\u2082": 5, "z\u2082": 5, "addalt_x": 5, "addalt_comm": 5, "apart": [5, 6], "effici": [5, 7, 8], "scalar": [5, 6, 7, 9], "smul": [5, 6, 7], "smul_distrib": 5, "road": 5, "link": [5, 6], "belong": [5, 6, 8], "simplex": 5, "convinc": 5, "equilater": 5, "interior": [5, 9], "standardtwosimplex": 5, "x_nonneg": 5, "y_nonneg": 5, "z_nonneg": 5, "sum_eq": 5, "swap": 5, "swapxi": 5, "interestingli": [5, 7, 9], "midpoint": 5, "div_nonneg": 5, "weight": 5, "averag": 5, "weightedaverag": 5, "lambda_nonneg": 5, "lambda_l": 5, "fin": [5, 7, 10], "standardsimplex": 5, "sum_eq_on": 5, "div_eq_mul_inv": 5, "sum_mul": 5, "sum_add_distrib": 5, "mul_sum": 5, "islinear": 5, "is_addit": 5, "preserves_mul": 5, "linf": 5, "subtyp": [5, 6, 7, 8], "preal": 5, "val": 5, "sigma": [5, 10], "wherebi": [5, 8], "stdsimplex": 5, "\u03c3": [5, 7], "fst": [5, 8], "snd": [5, 8], "custom": 5, "robust": [5, 6], "interfac": 5, "redefin": [5, 6], "accessor": 5, "weav": 5, "rich": [5, 6], "interconnect": 5, "hierarchi": [5, 7, 12], "clarifi": 5, "cdot": 5, "topolog": [5, 6, 9, 12], "mathcal": [5, 9], "proxi": 5, "bipartit": 5, "graph": 5, "categori": [5, 8, 9], "morphism": [5, 9, 12], "basi": [5, 8], "discret": 5, "inherit": [5, 6, 7], "polynomi": 5, "coeffici": [5, 7], "dual": [5, 8], "accommod": [5, 7], "almost": [5, 6, 7, 8, 10], "marriag": 5, "heaven": 5, "group\u2081": [5, 6], "inv": [5, 6], "struc": 5, "counterpart": 5, "assur": 5, "groupcat": 5, "group\u2081cat": 5, "str": 5, "capit": 5, "roman": 5, "equiv": [5, 7], "tofun": [5, 6], "right_inv": 5, "left_inv": 5, "creativ": 5, "evid": 5, "coercion": [5, 6, 7, 8, 9], "omit": 5, "perm": [5, 7], "under": [5, 6, 7, 8], "orient": 5, "permgroup": 5, "trans_assoc": 5, "trans_refl": 5, "refl_tran": 5, "self_trans_symm": [5, 7], "grouptheori": 5, "g_1": 5, "g_2": 5, "g_3": 5, "tightli": 5, "isomorph": [5, 7, 9], "Its": [5, 6], "neg": [5, 6, 8, 10], "reproduc": 5, "accompani": 5, "addgroup\u2081": 5, "scheme": 5, "addgrouppoint": 5, "arrang": 5, "mul_inv_cancel_right": 5, "achiev": [5, 6, 8], "silent": [5, 6], "regist": [5, 6, 7], "grp": 5, "contextu": 5, "cue": 5, "synthes": [5, 6], "whole": 5, "_inst_1": 5, "candid": 5, "group\u2082": 5, "mysquar": 5, "my_squar": 5, "remark": [5, 6], "headi": 5, "store": 5, "hasmulgroup\u2082": 5, "hasonegroup\u2082": 5, "hasinvgroup\u2082": 5, "suppli": 5, "accord": 5, "capabl": 5, "chain": 5, "recent": 5, "prioriti": 5, "bad": [5, 6, 8], "artifici": 5, "addgroup\u2082": 5, "subtl": [5, 7, 8], "configur": 5, "invisibli": [5, 6], "wise": 5, "euclidean": 5, "terminologi": 5, "mid": 5, "imaginari": 5, "gaussint": 5, "im": 5, "pointwis": [5, 8, 9], "root": [5, 6, 7, 12], "ac": 5, "bci": 5, "adi": 5, "bd": 5, "bc": 5, "zero_def": 5, "one_def": 5, "add_def": 5, "neg_def": 5, "mul_def": 5, "zero_r": 5, "zero_im": 5, "one_r": 5, "one_im": 5, "add_r": 5, "add_im": 5, "neg_r": 5, "neg_im": 5, "mul_r": 5, "mul_im": 5, "surprisingli": [5, 6], "concept": [5, 7, 8, 9], "light": 5, "bulb": 5, "skeleton": [5, 8], "scari": 5, "nsmul": [5, 6], "zsmul": [5, 6], "instcommr": 5, "nsmulrec": 5, "zsmulrec": 5, "left_distrib": [5, 6], "right_distrib": [5, 6], "ext_iff": 5, "bq": 5, "archetyp": 5, "eq": 5, "int": [5, 6, 7], "ediv_add_emod": 5, "emod_nonneg": 5, "emod_lt": 5, "unit": [5, 6, 8], "algorithm": 5, "conjug": [5, 7], "frac": 5, "nearest": 5, "vi": 5, "multipli": 5, "emb": 5, "forth": 5, "quadrat": 5, "gaussianint": 5, "stai": 5, "face": [5, 6, 8], "machineri": [5, 6, 8], "adapt": 5, "invest": 5, "pragmat": 5, "seek": 5, "heather": 5, "macbeth": 5, "eleg": 5, "div": 5, "mod": 5, "_add_mod": 5, "abs_mod": 5, "_le": 5, "emod_lt_of_po": 5, "zero_lt_two": 5, "fixm": 5, "_eq": 5, "sq_add_sq_eq_zero": 5, "linearorderedr": 5, "norm_nonneg": [5, 9], "norm_eq_zero": [5, 9], "norm_po": 5, "norm_mul": [5, 9], "conj": 5, "conj_r": 5, "conj_im": 5, "norm_conj": 5, "bespok": 5, "quad": 5, "record": [5, 6], "div_def": 5, "mod_def": 5, "messi": 5, "nicer": [5, 7, 8], "norm_mod_lt": 5, "norm_y_po": 5, "sq_ab": 5, "gcongr": 5, "ediv_mul_l": 5, "le_of_mul_le_mul_right": 5, "ediv_lt_of_lt_mul": 5, "natab": 5, "coe_natabs_norm": 5, "natabs_of_nonneg": 5, "natabs_norm_mod_lt": 5, "ofnat_lt": 5, "coe_natab": 5, "not_norm_mul_left_lt_norm": 5, "natabs_mul": 5, "le_mul_of_one_le_right": 5, "ofnat_l": 5, "add_one_le_of_lt": 5, "euclideandomain": 5, "quotient_mul_add_remainder_eq": 5, "quotient_zero": 5, "r_wellfound": 5, "remainder_lt": 5, "mul_left_not_lt": 5, "payoff": 5, "principalidealr": 5, "irreducible_iff_prim": 5, "studi": [6, 8], "prematur": 6, "technologi": 6, "simpler": 6, "ring\u2081": 6, "gradual": [6, 8], "bottom": [6, 7, 8], "endow": [6, 7], "one\u2081": 6, "heavier": 6, "inferr": 6, "resolut": 6, "ie": [6, 8], "attribut": 6, "ensur": [6, 7, 8], "self": 6, "one\u2082": 6, "usabl": 6, "silli": 6, "affect": 6, "importantli": [6, 7], "habit": 6, "ascript": [6, 7], "messag": 6, "typeclass": 6, "stuck": 6, "metavari": 6, "263": 6, "sever": [6, 8, 10], "unknown": 6, "collis": 6, "builtin": 6, "\ud835\udfd9": 6, "inherit_doc": 6, "diamond": 6, "dia\u2081": 6, "dia": 6, "infixl": 6, "70": 6, "semigroup": 6, "dia_assoc": 6, "semigroup\u2081": 6, "todia\u2081": 6, "previous": 6, "semigroup\u2082": 6, "hurdl": 6, "neutral": [6, 7], "diaoneclass\u2081": 6, "one_dia": 6, "dia_on": 6, "trace": 6, "ters": 6, "attempt": 6, "succe": 6, "success": 6, "set_opt": 6, "synthinst": 6, "monoid\u2081": 6, "hide": [6, 7, 8], "subtleti": [6, 7], "fear": 6, "unrel": 6, "tosemigroup\u2081": 6, "todiaoneclass\u2081": 6, "monoid\u2082": 6, "toone\u2081": 6, "overlap": [6, 7], "tear": 6, "signatur": 6, "restor": 6, "optim": [6, 10], "reusabl": 6, "inv\u2081": 6, "postfix": 6, "inv_dia": 6, "weak": 6, "preliminari": 6, "left_inv_eq_right_inv\u2081": 6, "hba": 6, "hac": 6, "export": 6, "inv_eq_of_dia": 6, "dia_inv": 6, "naiv": [6, 8], "duplic": 6, "to_addit": 6, "semi": [6, 7], "left_inv_eq_right_inv": 6, "left_neg_eq_right_neg": 6, "whatsnew": 6, "addsemigroup\u2083": 6, "add_assoc\u2083": 6, "semigroup\u2083": 6, "mul_assoc\u2083": 6, "addmonoid\u2083": 6, "addzeroclass": 6, "monoid\u2083": 6, "muloneclass": 6, "tomuloneclass": 6, "addcommsemigroup\u2083": 6, "commsemigroup\u2083": 6, "addcommmonoid\u2083": 6, "commmonoid\u2083": 6, "addgroup\u2083": 6, "neg_add": 6, "group\u2083": 6, "inv_mul": 6, "inv_eq_of_mul": 6, "propag": 6, "attr": 6, "mul_inv": [6, 7], "mul_left_cancel\u2083": 6, "mul_right_cancel\u2083": 6, "addcommgroup\u2083": 6, "commgroup\u2083": 6, "demonstr": [6, 8], "semir": [6, 7], "opposit": [6, 8], "gain": 6, "besid": 6, "parent": 6, "ring\u2083": 6, "mulzeroclass": 6, "toaddgroup\u2083": 6, "mayb": 6, "claus": 6, "le\u2081": 6, "50": 6, "\u2081": 6, "preorder\u2081": 6, "partialorder\u2081": 6, "orderedcommmonoid\u2081": 6, "modul": [6, 7], "pretend": 6, "smul\u2083": 6, "infixr": 6, "73": 6, "module\u2081": 6, "zero_smul": 6, "one_smul": [6, 7], "mul_smul": [6, 7], "add_smul": [6, 7], "smul_add": 6, "surpris": 6, "toaddcommgroup\u2083": 6, "inst": 6, "module\u2083": 6, "hunt": 6, "unspecifi": 6, "embark": 6, "quest": 6, "huge": 6, "trap": 6, "refus": [6, 8], "tosmul\u2083": 6, "inst_1": 6, "safe": [6, 7], "selfmodul": 6, "invert": [6, 7], "nsmul\u2081": 6, "zsmul\u2081": 6, "ofnat": 6, "negsucc": 6, "abgrpmodul": 6, "failur": 6, "synth": 6, "indirect": 6, "path": 6, "thank": 6, "offend": 6, "poor": 6, "forget": 6, "http": 6, "inria": 6, "hal": 6, "scienc": 6, "02463336": 6, "modifi": 6, "addmonoid\u2084": 6, "nsmul_zero": 6, "nsmul_succ": 6, "mysmul": 6, "stori": 6, "incorpor": 6, "lt\u2081": 6, "comparison": 6, "ismonoidhom\u2081": 6, "unpleas": [6, 8], "chose": 6, "ismonoidhom\u2082": 6, "map_on": [6, 7], "map_mul": [6, 7], "tempt": 6, "higher": 6, "unif": 6, "psycholog": 6, "rare": 6, "adject": 6, "bare": 6, "noun": 6, "argu": 6, "continuous_id": [6, 8], "primari": 6, "monoidhom\u2081": 6, "coefun": 6, "coerc": [6, 7], "coe": 6, "addmonoidhom\u2081": 6, "addmonoid": [6, 7], "map_zero": [6, 7], "map_add": [6, 7, 9], "ringhom\u2081": 6, "minor": [6, 9], "tomonoidhom\u2081": 6, "juggl": 6, "monoidhomclass\u2081": 6, "badinst": 6, "wouldn": 6, "priori": 6, "boil": 6, "hopelessli": 6, "checksynthord": 6, "random": 6, "deduc": [6, 7, 8], "outparam": 6, "trigger": 6, "retri": 6, "monoidhomclass\u2082": 6, "promis": [6, 8], "map_inv_of_inv": 6, "got": 6, "presenc": 6, "layer": [6, 8], "dfunlik": 6, "dfun": 6, "monoidhomclass": 6, "monoidhomclass\u2083": 6, "coe_inject": 6, "stop": 6, "ringhomclass\u2083": 6, "ringhom": [6, 7], "algebrahom": 6, "ve": [6, 8], "primarili": [6, 7, 8], "unbundl": 6, "orderpreshom": 6, "le_of_l": 6, "orderpresmonoidhom": 6, "orderpreshomclass": 6, "subgroup": 6, "subr": 6, "reus": 6, "led": 6, "descend": [6, 7], "break": 6, "barrier": 6, "setlik": 6, "wrap": [6, 8], "submonoid\u2081": 6, "submonoid": [6, 7], "mul_mem": [6, 7], "one_mem": [6, 7], "tackl": 6, "setco": 6, "submonoid\u2081monoid": 6, "destructur": 6, "binder": 6, "submonoidclass\u2081": 6, "subgroup\u2081": 6, "subgroupclass\u2081": 6, "subobject": 6, "s\u2081": 6, "s\u2082": 6, "shame": 6, "across": 6, "weird": [6, 8], "distract": 6, "emphas": [6, 7], "anecdot": 6, "devic": 6, "hasquoti": 6, "bewar": 6, "regular": [6, 8], "ascii": 6, "setoid": [6, 7], "commmonoid": 6, "iseqv": 6, "hw": 6, "quotientmonoid": 6, "map\u2082": 6, "treatment": 7, "constantli": 7, "review": [7, 8], "contort": 7, "verbatim": 7, "safer": 7, "friendli": 7, "proceed": 7, "mostli": 7, "comm": 7, "addcommmonoid": 7, "monoidhom": 7, "addmonoidhom": 7, "packag": 7, "unfortun": 7, "consequ": 7, "comp": [7, 8], "mul_inv_self": 7, "map_inv": 7, "enforc": 7, "sent": [7, 8], "mulequiv": 7, "addequiv": 7, "ulequiv": 7, "projector": 7, "ofbiject": 7, "closur": [7, 8], "inv_mem": 7, "issubgroup": 7, "addsubgroup": 7, "add_mem": 7, "zero_mem": 7, "neg_mem": 7, "inferinst": 7, "benefit": 7, "amount": 7, "sup_eq_closur": 7, "mem_bot": 7, "ambient": 7, "ty": 7, "comap": [7, 8], "pushforward": [7, 8], "mem_map": 7, "mem_comap": 7, "kernel": 7, "ker": 7, "mem_ker": 7, "mem_rang": 7, "\u03c6": [7, 8], "hst": 7, "\u03c8": 7, "homomorph": 7, "lagrang": 7, "sylow": 7, "corner": 7, "nonconstruct": 7, "card": 7, "index_mul_card": 7, "hdvd": 7, "exists_subgroup_card_pow_prim": 7, "corollari": 7, "eq_bot_iff_card": 7, "eq_bot_iff_foral": 7, "card_eq_one_iff_exist": 7, "card_dvd_of_l": 7, "inf_bot_of_coprim": 7, "mathfrak": 7, "_n": 7, "cycl": 7, "iscycl": 7, "closure_iscycl": 7, "cyclic": 7, "freegroup": 7, "induct": [7, 8, 12], "myelement": 7, "gave": [7, 8], "embodi": 7, "lift": 7, "send": [7, 10], "mymorph": 7, "cube": 7, "presentedgroup": 7, "normal": 7, "somehow": 7, "creation": 7, "mygroup": 7, "feed": 7, "togroup": 7, "mymap": 7, "compat_mymap": 7, "mynewmorph": 7, "mulact": 7, "downsid": 7, "setup": 7, "synonym": 7, "groupact": 7, "addact": 7, "\u1d65": 7, "affin": 7, "add_vadd": 7, "topermhom": 7, "caylei": 7, "embed": 7, "cayleyisomorph": 7, "subgroupofmulact": 7, "partit": 7, "orbit": 7, "orbitrel": 7, "global": [7, 8], "\u03c9": 7, "selfequivsigmaorbit": 7, "fintyp": [7, 8], "card_congr": 7, "card_sigma": 7, "furthermor": 7, "stabil": 7, "orbitequivquotientstabil": 7, "groupequivquotientprodsubgroup": 7, "conjugate_on": 7, "quotientgroup": 7, "clue": 7, "onto": 7, "quotientkerequivrang": 7, "pullback": [7, 8], "quotientmulequivofeq": 7, "seri": 7, "card_po": 7, "index_eq_card": 7, "eq_of_mul_eq_mul_right": 7, "aux_card_eq": 7, "bijective_iff_injective_and_card": 7, "ker_eq_bot_iff": 7, "ker_restrict": 7, "iso\u2081": 7, "g\u2080": 7, "g\u2081": 7, "g\u2082": 7, "iso\u2082": 7, "prodcongr": 7, "finaliso": 7, "exot": [7, 8], "commsemir": 7, "doubli": 7, "mislead": 7, "tradition": 7, "taught": 7, "promin": 7, "isunit": 7, "m\u02e3": 7, "mainli": 7, "mkofmuleqon": 7, "\u2124\u02e3": 7, "units_eq_one_or": 7, "r\u02e3": 7, "s\u02e3": 7, "ringequiv": 7, "toward": 7, "geometri": 7, "submodul": 7, "eq_zero_iff_mem": 7, "mem_sup": 7, "mul_le_left": 7, "mul_le_right": 7, "mul_le_inf": 7, "quotientmap": 7, "quotequivofeq": 7, "chines": 7, "\u03c0": [7, 8, 9], "font": 7, "\u03b9": [7, 8, 9, 10], "iscoprim": 7, "quotientinfringequivpiquoti": 7, "zmod": 7, "pinot": 7, "prodequivpi": 7, "pi": [7, 8], "ker_pi_quotient_mk": 7, "chinesemap": 7, "proven": 7, "chinesemap_mk": 7, "famili": [7, 8, 9], "injective_lift_iff": 7, "chinesemap_inj": 7, "maxim": 7, "iscoprime_iff_add": 7, "iscoprime_iff_exist": 7, "iscoprime_iff_sup_eq": 7, "iscoprime_iff_codisjoint": 7, "opportun": [7, 8], "mem_insert_of_mem": 7, "mem_insert_self": 7, "iscoprime_inf": 7, "simp_rw": 7, "iinf_insert": 7, "one_eq_top": 7, "eq_top_iff": 7, "chinesemap_surj": 7, "hi": 7, "mk_surject": 7, "\u1d9c": 7, "he": 7, "chineseiso": 7, "encod": [7, 10], "algebramap": 7, "alghom": 7, "\u2090": 7, "endomorph": 7, "univari": 7, "indetermin": 7, "crucial": [7, 8], "bodi": 7, "map_pow": 7, "coeff": 7, "degre": 7, "natdegre": 7, "withbot": 7, "absorb": 7, "formula": [7, 10], "nozerodivisor": 7, "degree_mul": 7, "hp": [7, 8], "hq": [7, 8], "natdegree_mul": 7, "natdegree_comp": 7, "evalu": 7, "isroot": 7, "vanish": 7, "count": 7, "pain": 7, "multiset": 7, "roots_x_sub_c": 7, "aeval": 7, "aroot": 7, "caveat": 7, "aroots_def": 7, "c_neg": 7, "linear_combin": 7, "c_mul": 7, "p_ne_zero": 7, "apply_fun": 7, "roots_mul": 7, "alembert": 7, "gauss": 7, "isalgclos": 7, "eval\u2082": 7, "ofreal": 7, "multivari": 7, "briefli": 7, "mvpolynomi": 7, "circl": 7, "circleequ": 7, "coordin": 7, "calculu": [8, 10, 12], "quantiti": 8, "begun": 8, "paradox": 8, "x\u2080": [8, 9], "convention": 8, "eight": 8, "varieti": 8, "wish": 8, "64": 8, "y\u2080": 8, "z\u2080": 8, "paragraph": 8, "512": 8, "bourbaki": 8, "spell": 8, "dualli": 8, "neighborhood": 8, "etc": 8, "attop": [8, 10], "\ud835\udcdd": [8, 9, 10], "\ud835\udce4": 8, "entourag": 8, "\u03bc": [8, 10], "ae": [8, 10], "univ_set": 8, "sets_of_superset": 8, "inter_set": 8, "blur": 8, "princip": 8, "\ud835\udcdf": 8, "x_0": 8, "ioo": [8, 9], "tendsto\u2081": 8, "tendsto": [8, 10], "lim_": 8, "abstractli": 8, "salient": 8, "f_": 8, "tendsto\u2082": 8, "via": 8, "leverag": 8, "map_mono": 8, "map_map": 8, "shot": 8, "256": 8, "map_le_iff_le_comap": 8, "contravari": 8, "comap_comap": 8, "plane": 8, "\u02e2": 8, "nhds_prod_eq": 8, "aforement": 8, "le_inf_iff": 8, "shouldn": 8, "prohibit": 8, "precondit": 8, "nebot": 8, "tour": [8, 9], "claim": 8, "recaptur": 8, "superfici": 8, "stronger": 8, "flexibl": 8, "hasbasi": 8, "nhds_basis_ioo_po": 8, "tendsto_iff": 8, "reformul": 8, "ici": 8, "attop_basi": 8, "knew": 8, "n_p": 8, "n_q": 8, "tiresom": 8, "\u1da0": [8, 9, 10], "superscript": 8, "eventuallyeq": 8, "tendsto_congr": 8, "eventually_of_foral": 8, "mono": 8, "item": 8, "filter_upward": 8, "hr": 8, "aka": 8, "occasion": 8, "frequent": 8, "sophist": 8, "mem_closure_of_tendsto": 8, "clusterpt": 8, "mem_closure_iff_clusterpt": 8, "le_principal_iff": 8, "nebot_of_l": 8, "hux": 8, "hum": 8, "dist_eq_zero": 8, "emetricspac": 8, "pseudometricspac": 8, "pseudoemetricspac": 8, "journei": 8, "recast": 8, "tendsto_attop": 8, "continuous_iff": 8, "devot": 8, "uncurri": 8, "slow": 8, "continuous_fst": 8, "assembl": 8, "prod_mk": 8, "continuous_snd": 8, "continuous_dist": 8, "clunki": 8, "heavili": 8, "elabor": 8, "prod_map": 8, "sad": 8, "border": 8, "obfusc": 8, "continuous_pow": 8, "continuousat": [8, 10], "continuousat_iff": 8, "geometr": 8, "closedbal": 8, "sign": 8, "radiu": 8, "mem_ball_self": 8, "mem_closedball_self": 8, "isopen": 8, "isopen_iff": 8, "Their": [8, 9], "isclos": [8, 9], "s\u1d9c": [8, 10], "isopen_compl_iff": 8, "hu": [8, 9], "mem_of_tendsto": 8, "mem_closure_iff": 8, "mem_closure_iff_seq_limit": 8, "nhds_basis_bal": 8, "nhds_basis_closedbal": 8, "mem_iff": 8, "segment": [8, 10], "somewher": 8, "continuouson": [8, 9], "minimum": 8, "iscompact": 8, "icc": [8, 9], "iscompact_icc": 8, "strictmono": 8, "tendsto_subseq": 8, "exists_forall_l": 8, "exists_forall_g": 8, "compactspac": 8, "iscompact_univ": 8, "cauchi": 8, "uniformcontinu": 8, "uniformcontinuous_iff": 8, "clearli": 8, "isclosed_l": [8, 9], "eq_empty_or_nonempti": 8, "attain": 8, "cauchyseq": 8, "cauchyseq_iff": 8, "completespac": [8, 9, 10], "cauchyseq_tendsto_of_complet": 8, "criterion": 8, "tendsto_pow_attop_nhds_0_of_lt_1": 8, "dist_le_range_sum_dist": 8, "cauchyseq_of_le_geometric_two": 8, "\u03b5_po": [8, 9], "le_iff_exists_add": 8, "boss": 8, "bair": [8, 9], "exclam": 8, "rec_on": 8, "ho": 8, "hd": 8, "dens": 8, "densiti": 8, "\u03b4po": 8, "hpo": 8, "hball": 8, "mem_closure_iff_nhds_basi": 8, "recon": 8, "rpo": 8, "rb": 8, "incl": 8, "cdist": 8, "ylim": 8, "yball": 8, "categor": 8, "topologicalspac": [8, 9], "isopen_univ": 8, "isopen_empti": 8, "isopen_iunion": 8, "isopen_iinter_of_finit": 8, "continuous_def": 8, "attach": 8, "filteri": 8, "mem_nhds_iff": 8, "digress": 8, "pure_le_nhd": 8, "self_of_nhd": 8, "eventually_eventually_nhd": 8, "mkofnhd": 8, "nhds_mkofnhd": 8, "functori": 8, "induc": 8, "sensibl": 8, "uncount": 8, "relatedli": 8, "coinduc": 8, "t_x": 8, "t_y": 8, "coinduced_le_iff_le_induc": 8, "covari": 8, "coinduced_compos": 8, "induced_compos": 8, "focus": 8, "nhd": 8, "recov": 8, "continuous_iff_coinduced_l": 8, "g_": 8, "t_z": 8, "wasn": 8, "t_": 8, "x_i": 8, "price": 8, "patholog": 8, "t2space": 8, "hausdorff": 8, "t3space": 8, "regularspac": 8, "tendsto_nhds_uniqu": 8, "closed_nhds_basi": 8, "nhds_basis_open": 8, "t_3": 8, "denseinduc": 8, "continuousat_extend": 8, "funni": 8, "_in": 8, "nhds_induc": 8, "fortiori": 8, "f_cont": 8, "tendsto_right_iff": 8, "firstcountabletopologi": 8, "cluster": 8, "hfx": 8, "push_pul": 8, "of_map": 8, "f_ne": 8, "f_le": 8, "map_eq": 8, "hne": 8, "hle": 8, "huo": 8, "hsu": 8, "elim_finite_subcov": 8, "introductori": 9, "hasderivat": [9, 10], "hasderivat_sin": 9, "differentiableat": 9, "inconveni": 9, "deriv_zero_of_not_differentiableat": 9, "deriv_add": 9, "islocalmin": 9, "deriv_eq_zero": 9, "roll": 9, "weirder": 9, "hab": 9, "hfc": 9, "hfi": 9, "exists_deriv_eq_zero": 9, "differentiableon": 9, "exists_deriv_eq_slop": 9, "normedaddcommgroup": [9, 10], "norm_add_l": 9, "infer_inst": [9, 10], "normedspac": [9, 10], "normedaddgroup": 9, "stipul": 9, "norm_smul": 9, "banach": [9, 10], "dimension": [9, 10], "finitedimension": [9, 10], "\ud835\udd5c": [9, 10], "nontriviallynormedfield": [9, 10], "normedfield": 9, "exists_one_lt_norm": 9, "continuouslinearmap": 9, "cont": 9, "map_smul": 9, "le_op_norm": 9, "hmp": 9, "hm": 9, "op_norm_le_bound": 9, "steinhau": 9, "bounded": 9, "uniformli": 9, "nonempty_interior_of_iunion_of_clos": 9, "continuous_linear_map": 9, "opnorm_le_of_shel": 9, "interior_subset": 9, "interior_iinter_subset": 9, "hc": 9, "h\u03b5": 9, "real_norm_l": 9, "\u03b5k_po": 9, "o": 9, "normedgroup": 9, "isbigowith": 9, "isbigowith_iff": 9, "isbigo_iff_isbigowith": 9, "islittleo_iff_forall_isbigowith": 9, "hasfderivat": 9, "fderiv": 9, "fr\u00e9chet": 9, "hasfderivatfilter_iff_islittleo": 9, "hff": 9, "iter": 9, "multilinear": 9, "withtop": 9, "infti": 9, "contdiff": 9, "iteratedfderiv": 9, "contdiff_iff_continuous_differenti": 9, "stricter": 9, "hasstrictfderivat": 9, "\ud835\udd42": 9, "rclike": 9, "contdiffat": 9, "localinvers": 9, "eventually_left_invers": 9, "eventually_right_invers": 9, "to_localinvers": 9, "hasfderivwithinat": [9, 10], "hasfderivatfilt": 9, "measuretheori": 10, "intervalintegr": 10, "integral_id": 10, "integral_one_div": 10, "differenti": [10, 12], "integral_hasstrictderivat_right": 10, "stronglymeasurableatfilt": 10, "volum": 10, "integral_eq_sub_of_hasderivat": 10, "convolut": 10, "bochner": 10, "lebesgu": 10, "measurablespac": 10, "countabl": 10, "measurableset": 10, "compl": 10, "iunion": 10, "iinter": 10, "measure_eq_iinf": 10, "measure_iunion_l": 10, "hmea": 10, "hdi": 10, "pairwis": 10, "m_iunion": 10, "\u1d50": 10, "integral_add": 10, "ennreal": 10, "toreal": 10, "setintegral_const": 10, "domin": 10, "converg": [10, 12], "aestronglymeasur": 10, "hbound": 10, "hlim": 10, "tendsto_integral_of_dominated_converg": 10, "fubini": 10, "sigmafinit": 10, "\u03bd": 10, "integral_prod": 10, "bilinear": 10, "borelspac": 10, "isaddhaarmeasur": 10, "invari": 10, "mass": 10, "compact": 10, "h_inj": 10, "det": 10, "integral_image_eq_integral_abs_det_fderiv_smul": 10, "overview": 12, "schr\u00f6der": 12, "bernstein": 12, "irrat": 12}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"introduct": 0, "get": 0, "start": 0, "overview": 0, "basic": [1, 6], "calcul": 1, "prove": 1, "ident": 1, "algebra": [1, 5, 7], "structur": [1, 5], "us": 1, "theorem": [1, 3], "lemma": 1, "more": 1, "exampl": 1, "appli": 1, "rw": 1, "fact": 1, "about": 1, "logic": 2, "implic": 2, "univers": 2, "quantifi": 2, "The": [2, 3], "existenti": 2, "negat": 2, "conjunct": 2, "iff": 2, "disjunct": 2, "sequenc": 2, "converg": [2, 8], "set": [3, 8], "function": [3, 8], "schr\u00f6der": 3, "bernstein": 3, "elementari": [4, 9, 10], "number": 4, "theori": [4, 10], "irrat": 4, "root": 4, "induct": 4, "recurs": 4, "infinit": 4, "mani": 4, "prime": 4, "defin": 5, "build": 5, "gaussian": 5, "integ": 5, "hierarchi": 6, "morphism": [6, 7], "sub": 6, "object": 6, "group": 7, "ring": 7, "monoid": 7, "subgroup": 7, "concret": 7, "action": 7, "quotient": 7, "unit": 7, "subr": 7, "ideal": 7, "polynomi": 7, "topologi": 8, "filter": 8, "metric": 8, "space": [8, 9], "continu": [8, 9], "ball": 8, "open": 8, "close": 8, "compact": 8, "uniformli": 8, "complet": 8, "topolog": 8, "fundament": 8, "separ": 8, "countabl": 8, "differenti": 9, "calculu": 9, "norm": 9, "linear": 9, "map": 9, "asymptot": 9, "comparison": 9, "integr": 10, "measur": 10, "index": 11, "mathemat": 12, "lean": 12}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"Introduction": [[0, "introduction"]], "Getting Started": [[0, "getting-started"]], "Overview": [[0, "overview"]], "Basics": [[1, "basics"], [6, "basics"]], "Calculating": [[1, "calculating"]], "Proving Identities in Algebraic Structures": [[1, "proving-identities-in-algebraic-structures"]], "Using Theorems and Lemmas": [[1, "using-theorems-and-lemmas"]], "More examples using apply and rw": [[1, "more-examples-using-apply-and-rw"]], "Proving Facts about Algebraic Structures": [[1, "proving-facts-about-algebraic-structures"]], "Logic": [[2, "logic"]], "Implication and the Universal Quantifier": [[2, "implication-and-the-universal-quantifier"]], "The Existential Quantifier": [[2, "the-existential-quantifier"]], "Negation": [[2, "negation"]], "Conjunction and Iff": [[2, "conjunction-and-iff"]], "Disjunction": [[2, "disjunction"]], "Sequences and Convergence": [[2, "sequences-and-convergence"]], "Sets and Functions": [[3, "sets-and-functions"]], "Sets": [[3, "sets"]], "Functions": [[3, "functions"]], "The Schr\u00f6der-Bernstein Theorem": [[3, "the-schroder-bernstein-theorem"]], "Elementary Number Theory": [[4, "elementary-number-theory"]], "Irrational Roots": [[4, "irrational-roots"]], "Induction and Recursion": [[4, "induction-and-recursion"]], "Infinitely Many Primes": [[4, "infinitely-many-primes"]], "Structures": [[5, "structures"]], "Defining structures": [[5, "defining-structures"]], "Algebraic Structures": [[5, "algebraic-structures"]], "Building the Gaussian Integers": [[5, "building-the-gaussian-integers"]], "Hierarchies": [[6, "hierarchies"]], "Morphisms": [[6, "morphisms"]], "Sub-objects": [[6, "sub-objects"]], "Groups and Rings": [[7, "groups-and-rings"]], "Monoids and Groups": [[7, "monoids-and-groups"]], "Monoids and their morphisms": [[7, "monoids-and-their-morphisms"]], "Groups and their morphisms": [[7, "groups-and-their-morphisms"]], "Subgroups": [[7, "subgroups"]], "Concrete groups": [[7, "concrete-groups"]], "Group actions": [[7, "group-actions"]], "Quotient groups": [[7, "quotient-groups"]], "Rings": [[7, "rings"]], "Rings, their units, morphisms and subrings": [[7, "rings-their-units-morphisms-and-subrings"]], "Ideals and quotients": [[7, "ideals-and-quotients"]], "Algebras and polynomials": [[7, "algebras-and-polynomials"]], "Topology": [[8, "index-0"]], "Filters": [[8, "filters"]], "Metric spaces": [[8, "metric-spaces"]], "Convergence and continuity": [[8, "convergence-and-continuity"]], "Balls, open sets and closed sets": [[8, "balls-open-sets-and-closed-sets"]], "Compactness": [[8, "compactness"], [8, "id5"]], "Uniformly continuous functions": [[8, "uniformly-continuous-functions"]], "Completeness": [[8, "completeness"]], "Topological spaces": [[8, "topological-spaces"]], "Fundamentals": [[8, "fundamentals"]], "Separation and countability": [[8, "separation-and-countability"]], "Differential Calculus": [[9, "index-0"]], "Elementary Differential Calculus": [[9, "elementary-differential-calculus"]], "Differential Calculus in Normed Spaces": [[9, "differential-calculus-in-normed-spaces"]], "Normed spaces": [[9, "id3"]], "Continuous linear maps": [[9, "continuous-linear-maps"]], "Asymptotic comparisons": [[9, "asymptotic-comparisons"]], "Differentiability": [[9, "differentiability"]], "Integration and Measure Theory": [[10, "index-0"]], "Elementary Integration": [[10, "elementary-integration"]], "Measure Theory": [[10, "measure-theory"]], "Integration": [[10, "integration"]], "Index": [[11, "index"]], "Mathematics in Lean": [[12, "mathematics-in-lean"]]}, "indexentries": {"check": [[0, "index-0"]], "commands": [[0, "index-0"]], "abel": [[1, "index-15"], [7, "index-3"]], "absolute value": [[1, "index-24"]], "apply": [[1, "index-12"], [1, "index-17"]], "calc": [[1, "index-3"]], "command": [[1, "index-9"]], "commutative ring": [[1, "index-8"]], "definitional equality": [[1, "index-13"]], "divisibility": [[1, "index-25"]], "exact": [[1, "index-12"], [1, "index-17"], [1, "index-5"]], "exponential": [[1, "index-19"]], "gcd": [[1, "index-26"]], "goal": [[1, "index-2"]], "group": [[1, "index-15"], [7, "index-2"]], "group (algebraic structure)": [[1, "index-14"], [7, "index-1"]], "group (tactic)": [[1, "index-15"], [7, "index-2"]], "have": [[1, "index-11"], [2, "index-12"]], "implicit argument": [[1, "index-10"]], "inequalities": [[1, "index-16"]], "lattice": [[1, "index-28"]], "lcm": [[1, "index-26"]], "linarith": [[1, "index-18"]], "local context": [[1, "index-2"]], "logarithm": [[1, "index-19"]], "max": [[1, "index-21"]], "metric space": [[1, "index-30"], [8, "index-2"]], "min": [[1, "index-21"]], "namespace": [[1, "index-9"]], "noncomm_ring": [[1, "index-15"]], "norm_num": [[1, "index-20"]], "open": [[1, "index-9"]], "order relation": [[1, "index-27"]], "partial order": [[1, "index-27"]], "proof state": [[1, "index-2"]], "real numbers": [[1, "index-1"]], "refl and reflexivity": [[1, "index-13"]], "reflexivity": [[1, "index-13"]], "repeat": [[1, "index-23"]], "rewrite": [[1, "index-0"]], "rfl": [[1, "index-13"]], "ring": [[1, "index-6"]], "ring (algebraic structure)": [[1, "index-7"], [7, "index-4"]], "ring (tactic)": [[1, "index-6"]], "rw": [[1, "index-0"], [1, "index-4"]], "rw and rewrite": [[1, "index-0"], [1, "index-4"]], "show": [[1, "index-22"]], "tactics": [[1, "index-0"], [1, "index-11"], [1, "index-12"], [1, "index-13"], [1, "index-15"], [1, "index-17"], [1, "index-18"], [1, "index-20"], [1, "index-22"], [1, "index-23"], [1, "index-29"], [1, "index-3"], [1, "index-4"], [1, "index-5"], [1, "index-6"], [2, "index-0"], [2, "index-11"], [2, "index-12"], [2, "index-13"], [2, "index-14"], [2, "index-15"], [2, "index-16"], [2, "index-17"], [2, "index-18"], [2, "index-19"], [2, "index-2"], [2, "index-20"], [2, "index-21"], [2, "index-23"], [2, "index-24"], [2, "index-25"], [2, "index-26"], [2, "index-4"], [2, "index-6"], [2, "index-8"], [2, "index-9"], [3, "index-1"], [3, "index-2"], [4, "index-0"], [7, "index-2"], [7, "index-3"], [8, "index-3"]], "trans": [[1, "index-29"]], "absurd": [[2, "index-17"]], "anonymous constructor": [[2, "index-7"]], "assumption": [[2, "index-19"]], "by_cases": [[2, "index-23"]], "by_contra": [[2, "index-14"]], "by_contra and by_contradiction": [[2, "index-14"]], "cases": [[2, "index-8"]], "change": [[2, "index-2"]], "congr": [[2, "index-25"]], "constructor": [[2, "index-18"]], "contradiction": [[2, "index-17"]], "contrapose": [[2, "index-16"]], "convert": [[2, "index-26"]], "dsimp": [[2, "index-2"]], "erw": [[2, "index-4"]], "excluded middle": [[2, "index-22"]], "exfalso": [[2, "index-17"]], "ext": [[2, "index-24"]], "extensionality": [[2, "index-24"]], "field_simp": [[2, "index-11"]], "from": [[2, "index-12"]], "injective function": [[2, "index-5"]], "intro": [[2, "index-0"]], "lambda abstraction": [[2, "index-1"]], "left": [[2, "index-21"]], "let": [[2, "index-13"]], "monotone function": [[2, "index-3"]], "push_neg": [[2, "index-15"]], "rcases": [[2, "index-9"]], "right": [[2, "index-21"]], "rintro": [[2, "index-9"]], "simp": [[2, "index-20"], [3, "index-1"]], "surjective function": [[2, "index-10"]], "this": [[2, "index-12"]], "use": [[2, "index-6"]], "bounded quantifiers": [[3, "index-3"]], "rwa": [[3, "index-2"]], "set operations": [[3, "index-0"]], "decide": [[4, "index-0"]], "monoid": [[7, "index-0"]], "filter": [[8, "index-1"]], "continuity": [[8, "index-3"]], "topological space": [[8, "index-4"]], "topology": [[8, "index-0"]], "differential calculus": [[9, "index-0"]], "elementary calculus": [[9, "index-1"]], "normed space": [[9, "index-2"]], "integration": [[10, "index-0"], [10, "index-1"]], "measure theory": [[10, "index-2"]]}}) Search.setIndex({"alltitles": {"Algebraic Structures": [[5, "algebraic-structures"]], "Algebras and polynomials": [[7, "algebras-and-polynomials"]], "Asymptotic comparisons": [[9, "asymptotic-comparisons"]], "Balls, open sets and closed sets": [[8, "balls-open-sets-and-closed-sets"]], "Basics": [[1, null], [6, "basics"]], "Building the Gaussian Integers": [[5, "building-the-gaussian-integers"]], "Calculating": [[1, "calculating"]], "Compactness": [[8, "compactness"], [8, "id5"]], "Completeness": [[8, "completeness"]], "Concrete groups": [[7, "concrete-groups"]], "Conjunction and Iff": [[2, "conjunction-and-iff"]], "Continuous linear maps": [[9, "continuous-linear-maps"]], "Convergence and continuity": [[8, "convergence-and-continuity"]], "Defining structures": [[5, "defining-structures"]], "Differentiability": [[9, "differentiability"]], "Differential Calculus": [[9, null]], "Differential Calculus in Normed Spaces": [[9, "differential-calculus-in-normed-spaces"]], "Disjunction": [[2, "disjunction"]], "Elementary Differential Calculus": [[9, "elementary-differential-calculus"]], "Elementary Integration": [[10, "elementary-integration"]], "Elementary Number Theory": [[4, null]], "Filters": [[8, "filters"]], "Functions": [[3, "functions"]], "Fundamentals": [[8, "fundamentals"]], "Getting Started": [[0, "getting-started"]], "Group actions": [[7, "group-actions"]], "Groups and Rings": [[7, null]], "Groups and their morphisms": [[7, "groups-and-their-morphisms"]], "Hierarchies": [[6, null]], "Ideals and quotients": [[7, "ideals-and-quotients"]], "Implication and the Universal Quantifier": [[2, "implication-and-the-universal-quantifier"]], "Index": [[11, null]], "Induction and Recursion": [[4, "induction-and-recursion"]], "Infinitely Many Primes": [[4, "infinitely-many-primes"]], "Integration": [[10, "integration"]], "Integration and Measure Theory": [[10, null]], "Introduction": [[0, null]], "Irrational Roots": [[4, "irrational-roots"]], "Logic": [[2, null]], "Mathematics in Lean": [[12, null]], "Measure Theory": [[10, "measure-theory"]], "Metric spaces": [[8, "metric-spaces"]], "Monoids and Groups": [[7, "monoids-and-groups"]], "Monoids and their morphisms": [[7, "monoids-and-their-morphisms"]], "More examples using apply and rw": [[1, "more-examples-using-apply-and-rw"]], "Morphisms": [[6, "morphisms"]], "Negation": [[2, "negation"]], "Normed spaces": [[9, "id3"]], "Overview": [[0, "overview"]], "Proving Facts about Algebraic Structures": [[1, "proving-facts-about-algebraic-structures"]], "Proving Identities in Algebraic Structures": [[1, "proving-identities-in-algebraic-structures"]], "Quotient groups": [[7, "quotient-groups"]], "Rings": [[7, "rings"]], "Rings, their units, morphisms and subrings": [[7, "rings-their-units-morphisms-and-subrings"]], "Separation and countability": [[8, "separation-and-countability"]], "Sequences and Convergence": [[2, "sequences-and-convergence"]], "Sets": [[3, "sets"]], "Sets and Functions": [[3, null]], "Structures": [[5, null]], "Sub-objects": [[6, "sub-objects"]], "Subgroups": [[7, "subgroups"]], "The Existential Quantifier": [[2, "the-existential-quantifier"]], "The Schr\u00f6der-Bernstein Theorem": [[3, "the-schroder-bernstein-theorem"]], "Topological spaces": [[8, "topological-spaces"]], "Topology": [[8, null]], "Uniformly continuous functions": [[8, "uniformly-continuous-functions"]], "Using Theorems and Lemmas": [[1, "using-theorems-and-lemmas"]]}, "docnames": ["C01_Introduction", "C02_Basics", "C03_Logic", "C04_Sets_and_Functions", "C05_Elementary_Number_Theory", "C06_Structures", "C07_Hierarchies", "C08_Groups_and_Rings", "C09_Topology", "C10_Differential_Calculus", "C11_Integration_and_Measure_Theory", "genindex", "index"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["C01_Introduction.rst", "C02_Basics.rst", "C03_Logic.rst", "C04_Sets_and_Functions.rst", "C05_Elementary_Number_Theory.rst", "C06_Structures.rst", "C07_Hierarchies.rst", "C08_Groups_and_Rings.rst", "C09_Topology.rst", "C10_Differential_Calculus.rst", "C11_Integration_and_Measure_Theory.rst", "genindex.rst", "index.rst"], "indexentries": {"abel": [[1, "index-15", false], [7, "index-3", false]], "absolute value": [[1, "index-24", false]], "absurd": [[2, "index-17", false]], "anonymous constructor": [[2, "index-7", false]], "apply": [[1, "index-12", false], [1, "index-17", false]], "assumption": [[2, "index-19", false]], "bounded quantifiers": [[3, "index-3", false]], "by_cases": [[2, "index-23", false]], "by_contra": [[2, "index-14", false]], "by_contra and by_contradiction": [[2, "index-14", false]], "calc": [[1, "index-3", false]], "cases": [[2, "index-8", false]], "change": [[2, "index-2", false]], "check": [[0, "index-0", false]], "command": [[1, "index-9", false]], "commands": [[0, "index-0", false]], "commutative ring": [[1, "index-8", false]], "congr": [[2, "index-25", false]], "constructor": [[2, "index-18", false]], "continuity": [[8, "index-3", false]], "contradiction": [[2, "index-17", false]], "contrapose": [[2, "index-16", false]], "convert": [[2, "index-26", false]], "decide": [[4, "index-0", false]], "definitional equality": [[1, "index-13", false]], "differential calculus": [[9, "index-0", false]], "divisibility": [[1, "index-25", false]], "dsimp": [[2, "index-2", false]], "elementary calculus": [[9, "index-1", false]], "erw": [[2, "index-4", false]], "exact": [[1, "index-12", false], [1, "index-17", false], [1, "index-5", false]], "excluded middle": [[2, "index-22", false]], "exfalso": [[2, "index-17", false]], "exponential": [[1, "index-19", false]], "ext": [[2, "index-24", false]], "extensionality": [[2, "index-24", false]], "field_simp": [[2, "index-11", false]], "filter": [[8, "index-1", false]], "from": [[2, "index-12", false]], "gcd": [[1, "index-26", false]], "goal": [[1, "index-2", false]], "group": [[1, "index-15", false], [7, "index-2", false]], "group (algebraic structure)": [[1, "index-14", false], [7, "index-1", false]], "group (tactic)": [[1, "index-15", false], [7, "index-2", false]], "have": [[1, "index-11", false], [2, "index-12", false]], "implicit argument": [[1, "index-10", false]], "inequalities": [[1, "index-16", false]], "injective function": [[2, "index-5", false]], "integration": [[10, "index-0", false], [10, "index-1", false]], "intro": [[2, "index-0", false]], "lambda abstraction": [[2, "index-1", false]], "lattice": [[1, "index-28", false]], "lcm": [[1, "index-26", false]], "left": [[2, "index-21", false]], "let": [[2, "index-13", false]], "linarith": [[1, "index-18", false]], "local context": [[1, "index-2", false]], "logarithm": [[1, "index-19", false]], "max": [[1, "index-21", false]], "measure theory": [[10, "index-2", false]], "metric space": [[1, "index-30", false], [8, "index-2", false]], "min": [[1, "index-21", false]], "monoid": [[7, "index-0", false]], "monotone function": [[2, "index-3", false]], "namespace": [[1, "index-9", false]], "noncomm_ring": [[1, "index-15", false]], "norm_num": [[1, "index-20", false]], "normed space": [[9, "index-2", false]], "open": [[1, "index-9", false]], "order relation": [[1, "index-27", false]], "partial order": [[1, "index-27", false]], "proof state": [[1, "index-2", false]], "push_neg": [[2, "index-15", false]], "rcases": [[2, "index-9", false]], "real numbers": [[1, "index-1", false]], "refl and reflexivity": [[1, "index-13", false]], "reflexivity": [[1, "index-13", false]], "repeat": [[1, "index-23", false]], "rewrite": [[1, "index-0", false]], "rfl": [[1, "index-13", false]], "right": [[2, "index-21", false]], "ring": [[1, "index-6", false]], "ring (algebraic structure)": [[1, "index-7", false], [7, "index-4", false]], "ring (tactic)": [[1, "index-6", false]], "rintro": [[2, "index-9", false]], "rw": [[1, "index-0", false], [1, "index-4", false]], "rw and rewrite": [[1, "index-0", false], [1, "index-4", false]], "rwa": [[3, "index-2", false]], "set operations": [[3, "index-0", false]], "show": [[1, "index-22", false]], "simp": [[2, "index-20", false], [3, "index-1", false]], "surjective function": [[2, "index-10", false]], "tactics": [[1, "index-0", false], [1, "index-11", false], [1, "index-12", false], [1, "index-13", false], [1, "index-15", false], [1, "index-17", false], [1, "index-18", false], [1, "index-20", false], [1, "index-22", false], [1, "index-23", false], [1, "index-29", false], [1, "index-3", false], [1, "index-4", false], [1, "index-5", false], [1, "index-6", false], [2, "index-0", false], [2, "index-11", false], [2, "index-12", false], [2, "index-13", false], [2, "index-14", false], [2, "index-15", false], [2, "index-16", false], [2, "index-17", false], [2, "index-18", false], [2, "index-19", false], [2, "index-2", false], [2, "index-20", false], [2, "index-21", false], [2, "index-23", false], [2, "index-24", false], [2, "index-25", false], [2, "index-26", false], [2, "index-4", false], [2, "index-6", false], [2, "index-8", false], [2, "index-9", false], [3, "index-1", false], [3, "index-2", false], [4, "index-0", false], [7, "index-2", false], [7, "index-3", false], [8, "index-3", false]], "this": [[2, "index-12", false]], "topological space": [[8, "index-4", false]], "topology": [[8, "index-0", false]], "trans": [[1, "index-29", false]], "use": [[2, "index-6", false]]}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "0": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "02463336": 6, "1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "10": [2, 9], "12": 4, "15": 2, "17": 4, "2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "256": 8, "263": 6, "27": 4, "2c": 4, "3": [0, 1, 2, 3, 4, 5, 6, 7, 8], "37": 2, "4": [0, 1, 2, 4, 5, 7, 8, 9], "4c": 4, "5": [1, 2, 5, 7, 8, 9], "50": 6, "512": 8, "6": [2, 4, 5, 6, 7, 8, 9], "64": 8, "7": [2, 4, 5, 7], "70": 6, "73": 6, "8": [2, 4, 7, 8], "9": [2, 8], "A": [1, 2, 3, 4, 5, 6, 7, 8, 9], "And": [2, 4, 6, 8], "As": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "At": [0, 1, 2, 4, 5, 6], "Be": [1, 3], "But": [0, 1, 2, 3, 4, 5, 6, 7, 8], "By": [1, 3, 5, 6, 7], "For": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "If": [0, 1, 2, 3, 4, 5, 6, 8], "In": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "It": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "Its": [5, 6], "Not": [1, 5, 8], "Of": [1, 2, 4, 6, 7, 8, 9, 10], "On": [1, 2, 3, 5, 6, 8, 10], "One": [1, 2, 3, 4, 5, 6, 7, 8], "Or": [2, 3], "Such": [0, 1, 2, 6], "That": [0, 4, 5, 6], "The": [0, 1, 4, 5, 6, 7, 8, 9, 10, 12], "Their": [8, 9], "Then": [2, 3, 5, 6, 7, 8, 10], "There": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10], "These": [0, 1, 3, 4, 5, 7, 9, 10], "To": [0, 1, 2, 3, 4, 5, 6, 7, 8], "With": [1, 3, 4, 6, 8], "_": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "_add_mod": 5, "_def": 4, "_eq": 5, "_in": 8, "_inst_1": 5, "_le": 5, "_n": 7, "_root_": [1, 3, 4], "a_0": 3, "a_1": 3, "a_2": 3, "a_def": 3, "a_of_b_of_c": 1, "ab": [0, 2, 5, 7], "abandon": 4, "abbrevi": [1, 2, 3, 5], "abel": [1, 7], "abelian": [1, 5, 6], "abgrpmodul": 6, "abil": 0, "abl": [0, 1, 2, 3, 4, 5, 6, 7, 9], "abn": 2, "about": [0, 2, 3, 4, 5, 6, 7, 8, 9, 12], "abov": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "abs_add": [1, 2], "abs_l": [1, 5], "abs_lt": 2, "abs_mod": 5, "abs_mul": 2, "abs_nonneg": 2, "abs_of_neg": 2, "abs_of_nonneg": [2, 5], "abs_po": 2, "abs_zero": 2, "absa": 2, "absb": 2, "absolut": 2, "absorb": 7, "absorb1": 1, "absorb2": 1, "absorpt": 1, "abstract": [1, 2, 5, 6, 7, 8], "abstractli": 8, "absurd": [2, 4], "abus": 5, "ac": 5, "accept": [0, 1, 2, 8], "access": [1, 3, 5, 6, 7, 8, 10], "accessor": 5, "accommod": [5, 7], "accompani": 5, "accord": 5, "achiev": [5, 6, 8], "acknowledg": 0, "acpo": 2, "across": 6, "act": [1, 7], "activ": 0, "actual": [2, 3, 4, 6, 7, 8], "ad": [1, 2, 3, 4, 5, 6, 8], "adapt": 5, "add": [2, 4, 5, 6, 7, 8, 9], "add_assoc": [1, 4, 5, 6], "add_assoc\u2083": 6, "add_comm": [1, 4, 5, 6, 7], "add_def": 5, "add_im": 5, "add_l": 1, "add_le_add": [1, 2], "add_le_add_left": 1, "add_le_add_right": 1, "add_left_cancel": 1, "add_left_inj": 2, "add_left_neg": [1, 5], "add_lt_add_left": 1, "add_lt_add_of_le_of_lt": 1, "add_lt_add_of_lt_of_l": 1, "add_lt_add_right": 1, "add_mem": 7, "add_mul": [1, 6], "add_mul_mod_self_left": 4, "add_neg_cancel_right": 1, "add_nonneg": [1, 5], "add_one_le_of_lt": 5, "add_po": 1, "add_pos_of_pos_of_nonneg": 1, "add_r": 5, "add_right_cancel": 1, "add_right_neg": 1, "add_smul": [6, 7], "add_sub": 1, "add_sub_cancel": 4, "add_sub_cancel_right": 1, "add_vadd": 7, "add_x": 5, "add_zero": [1, 5, 6], "addact": 7, "addalt": 5, "addalt_comm": 5, "addalt_x": 5, "addcommgroup": [1, 7], "addcommgroup\u2083": 6, "addcommmonoid": 7, "addcommmonoid\u2083": 6, "addcommsemigroup\u2083": 6, "addequiv": 7, "addgroup": [1, 5, 7], "addgrouppoint": 5, "addgroup\u2081": 5, "addgroup\u2082": 5, "addgroup\u2083": 6, "addit": [1, 2, 4, 5, 6, 7, 8, 9, 10], "addmonoid": [6, 7], "addmonoidhom": 7, "addmonoidhom\u2081": 6, "addmonoid\u2083": 6, "addmonoid\u2084": 6, "addsemigroup\u2083": 6, "addsubgroup": 7, "addzeroclass": 6, "adi": 5, "adject": 6, "adopt": 1, "advantag": [2, 3, 4, 5, 7, 9], "ae": [8, 10], "aestronglymeasur": 10, "aeval": 7, "affect": 6, "affin": 7, "aforement": 8, "after": [1, 2, 4, 6, 8, 9], "again": [1, 2, 3, 4, 5, 6, 7, 8], "against": 2, "agre": 3, "aim": [4, 7], "aka": 8, "aleb": 2, "alembert": 7, "alex": 0, "alexandru": 0, "algebra": [4, 6, 8, 9, 10, 12], "algebrahom": 6, "algebramap": 7, "alghom": 7, "algorithm": 5, "all": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "allow": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "almost": [5, 6, 7, 8, 10], "alon": 3, "along": [1, 4, 7, 8], "alpha": [2, 3], "alreadi": [0, 1, 2, 3, 4, 5, 6, 7, 8], "also": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "altern": [0, 1, 2, 3, 4, 5, 6, 8], "although": [0, 3, 4, 5, 6, 7, 8], "alwai": [0, 1, 2, 3, 5, 6, 7], "ambient": 7, "ambigu": [1, 5], "among": 4, "amount": 7, "an": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "analog": [1, 2, 3, 4, 8], "analogi": [2, 5, 8, 9], "analysi": [0, 5, 9], "ancient": 4, "and_comm": 3, "anecdot": 6, "angl": 2, "ani": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "ann": 5, "annoi": [4, 6], "annot": [1, 2, 3, 4, 5, 6], "anonym": [2, 3, 4, 5, 7], "anoth": [0, 1, 2, 3, 4, 5, 6, 7, 8], "answer": [0, 5, 8], "antisymm": 3, "antisymmetr": [1, 2], "anyhow": 2, "anyth": [2, 5, 8], "anywai": [4, 7], "apart": [5, 6], "api": 1, "appeal": [3, 6], "appear": [0, 1, 2, 5, 6, 7, 8], "appli": [2, 3, 4, 5, 6, 7, 8, 9, 10, 12], "applic": [1, 2, 5, 7, 10], "apply_fun": 7, "appreci": 4, "approach": [4, 5, 6, 8], "appropri": [1, 2, 3, 5, 6], "approxim": 1, "ar": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "arbitrari": [1, 2, 3, 4, 5, 7], "arbitrarili": [2, 8], "archetyp": 5, "argu": 6, "argument": [1, 2, 3, 4, 5, 6, 7, 8], "aris": 2, "arithmet": 1, "aroot": 7, "aroots_def": 7, "around": [1, 3, 6, 7, 8, 10], "arrang": 5, "arrow": [1, 2, 6, 8], "artifici": 5, "ascii": 6, "ascript": [6, 7], "asid": 3, "ask": [2, 4, 5, 6, 7, 8], "aspect": [0, 5, 7], "assembl": 8, "assert": [2, 3, 6, 7], "assign": [2, 3, 5, 6, 7], "assist": [0, 2, 5], "associ": [0, 1, 2, 4, 5, 6, 7, 8, 10], "assum": [0, 1, 2, 3, 4, 6, 7, 8], "assumpt": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10], "assur": 5, "asymmetri": 2, "attach": 8, "attain": 8, "attempt": 6, "attent": [1, 2, 4, 6, 7, 8], "attop": [8, 10], "attop_basi": 8, "attr": 6, "attract": 2, "attribut": 6, "auto": [1, 6], "autom": [0, 1, 5], "automat": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "aux": [1, 2, 4, 8], "aux_card_eq": 7, "auxiliari": [2, 8], "avail": [0, 1, 2, 4, 5, 6, 7], "averag": 5, "avoid": [1, 2, 3, 4, 5, 6, 7, 9], "awai": [2, 5], "axiom": [1, 2, 3, 5, 6, 7, 8, 10], "axiomat": [1, 2, 3, 5], "b": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "baanen": 5, "back": [0, 1, 2, 5, 6, 7, 8], "background": [0, 7], "backslash": [1, 3], "backward": [2, 8], "bad": [5, 6, 8], "badinst": 6, "bair": [8, 9], "balanc": 1, "ball": [3, 9], "banach": [9, 10], "bar": [0, 1, 2], "bare": 6, "barrier": 6, "bartosz": 0, "base": [0, 2, 3, 4, 6, 7, 8, 9], "basi": [5, 8], "basic": [0, 2, 4, 5, 8, 10, 12], "baz": 1, "bbb": [2, 5], "bc": 5, "bci": 5, "bd": 5, "becaus": [1, 2, 3, 4, 5, 6, 7, 8, 9], "becom": [1, 4, 5, 6, 8], "been": [0, 1, 2, 4, 5, 6, 9], "befor": [0, 1, 2, 3, 4, 5, 6, 7], "begin": [1, 2, 3, 4, 5, 6], "begun": 8, "behav": [2, 3, 6, 8], "behavior": [3, 6, 8], "behind": [3, 7], "being": [1, 3, 5, 7, 8, 9], "belong": [5, 6, 8], "below": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10], "benefit": 7, "beq": 2, "berman": 0, "bernstein": 12, "besid": 6, "bespok": 5, "best": 0, "beta": [2, 3], "better": [3, 4, 5, 6, 8], "between": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "bewar": 6, "bex": 3, "bex_def": 3, "beyond": [2, 6, 9], "bi": [1, 2, 5], "big": [0, 5, 7, 8, 9], "bigcup_": 3, "bigger": [0, 3, 9], "bigoper": [4, 5, 7], "biject": [3, 5, 7], "bijective_iff_injective_and_card": 7, "bilinear": 10, "binari": [1, 2, 4, 5, 6], "bind": [1, 3], "binder": 6, "bipartit": 5, "bit": [1, 2, 4, 6, 7, 8], "black": [4, 6], "block": [1, 4, 7], "blur": 8, "bochner": 10, "bodi": 7, "boil": 6, "bold": 2, "bolt": 1, "book": [0, 2, 8], "boolean": 1, "border": 8, "borelspac": 10, "boss": 8, "both": [1, 2, 3, 4, 5, 6, 7, 8, 9], "bother": [1, 3], "bottom": [6, 7, 8], "bound": [1, 2, 3, 4, 5, 8, 9, 10], "bounded": 9, "bounded_of_ex_finset": 4, "bourbaki": 8, "box": 4, "bpo": [2, 8], "bq": 5, "brace": 1, "bracket": [1, 2, 5, 6, 7], "branch": [2, 3, 6], "break": 6, "breviti": [1, 5], "briefli": 7, "bring": [3, 4, 8], "broader": [4, 9], "broadest": 5, "brown": 0, "brows": [0, 1, 4, 7], "bryan": 0, "build": [0, 2, 4, 6, 7, 8, 12], "builder": 3, "built": [0, 2, 6, 7], "builtin": 6, "bulb": 5, "bulwi": 0, "bundl": [5, 6, 7, 8, 9], "button": 0, "by_cas": [2, 3, 4], "by_contra": [2, 4], "c": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10], "c_mul": 7, "c_neg": 7, "cach": 0, "calc": [1, 2, 3, 5, 7, 8], "calcul": [0, 2, 4, 5, 12], "calculu": [8, 10, 12], "call": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "candid": 5, "cannot": [2, 3, 4, 5, 6, 7, 8], "canon": [2, 3, 4, 5], "cantor": 3, "cap": 3, "capabl": 5, "capit": 5, "card": 7, "card_congr": 7, "card_dvd_of_l": 7, "card_eq_one_iff_exist": 7, "card_po": 7, "card_sigma": 7, "cardin": [3, 7], "care": [1, 2, 3, 5], "carneiro": 0, "carri": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "carrier": [1, 5, 6, 7], "case": [1, 2, 3, 4, 5, 6, 7, 8, 10], "categor": 8, "categori": [5, 8, 9], "cauchi": 8, "cauchyseq": 8, "cauchyseq_iff": 8, "cauchyseq_of_le_geometric_two": 8, "cauchyseq_tendsto_of_complet": 8, "caveat": 7, "caylei": 7, "cayleyisomorph": 7, "cdist": 8, "cdot": 5, "center": [0, 8], "central": [0, 4], "centuri": 3, "ceq": 2, "certain": [2, 6, 8], "certifi": 0, "cha": 0, "chain": 5, "challeng": [0, 1, 2, 3, 5, 9], "chanc": 2, "chang": [0, 1, 2, 4, 5, 8, 10], "chapter": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "char": 0, "charact": [1, 3, 6], "character": [1, 3, 4, 8, 9], "chat": 0, "cheat": [0, 1], "check": [0, 1, 2, 3, 4, 5, 6, 7, 8], "checksynthord": 6, "chen": 0, "chestnut": 2, "chines": 7, "chineseiso": 7, "chinesemap": 7, "chinesemap_inj": 7, "chinesemap_mk": 7, "chinesemap_surj": 7, "choic": [1, 2, 3, 5, 8], "choos": [0, 2, 3, 4, 5, 6, 7, 8], "choose_spec": 3, "chose": 6, "chosen": [2, 5], "circ": [3, 5], "circl": 7, "circleequ": 7, "claim": 8, "clarifi": 5, "clash": 1, "class": [1, 4, 5, 6, 7, 8, 9, 10], "classic": [2, 3, 4, 7], "claus": 6, "clean": [2, 8], "clear": [1, 2, 4, 5, 6], "clearer": [1, 3, 5], "clearli": 8, "clever": 1, "click": [0, 1, 3, 4, 5, 6], "clock": 0, "clontz": 0, "close": [1, 2, 3, 6, 7, 9, 10], "closed_nhds_basi": 8, "closedbal": 8, "closer": [2, 8], "closur": [7, 8], "closure_iscycl": 7, "cloud": 0, "clue": 7, "clunki": 8, "cluster": 8, "clusterpt": 8, "cmd": [1, 2], "co": [2, 7], "cocki": 1, "code": [0, 1, 2, 3, 5, 6], "codomain": [2, 4, 8], "coe": 6, "coe_inject": 6, "coe_natab": 5, "coe_natabs_norm": 5, "coeff": 7, "coeffici": [5, 7], "coefun": 6, "coerc": [6, 7], "coercion": [5, 6, 7, 8, 9], "coincid": [4, 5, 8], "coinduc": 8, "coinduced_compos": 8, "coinduced_le_iff_le_induc": 8, "collari": 0, "collect": [1, 2, 3, 5, 8, 10], "collis": 6, "colon": 2, "comap": [7, 8], "comap_comap": 8, "combin": [1, 2, 5, 6, 7, 8], "come": [0, 1, 2, 3, 4, 5, 6, 7, 8], "comfort": 0, "comm": 7, "comma": 1, "command": [0, 1, 2, 3, 4, 5, 6, 7], "commelin": 0, "comment": [0, 4], "commgroup": 1, "commgroup\u2083": 6, "commmonoid": 6, "commmonoid\u2083": 6, "common": [1, 2, 3, 4, 5, 7, 8], "commonli": [4, 5], "commr": [1, 2, 5, 7], "commsemigroup\u2083": 6, "commsemir": 7, "commun": [0, 4], "commut": [1, 2, 3, 4, 5, 6, 7, 9], "comp": [7, 8], "compact": 10, "compactspac": 8, "compani": 2, "companion": [0, 1], "compar": [0, 5, 6, 8], "comparison": 6, "compat": [1, 7, 8], "compat_mymap": 7, "compl": 10, "complain": 1, "complement": [3, 8, 10], "complementari": 0, "complet": [0, 1, 2, 3, 4, 6, 7, 9], "completespac": [8, 9, 10], "complex": [0, 1, 2, 4, 5, 7, 9, 10], "complic": [1, 2, 6, 7], "compon": [2, 3, 5, 8, 10], "compos": [3, 5, 7, 8], "composit": [2, 3, 5, 6, 7, 8], "compound": [1, 2, 8], "compress": [0, 1, 8], "comput": [0, 2, 3, 4, 5, 7, 9, 10], "computation": 4, "concentr": 3, "concept": [5, 7, 8, 9], "conceptu": [3, 7], "concis": [1, 5, 7], "conclud": [2, 9], "conclus": [1, 2, 4], "concret": [1, 2, 4, 5, 6, 8], "condens": 3, "condit": [3, 4, 6, 7, 8, 9], "confid": 3, "configur": 5, "confirm": [1, 2, 3, 4], "confus": [3, 4, 6, 7, 8], "congr": 2, "congratul": [1, 2, 4], "congruent": 4, "conj": 5, "conj_im": 5, "conj_r": 5, "conjug": [5, 7], "conjugate_on": 7, "conjunct": [1, 6, 12], "connect": [1, 3, 5, 8], "consequ": 7, "consid": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "consist": [1, 3, 5, 6, 7, 8, 9], "constant": [1, 2, 7, 10], "constantli": 7, "constitut": 1, "constraint": [5, 8], "construct": [0, 2, 3, 4, 5, 6, 7, 8], "constructor": [1, 2, 3, 4, 5, 6], "consult": 5, "cont": 9, "contain": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10], "contdiff": 9, "contdiff_iff_continuous_differenti": 9, "contdiffat": 9, "contend": 4, "content": [0, 1, 2, 4, 8], "context": [1, 2, 4, 5, 6, 7, 8, 9, 10], "contextu": 5, "continu": [0, 1, 4, 5, 6, 10], "continuous_def": 8, "continuous_dist": 8, "continuous_fst": 8, "continuous_id": [6, 8], "continuous_iff": 8, "continuous_iff_coinduced_l": 8, "continuous_linear_map": 9, "continuous_pow": 8, "continuous_snd": 8, "continuousat": [8, 10], "continuousat_extend": 8, "continuousat_iff": 8, "continuouslinearmap": 9, "continuouson": [8, 9], "continuum": 2, "contort": 7, "contract": 2, "contradict": [2, 3, 4], "contradictori": 2, "contrapos": [2, 3, 4], "contrari": 2, "contrast": [2, 3, 5, 6, 8], "contravari": 8, "contribut": [0, 3], "control": 2, "conveni": [1, 2, 3, 5, 6, 7, 8], "convent": [1, 5, 7, 10], "convention": 8, "converg": [10, 12], "convergesto": 2, "convergesto_add": 2, "convergesto_const": 2, "convergesto_mul": 2, "convergesto_mul_const": 2, "convergesto_uniqu": 2, "convers": [0, 2, 4, 7, 8], "convert": [2, 4, 7], "convinc": 5, "convolut": 10, "coordin": 7, "copi": [0, 3, 4, 6, 7, 8], "coprim": [4, 7], "coprime_mn": 4, "core": [0, 4, 5], "corner": 7, "corollari": 7, "correct": [0, 1, 7], "correctli": 3, "correspond": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "could": [0, 1, 2, 4, 5, 6, 7, 8], "count": 7, "count_factors_mul_of_po": 4, "countabl": 10, "counterexampl": [2, 9], "counterpart": 5, "coupl": [1, 2, 6, 8], "cours": [1, 2, 4, 6, 7, 8, 9, 10], "covari": 8, "cover": [0, 1, 3, 6, 7, 8, 9], "creat": [0, 1, 4, 6], "creation": 7, "creativ": 5, "criterion": 8, "crucial": [7, 8], "crude": 4, "cryptic": 2, "ct": 2, "ctrl": [0, 1, 2, 4, 5], "cube": 7, "cue": 5, "cup": 3, "curiou": [1, 6], "curli": [1, 2], "current": [1, 2, 5, 6], "curri": 1, "cursor": [0, 1, 2], "curv": 0, "custom": 5, "cut": 4, "cycl": 7, "cyclic": 7, "czubin": 0, "d": [1, 2, 4, 5, 7, 9], "dai": 3, "danger": [4, 5], "data": [1, 2, 4, 5, 6, 8], "databas": [3, 4, 6, 8], "datatyp": 4, "de": 0, "deal": [1, 2, 3, 4, 5, 8], "dealt": 2, "decid": [4, 7, 8], "decidableeq": 4, "decidablepr": 4, "decis": [4, 7], "declar": [0, 1, 4, 5, 6, 7], "decompos": [0, 3], "decreas": [1, 5], "dedekind": 3, "deduc": [6, 7, 8], "def": [0, 2, 3, 4, 5, 6, 7, 8], "default": [1, 2, 3, 4, 5, 6, 7, 9], "defect": [2, 6, 8], "defin": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12], "definit": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "definition": [1, 4, 5, 6, 8], "degre": 7, "degree_mul": 7, "delet": [1, 2, 3], "delic": 3, "delimit": 1, "demonstr": [6, 8], "deni": 0, "denomin": [2, 4, 5], "denot": [1, 3, 4, 6, 7, 8], "dens": 8, "denseinduc": 8, "densiti": 8, "depend": [0, 2, 3, 4, 5, 6, 7, 8], "deriv": [1, 2, 4, 7, 9, 10], "deriv_add": 9, "deriv_eq_zero": 9, "deriv_zero_of_not_differentiableat": 9, "descend": [6, 7], "describ": [0, 1, 2, 3, 4, 5, 6, 8], "descript": [0, 1, 2, 4, 8], "deserv": 4, "design": [0, 1, 2, 3, 5, 7, 8], "desir": [1, 3, 6, 7, 8], "destruct": 2, "destructur": 6, "det": 10, "detail": [1, 2, 3, 4, 5, 6, 7], "detect": 2, "determin": [1, 5, 7, 8], "develop": [0, 1, 4, 7, 10], "devic": 6, "devot": 8, "dfun": 6, "dfunlik": 6, "di": [2, 5], "dia": 6, "dia_assoc": 6, "dia_inv": 6, "dia_on": 6, "diagram": 3, "diamond": 6, "diaoneclass\u2081": 6, "dia\u2081": 6, "dictionari": 1, "did": [0, 2, 6, 8], "dif_neg": 3, "dif_po": 3, "diff_eq": 3, "differ": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "differenti": [10, 12], "differentiableat": 9, "differentiableon": 9, "difficult": [2, 6], "digress": 8, "dimension": [9, 10], "direct": [1, 2, 3, 6, 7, 8, 9], "directli": [1, 2, 4, 5, 6, 8], "discret": 5, "discuss": [1, 2, 4, 5, 6, 7, 8, 9], "dishwash": 0, "disjoint": [3, 7, 10], "disjunct": [1, 3, 12], "dispens": 4, "displai": [0, 1, 2, 6], "dispos": 2, "dist": [1, 8], "dist_comm": [1, 8], "dist_eq_zero": 8, "dist_le_range_sum_dist": 8, "dist_nonneg": [1, 8], "dist_self": 1, "dist_triangl": [1, 8], "distanc": [1, 2, 8, 9], "distinct": [0, 2, 3, 4, 5, 8], "distinguish": [0, 5, 6, 7, 8, 9], "distract": 6, "distriblattic": 1, "distribut": [1, 4, 5, 6], "div": 5, "div_def": 5, "div_dvd_of_dvd": 4, "div_eq_mul_inv": 5, "div_eq_of_eq_mul_right": 4, "div_lt_self": 4, "div_nonneg": 5, "div_po": 2, "divab": 2, "divac": 2, "divbc": 2, "dive": 0, "divid": [1, 2, 4, 5, 7], "divis": [1, 2, 4, 5, 6], "divisor": [1, 2, 4, 5, 7], "do": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "doc": 0, "document": [0, 1, 3, 4, 6], "doe": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "doesn": [1, 2, 7, 8], "domain": [1, 2, 3, 4, 5, 7, 8], "domin": 10, "don": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "done": [0, 2, 3, 4, 6, 7, 8], "doorn": 0, "dot": [1, 7, 8], "doubl": [2, 3], "doubli": 7, "doubt": 0, "down": [0, 3, 4, 6, 8], "downsid": 7, "dozen": 3, "draw": [1, 5, 6], "drop": 2, "dsimp": [2, 3, 5, 7], "dual": [5, 8], "dualli": 8, "duca": 0, "due": [1, 6], "duplic": 6, "dvd": 1, "dvd_add_iff_left": 4, "dvd_antisymm": 1, "dvd_fac": 4, "dvd_factori": 4, "dvd_gcd": 4, "dvd_gcd_iff": 2, "dvd_iff_exists_eq_mul_left": 4, "dvd_mul": 4, "dvd_mul_left": 1, "dvd_mul_of_dvd_left": 1, "dvd_mul_of_dvd_right": 4, "dvd_mul_right": [2, 4], "dvd_of_dvd_pow": 4, "dvd_prod_of_mem": 4, "dvd_sub": 4, "dvd_tran": 1, "dwell": 3, "e": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "each": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "earlier": [1, 7], "easi": [0, 4, 5, 6, 7, 8], "easier": [0, 1, 3, 4, 6, 8], "easiest": [2, 4], "easili": [1, 4, 5, 6, 7], "ebner": 0, "edit": 0, "editor": [0, 1], "ediv_add_emod": 5, "ediv_lt_of_lt_mul": 5, "ediv_mul_l": 5, "ef": 2, "effect": [1, 3, 6, 8], "effici": [5, 7, 8], "effort": [1, 4], "eg": 2, "eight": 8, "either": [1, 2, 3, 5, 6, 8], "elabor": 8, "ele1": 2, "eleg": 5, "element": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "elementari": [0, 3, 5, 7, 8, 12], "elim": 2, "elim_finite_subcov": 8, "elimin": 1, "els": [2, 3, 4], "em": [2, 3], "emanuel": 0, "emb": 5, "embark": 6, "embed": 7, "embodi": 7, "emetricspac": 8, "emod_lt": 5, "emod_lt_of_po": 5, "emod_nonneg": 5, "emphas": [6, 7], "emphasi": [0, 6], "empti": [3, 4, 5, 7, 8, 10], "enabl": [2, 3, 4, 5], "enat": 4, "encapsul": [3, 5, 9], "encod": [7, 10], "encount": [4, 6], "encourag": [0, 1, 2, 3, 4, 5], "end": [1, 2, 3, 4, 5, 6, 7, 8, 9], "endomorph": 7, "endow": [6, 7], "enforc": 7, "engin": 4, "enjoi": [2, 3, 4, 8], "ennreal": 10, "enough": [0, 1, 2, 3, 4, 6, 7, 8], "ensur": [6, 7, 8], "enter": [0, 1, 2, 3, 7, 8], "enthusiast": 0, "entir": [1, 3, 5, 8, 9], "entourag": 8, "entri": [0, 5, 7], "enumer": [1, 2], "epo": 2, "eq": 5, "eq1": 4, "eq2": 4, "eq_bot_iff_card": 7, "eq_bot_iff_foral": 7, "eq_empty_or_nonempti": 8, "eq_neg_of_add_eq_zero": 1, "eq_of_dvd_of_prim": 4, "eq_of_mul_eq_mul_right": 7, "eq_one_or_self_of_dvd": 4, "eq_top_iff": 7, "eq_two_or_odd": 3, "eq_univ": 3, "eq_univ_of_foral": 3, "eq_zero_iff_mem": 7, "eq_zero_or_eq_zero_of_mul_eq_zero": 2, "equal": [1, 2, 3, 4, 5, 6, 7, 8, 10], "equat": [1, 2, 3, 4, 5], "equilater": 5, "equip": [1, 3, 5, 6, 7, 8, 9, 10], "equiv": [5, 7], "equival": [1, 2, 3, 4, 5, 7, 8, 9, 10], "eras": 4, "eric": 0, "error": [1, 2, 3, 6], "erw": 2, "especi": [1, 2, 5, 6, 7, 8], "essenti": [2, 3, 5, 7, 8], "establish": [0, 1, 2, 3, 4, 5], "eta": 5, "etc": 8, "euclidean": 5, "euclideandomain": 5, "eval": [0, 7], "evalu": 7, "eval\u2082": 7, "even": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10], "even_iff": 3, "even_of_even_sqr": 4, "eventu": [2, 3, 8], "eventually_eventually_nhd": 8, "eventually_left_invers": 9, "eventually_of_foral": 8, "eventually_right_invers": 9, "eventuallyeq": 8, "ever": [0, 8], "everi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "everyth": [1, 2, 6, 8], "everywher": [2, 3, 6, 8, 10], "evid": 5, "evolv": 1, "ex": [0, 2], "ex_finset_of_bound": 4, "exact": [1, 2, 3, 4, 5, 7, 8], "exactli": [1, 2, 3, 5, 6, 7, 8], "exampl": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12], "except": [1, 2, 5, 7], "exclam": 8, "exclud": [2, 4], "exercis": [0, 1, 2, 3, 5, 6, 7, 8, 9], "exfalso": 2, "exhibit": [2, 8], "exist": [1, 2, 3, 6, 7, 8], "existenti": [3, 7, 12], "exists_abs_le_of_convergesto": 2, "exists_deriv_eq_slop": 9, "exists_deriv_eq_zero": 9, "exists_forall_g": 8, "exists_forall_l": 8, "exists_infinite_prim": 3, "exists_one_lt_norm": 9, "exists_prime_and_dvd": 3, "exists_prime_factor": 4, "exists_prime_factor_mod_4_eq_3": 4, "exists_subgroup_card_pow_prim": 7, "exot": [7, 8], "exp": [1, 3], "exp_le_exp": 1, "exp_log": 3, "exp_lt_exp": 1, "exp_po": [1, 3], "expand": [1, 2, 3, 4, 5, 6], "expect": [1, 2, 3, 4, 5, 6, 7, 8], "experi": [0, 1, 8], "explain": [1, 2, 3, 4, 5, 6, 7, 8, 10], "explan": [0, 7, 8], "explicit": [1, 2, 5, 6, 8], "explicitli": [1, 2, 3, 5, 6, 7, 8, 9], "explor": [4, 8], "expon": 1, "exponenti": 4, "export": 6, "expos": [2, 8], "express": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "ext": [2, 3, 4, 5, 6, 7], "ext_iff": 5, "extend": [1, 3, 4, 5, 6, 8, 10], "extens": [0, 1, 6, 8, 9], "extension": [3, 5], "extra": [1, 2, 3, 5, 6, 7, 8], "extract": [2, 8], "extrem": [0, 6, 8], "f": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "f_": 8, "f_cont": 8, "f_le": 8, "f_ne": 8, "fac": 4, "fac_po": 4, "face": [5, 6, 8], "facilit": [2, 8], "fact": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12], "factor": [4, 5, 7], "factori": 4, "factorial_po": 4, "factorization_mul": 4, "factorization_pow": 4, "fail": [1, 2, 4, 5, 6, 8, 10], "failur": 6, "fairli": 2, "fals": [1, 2, 3, 4, 6], "falso": 2, "famili": [7, 8, 9], "familiar": [0, 1, 4, 5, 8, 9], "famou": [3, 7], "far": [2, 3, 6, 8], "favor": [1, 5], "fderiv": 9, "fear": 6, "feat": 4, "featur": [0, 2, 4, 7], "feed": 7, "feedback": 0, "feel": [0, 1, 2, 6, 8], "fermatlasttheorem": 0, "fetch": 0, "few": [1, 2, 3, 4, 8], "field": [0, 1, 5, 6, 7, 9], "field_simp": [2, 5], "figur": [0, 1, 2, 5], "file": [0, 1, 4, 5, 6, 7, 8], "fill": [2, 3, 4, 5], "filter": [4, 9, 10, 12], "filter_upward": 8, "filteri": 8, "fin": [5, 7, 10], "final": [1, 2, 3, 5, 7, 8, 10], "finaliso": 7, "find": [0, 1, 2, 4, 5, 6, 8], "finicki": 1, "finish": [1, 2, 3, 4, 7], "finit": [1, 3, 4, 5, 7, 8, 9, 10], "finitedimension": [9, 10], "finset": [4, 5, 7, 8], "fintyp": [7, 8], "first": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "firstcountabletopologi": 8, "fix": [4, 6, 7, 8], "fixm": 5, "flag": [2, 3], "flexibl": 8, "flori": 0, "fn_ub_add": 2, "fneven": 2, "fnhaslb": 2, "fnhasub": 2, "fnlb": 2, "fnodd": 2, "fnub": 2, "fnub_add": 2, "fnuba": 2, "focu": [0, 1, 7, 8, 10], "focus": 8, "folder": 0, "follow": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "font": 7, "foo": [1, 5], "forc": [1, 2, 3, 7], "foreshadow": 1, "forewarn": 0, "forget": 6, "form": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "formal": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "format": 1, "former": 5, "formul": [4, 7, 8], "formula": [7, 10], "forth": 5, "fortiori": 8, "fortun": 3, "forward": [1, 2, 5, 7, 8], "found": [1, 5, 7, 9], "foundat": [2, 3, 4, 5, 7], "four": [2, 5], "fourth": [1, 2], "frac": 5, "fraction": 4, "fraenkel": 2, "framework": 0, "frasa": 0, "free": [0, 1, 7, 8], "freegroup": 7, "freeli": 4, "frequent": 8, "friend": [2, 5], "friendli": 7, "from": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "front": 2, "frustrat": [0, 6], "fr\u00e9chet": 9, "fst": [5, 8], "fubini": 10, "full": [1, 2, 3, 4, 5, 6, 7, 8], "fulli": [3, 7, 8], "fun": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10], "function": [1, 2, 4, 5, 6, 7, 9, 10, 12], "functori": 8, "fundament": [0, 4, 5, 6, 10], "funni": 8, "further": [1, 8], "furthermor": 7, "g": [1, 2, 3, 5, 6, 7, 8, 9, 10], "g_": 8, "g_1": 5, "g_2": 5, "g_3": 5, "gabriel": 0, "gadget": [2, 8], "gain": 6, "galoi": [3, 5, 8], "game": [0, 6], "gauss": 7, "gaussian": [2, 7, 12], "gaussianint": 5, "gaussint": 5, "gave": [7, 8], "gcd": [1, 2, 4], "gcd_zero_left": 1, "gcd_zero_right": 1, "gcongr": 5, "ge": [0, 2, 5], "gener": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "genuin": 2, "geometr": 8, "geometri": 7, "get": [1, 2, 3, 4, 6, 7, 8, 9, 12], "gin": 0, "giovanni": 0, "git": 0, "github": [0, 1], "gitpod": 0, "give": [1, 2, 3, 4, 6, 7, 8, 10], "given": [0, 1, 2, 3, 4, 5, 6, 7, 8], "glb": 1, "global": [7, 8], "go": [0, 1, 2, 3, 4, 6, 8], "goal": [0, 1, 2, 3, 4, 5, 8], "goe": [3, 4, 5, 6, 8], "good": [1, 2, 3, 4, 5, 6, 7, 8], "gorbachev": 0, "got": 6, "govern": [1, 5], "gradual": [6, 8], "graph": 5, "grate": [0, 5], "great": [1, 5], "greater": [0, 1, 2, 3, 4, 8], "greatest": [1, 5, 8], "greef": 0, "greek": [1, 4], "group": [0, 1, 2, 3, 4, 5, 6, 8, 9, 12], "groupact": 7, "groupcat": 5, "groupequivquotientprodsubgroup": 7, "grouptheori": 5, "group\u2081": [5, 6], "group\u2081cat": 5, "group\u2082": 5, "group\u2083": 6, "grow": [0, 6, 7], "grp": 5, "guai": 0, "guarante": [0, 3, 5], "guess": [1, 2, 3, 4, 5], "guilherm": 0, "gya": 3, "g\u2080": 7, "g\u2081": 7, "g\u2082": 7, "h": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "h0": 4, "h1": [1, 2, 3, 4, 5], "h2": [1, 2, 3, 5], "h3": 1, "h_def": 3, "h_inj": 10, "ha": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "hab": 9, "habit": 6, "hac": 6, "hack": 3, "had": [1, 6], "hal": 6, "half": [3, 7], "hand": [1, 2, 3, 4, 5, 6, 8], "handi": 4, "handl": [1, 3, 4, 6, 7], "hanson": 0, "happen": [1, 6, 8], "happi": 0, "hard": [0, 1, 3, 5, 6, 7], "harder": [2, 5], "harm": 3, "hasbasi": 8, "hasderivat": [9, 10], "hasderivat_sin": 9, "hasfderivat": 9, "hasfderivatfilt": 9, "hasfderivatfilter_iff_islittleo": 9, "hasfderivwithinat": [9, 10], "hasinvgroup\u2082": 5, "haskel": 1, "hasmulgroup\u2082": 5, "hasonegroup\u2082": 5, "hasquoti": 6, "hasstrictfderivat": 9, "hausdorff": 8, "have": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "haven": [0, 2, 6, 8], "hb": [2, 8], "hba": 6, "hball": 8, "hbound": 10, "hc": 9, "hd": 8, "hdi": 10, "hdvd": 7, "he": 7, "headach": 4, "headi": 5, "heart": [4, 7], "heather": 5, "heaven": 5, "heavier": 6, "heavili": 8, "hello": 0, "help": [0, 1, 2, 3, 4, 5, 6, 8], "helper": 1, "henc": [0, 2, 3, 4, 5, 6, 8, 9], "here": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "hesit": 4, "hf": [3, 7, 8, 9, 10], "hfa": 2, "hfc": 9, "hff": 9, "hfi": 9, "hfx": 8, "hg": [3, 8, 9, 10], "hgb": 2, "hi": 7, "hidden": 2, "hide": [6, 7, 8], "hierarchi": [5, 7, 12], "high": [2, 7], "higher": 6, "highlight": [0, 2], "hint": [0, 1, 2, 10], "histor": [1, 7], "hit": [0, 1], "hk": [0, 9], "hle": 8, "hlim": 10, "hm": 9, "hmea": 10, "hmn": 0, "hmp": 9, "hn": [3, 4, 8, 9], "hna": 2, "hnb": 2, "hne": 8, "ho": 8, "hold": [1, 2, 3, 4, 5, 7, 8, 10], "home": [4, 5], "homomorph": 7, "hood": [3, 5], "hope": [0, 1], "hopelessli": 6, "hoskinson": 0, "hover": [0, 1, 2, 3, 4, 5], "how": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "howev": [1, 2, 5, 6, 7, 8, 9], "hp": [7, 8], "hpo": 8, "hq": [7, 8], "hr": 8, "hst": 7, "hsu": 8, "ht": 2, "html": 0, "http": 6, "hu": [8, 9], "huge": 6, "huisinga": 0, "hum": 8, "human": 1, "hunt": 6, "hunter": 0, "huo": 8, "hurdl": 6, "hurt": 2, "hux": 8, "hw": 6, "hx": [2, 3, 5, 6, 7, 9], "hxeq": 3, "hy": [5, 6, 7], "hyp": 1, "hypothes": [1, 2, 3, 4, 5], "hypothesi": [0, 1, 2, 3, 4], "hz": [5, 6], "h\u03b5": 9, "h\u2080": [1, 2, 3, 4, 8], "h\u2081": [1, 2, 3, 4], "h\u2082": [1, 3, 4], "h\u2083": [1, 3], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "icc": [8, 9], "ici": 8, "id": [4, 6, 8, 9], "idea": [1, 2, 3, 5, 6, 8], "ident": [3, 4, 5, 6, 7, 8, 12], "identifi": [1, 2, 4], "ie": [6, 8], "if_neg": 3, "if_po": 3, "iff": [1, 3, 7, 8, 9, 10, 12], "ignor": [0, 5, 7, 8], "ih": 4, "iinf_insert": 7, "iinter": 10, "il": 4, "illustr": [1, 2, 3, 4, 5, 7], "im": 5, "imag": [3, 4, 6, 7, 8], "image_subset_iff": 3, "imagin": 1, "imaginari": 5, "immedi": [2, 3, 5, 6], "implement": [2, 5, 6, 7, 9], "impli": [1, 2, 3, 4, 5, 8], "implic": [1, 8, 12], "implicit": [1, 2, 5, 6, 7, 8, 9], "implicitli": [1, 2], "import": [1, 2, 3, 4, 5, 6, 7, 8, 10], "importantli": [6, 7], "imposs": 1, "impress": 0, "improv": [3, 4], "incl": 8, "includ": [0, 1, 2, 3, 4, 6, 7, 8, 9], "inclus": [1, 3, 7, 8], "inconsist": 1, "inconveni": 9, "incorpor": 6, "increas": 1, "increment": [0, 1], "inde": [1, 5, 6, 7, 8, 9], "indefinit": 4, "indent": 1, "independ": [2, 3, 5], "indetermin": 7, "index": [3, 6, 7, 8], "index_eq_card": 7, "index_mul_card": 7, "indic": [1, 2, 3, 5, 6], "indirect": 6, "indirectli": 1, "individu": 1, "induc": 8, "induced_compos": 8, "induct": [7, 8, 12], "induction_on": 4, "inequ": [1, 2, 6, 8], "inf": [1, 6, 8], "inf_assoc": 1, "inf_bot_of_coprim": 7, "inf_comm": [1, 7], "inf_le_left": [1, 8], "inf_le_right": 1, "inf_sup_left": 1, "inf_sup_right": 1, "inf_sup_self": 1, "infer": [1, 2, 3, 5, 6, 7], "infer_inst": [9, 10], "inferenti": 0, "inferinst": 7, "inferr": 6, "infimum": [1, 6, 7, 8, 10], "infin": [4, 8, 10], "infinit": [3, 8, 12], "infix": [1, 6], "infixl": 6, "infixr": 6, "inform": [0, 1, 2, 3, 5, 6, 8], "infoview": [1, 6], "infrastructur": 0, "infti": 9, "ingredi": [3, 5, 8, 9], "inhabit": [3, 5, 8], "inherit": [5, 6, 7], "inherit_doc": 6, "inj": 4, "inject": [2, 3, 4, 6, 7, 8], "injective_lift_iff": 7, "injf": [2, 3], "injg": 2, "injon": [3, 10], "inl": [2, 3], "inner": 3, "input": [1, 3, 8], "inr": [2, 3], "inria": 6, "inscrut": [2, 3], "insert": [0, 2, 4, 5, 7, 8, 9], "insid": [0, 1, 2, 3, 7], "insight": 2, "insist": [1, 6], "inspect": 1, "inspir": 2, "inst": 6, "inst_1": 6, "instal": [0, 6], "instanc": [1, 2, 3, 4, 5, 6, 7, 8, 9], "instanti": [2, 5, 6, 8], "instcommr": 5, "instead": [0, 1, 2, 3, 4, 5, 6, 7, 8], "instruct": [0, 1, 2, 8], "int": [5, 6, 7], "intact": 0, "integ": [1, 2, 4, 6, 7, 12], "integr": [2, 9, 12], "integral_add": 10, "integral_eq_sub_of_hasderivat": 10, "integral_hasstrictderivat_right": 10, "integral_id": 10, "integral_image_eq_integral_abs_det_fderiv_smul": 10, "integral_one_div": 10, "integral_prod": 10, "intend": [0, 1, 2, 5], "inter_def": 3, "inter_set": 8, "interact": [0, 5, 6, 7, 10], "interchang": 1, "interconnect": 5, "interest": [1, 2, 3, 5, 6, 8], "interestingli": [5, 7, 9], "interfac": 5, "interior": [5, 9], "interior_iinter_subset": 9, "interior_subset": 9, "intermedi": [1, 6, 8], "intern": [2, 5, 7], "interpret": [0, 1, 4, 5, 7, 8], "intersect": [1, 3, 5, 6, 7, 8, 10], "interv": [4, 8, 10], "interval_cas": 4, "intervalintegr": 10, "intro": [0, 1, 2, 3, 4, 5, 6, 7, 8], "introduc": [0, 1, 2, 3, 4, 8, 10], "introduct": [1, 2, 7, 8, 12], "introductori": 9, "intuit": [3, 8], "inv": [5, 6], "inv_dia": 6, "inv_eq_of_dia": 6, "inv_eq_of_mul": 6, "inv_mem": 7, "inv_mul": 6, "invari": 10, "invers": [1, 3, 5, 6, 7, 9, 10], "inverse_spec": 3, "invert": [6, 7], "invest": 5, "invfun": [3, 5], "invfun_eq": 3, "invisibli": [5, 6], "invok": [0, 1, 8], "involv": [1, 2, 4, 5, 6, 7, 8], "inv\u2081": 6, "inward": 2, "ioo": [8, 9], "ipo": 4, "irrat": 12, "irration": 4, "irreduc": [4, 5], "irreducible_iff_prim": 5, "irreflex": 2, "is_addit": 5, "isaddhaarmeasur": 10, "isaiah": 0, "isalgclos": 7, "isbigo_iff_isbigowith": 9, "isbigowith": 9, "isbigowith_iff": 9, "isclos": [8, 9], "isclosed_l": [8, 9], "iscompact": 8, "iscompact_icc": 8, "iscompact_univ": 8, "iscoprim": 7, "iscoprime_iff_add": 7, "iscoprime_iff_codisjoint": 7, "iscoprime_iff_exist": 7, "iscoprime_iff_sup_eq": 7, "iscoprime_inf": 7, "iscycl": 7, "isdomain": [2, 7], "iseqv": 6, "islinear": 5, "islittleo_iff_forall_isbigowith": 9, "islocalmin": 9, "ismonoidhom\u2081": 6, "ismonoidhom\u2082": 6, "isn": [0, 2, 3, 4, 6], "isomorph": [5, 7, 9], "isopen": 8, "isopen_compl_iff": 8, "isopen_empti": 8, "isopen_iff": 8, "isopen_iinter_of_finit": 8, "isopen_iunion": 8, "isopen_univ": 8, "iso\u2081": 7, "iso\u2082": 7, "isroot": 7, "issu": [1, 4, 5, 6, 8], "issubgroup": 7, "isunit": 7, "item": 8, "iter": 9, "iteratedfderiv": 9, "its": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "itself": [0, 2, 3, 5, 6, 7, 8, 9], "iunion": 10, "j": [3, 7], "jimmi": 0, "job": 1, "johan": 0, "john": 0, "join": [0, 1, 5], "journei": 8, "juggl": 6, "julian": 0, "jump": [1, 4, 5, 8], "just": [0, 1, 2, 3, 4, 5, 6, 7, 8], "justif": [1, 2], "justifi": [0, 1, 2, 8], "k": [0, 2, 4, 5, 7, 8, 9], "keep": [1, 5, 6, 7], "kei": [1, 4, 5, 7, 8], "keith": 0, "ker": 7, "ker_eq_bot_iff": 7, "ker_pi_quotient_mk": 7, "ker_restrict": 7, "kernel": 7, "keyboard": 1, "keyword": [1, 2, 4, 5], "kind": [0, 1, 6, 8], "knew": 8, "know": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "known": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "k\u00fclshammer": 0, "l": [0, 1, 9, 10], "label": [1, 2], "lagrang": 7, "lake": 0, "lambda": [2, 5], "lambda_l": 5, "lambda_nonneg": 5, "languag": [0, 1, 2, 3], "larg": [0, 6, 8], "larger": [1, 8], "last": [1, 2, 3, 4, 5, 6, 7, 8], "later": [0, 1, 2, 4, 5, 6, 7, 8], "latter": [5, 7, 8], "lattic": [1, 5, 6, 7, 8], "law": [1, 7], "layer": [6, 8], "lbf": 2, "lbg": 2, "lcm": 1, "lcm_zero_left": 1, "lcm_zero_right": 1, "ldot": [2, 3, 4], "le": [1, 5, 6], "le_abs_self": 2, "le_antisymm": [1, 2], "le_iff_exists_add": 8, "le_inf": 1, "le_inf_iff": 8, "le_min": 1, "le_mul_of_one_le_right": 5, "le_of_dvd": 4, "le_of_l": 6, "le_of_max_le_left": 2, "le_of_max_le_right": 2, "le_of_mul_le_mul_right": 5, "le_of_not_gt": 2, "le_op_norm": 9, "le_or_gt": 2, "le_principal_iff": 8, "le_refl": [1, 2], "le_sup": 4, "le_sup_left": 1, "le_sup_right": 1, "le_tran": [1, 2], "lead": [1, 2, 4, 5, 6, 7, 8], "leader": 1, "lean": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "lean4": 1, "learn": [0, 1, 4, 5], "least": [1, 5, 6, 8], "leav": [0, 1, 2, 3, 5, 6, 7], "lebesgu": 10, "led": 6, "left": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "left_distrib": [5, 6], "left_inv": 5, "left_inv_eq_right_inv": 6, "left_inv_eq_right_inv\u2081": 6, "left_neg_eq_right_neg": 6, "leftinvers": 3, "leftinverse_invfun": 3, "legal": 1, "lemma": [2, 4, 5, 6, 7, 8, 9, 10, 12], "less": [1, 2, 3, 4, 5, 6, 7, 8], "let": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "letter": [1, 5, 9], "level": [1, 2, 6], "leverag": 8, "le\u2081": 6, "librari": [0, 1, 2, 3, 4, 5, 7, 8, 9], "life": [0, 2], "lift": 7, "light": 5, "like": [0, 1, 2, 3, 4, 5, 6, 7, 8], "lim_": 8, "limit": [2, 6, 8], "linarith": [1, 2, 4, 5], "line": [0, 1, 2, 3, 4, 6, 7], "linear": [1, 2, 5, 7, 8], "linear_combin": 7, "linearord": 2, "linearorderedr": 5, "liner": 0, "linf": 5, "link": [5, 6], "list": [1, 2, 3, 4, 5], "littl": [1, 2, 8, 9], "liu": 0, "live": [0, 5], "ll": [0, 2, 4, 6, 8], "local": [1, 2, 6, 8, 9], "localinvers": 9, "log": [1, 3, 10], "log_le_log": 1, "log_lt_log": 1, "logic": [0, 1, 3, 4, 5, 7, 12], "logician": 1, "long": [1, 2, 3, 5, 6, 7, 9], "longer": [0, 4, 5], "look": [1, 2, 3, 4, 6, 7, 8], "loop": 4, "loss": 4, "lot": [0, 1, 3, 5, 6, 7, 8], "loud": 1, "lower": [1, 2, 4], "lowest": 4, "lr": 1, "lt_ab": 2, "lt_asymm": 2, "lt_iff_le_and_n": 1, "lt_iff_le_not_l": 2, "lt_irrefl": [1, 2], "lt_of_le_of_lt": [1, 2], "lt_of_lt_of_l": 1, "lt_of_not_g": 2, "lt_succ_iff": 4, "lt_succ_of_l": 4, "lt_tran": [1, 2], "lt_trichotomi": 2, "lt\u2081": 6, "lu": 0, "lub": 1, "m": [0, 1, 2, 4, 6, 7, 8, 9], "m_iunion": 10, "mac": [1, 2], "macbeth": 5, "machineri": [5, 6, 8], "maco": 0, "made": [1, 2, 3, 5, 8], "magic": [2, 5, 6], "mai": [0, 1, 2, 3, 5, 6, 7, 8, 9], "main": [2, 6, 8, 9], "mainli": 7, "maintain": 1, "make": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "manag": [0, 1, 4, 5, 8], "mani": [1, 2, 3, 5, 6, 7, 8, 9, 10, 12], "manifest": [1, 8], "manipul": [2, 5, 7, 8], "manner": [2, 5], "manual": [0, 3, 4], "map": [1, 2, 3, 5, 6, 7, 8], "map_add": [6, 7, 9], "map_eq": 8, "map_inv": 7, "map_inv_of_inv": 6, "map_le_iff_le_comap": 8, "map_map": 8, "map_mono": 8, "map_mul": [6, 7], "map_on": [6, 7], "map_pow": 7, "map_smul": 9, "map_zero": [6, 7], "mapsto": [1, 5], "map\u2082": 6, "marc": 0, "mario": 0, "mark": [0, 1, 2, 6, 8], "marker": 2, "marriag": 5, "martin": 0, "mascellani": 0, "mass": 10, "master": [0, 1, 4], "match": [1, 2, 5], "mathbb": [3, 4, 5, 7], "mathcal": [5, 9], "mathemat": [0, 1, 2, 3, 4, 5, 6, 7, 8], "mathematician": [4, 8], "mathematics_in_lean": 0, "mathfrak": 7, "mathieu": 0, "mathlib": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "matric": [1, 5, 7], "matter": [1, 2], "matthew": 0, "mauricio": 0, "max": [1, 2, 6, 8, 10], "maxim": 7, "maximum": [2, 4, 8], "mayb": 6, "mcdowel": 0, "mdvdn": 4, "mean": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "meaningless": 2, "meant": [0, 2, 6], "meanwhil": [1, 4], "measur": [0, 5, 8, 9, 12], "measurableset": 10, "measurablespac": 10, "measure_eq_iinf": 10, "measure_iunion_l": 10, "measuretheori": 10, "mechan": [1, 2, 5], "mediat": 4, "meet": [1, 2, 3, 5], "mem": 3, "mem_": 4, "mem_ball_self": 8, "mem_bot": 7, "mem_closedball_self": 8, "mem_closure_iff": 8, "mem_closure_iff_clusterpt": 8, "mem_closure_iff_nhds_basi": 8, "mem_closure_iff_seq_limit": 8, "mem_closure_of_tendsto": 8, "mem_comap": 7, "mem_diff": 3, "mem_eras": 4, "mem_filt": 4, "mem_iff": 8, "mem_iint": 3, "mem_iinter\u2082": 3, "mem_image_of_mem": 3, "mem_insert": 4, "mem_insert_of_mem": 7, "mem_insert_self": 7, "mem_int": 4, "mem_inter_iff": 3, "mem_iunion": 3, "mem_iunion\u2082": 3, "mem_ker": 7, "mem_map": 7, "mem_nhds_iff": 8, "mem_of_dvd_prod_prim": 4, "mem_of_tendsto": 8, "mem_rang": 7, "mem_sdiff": 4, "mem_setof": 3, "mem_sup": 7, "mem_union": [3, 4], "member": [3, 8], "membership": [3, 4, 6, 7], "mention": [2, 3, 5, 6, 7, 8], "menu": [0, 1], "meq": 4, "messag": 6, "messi": 5, "messier": 5, "meta": [2, 6], "metavari": 6, "method": [0, 2, 3, 4, 5], "metric": [1, 5, 9, 12], "metricspac": [1, 8, 9], "mf": 2, "mg": 2, "mge2": 4, "mgt2": 4, "mid": 5, "middl": [0, 1, 2, 8], "midpoint": 5, "might": [1, 2, 3, 4, 5, 7], "mil": 0, "min": [1, 2, 8, 10], "min_le_left": 1, "min_le_right": 1, "mind": [1, 2, 5, 6, 7], "mindich": 0, "minfac": 4, "minimum": 8, "minor": [6, 9], "mislead": 7, "miss": [1, 3, 4], "mission": 0, "mk": [5, 6, 7, 8], "mk_surject": 7, "mkofmuleqon": 7, "mkofnhd": 8, "mltn": 4, "mne1": 4, "mnez": 4, "mod": 5, "mod_4_eq_3_or_mod_4_eq_3": 4, "mod_def": 5, "mod_lt": 4, "mode": [1, 2, 5], "model": [3, 8], "modern": [5, 7], "modifi": 6, "modu": 1, "modul": [6, 7], "modular": 1, "module\u2081": 6, "module\u2083": 6, "modulo": [1, 4, 5], "moment": [1, 2, 5], "mono": 8, "monof": 2, "monoid": [2, 3, 4, 6, 12], "monoidhom": 7, "monoidhomclass": 6, "monoidhomclass\u2081": 6, "monoidhomclass\u2082": 6, "monoidhomclass\u2083": 6, "monoidhom\u2081": 6, "monoid\u2081": 6, "monoid\u2082": 6, "monoid\u2083": 6, "monoton": [2, 6, 8], "monro": 0, "monticon": 0, "moral": [0, 5, 7], "more": [0, 2, 3, 4, 5, 6, 7, 8, 9, 12], "moreov": [0, 1, 4, 5, 8], "morphism": [5, 9, 12], "morrison": 0, "most": [1, 2, 3, 4, 5, 6, 7, 8, 10], "mostli": 7, "motiv": 2, "move": [0, 1, 2, 6, 8], "mp": [1, 2, 3, 4, 8], "mpr": [1, 2, 5, 8], "much": [0, 2, 4, 6, 7, 8, 9], "mul": [4, 5, 6, 8], "mul_add": [0, 1, 4, 6], "mul_assoc": [1, 2, 4, 5, 6, 7], "mul_assoc\u2083": 6, "mul_comm": [1, 2, 4, 5, 6, 7], "mul_def": 5, "mul_div_cancel": 4, "mul_div_cancel\u2080": 2, "mul_im": 5, "mul_inv": [6, 7], "mul_inv_cancel_right": 5, "mul_inv_rev": 1, "mul_inv_self": 7, "mul_le_inf": 7, "mul_le_left": 7, "mul_le_mul": 2, "mul_le_right": 7, "mul_left_cancel\u2083": 6, "mul_left_comm": 4, "mul_left_inv": [1, 5], "mul_left_not_lt": 5, "mul_lt_mul_right": 2, "mul_mem": [6, 7], "mul_mod": 4, "mul_mod_mod": 4, "mul_mod_right": 4, "mul_nonneg": 1, "mul_on": [1, 5, 6, 7], "mul_po": [1, 4], "mul_r": 5, "mul_right_cancel\u2083": 6, "mul_right_inj": 4, "mul_right_inv": [1, 5], "mul_smul": [6, 7], "mul_sub": 1, "mul_sum": 5, "mul_zero": [1, 5, 6], "mulact": 7, "mulequiv": 7, "muloneclass": 6, "multilinear": 9, "multipl": [1, 2, 3, 4, 5, 6, 7, 9], "multipli": 5, "multiset": 7, "multivari": 7, "mulzeroclass": 6, "mundan": 2, "must": [1, 5, 6, 8], "mvpolynomi": 7, "my_fil": 0, "my_lemma": 2, "my_lemma2": 2, "my_lemma3": 2, "my_lemma4": 2, "my_squar": 5, "myab": 2, "myelement": 7, "mygroup": 7, "mymap": 7, "mymorph": 7, "mynat": 4, "mynewmorph": 7, "mypoint1": 5, "mypoint2": 5, "mypoint3": 5, "myre": 1, "mysmul": 6, "mysquar": 5, "mysteri": [1, 5, 6], "mz": 4, "m\u02e3": 7, "n": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "n_p": 8, "n_q": 8, "na": 2, "naiv": [6, 8], "name": [1, 2, 3, 4, 5, 6, 7, 8, 9], "namespac": [1, 2, 3, 4, 5, 7, 8], "nash": 0, "nat": [0, 1, 2, 3, 4, 5, 7, 8], "natab": 5, "natabs_mul": 5, "natabs_norm_mod_lt": 5, "natabs_of_nonneg": 5, "natal": 0, "natdegre": 7, "natdegree_comp": 7, "natdegree_mul": 7, "natur": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "nb": 2, "ne": [4, 5], "nearbi": [1, 4], "nearest": 5, "nebot": 8, "nebot_of_l": 8, "necessari": [0, 2, 4, 5, 7], "necessarili": [1, 10], "need": [0, 1, 2, 3, 4, 5, 6, 7, 8], "neg": [5, 6, 8, 10], "neg_add": 6, "neg_add_cancel_left": 1, "neg_def": 5, "neg_eq_of_add_eq_zero": 1, "neg_im": 5, "neg_le_abs_self": 2, "neg_mem": 7, "neg_neg": 1, "neg_r": 5, "neg_zero": 1, "negat": [1, 5, 12], "negsucc": 6, "neighborhood": 8, "neither": [3, 5, 6], "neq": 4, "nest": [1, 2], "net": 1, "neutral": [6, 7], "never": [0, 6], "new": [0, 1, 2, 3, 4, 5, 6, 7, 8], "newcom": 0, "next": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "nge": 2, "nhd": 8, "nhds_basis_bal": 8, "nhds_basis_closedbal": 8, "nhds_basis_ioo_po": 8, "nhds_basis_open": 8, "nhds_induc": 8, "nhds_mkofnhd": 8, "nhds_prod_eq": 8, "nice": [1, 2, 4, 6, 7, 8], "nicer": [5, 7, 8], "nicola": 0, "nineteenth": 3, "nna": 2, "nnc": 2, "nnez": 4, "nnf": 2, "nng": 2, "nnz": 4, "non": [1, 3, 6, 7, 8, 10], "noncomm_r": 1, "noncomput": [3, 5, 7], "nonconstruct": 7, "nondecreas": [2, 4], "nondistribut": 1, "nonempti": [3, 7, 8], "nonempty_interior_of_iunion_of_clos": 9, "nonexist": 2, "nonneg": [1, 5], "nonneg_of_mul_nonneg_left": 1, "nontrivi": [2, 3, 4, 5, 8, 9], "nontriviallynormedfield": [9, 10], "nonzero": [2, 4, 5, 10], "nor": [3, 5], "norm": [2, 5, 8, 12], "norm_add_l": 9, "norm_conj": 5, "norm_eq_zero": [5, 9], "norm_mod_lt": 5, "norm_mul": [5, 9], "norm_nonneg": [5, 9], "norm_num": [1, 2, 4, 5], "norm_po": 5, "norm_smul": 9, "norm_y_po": 5, "normal": 7, "normedaddcommgroup": [9, 10], "normedaddgroup": 9, "normedfield": 9, "normedgroup": 9, "normedspac": [9, 10], "not_imp_self": 3, "not_le_of_gt": 2, "not_lt_of_g": [2, 4, 5], "not_monotone_iff": 2, "not_norm_mul_left_lt_norm": 5, "not_not": 2, "notat": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "note": [1, 2, 4, 5, 6, 7, 8, 10], "noth": [1, 2, 3, 4, 5, 6, 7], "notic": [1, 2, 3, 4, 5, 7, 8], "notin": 3, "notion": [1, 2, 3, 4, 5, 7, 8, 9, 10], "noun": 6, "now": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "nozerodivisor": 7, "np": 4, "npow_nz": 4, "npowz": 4, "nsmul": [5, 6], "nsmul_succ": 6, "nsmul_zero": 6, "nsmulrec": 5, "nsmul\u2081": 6, "nsqr_nez": 4, "nt": 2, "nth_rw": 1, "number": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12], "numer": [1, 4, 5], "nut": 1, "n\u2080": 2, "n\u2081": 2, "o": 9, "obfusc": 8, "object": [0, 1, 2, 3, 4, 5, 7, 12], "observ": [2, 4, 8], "obtain": [1, 2, 4, 5, 8, 9], "obviou": [0, 4, 5, 6], "occasion": 8, "occur": 4, "occurr": 1, "odd": [1, 2, 3, 4], "of_le_succ": 4, "of_map": 8, "ofbiject": 7, "off": [2, 3, 4], "offend": 6, "offer": [0, 2, 5, 8], "ofnat": 6, "ofnat_l": 5, "ofnat_lt": 5, "ofreal": 7, "often": [0, 1, 2, 3, 4, 5, 6, 7, 8], "og": 2, "old": [2, 5, 6], "oliv": 0, "omit": 5, "onc": [1, 2, 3, 4, 5, 6, 7, 8, 10], "one": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "one_add_one_eq_two": 1, "one_def": 5, "one_dia": 6, "one_eq_top": 7, "one_im": 5, "one_mem": [6, 7], "one_mul": [1, 2, 5, 6], "one_r": 5, "one_smul": [6, 7], "oner": 1, "ones": [0, 1, 2, 3, 5, 10], "one\u2081": 6, "one\u2082": 6, "onli": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "onlin": 0, "onto": 7, "op_norm_le_bound": 9, "open": [0, 1, 2, 3, 4, 5, 7, 9, 10], "oper": [1, 2, 3, 4, 5, 6, 7, 8, 9], "opnorm_le_of_shel": 9, "opportun": [7, 8], "opposit": [6, 8], "optim": [6, 10], "option": [1, 2, 4, 5, 6, 8], "orbit": 7, "orbitequivquotientstabil": 7, "orbitrel": 7, "order": [1, 2, 3, 4, 5, 6, 8, 9], "orderedcanceladdcommmonoid": 2, "orderedcommmonoid\u2081": 6, "orderpreshom": 6, "orderpreshomclass": 6, "orderpresmonoidhom": 6, "ordinari": [1, 2, 4, 5, 7, 8], "ordinarili": [4, 5], "organ": 0, "organiz": 1, "orient": 5, "origin": [0, 1, 5, 7], "other": [0, 1, 2, 3, 4, 5, 6, 7, 8], "otherwis": [1, 2, 3, 4, 5, 7], "ott": 0, "our": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "ourselv": [4, 6], "out": [0, 1, 2, 3, 4, 5, 6, 7, 8], "outer": 1, "outermost": 3, "outlin": [1, 2, 4, 8], "outparam": 6, "output": [1, 7], "outsid": [1, 4], "over": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "overlap": [6, 7], "overload": 3, "overview": 12, "own": [0, 1, 4, 5, 6], "p": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "p4": 4, "p4eq": 4, "p_1": 4, "p_i": [4, 8], "p_k": 4, "p_n": 4, "p_ne_zero": 7, "packag": 7, "page": [0, 1, 4], "pai": [1, 2, 6, 7, 8], "pain": 7, "pair": [1, 2, 4, 5, 7, 8], "pairwis": 10, "panel": 0, "paper": [2, 3, 5, 7, 8, 10], "paquet": 0, "paradox": 8, "paragraph": 8, "paramet": [5, 6], "parent": 6, "parenthes": [1, 2, 3, 4], "pariti": 0, "parity_simp": 0, "pars": [1, 3, 7], "part": [1, 2, 3, 4, 5, 6, 8, 10], "partial": [0, 1, 2, 3, 5, 6, 7], "partialord": [1, 2], "partialorder\u2081": 6, "particular": [1, 2, 5, 6, 7, 8], "partit": 7, "partli": [1, 6, 7], "pass": [1, 5], "past": [0, 1, 7], "path": 6, "patholog": 8, "pattern": [1, 2, 3, 5, 6], "payoff": 5, "pdf": 0, "pdvd": 4, "pedro": 0, "peel": 2, "pen": [2, 7], "peopl": [0, 1], "perform": [1, 2, 3], "perm": [5, 7], "permgroup": 5, "permiss": 1, "permut": [4, 7], "person": 0, "perspicu": 2, "phenomenon": 3, "phrase": [0, 1, 2, 4, 5], "pi": [7, 8], "pick": [0, 6], "pictur": [4, 5, 7], "piec": [1, 4, 5, 6, 7, 8], "pierpaolo": 0, "pietro": 0, "pim": 0, "pinot": 7, "piotrowski": 0, "place": [0, 1, 2, 5, 8], "placehold": 2, "placement": 4, "plai": [1, 3, 4, 6, 7, 8], "plan": [1, 6, 8], "plane": 8, "plausibl": 3, "ple": 4, "pltn": 4, "pne3": 4, "point": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10], "pointwis": [5, 8, 9], "polynomi": 5, "ponen": 1, "poor": 6, "pop": 0, "port": 0, "posit": [1, 3, 4, 5, 8, 10], "possibl": [1, 2, 3, 4, 5, 7, 8], "possibli": 5, "postfix": 6, "pos\u2080": 2, "potscrubb": 0, "pow_eq": 4, "pow_eq_zero": [2, 4], "pow_succ": 4, "pow_two": [1, 4], "pow_two_le_fac": 4, "pow_two_nonneg": [1, 2], "power": [0, 1, 3, 4, 5, 6], "pp": 4, "practic": [1, 2, 3, 6, 7, 8], "pragmat": 5, "pre": 2, "preal": 5, "preced": [4, 7], "precis": [1, 3, 7, 8, 9], "precondit": 8, "pred": 4, "predecessor": 4, "predic": [2, 3, 4, 6, 7, 8, 9], "prefer": [0, 1, 2, 3], "prefix": [4, 6, 7], "preimag": [3, 7, 8], "preliminari": 6, "prematur": 6, "preorder": [2, 6, 8], "preorder\u2081": 6, "presenc": 6, "present": [1, 2, 4, 7, 8], "presentedgroup": 7, "preserv": [4, 6, 8], "preserves_mul": 5, "press": 0, "presuppos": 0, "pretend": 6, "pretti": [2, 6, 7, 8], "previou": [1, 2, 3, 5, 6, 7, 8, 9, 10], "previous": 6, "price": 8, "primari": 6, "primarili": [6, 7, 8], "prime": [1, 2, 3, 5, 6, 7, 12], "prime_def_lt": 4, "prime_iff": 3, "prime_of_mem_primefactorslist": 4, "prime_p": 4, "prime_q": 4, "prime_thre": 4, "prime_two": 4, "prime_x": 3, "primefactorslist": 4, "primefactorslist_uniqu": 4, "primes_infinit": 4, "primes_mod_4_eq_3_infinit": 4, "primit": [2, 3], "princip": 8, "principalidealr": 5, "principl": [1, 2, 3, 4, 6, 9], "print": [0, 3, 4, 5, 10], "priori": 6, "prioriti": 5, "probabl": [1, 5, 6, 8], "problem": [3, 4, 5, 6, 8], "proce": [4, 6], "procedur": [4, 6], "proceed": 7, "prod": [4, 7, 8, 10], "prod_": 4, "prod_empti": 4, "prod_insert": 4, "prod_map": 8, "prod_mk": 8, "prod_po": 4, "prod_primefactorslist": 4, "prod_range_succ": 4, "prod_range_zero": 4, "prodcongr": 7, "prodequivpi": 7, "produc": [1, 2, 7, 9], "product": [2, 4, 5, 6, 7, 8, 10], "profici": 4, "program": [0, 1, 2], "progress": [0, 1, 5, 7], "prohibit": 8, "project": [0, 4, 5, 7, 8], "projector": 7, "promin": 7, "promis": [6, 8], "promot": 1, "proof": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "prop": [0, 2, 3, 4, 5, 6, 7, 8, 10], "propag": 6, "properti": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "proposit": [0, 2, 3, 4, 5], "protect": 5, "provabl": [1, 3, 6, 8], "prove": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12], "proven": 7, "provid": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "proxi": 5, "pseudoemetricspac": 8, "pseudometricspac": 8, "psycholog": 6, "pull": [0, 7, 8], "pullback": [7, 8], "pun": 2, "pure": [1, 8], "pure_le_nhd": 8, "purpos": [1, 2, 3, 4, 5, 6, 8], "push": [2, 4, 7, 8], "push_neg": [2, 3, 4], "push_pul": 8, "pushforward": [7, 8], "put": [0, 1, 2, 3, 4, 5, 6, 7, 8], "q": [2, 4, 5, 6, 7, 8], "qk": 4, "quad": 5, "quadrat": 5, "quantifi": [1, 3, 4, 5, 7, 8, 12], "quantiti": 8, "quest": 6, "question": [0, 4, 6, 8, 10], "quick": [4, 7, 9], "quicker": 0, "quickli": [3, 7, 10], "quirki": 4, "quit": [2, 6, 8], "quot": [5, 8], "quotequivofeq": 7, "quotient": [4, 5, 6, 8], "quotient_mul_add_remainder_eq": 5, "quotient_zero": 5, "quotientgroup": 7, "quotientinfringequivpiquoti": 7, "quotientkerequivrang": 7, "quotientmap": 7, "quotientmonoid": 6, "quotientmulequivofeq": 7, "r": [1, 2, 4, 5, 6, 7, 8], "r_wellfound": 5, "radiu": 8, "raini": 3, "rais": [1, 4], "random": 6, "rang": [0, 2, 3, 4, 7, 8], "rare": 6, "rather": [0, 1, 2, 4, 5, 6, 7, 8], "ration": [1, 2, 4, 8], "rb": 8, "rcase": [2, 3, 4, 8], "rclike": 9, "re": [4, 5], "reach": [2, 6], "read": [0, 1, 4, 5, 6, 7, 8], "readabl": [1, 2, 3, 8], "reader": [1, 8], "readi": [4, 6, 7, 8, 9], "real": [1, 2, 3, 4, 5, 6, 8, 9, 10], "real_norm_l": 9, "realli": [1, 2, 3, 4, 6, 7, 8], "reason": [0, 1, 2, 4, 5, 6, 7, 8], "rec_on": 8, "recal": [1, 2, 4, 5, 7, 8, 10], "recaptur": 8, "recast": 8, "recent": 5, "recogn": [1, 2, 4, 5, 6, 8], "recommend": [0, 1, 3], "recon": 8, "reconcil": 2, "record": [5, 6], "recov": 8, "recurs": [2, 3, 5, 12], "redefin": [5, 6], "reduc": [0, 2, 3, 4, 5], "reduct": [2, 3, 5], "redund": [1, 5, 8, 10], "refer": [0, 1, 2, 4, 5, 6, 8, 9], "refin": [4, 9], "refl": [2, 3, 5, 6, 7], "refl_tran": 5, "reflect": 2, "reflex": [1, 2, 5], "reformul": 8, "refus": [6, 8], "regiment": 0, "region": 3, "regist": [5, 6, 7], "regular": [6, 8], "regularspac": 8, "rel": [3, 5], "relat": [1, 2, 3, 5, 6, 7, 8, 9, 10], "relatedli": 8, "relationship": [3, 4], "relativ": 3, "relev": [0, 1, 2, 4, 5, 6, 7, 8], "reli": [1, 2, 5, 8], "remain": [0, 1, 2, 3, 5, 6, 8], "remaind": [4, 5, 7], "remainder_lt": 5, "remark": [5, 6], "rememb": [1, 2, 3, 4, 5, 6, 7, 8], "remov": [4, 8], "renam": 0, "render": [2, 4], "repeat": [1, 4, 5, 6], "repeatedli": [2, 8], "repetit": [1, 6], "replac": [0, 1, 2, 3, 4, 6, 7], "replai": 0, "report": 1, "repositori": [0, 1], "repres": [0, 1, 2, 3, 4, 5, 6, 9], "represent": [3, 4, 5], "reproduc": 5, "reprov": [1, 7], "requir": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "resolut": 6, "resolve_left": 3, "resourc": 0, "respect": [1, 2, 3, 4, 5, 7, 8], "respons": [0, 1], "rest": [2, 3, 5, 7, 8], "restat": [2, 6, 7], "restor": 6, "restrict": [3, 4, 7, 8], "result": [0, 1, 2, 3, 4, 5, 6, 7, 8], "retri": 6, "return": [0, 2, 3, 4, 5, 7, 8], "reus": 6, "reusabl": 6, "reveal": 1, "revers": [1, 2, 3, 5, 8], "revert": [4, 5], "review": [7, 8], "rewrit": [0, 1, 2, 3, 4, 5, 6, 8], "rewritten": 3, "rfl": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "rich": [5, 6], "rid": 2, "right": [1, 2, 3, 4, 5, 6, 8, 9], "right_distrib": [5, 6], "right_inv": 5, "rightinvers": 3, "ring": [0, 1, 2, 3, 4, 5, 6, 12], "ringequiv": 7, "ringhom": [6, 7], "ringhomclass\u2083": 6, "ringhom\u2081": 6, "ring\u2081": 6, "ring\u2083": 6, "rintro": [0, 2, 3, 4, 7, 8], "rise": [4, 6, 7], "road": 5, "robust": [5, 6], "role": [4, 5, 8], "roll": 9, "rolland": 0, "roman": 5, "root": [5, 6, 7, 12], "roots_mul": 7, "roots_x_sub_c": 7, "roughli": [2, 3, 4], "round": [0, 1, 5], "routin": 2, "rpo": 8, "rule": [0, 2, 4, 5, 6, 8], "run": 0, "rush": 0, "rw": [0, 2, 3, 4, 5, 6, 7, 8, 12], "rwa": [3, 4, 5], "r\u02e3": 7, "s_": 3, "s_0": [2, 3], "s_1": 2, "s_2": 2, "s_n": [2, 3], "sa": 2, "sad": 8, "safe": [6, 7], "safer": 7, "sai": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "said": [0, 2, 4, 5], "sake": [1, 4], "salient": 8, "same": [0, 1, 2, 3, 4, 5, 6, 7, 8], "satisfi": [1, 3, 4, 5, 6, 8, 9], "save": 2, "saw": [1, 5, 6, 7, 8], "sb": 2, "sb_fun": 3, "sb_inject": 3, "sb_right_inv": 3, "sb_surject": 3, "sbaux": 3, "sbfun": 3, "sbset": 3, "scalar": [5, 6, 7, 9], "scale": 3, "scari": 5, "scheme": 5, "schroeder_bernstein": 3, "schr\u00f6der": 12, "scienc": 6, "scientist": 2, "scope": [1, 2, 3, 5, 7], "scott": 0, "scratch": 2, "script": 1, "search": [4, 5, 6], "second": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "section": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "see": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "seek": 5, "seem": [1, 2, 4, 6, 8, 9], "seen": [0, 1, 2, 4, 5, 6, 7, 8], "segment": [8, 10], "select": [0, 8], "self": 6, "self_of_nhd": 8, "self_sub": 1, "self_trans_symm": [5, 7], "selfequivsigmaorbit": 7, "selfmodul": 6, "semi": [6, 7], "semicolon": [2, 4], "semigroup": 6, "semigroup\u2081": 6, "semigroup\u2082": 6, "semigroup\u2083": 6, "semir": [6, 7], "send": [7, 10], "sens": [0, 2, 3, 4, 5, 6, 7, 8, 9], "sensibl": 8, "sent": [7, 8], "separ": [0, 1, 2, 4, 5], "sequenc": [3, 6, 8, 9, 12], "seri": 7, "seriou": [4, 6, 8], "serv": [1, 3, 4, 5, 10], "set": [0, 1, 2, 4, 5, 6, 7, 9, 10, 12], "set_opt": 6, "setco": 6, "setintegral_const": 10, "setlik": 6, "setminu": 3, "setoid": [6, 7], "sets_of_superset": 8, "setub": 2, "setup": 7, "seurin": 0, "sever": [6, 8, 10], "shade": 3, "shame": 6, "sharp": 0, "shift": [0, 1, 6, 8], "short": [0, 1, 2, 3, 4, 5], "shorten": [1, 2, 7], "shorter": [1, 3, 4, 7, 8], "shot": 8, "should": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "shouldn": 8, "show": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "shown": [1, 5, 9, 10], "side": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "sight": [2, 6], "sigma": [5, 10], "sigmafinit": 10, "sign": 8, "signatur": 6, "signific": 3, "silent": [5, 6], "silli": 6, "silva": 0, "similar": [1, 2, 3, 5, 6, 7, 8], "similarli": [2, 3, 4, 5, 7], "simp": [0, 2, 3, 4, 5, 6, 7, 8, 9], "simp_rw": 7, "simpa": [4, 7, 9], "simpl": [2, 4, 5, 6, 9], "simpler": 6, "simplex": 5, "simpli": [0, 1, 2, 3, 4, 5, 6, 7, 8], "simplif": [2, 3, 4], "simplifi": [0, 2, 3, 4, 5, 8, 10], "sin": [2, 9], "sinc": [0, 1, 2, 3, 4, 5, 6, 7, 8], "singl": [0, 1, 2, 3, 4, 5, 6, 7, 9], "singleton": 4, "sinter": 3, "sinter_eq_biint": 3, "situat": [1, 3, 6, 7, 8], "skeleton": [5, 8], "sketch": [2, 3, 4, 8], "skill": [0, 1, 2, 3, 4], "slick": 2, "slight": 3, "slightli": [1, 6, 7, 8, 9], "slow": 8, "small": [0, 2, 4, 5, 8], "smaller": [3, 4, 8], "smallest": [4, 6, 8], "smart": 4, "smul": [5, 6, 7], "smul_add": 6, "smul_distrib": 5, "smul\u2083": 6, "snd": [5, 8], "snippet": [2, 4, 5, 7], "so": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "solut": [0, 1, 4, 6], "solv": [0, 1, 2, 3, 4, 5, 6, 8], "some": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "somehow": 7, "someth": [0, 1, 2, 4, 6, 8], "sometim": [1, 2, 3, 4, 5, 6, 7, 8], "somewhat": [1, 3, 8], "somewher": 8, "soon": [0, 2, 6, 7, 8], "sophist": 8, "sorri": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "sort": [1, 3, 4], "sosi": 2, "sosx": 2, "sound": [3, 5, 6], "sourc": [2, 8], "space": [1, 2, 3, 5, 6, 7, 10, 12], "speak": [2, 5, 7, 8], "special": [3, 4, 5, 6, 7, 8, 10], "specif": [0, 1, 3, 4, 5, 6], "specifi": [1, 2, 3, 4, 5, 8, 9, 10], "spell": 8, "split": [1, 2, 3, 4], "spot": 2, "sq_ab": 5, "sq_add_sq_eq_zero": 5, "sq_nonneg": 1, "sqr_eq": 4, "sqrt": [2, 3, 4, 5], "squar": [1, 2, 4, 5, 6, 7], "squiggli": 2, "ss": 3, "ssubt": 3, "stabil": 7, "stage": [2, 5, 6], "stai": 5, "stand": [1, 2, 4, 5, 6, 7, 8, 9], "standard": [4, 5, 6, 8], "standardsimplex": 5, "standardtwosimplex": 5, "start": [1, 2, 3, 4, 6, 7, 8, 9, 10, 12], "state": [0, 1, 2, 3, 4, 6, 7, 8, 9], "statement": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "stdsimplex": 5, "steep": 0, "steinhau": 9, "step": [0, 1, 2, 3, 4, 5, 6], "steven": 0, "stick": [1, 2, 8, 9], "still": [0, 1, 2, 3, 4, 5, 6, 8, 10], "stipul": 9, "stop": 6, "store": 5, "stori": 6, "str": 5, "straightforward": [2, 6], "strang": [2, 4, 7], "strategi": [1, 2, 4], "strength": 1, "strengthen": [1, 2, 4], "stretch": [4, 5], "strict": [1, 2], "stricter": 9, "strictli": [1, 2, 9], "strictmono": 8, "strictorderedr": 1, "strike": [1, 2], "strong": [2, 4], "strong_induction_on": 4, "stronger": 8, "strongli": 0, "stronglymeasurableatfilt": 10, "struc": 5, "structur": [2, 4, 6, 7, 8, 9, 10, 12], "stuck": 6, "studi": [6, 8], "style": [0, 1], "sub": [3, 8, 10, 12], "sub_add_cancel": 1, "sub_eq_add_neg": 1, "sub_self": [1, 2], "sub_sub": 1, "subgoal": 2, "subgroup": 6, "subgroupclass\u2081": 6, "subgroupofmulact": 7, "subgroup\u2081": 6, "subject": 5, "submodul": 7, "submonoid": [6, 7], "submonoidclass\u2081": 6, "submonoid\u2081": 6, "submonoid\u2081monoid": 6, "subobject": 6, "subproof": 1, "subr": 6, "subscript": 1, "subsequ": [2, 4, 8], "subset": [1, 2, 3, 5, 8, 9], "subset_def": 3, "subset_iff": 4, "subspac": [1, 6], "substant": 4, "substanti": 0, "substitut": [0, 2], "subsum": 4, "subtl": [5, 7, 8], "subtleti": [6, 7], "subtract": [1, 4, 5], "subtyp": [5, 6, 7, 8], "succ": [4, 6], "succ_add": 4, "succ_le_succ": 4, "succ_mul": 4, "succ_ne_zero": 4, "succ_po": 4, "succe": 6, "success": 6, "successor": 4, "suffic": [1, 2, 3, 7, 8], "suffici": [4, 8], "suggest": [0, 2, 4, 5, 8], "suitabl": [0, 1, 2, 5, 8], "sum": [1, 2, 4, 5, 6, 7, 8], "sum_add_distrib": 5, "sum_eq": 5, "sum_eq_on": 5, "sum_id": 4, "sum_mul": 5, "sum_range_succ": 4, "sum_range_zero": 4, "sum_sqr": 4, "summat": 4, "sumofsquar": 2, "sumofsquares_mul": 2, "sunion": 3, "sunion_eq_biunion": 3, "sup": [1, 4, 8], "sup_assoc": 1, "sup_comm": 1, "sup_eq_closur": 7, "sup_inf_left": 1, "sup_inf_right": 1, "sup_inf_self": 1, "sup_l": 1, "superfici": 8, "superscript": 8, "suppli": 5, "support": [0, 1, 2, 3, 4, 5, 6, 8], "suppos": [1, 2, 3, 4, 5, 8], "suppress": 1, "supremum": [1, 4, 6, 7], "sure": [0, 1, 2, 3, 5, 6, 7], "surject": [2, 3, 7, 8], "surjf": [2, 3], "surjg": 2, "surpris": 6, "surprisingli": [5, 6], "swap": 5, "swapxi": 5, "sweet": 3, "switch": [1, 6], "sylow": 7, "symbol": [1, 2, 5, 6, 7], "symm": [3, 4, 5, 6, 7, 8, 9], "symmetr": [2, 3, 7], "symmetri": [3, 6], "synonym": 7, "syntact": 2, "syntax": [0, 1, 2, 4, 6], "synth": 6, "synthes": [5, 6], "synthinst": 6, "system": [3, 4, 5, 6], "s\u00e1nchez": 0, "s\u02e3": 7, "s\u1d9c": [8, 10], "s\u2081": 6, "s\u2082": 6, "t": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "t2space": 8, "t3space": 8, "t_": 8, "t_3": 8, "t_x": 8, "t_y": 8, "t_z": 8, "tab": [1, 3, 4], "tackl": 6, "tactic": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "tag": [2, 3, 6], "take": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "taken": [1, 2], "takeshi": 0, "talk": [4, 7, 8, 9], "tantamount": [1, 3], "target": [1, 6, 7, 8, 10], "task": [0, 2, 4, 5, 6, 8], "taught": 7, "tauto": 4, "tautologi": 4, "teach": 0, "tear": 6, "technic": [1, 5, 6], "techniqu": [2, 8], "technologi": 6, "tediou": [1, 2, 6], "tell": [0, 2, 3, 4, 5, 6, 7], "temporarili": [1, 2], "tempt": 6, "tend": [1, 8], "tendsto": [8, 10], "tendsto_attop": 8, "tendsto_congr": 8, "tendsto_iff": 8, "tendsto_integral_of_dominated_converg": 10, "tendsto_nhds_uniqu": 8, "tendsto_pow_attop_nhds_0_of_lt_1": 8, "tendsto_right_iff": 8, "tendsto_subseq": 8, "tendsto\u2081": 8, "tendsto\u2082": 8, "term": [0, 1, 2, 3, 4, 5, 7, 8], "terminologi": 5, "terraf": 0, "ters": 6, "test": 4, "text": [0, 3, 5, 8], "textbook": [0, 1, 2], "th": 4, "than": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "thank": 6, "thei": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "them": [0, 1, 2, 3, 4, 5, 6, 7, 8], "theme": 3, "themselv": [0, 4, 5], "theorem": [0, 2, 4, 5, 7, 8, 9, 10, 12], "theoret": [2, 3, 8], "theori": [0, 1, 2, 3, 6, 7, 8, 9, 12], "therefor": [1, 4, 5, 8], "thereof": 0, "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "thing": [0, 1, 2, 3, 4, 5, 6, 8], "think": [0, 1, 2, 3, 4, 5, 6, 8, 9], "third": [1, 2, 3, 5, 8], "thoma": 0, "thorough": 0, "those": [0, 1, 2, 3, 5, 6, 7, 8, 9], "though": [2, 3, 4, 5], "three": [1, 2, 4, 5, 7, 8], "through": [0, 1, 3, 4, 5, 6, 7, 8], "thu": [1, 3, 4, 5, 8], "thumb": 4, "tighter": [1, 3], "tightli": 5, "time": [1, 4, 5, 6, 8, 9, 10], "timesav": 1, "tiresom": 8, "to_addit": 6, "to_localinvers": 9, "toaddcommgroup\u2083": 6, "toaddgroup\u2083": 6, "todiaoneclass\u2081": 6, "todia\u2081": 6, "tofun": [5, 6], "togeth": [1, 2, 3, 4, 5, 7, 8], "togroup": 7, "tomonoidhom\u2081": 6, "tomuloneclass": 6, "too": [0, 1, 3, 5, 6, 7, 8], "toohei": 0, "tool": [0, 1, 5, 6], "toone\u2081": 6, "top": [0, 6, 7, 8, 9], "topermhom": 7, "topic": [4, 5, 6, 7], "topolog": [5, 6, 9, 12], "topologi": [1, 5, 6, 9, 12], "topologicalspac": [8, 9], "toreal": 10, "tosemigroup\u2081": 6, "tosmul\u2083": 6, "total": 1, "tour": [8, 9], "toward": 7, "trace": 6, "tradeoff": 3, "tradition": 7, "train": [1, 6], "tran": [1, 2, 4, 5, 6, 7], "trans_assoc": 5, "trans_refl": 5, "transform": [2, 3], "transit": [1, 2, 5, 8], "translat": [4, 6, 7, 8], "trap": 6, "treat": [2, 3, 5, 6, 7, 8, 9], "treatment": 7, "tri": [1, 2, 4, 6], "triangl": [1, 2, 5], "trick": [1, 2, 4, 6, 9], "tricki": [2, 3, 4, 6, 7], "trigger": 6, "tripl": 3, "trivial": [3, 4, 7, 8], "troubl": [2, 3, 5], "true": [1, 2, 3, 6, 8], "truncat": 4, "truth": [1, 4], "try": [0, 1, 2, 3, 4, 5, 6, 8], "tupl": 5, "turn": [2, 3, 4, 5, 6, 8, 9], "tutori": 0, "twice": [0, 1, 8], "two": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "two_l": 4, "two_le_of_mod_4_eq_3": 4, "two_mul": 1, "ty": 7, "type": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "typeclass": 6, "typic": [1, 7], "u": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "ubf": 2, "ubfa": 2, "ubg": 2, "ubgb": 2, "ulequiv": 7, "ultim": 0, "un": 3, "unapp": 1, "unbundl": 6, "unchang": [1, 2], "uncom": 1, "uncount": 8, "uncurri": 8, "under": [5, 6, 7, 8], "underli": [0, 1, 5, 6, 7], "underneath": [1, 3], "underscor": [1, 2, 3], "understand": [0, 2, 3, 4, 5, 6, 7, 8], "understood": [4, 8], "unfold": [1, 2, 3, 4, 5, 8], "unfortun": 7, "unicod": [1, 3, 6], "unif": 6, "uniform": [3, 8, 9], "uniformcontinu": 8, "uniformcontinuous_iff": 8, "uniformli": 9, "union": [1, 3, 4, 5, 6, 7, 9, 10], "union_def": 3, "uniqu": [1, 2, 3, 4, 5, 7, 8], "unit": [5, 6, 8], "units_eq_one_or": 7, "univ": [3, 8, 9, 10], "univ_set": 8, "univari": 7, "univers": [1, 3, 5, 7, 8, 12], "unknown": 6, "unless": [1, 2, 5], "unlik": [3, 4], "unnecessari": [3, 7], "unpack": [2, 3], "unpleas": [6, 8], "unrel": 6, "unshad": 3, "unspecifi": 6, "unsurprisingli": 3, "until": [1, 4, 6, 8], "up": [0, 2, 3, 4, 5, 6, 7, 8], "updat": 0, "upper": [1, 2], "us": [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12], "usabl": 6, "usag": 1, "user": [0, 6], "usual": [1, 2, 3, 4, 5, 7, 8, 10], "v": [0, 1, 2, 3, 5, 8], "val": 5, "valid": 2, "valu": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "van": 0, "vanish": 7, "varepsilon": [2, 8], "variabl": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "variant": [1, 2, 7, 8], "variat": [1, 3, 4, 5, 8, 9], "varieti": 8, "variou": [2, 3, 5, 6, 10], "vastli": 2, "ve": [6, 8], "vector": [1, 3, 6, 7, 9], "verbatim": 7, "verbos": 3, "veri": [0, 2, 4, 6, 7, 8, 10], "verifi": 2, "versa": [1, 3], "version": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "vertic": [2, 5], "vi": 5, "via": 8, "vice": [1, 3], "victor": 0, "view": [5, 6, 7, 8], "visibl": 1, "vocabulari": 3, "volum": 10, "w": [1, 6], "wa": [1, 3, 7], "wai": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10], "want": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "wasn": 8, "we": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "weak": 6, "weaker": [1, 2], "weav": 5, "web": [0, 1, 4], "weight": 5, "weightedaverag": 5, "weird": [6, 8], "weirder": 9, "welcom": [0, 1], "well": [0, 1, 2, 3, 4, 5, 6, 7, 8], "were": [2, 4, 5, 8], "what": [0, 1, 2, 3, 4, 5, 6, 7, 8], "whatev": [0, 2, 4], "whatsnew": 6, "when": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "whenev": [1, 2, 4, 5], "where": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "wherea": [0, 1, 2, 3, 5, 7, 8], "wherebi": [5, 8], "whether": [2, 3, 4, 6, 8], "which": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "while": [0, 1, 2, 6, 7, 8], "who": [0, 8], "whole": 5, "whose": [1, 2, 4, 5, 6, 7, 8, 9], "why": [0, 2, 4, 6, 7, 8], "wieser": 0, "window": [0, 1, 2, 5], "winston": 0, "wise": 5, "wish": 8, "withbot": 7, "within": [1, 2, 8], "without": [1, 2, 4, 5, 6, 7, 8, 9], "withtop": 9, "wlog": 3, "won": [2, 4, 6, 7, 8], "word": [1, 2, 3, 4, 5, 7, 8], "work": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "world": 0, "worri": [1, 3, 4, 5, 7], "worth": [1, 2, 5], "would": [1, 2, 3, 4, 5, 6, 7, 8, 9], "wouldn": 6, "wrap": [6, 8], "write": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10], "written": [1, 2, 3, 4, 5, 6, 7, 8, 9], "wrong": 3, "wrote": 4, "x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "x_0": 8, "x_1": [2, 3], "x_2": [2, 3], "x_i": 8, "x_nonneg": 5, "xa": 3, "xai": 3, "xeq": [2, 3], "xgt": 2, "xlt": 2, "xltz": 2, "xmem": 3, "xnt": 3, "xnu": 3, "xpo": 3, "xstu": 3, "xsu": 3, "xt": 3, "xtu": 3, "xu": 3, "xy": [2, 5], "x\u2080": [8, 9], "x\u2081": [2, 3, 5, 8], "x\u2081a": 3, "x\u2082": [2, 3, 5], "x\u2082a": 3, "x\u2082eq": 3, "x\u2082na": 3, "y": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "y_nonneg": 5, "yannick": 0, "yball": 8, "yeq": 2, "yet": [2, 3, 4, 5, 6, 8], "yield": [1, 2, 3, 4, 5, 8], "ylim": 8, "ylt": 2, "you": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "your": [0, 1, 2, 3, 5, 6, 7, 8], "yourself": [2, 5], "ypo": 3, "y\u2080": 8, "y\u2081": 5, "y\u2082": 5, "z": [0, 1, 2, 5, 6, 7, 8, 9, 10], "z_nonneg": 5, "zermelo": 2, "zero": [2, 3, 4, 5, 6, 7, 8, 9, 10], "zero_add": [1, 4, 5, 6], "zero_def": 5, "zero_dvd_iff": 4, "zero_im": 5, "zero_l": [4, 5], "zero_lt_on": [2, 4], "zero_lt_two": 5, "zero_mem": 7, "zero_mul": [1, 4, 5, 6], "zero_r": 5, "zero_smul": 6, "zf": 2, "zlty": 2, "zmod": 7, "zsmul": [5, 6], "zsmulrec": 5, "zsmul\u2081": 6, "zulip": [0, 4], "z\u2080": 8, "z\u2081": 5, "z\u2082": 5, "\u00b9": [1, 3, 5, 6, 7, 8], "\u02e2": 8, "\u03b1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "\u03b2": [1, 2, 3, 5, 6, 8, 10], "\u03b3": [1, 2, 5, 8], "\u03b4": [2, 8], "\u03b4po": 8, "\u03b5": [2, 8, 9], "\u03b52po": 2, "\u03b5_po": [8, 9], "\u03b5k_po": 9, "\u03b5po": [2, 8], "\u03b9": [7, 8, 9, 10], "\u03bc": [8, 10], "\u03bd": 10, "\u03c0": [7, 8, 9], "\u03c3": [5, 7], "\u03c6": [7, 8], "\u03c8": 7, "\u03c9": 7, "\u1d50": 10, "\u1d65": 7, "\u1d9c": 7, "\u1da0": [8, 9, 10], "\u2080": 3, "\u2081": 6, "\u2090": 7, "\u2102": [1, 5, 7, 9], "\u2115": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "\u211a": [1, 4, 7, 8], "\u211d": [1, 2, 3, 5, 6, 7, 8, 9, 10], "\u2124": [1, 4, 5, 6, 7], "\u2124\u02e3": 7, "\ud835\udcdd": [8, 9, 10], "\ud835\udcdf": 8, "\ud835\udce4": 8, "\ud835\udd42": 9, "\ud835\udd5c": [9, 10], "\ud835\udfd9": 6}, "titles": ["<span class=\"section-number\">1. </span>Introduction", "<span class=\"section-number\">2. </span>Basics", "<span class=\"section-number\">3. </span>Logic", "<span class=\"section-number\">4. </span>Sets and Functions", "<span class=\"section-number\">5. </span>Elementary Number Theory", "<span class=\"section-number\">6. </span>Structures", "<span class=\"section-number\">7. </span>Hierarchies", "<span class=\"section-number\">8. </span>Groups and Rings", "<span class=\"section-number\">9. </span>Topology", "<span class=\"section-number\">10. </span>Differential Calculus", "<span class=\"section-number\">11. </span>Integration and Measure Theory", "Index", "Mathematics in Lean"], "titleterms": {"The": [2, 3], "about": 1, "action": 7, "algebra": [1, 5, 7], "appli": 1, "asymptot": 9, "ball": 8, "basic": [1, 6], "bernstein": 3, "build": 5, "calcul": 1, "calculu": 9, "close": 8, "compact": 8, "comparison": 9, "complet": 8, "concret": 7, "conjunct": 2, "continu": [8, 9], "converg": [2, 8], "countabl": 8, "defin": 5, "differenti": 9, "disjunct": 2, "elementari": [4, 9, 10], "exampl": 1, "existenti": 2, "fact": 1, "filter": 8, "function": [3, 8], "fundament": 8, "gaussian": 5, "get": 0, "group": 7, "hierarchi": 6, "ideal": 7, "ident": 1, "iff": 2, "implic": 2, "index": 11, "induct": 4, "infinit": 4, "integ": 5, "integr": 10, "introduct": 0, "irrat": 4, "lean": 12, "lemma": 1, "linear": 9, "logic": 2, "mani": 4, "map": 9, "mathemat": 12, "measur": 10, "metric": 8, "monoid": 7, "more": 1, "morphism": [6, 7], "negat": 2, "norm": 9, "number": 4, "object": 6, "open": 8, "overview": 0, "polynomi": 7, "prime": 4, "prove": 1, "quantifi": 2, "quotient": 7, "recurs": 4, "ring": 7, "root": 4, "rw": 1, "schr\u00f6der": 3, "separ": 8, "sequenc": 2, "set": [3, 8], "space": [8, 9], "start": 0, "structur": [1, 5], "sub": 6, "subgroup": 7, "subr": 7, "theorem": [1, 3], "theori": [4, 10], "topolog": 8, "topologi": 8, "uniformli": 8, "unit": 7, "univers": 2, "us": 1}})
-
-