Аналіз I, Глава 2.2
Цей файл є перекладом Глави 2.2 Аналізу I до Lean 4. Вся нумерація посилається на оригінальний текст.
Я (пр.перекл. Терренс Тао) намагався зробити переклад якомога точнішим перефразуванням оригінального тексту. Коли є вибір між більш ідіоматичним рішенням Lean та більш точним перекладом, я зазвичай обирав останній. Зокрема, будуть місця, де код Lean можна було б "підбуцнути", щоб зробити його більш елегантним та ідіоматичним, але я свідомо уникав цього вибору.
Основні конструкції та результати цього розділу:
-
Визначення додавання та порядку для натуральних чисел "Розділу 2",
Chapter2.Nat
-
Встановлення основних властивостей додавання та порядку
Примітка: наприкінці цього розділу клас Chapter2.Nat
буде замінено на користь стандартного
класу Mathlib _root_.Nat
, або ℕ
. Однак, ми пропрацюємо властивості
Chapter2.Nat
"вручну" в наступних кількох розділах для педагогічних цілей.
namespace Chapter2
Визначення 2.2.1. (Додавання натуральних чисел.
Порівняйте із Mathlib-овським Nat.add
abbrev Nat.add (n m : Nat) : Nat := Nat.recurse (fun _ sum ↦ sum++) m n
Цей екземпляр дозволить нотації використовуватися для додавання натуральних чисел.
instance Nat.instAdd : Add Nat where
add := add
Порівняйте із Mathlib-овським Nat.zero_add
@[simp]
theorem Nat.zero_add (m: Nat) : 0 + m = m := recurse_zero (fun _ sum ↦ sum++) _
Порівняйте із Mathlib-овським Nat.succ_add
theorem Nat.succ_add (n m: Nat) : n++ + m = (n+m)++ := n:Natm:Nat⊢ n++ + m = (n + m)++ All goals completed! 🐙
Порівняйте із Mathlib-овським Nat.one_add
theorem Nat.one_add (m:Nat) : 1 + m = m++ := m:Nat⊢ 1 + m = m++
All goals completed! 🐙
theorem Nat.two_add (m:Nat) : 2 + m = (m++)++ := m:Nat⊢ 2 + m = m++++
All goals completed! 🐙
example : (2:Nat) + 3 = 5 := ⊢ 2 + 3 = 5
All goals completed! 🐙
-- сума двух натуральних чисел це також натуральне число
#check (fun (n m:Nat) ↦ n + m)
fun n m => n + m : Nat → Nat → Nat
Лема 2.2.2 (n + 0 = n). Порівняйте із Mathlib-овським Nat.add_zero
@[simp]
lemma Nat.add_zero (n:Nat) : n + 0 = n := n:Nat⊢ n + 0 = n
-- цей доказ написан так, щоб співпадати із структурою орігінального тексту.
⊢ ∀ (n : Nat), n + 0 = n; ⊢ 0 + 0 = 0⊢ ∀ (n : Nat), n + 0 = n → n++ + 0 = n++
⊢ 0 + 0 = 0 All goals completed! 🐙
n:Natih:n + 0 = n⊢ n++ + 0 = n++
calc
(n++) + 0 = (n + 0)++ := n:Natih:n + 0 = n⊢ n++ + 0 = (n + 0)++ All goals completed! 🐙
_ = n++ := n:Natih:n + 0 = n⊢ (n + 0)++ = n++ All goals completed! 🐙
Лема 2.2.3 (n+(m++) = (n+m)++). Порівняйте із Mathlib-овським Nat.add_succ
lemma Nat.add_succ (n m:Nat) : n + (m++) = (n + m)++ := n:Natm:Nat⊢ n + m++ = (n + m)++
-- цей доказ написан так, щоб співпадати із структурою орігінального тексту.
m:Nat⊢ ∀ (n : Nat), n + m++ = (n + m)++; m:Nat⊢ 0 + m++ = (0 + m)++m:Nat⊢ ∀ (n : Nat), n + m++ = (n + m)++ → n++ + m++ = (n++ + m)++
m:Nat⊢ 0 + m++ = (0 + m)++ All goals completed! 🐙
m:Natn:Natih:n + m++ = (n + m)++⊢ n++ + m++ = (n++ + m)++
m:Natn:Natih:n + m++ = (n + m)++⊢ (n + m)++++ = (n++ + m)++
All goals completed! 🐙
n++ = n + 1 (Чому?). Порівняйте із Mathlib-овським Nat.succ_eq_add_one
theorem Nat.succ_eq_add_one (n:Nat) : n++ = n + 1 := n:Nat⊢ n++ = n + 1
All goals completed! 🐙
Твердження 2.2.4 (Додавання комутативне). Порівняйте із Mathlib-овським Nat.add_comm
theorem Nat.add_comm (n m:Nat) : n + m = m + n := n:Natm:Nat⊢ n + m = m + n
-- цей доказ написан так, щоб співпадати із структурою орігінального тексту.
m:Nat⊢ ∀ (n : Nat), n + m = m + n; m:Nat⊢ 0 + m = m + 0m:Nat⊢ ∀ (n : Nat), n + m = m + n → n++ + m = m + n++
m:Nat⊢ 0 + m = m + 0 All goals completed! 🐙
m:Natn:Natih:n + m = m + n⊢ n++ + m = m + n++
m:Natn:Natih:n + m = m + n⊢ (n + m)++ = m + n++
All goals completed! 🐙
Твердження 2.2.5 (Додавання асоціативне) / Вправа 2.2.1
Порівняйте із Mathlib-овським Nat.add_assoc
theorem Nat.add_assoc (a b c:Nat) : (a + b) + c = a + (b + c) := a:Natb:Natc:Nat⊢ a + b + c = a + (b + c)
All goals completed! 🐙
Твердження 2.2.6 (Властивість скорочення)
Порівняйте із Mathlib-овським Nat.add_left_cancel
theorem Nat.add_left_cancel (a b c:Nat) (habc: a + b = a + c) : b = c := a:Natb:Natc:Nathabc:a + b = a + c⊢ b = c
-- цей доказ написан так, щоб співпадати із структурою орігінального тексту.
b:Natc:Nat⊢ ∀ (a : Nat), a + b = a + c → b = c; b:Natc:Nat⊢ 0 + b = 0 + c → b = cb:Natc:Nat⊢ ∀ (n : Nat), (n + b = n + c → b = c) → n++ + b = n++ + c → b = c
b:Natc:Nat⊢ 0 + b = 0 + c → b = c b:Natc:Nathbc:0 + b = 0 + c⊢ b = c
rwa [zero_add, zero_addb:Natc:Nathbc:b = c⊢ b = c at hbc
b:Natc:Nata:Natih:a + b = a + c → b = c⊢ a++ + b = a++ + c → b = c
b:Natc:Nata:Natih:a + b = a + c → b = chbc:a++ + b = a++ + c⊢ b = c
b:Natc:Nata:Natih:a + b = a + c → b = chbc:(a + b)++ = (a + c)++⊢ b = c
b:Natc:Nata:Natih:a + b = a + c → b = chbc:a + b = a + c⊢ b = c
All goals completed! 🐙
(Не із книги) Типу Nat можна дати структуру комутативного адітивного моноїда.
instance Nat.addCommMonoid : AddCommMonoid Nat where
add_assoc := add_assoc
add_comm := add_comm
zero_add := zero_add
add_zero := add_zero
nsmul := nsmulRec
theorem Nat.isPos_iff (n:Nat) : n.isPos ↔ n ≠ 0 := n:Nat⊢ n.isPos ↔ n ≠ 0 All goals completed! 🐙
Твердження 2.2.8 (Додатне плюс натуральне число буде додатним).
Порівняйте із Mathlib-овським Nat.add_pos_left
theorem Nat.add_pos_left {a:Nat} (b:Nat) (ha: a.isPos) : (a + b).isPos := a:Natb:Natha:a.isPos⊢ (a + b).isPos
-- цей доказ написан так, щоб співпадати із структурою орігінального тексту.
a:Natha:a.isPos⊢ ∀ (b : Nat), (a + b).isPos; a:Natha:a.isPos⊢ (a + 0).isPosa:Natha:a.isPos⊢ ∀ (n : Nat), (a + n).isPos → (a + n++).isPos
a:Natha:a.isPos⊢ (a + 0).isPos rwa [add_zeroa:Natha:a.isPos⊢ a.isPos
a:Natha:a.isPosb:Nathab:(a + b).isPos⊢ (a + b++).isPos
a:Natha:a.isPosb:Nathab:(a + b).isPos⊢ (a + b)++.isPos
a:Natha:a.isPosb:Nathab:(a + b).isPosthis:(a + b)++ ≠ 0⊢ (a + b)++.isPos
All goals completed! 🐙
Порівняйте із Mathlib-овським Nat.add_pos_right
theorem Nat.add_pos_right {a:Nat} (b:Nat) (ha: a.isPos) : (b + a).isPos := a:Natb:Natha:a.isPos⊢ (b + a).isPos
a:Natb:Natha:a.isPos⊢ (a + b).isPos
All goals completed! 🐙
Наслідок 2.2.9 (якщо сума дорівнює нулю, тоді доданки дорівнюють нулю).
Порівняйте із Mathlib-овським Nat.add_eq_zero
theorem Nat.add_eq_zero (a b:Nat) (hab: a + b = 0) : a = 0 ∧ b = 0 := a:Natb:Nathab:a + b = 0⊢ a = 0 ∧ b = 0
-- цей доказ написан так, щоб співпадати із структурою орігінального тексту.
a:Natb:Nathab:a + b = 0h:¬(a = 0 ∧ b = 0)⊢ False
a:Natb:Nathab:a + b = 0h:a ≠ 0 ∨ b ≠ 0⊢ False
a:Natb:Nathab:a + b = 0ha:a ≠ 0⊢ Falsea:Natb:Nathab:a + b = 0hb:b ≠ 0⊢ False
a:Natb:Nathab:a + b = 0ha:a ≠ 0⊢ False a:Natb:Nathab:a + b = 0ha:a.isPos⊢ False
a:Natb:Nathab:a + b = 0ha:a.isPosthis:(a + b).isPos⊢ False
All goals completed! 🐙
a:Natb:Nathab:a + b = 0hb:b.isPos⊢ False
a:Natb:Nathab:a + b = 0hb:b.isPosthis:(a + b).isPos⊢ False
All goals completed! 🐙
/-
Наступне API для ∃! може бути корисним для наступної проблеми. Також, тактика `obtain` корисна
для вилучення змінної предіката із кванторів існування; наприклад, `obtain ⟨ x, hx ⟩ := h`
вилучає змінну предіката `x` та доказ `hx : P x` властивості із гіпотези `h : ∃ x, P x`.
-/
#check existsUnique_of_exists_of_unique
existsUnique_of_exists_of_unique.{u_1} {α : Sort u_1} {p : α → Prop} (hex : ∃ x, p x) (hunique : ∀ (y₁ y₂ : α), p y₁ → p y₂ → y₁ = y₂) : ∃! x, p x
#check ExistsUnique.exists
ExistsUnique.exists.{u_1} {α : Sort u_1} {p : α → Prop} : (∃! x, p x) → ∃ x, p x
#check ExistsUnique.unique
ExistsUnique.unique.{u_1} {α : Sort u_1} {p : α → Prop} (h : ∃! x, p x) {y₁ y₂ : α} (py₁ : p y₁) (py₂ : p y₂) : y₁ = y₂
Лема 2.2.10 (унікальний попередник) / Вправа 2.2.2
lemma Nat.uniq_succ_eq (a:Nat) (ha: a.isPos) : ∃! b, b++ = a := a:Natha:a.isPos⊢ ∃! b, b++ = a
All goals completed! 🐙
Визначення 2.2.11 (Порядок натуральних чисел)
Це визначає операцію на натуральних числах.
instance Nat.instLE : LE Nat where
le n m := ∃ a:Nat, m = n + a
Визначення 2.2.11 (Порядок натуральних чисел)
Це визначає операцію на натуральних числах.
instance Nat.instLT : LT Nat where
lt n m := n ≤ m ∧ n ≠ m
lemma Nat.le_iff (n m:Nat) : n ≤ m ↔ ∃ a:Nat, m = n + a := n:Natm:Nat⊢ n ≤ m ↔ ∃ a, m = n + a All goals completed! 🐙
lemma Nat.lt_iff (n m:Nat) : n < m ↔ (∃ a:Nat, m = n + a) ∧ n ≠ m := n:Natm:Nat⊢ n < m ↔ (∃ a, m = n + a) ∧ n ≠ m All goals completed! 🐙
Порівняйте із Mathlib-овським ge_iff_le
lemma Nat.ge_iff_le (n m:Nat) : n ≥ m ↔ m ≤ n := n:Natm:Nat⊢ n ≥ m ↔ m ≤ n All goals completed! 🐙
Порівняйте із Mathlib-овським gt_iff_lt
lemma Nat.gt_iff_lt (n m:Nat) : n > m ↔ m < n := n:Natm:Nat⊢ n > m ↔ m < n All goals completed! 🐙
Порівняйте із Mathlib-овським Nat.le_of_lt
lemma Nat.le_of_lt {n m:Nat} (hnm: n < m) : n ≤ m := hnm.1
Порівняйте із Mathlib-овським Nat.le_iff_lt_or_eq
lemma Nat.le_iff_lt_or_eq (n m:Nat) : n ≤ m ↔ n < m ∨ n = m := n:Natm:Nat⊢ n ≤ m ↔ n < m ∨ n = m
n:Natm:Nat⊢ (∃ a, m = n + a) ↔ (∃ a, m = n + a) ∧ n ≠ m ∨ n = m
n:Natm:Nath:n = m⊢ (∃ a, m = n + a) ↔ (∃ a, m = n + a) ∧ n ≠ m ∨ n = mn:Natm:Nath:¬n = m⊢ (∃ a, m = n + a) ↔ (∃ a, m = n + a) ∧ n ≠ m ∨ n = m
n:Natm:Nath:n = m⊢ (∃ a, m = n + a) ↔ (∃ a, m = n + a) ∧ n ≠ m ∨ n = m n:Natm:Nath:n = m⊢ ∃ a, m = m + a
n:Natm:Nath:n = m⊢ m = m + 0
All goals completed! 🐙
All goals completed! 🐙
example : (8:Nat) > 5 := ⊢ 8 > 5
⊢ (∃ a, 8 = 5 + a) ∧ 5 ≠ 8
⊢ ∃ a, 8 = 5 + a⊢ 5 ≠ 8
⊢ ∃ a, 8 = 5 + a have : (8:Nat) = 5 + 3 := ⊢ 8 > 5 All goals completed! 🐙
this:8 = 5 + 3⊢ ∃ a, 5 + 3 = 5 + a
All goals completed! 🐙
All goals completed! 🐙
Порівняйте із Mathlib-овським Nat.lt_succ_self
theorem Nat.succ_gt_self (n:Nat) : n++ > n := n:Nat⊢ n++ > n
All goals completed! 🐙
Твердження 2.2.12 (Базові властивості порядку для натуральних чисел) / Вправа 2.2.3
(a) (Порядок рефлексівен). Порівняйте із Mathlib-овським Nat.le_refl
theorem Nat.ge_refl (a:Nat) : a ≥ a := a:Nat⊢ a ≥ a
All goals completed! 🐙
(b) (Порядок транзітивен). Тут буде корисною тактика obtain
.
Порівняйте із Mathlib-овським Nat.le_trans
theorem Nat.ge_trans {a b c:Nat} (hab: a ≥ b) (hbc: b ≥ c) : a ≥ c := a:Natb:Natc:Nathab:a ≥ bhbc:b ≥ c⊢ a ≥ c
All goals completed! 🐙
(c) (Порядок антисіметричен). Порівняйте із Mathlib-овським Nat.le_antisymm
theorem Nat.ge_antisymm {a b:Nat} (hab: a ≥ b) (hba: b ≥ a) : a = b := a:Natb:Nathab:a ≥ bhba:b ≥ a⊢ a = b
All goals completed! 🐙
(d) (Додавання зберігає порядок). Порівняйте із Mathlib-овським Nat.add_le_add_right
theorem Nat.add_ge_add_right (a b c:Nat) : a ≥ b ↔ a + c ≥ b + c := a:Natb:Natc:Nat⊢ a ≥ b ↔ a + c ≥ b + c
All goals completed! 🐙
(d) (Додавання зберігає порядок). Порівняйте із Mathlib-овським Nat.add_le_add_left
theorem Nat.add_ge_add_left (a b c:Nat) : a ≥ b ↔ c + a ≥ c + b := a:Natb:Natc:Nat⊢ a ≥ b ↔ c + a ≥ c + b
a:Natb:Natc:Nat⊢ a ≥ b ↔ a + c ≥ b + c
All goals completed! 🐙
(d) (Додавання зберігає порядок). Порівняйте із Mathlib-овським Nat.add_le_add_right
theorem Nat.add_le_add_right (a b c:Nat) : a ≤ b ↔ a + c ≤ b + c := add_ge_add_right _ _ _
(d) (Додавання зберігає порядок). Порівняйте із Mathlib-овським Nat.add_le_add_left
theorem Nat.add_le_add_left (a b c:Nat) : a ≤ b ↔ c + a ≤ c + b := add_ge_add_left _ _ _
(e) a < b iff a++ ≤ b. Порівняйте із Mathlib-овським Nat.succ_le_iff
theorem Nat.lt_iff_succ_le (a b:Nat) : a < b ↔ a++ ≤ b := a:Natb:Nat⊢ a < b ↔ a++ ≤ b
All goals completed! 🐙
(f) a < b if and only if b = a + d for positive d.
theorem Nat.lt_iff_add_pos (a b:Nat) : a < b ↔ ∃ d:Nat, d.isPos ∧ b = a + d := a:Natb:Nat⊢ a < b ↔ ∃ d, d.isPos ∧ b = a + d
All goals completed! 🐙
Якщо a < b тоді a ̸= b,
theorem Nat.ne_of_lt (a b:Nat) : a < b → a ≠ b := a:Natb:Nat⊢ a < b → a ≠ b
a:Natb:Nath:a < b⊢ a ≠ b; All goals completed! 🐙
Якщо a > b тоді a ̸= b.
theorem Nat.ne_of_gt (a b:Nat) : a > b → a ≠ b := a:Natb:Nat⊢ a > b → a ≠ b
a:Natb:Nath:a > b⊢ a ≠ b; All goals completed! 🐙
Якщо a > b та a < b тоді протиріччя
theorem Nat.not_lt_of_gt (a b:Nat) : a < b ∧ a > b → False := a:Natb:Nat⊢ a < b ∧ a > b → False
a:Natb:Nath:a < b ∧ a > b⊢ False
a:Natb:Nath:a < b ∧ a > bthis:a = b⊢ False
a:Natb:Nath:a < b ∧ a > bthis✝:a = bthis:a ≠ b⊢ False
All goals completed! 🐙
Твердження 2.2.13 (Тріхотомія порядку для натуральних чисел) / Вправа 2.2.4
Порівняйте із Mathlib-овським trichotomous
theorem Nat.trichotomous (a b:Nat) : a < b ∨ a = b ∨ a > b := a:Natb:Nat⊢ a < b ∨ a = b ∨ a > b
-- цей доказ написан так, щоб співпадати із структурою орігінального тексту.
b:Nat⊢ ∀ (a : Nat), a < b ∨ a = b ∨ a > b; b:Nat⊢ 0 < b ∨ 0 = b ∨ 0 > bb:Nat⊢ ∀ (n : Nat), n < b ∨ n = b ∨ n > b → n++ < b ∨ n++ = b ∨ n++ > b
b:Nat⊢ 0 < b ∨ 0 = b ∨ 0 > b have why : 0 ≤ b := a:Natb:Nat⊢ a < b ∨ a = b ∨ a > b
All goals completed! 🐙
b:Natwhy:0 < b ∨ 0 = b⊢ 0 < b ∨ 0 = b ∨ 0 > b
All goals completed! 🐙
b:Nata:Natih:a < b ∨ a = b ∨ a > b⊢ a++ < b ∨ a++ = b ∨ a++ > b
b:Nata:Natcase1:a < b⊢ a++ < b ∨ a++ = b ∨ a++ > bb:Nata:Natcase2:a = b⊢ a++ < b ∨ a++ = b ∨ a++ > bb:Nata:Natcase3:a > b⊢ a++ < b ∨ a++ = b ∨ a++ > b
b:Nata:Natcase1:a < b⊢ a++ < b ∨ a++ = b ∨ a++ > b b:Nata:Natcase1:a++ ≤ b⊢ a++ < b ∨ a++ = b ∨ a++ > b
b:Nata:Natcase1:a++ < b ∨ a++ = b⊢ a++ < b ∨ a++ = b ∨ a++ > b
All goals completed! 🐙
b:Nata:Natcase2:a = b⊢ a++ < b ∨ a++ = b ∨ a++ > b have why : a++ > b := a:Natb:Nat⊢ a < b ∨ a = b ∨ a > b All goals completed! 🐙
All goals completed! 🐙
have why : a++ > b := a:Natb:Nat⊢ a < b ∨ a = b ∨ a > b All goals completed! 🐙
All goals completed! 🐙
(Не із книги) Встановіть алгоритмічну розв'язність для цього порядку обчислювальним шляхом.
Частина доказу, що стосується розв'язності, наведена; решта sorry
стосуються тверджень
про натуральні числа. Цей результат також можна було б встановити за допомогою тактики classical
з подальшим використанням exact Classical.decRel _
, але це зробило б це визначення
(а також деякі приклади нижче) необчислювальним.
Порівняйте із Mathlib-овським Nat.decLe
def Nat.decLe : (a b : Nat) → Decidable (a ≤ b)
b:Nat⊢ Decidable (0 ≤ b) b:Nat⊢ Decidable (0 ≤ b)
b:Nat⊢ 0 ≤ b
All goals completed! 🐙
a:Natb:Nat⊢ Decidable (a++ ≤ b) a:Natb:Nat⊢ Decidable (a++ ≤ b)
cases decLe a b with
a:Natb:Nath:a ≤ b⊢ Decidable (a++ ≤ b)
cases decEq a b with
a:Natb:Nath✝:a ≤ bh:a = b⊢ Decidable (a++ ≤ b)
a:Natb:Nath✝:a ≤ bh:a = b⊢ ¬a++ ≤ b
All goals completed! 🐙
a:Natb:Nath✝:a ≤ bh:¬a = b⊢ Decidable (a++ ≤ b)
a:Natb:Nath✝:a ≤ bh:¬a = b⊢ a++ ≤ b
All goals completed! 🐙
a:Natb:Nath:¬a ≤ b⊢ Decidable (a++ ≤ b)
a:Natb:Nath:¬a ≤ b⊢ ¬a++ ≤ b
All goals completed! 🐙
instance Nat.decidableRel : DecidableRel (· ≤ · : Nat → Nat → Prop) := Nat.decLe
(Не із книги) Nat має структуру лінійне впорядкування.
instance Nat.linearOrder : LinearOrder Nat where
le_refl := ge_refl
le_trans a b c hab hbc := ge_trans hbc hab
lt_iff_le_not_le := sorry
le_antisymm a b hab hba := ge_antisymm hba hab
le_total := sorry
toDecidableLE := decidableRel
(Не із книги) Nat має структуру впорядкованого моноїда.
instance Nat.isOrderedAddMonoid : IsOrderedAddMonoid Nat where
add_le_add_left := ⊢ ∀ (a b : Nat), a ≤ b → ∀ (c : Nat), c + a ≤ c + b
a:Natb:Nathab:a ≤ bc:Nat⊢ c + a ≤ c + b
All goals completed! 🐙
Твердження 2.2.14 (Сильний принцип індукції) / Вправа 2.2.5
Порівняйте із Mathlib-овським Nat.strong_induction_on
theorem Nat.strong_induction {m₀:Nat} {P: Nat → Prop}
(hind: ∀ m, m ≥ m₀ → (∀ m', m₀ ≤ m' ∧ m' < m → P m') → P m) :
∀ m, m ≥ m₀ → P m := m₀:NatP:Nat → Prophind:∀ m ≥ m₀, (∀ (m' : Nat), m₀ ≤ m' ∧ m' < m → P m') → P m⊢ ∀ m ≥ m₀, P m
All goals completed! 🐙
Вправа 2.2.6 (індукція у зворотньому напрямку)
Порівняйте із Mathlib-овським Nat.decreasingInduction
theorem Nat.backwards_induction {n:Nat} {P: Nat → Prop}
(hind: ∀ m, P (m++) → P m) (hn: P n) :
∀ m, m ≤ n → P m := n:NatP:Nat → Prophind:∀ (m : Nat), P (m++) → P mhn:P n⊢ ∀ m ≤ n, P m
All goals completed! 🐙
Вправа 2.2.7 (індукція із початкової точки)
Порівняйте із Mathlib-овським Nat.le_induction
theorem Nat.induction_from {n:Nat} {P: Nat → Prop} (hind: ∀ m, P m → P (m++)) :
P n → ∀ m, m ≥ n → P m := n:NatP:Nat → Prophind:∀ (m : Nat), P m → P (m++)⊢ P n → ∀ m ≥ n, P m
All goals completed! 🐙
end Chapter2