Аналіз I, Глава 2.1

Цей файл є перекладом Глави 2.1 Аналізу I до Lean 4. Вся нумерація посилається на оригінальний текст.

Я (пр.перекл. Терренс Тао) намагався зробити переклад якомога точнішим перефразуванням оригінального тексту. Коли є вибір між більш ідіоматичним рішенням Lean та більш точним перекладом, я зазвичай обирав останній. Зокрема, будуть місця, де код Lean можна було б "підбуцнути", щоб зробити його більш елегантним та ідіоматичним, але я свідомо уникав цього вибору.

Основні конструкції та результати цього розділу:

Примітка: наприкінці цього розділу клас Chapter2.Nat : TypeChapter2.Nat буде замінено на користь стандартного класу Mathlib Nat : Type_root_.Nat, або ℕ : Type. Однак, ми пропрацюємо властивості Chapter2.Nat : TypeChapter2.Nat "вручну" в наступних кількох розділах для педагогічних цілей.

namespace Chapter2

Припущення 2.6 (Існування натуральних чисел). Тут ми будемо використовувати явне побудування натуральних чисел (використовуючи індуктивний тип). Для більш аксіоматичного підходу, дивіться епілог до цього розділу

inductive Nat where | zero : Nat | succ : Nat Nat deriving Repr, DecidableEq -- це дозволяє `decide` працювати із `Nat`

Аксіома 2.1 (0 це натуральне число)

instance Nat.instZero : Zero Nat := zero
0 : Nat#check (0:Nat)
0 : Nat
/-- Аксіома 2.2 (Наступник натурального числа також є натуральним числом) -/ postfix:100 "++" => Nat.succfun n => n++ : Nat → Nat#check (fun n n++)
fun n => n++ : Nat → Nat

Визначення 2.1.3 (Визначення чисел 0, 1, 2, etc.). Примітка: щоб уникнути неоднозначності, вам може знадобитися явна конвертація як наприклад (0:Nat), (1:Nat), і т.д. щоб посилатися на версію натуральних чисел із цього розділу.

instance Nat.instOfNat {n:_root_.Nat} : OfNat Nat n where ofNat := _root_.Nat.rec 0 (fun _ n n++) n
instance Nat.instOne : One Nat := 1 lemma Nat.zero_succ : 0++ = 1 := 0++ = 1 All goals completed! 🐙1 : Nat#check (1:Nat)
1 : Nat
lemma Nat.one_succ : 1++ = 2 := 1++ = 2 All goals completed! 🐙2 : Nat#check (2:Nat)
2 : Nat

Твердження 2.1.4 (3 є натуральним числом)

lemma Nat.two_succ : 2++ = 3 := 2++ = 3 All goals completed! 🐙
3 : Nat#check (3:Nat)
3 : Nat

Аксіома 2.3 (0 не є наступником ніякого натурального числа). Порівняйте із Mathlib-овським Nat.succ_ne_zero (n : ℕ) : n.succ ≠ 0Nat.succ_ne_zero.

theorem Nat.succ_ne (n:Nat) : n++ 0 := n:Natn++ 0 n:Nath:n++ = 0False All goals completed! 🐙

Твердження 2.1.6 (4 не дорівнює нулю)

theorem Nat.four_ne : (4:Nat) 0 := 4 0 -- За визначенням, 4 = 3++. 3++ 0 -- За аксіомою 2.3, 3++ не є нулем. All goals completed! 🐙

Аксіома 2.4 (Різні натуральні числа мають різних наступників). Порівняйте із Mathlib-овським Nat.succ_inj {a b : ℕ} : a.succ = b.succ ↔ a = bNat.succ_inj.

theorem Nat.succ_cancel {n m:Nat} (hnm: n++ = m++) : n = m := n:Natm:Nathnm:n++ = m++n = m rwa [succ.injEqn:Natm:Nathnm:n = mn = m at hnm

Аксіома 2.4 (Різні натуральні числа мають різних наступників). Порівняйте із Mathlib-овським Nat.succ_ne_succ {m n : ℕ} : m.succ ≠ n.succ ↔ m ≠ nNat.succ_ne_succ.

theorem Nat.succ_ne_succ (n m:Nat) : n m n++ m++ := n:Natm:Natn m n++ m++ n:Natm:Nath:n mn++ m++ n:Natm:Nath:n++ = m++n = m All goals completed! 🐙

Твердження 2.1.8 (6 не дорівнює 2)

theorem Nat.six_ne_two : (6:Nat) 2 := 6 2 -- цей доказ написан так, щоб співпадати із структурою орігінального тексту. h:6 = 2False h:5++ = 1++False h:5 = 1False h:4++ = 0++False h:4 = 0False h:4 = 0this:4 0False All goals completed! 🐙

Ви також можете довести такого типу результат використовуючи тактику Decidable.decide (p : Prop) [h : Decidable p] : Booldecide

theorem Nat.six_ne_two' : (6:Nat) 2 := 6 2 All goals completed! 🐙

Аксіома 2.5 (принцип математичної індукції). Тактика unknown identifier 'induction'induction (або unknown identifier 'induction''induction') в Mathlib служить заміною для цієї аксіоми.

theorem Nat.induction (P : Nat Prop) (hbase : P 0) (hind : n, P n P (n++)) : n, P n := P:Nat Prophbase:P 0hind: (n : Nat), P n P (n++) (n : Nat), P n P:Nat Prophbase:P 0hind: (n : Nat), P n P (n++)n:NatP n induction n with P:Nat Prophbase:P 0hind: (n : Nat), P n P (n++)P zero All goals completed! 🐙 P:Nat Prophbase:P 0hind: (n : Nat), P n P (n++)n:Natih:P nP (n++) All goals completed! 🐙

Рекурсія. Аналогічно до вбудованого методу Mathlib Nat.rec.{u} {motive : ℕ → Sort u} (zero : motive Nat.zero) (succ : (n : ℕ) → motive n → motive n.succ) (t : ℕ) : motive tNat.rec ассоційованого із натуральними числами Mathlib

abbrev Nat.recurse (f: Nat Nat Nat) (c: Nat) : Nat Nat := fun n match n with | 0 => c | n++ => f n (recurse f c n)

Твердження 2.1.16 (рекурсивне визначення). Порівняйте із Mathlib-овським Nat.rec_zero.{u_1} {C : ℕ → Sort u_1} (h0 : C 0) (h : (n : ℕ) → C n → C (n + 1)) : Nat.rec h0 h 0 = h0Nat.rec_zero.

theorem Nat.recurse_zero (f: Nat Nat Nat) (c: Nat) : Nat.recurse f c 0 = c := f:Nat Nat Natc:Natrecurse f c 0 = c All goals completed! 🐙

Твердження 2.1.16 (рекурсивне визначення). Порівняйте із Mathlib-овським Nat.rec_add_one.{u_1} {C : ℕ → Sort u_1} (h0 : C 0) (h : (n : ℕ) → C n → C (n + 1)) (n : ℕ) : Nat.rec h0 h (n + 1) = h n (Nat.rec h0 h n)Nat.rec_add_one.

theorem Nat.recurse_succ (f: Nat Nat Nat) (c: Nat) (n: Nat) : recurse f c (n++) = f n (recurse f c n) := f:Nat Nat Natc:Natn:Natrecurse f c (n++) = f n (recurse f c n) All goals completed! 🐙

Твердження 2.1.16 (рекурсивне визначення).

theorem Nat.eq_recurse (f: Nat Nat Nat) (c: Nat) (a: Nat Nat) : (a 0 = c n, a (n++) = f n (a n)) a = recurse f c := f:Nat Nat Natc:Nata:Nat Nat(a 0 = c (n : Nat), a (n++) = f n (a n)) a = recurse f c f:Nat Nat Natc:Nata:Nat Nat(a 0 = c (n : Nat), a (n++) = f n (a n)) a = recurse f cf:Nat Nat Natc:Nata:Nat Nata = recurse f c a 0 = c (n : Nat), a (n++) = f n (a n) f:Nat Nat Natc:Nata:Nat Nat(a 0 = c (n : Nat), a (n++) = f n (a n)) a = recurse f c f:Nat Nat Natc:Nata:Nat Nath0:a 0 = chsucc: (n : Nat), a (n++) = f n (a n)a = recurse f c -- цей доказ написан так, щоб співпадати із структурою орігінального тексту. f:Nat Nat Natc:Nata:Nat Nath0:a 0 = chsucc: (n : Nat), a (n++) = f n (a n) (x : Nat), a x = recurse f c x; f:Nat Nat Natc:Nata:Nat Nath0:a 0 = chsucc: (n : Nat), a (n++) = f n (a n)a 0 = recurse f c 0f:Nat Nat Natc:Nata:Nat Nath0:a 0 = chsucc: (n : Nat), a (n++) = f n (a n) (n : Nat), a n = recurse f c n a (n++) = recurse f c (n++) f:Nat Nat Natc:Nata:Nat Nath0:a 0 = chsucc: (n : Nat), a (n++) = f n (a n)a 0 = recurse f c 0 All goals completed! 🐙 f:Nat Nat Natc:Nata:Nat Nath0:a 0 = chsucc: (n : Nat), a (n++) = f n (a n)n:Nathn:a n = recurse f c na (n++) = recurse f c (n++) All goals completed! 🐙 f:Nat Nat Natc:Nata:Nat Nath:a = recurse f ca 0 = c (n : Nat), a (n++) = f n (a n) f:Nat Nat Natc:Nata:Nat Nath:a = recurse f crecurse f c 0 = c (n : Nat), recurse f c (n++) = f n (recurse f c n) f:Nat Nat Natc:Nata:Nat Nath:a = recurse f crecurse f c 0 = cf:Nat Nat Natc:Nata:Nat Nath:a = recurse f c (n : Nat), recurse f c (n++) = f n (recurse f c n) f:Nat Nat Natc:Nata:Nat Nath:a = recurse f crecurse f c 0 = c All goals completed! 🐙 All goals completed! 🐙

Твердження 2.1.16 (рекурсивне визначення).

theorem Nat.recurse_uniq (f: Nat Nat Nat) (c: Nat) : ∃! (a: Nat Nat), a 0 = c n, a (n++) = f n (a n) := f:Nat Nat Natc:Nat∃! a, a 0 = c (n : Nat), a (n++) = f n (a n) f:Nat Nat Natc:Natrecurse f c 0 = c (n : Nat), recurse f c (n++) = f n (recurse f c n)f:Nat Nat Natc:Nat (y : Nat Nat), (y 0 = c (n : Nat), y (n++) = f n (y n)) y = recurse f c f:Nat Nat Natc:Natrecurse f c 0 = c (n : Nat), recurse f c (n++) = f n (recurse f c n) f:Nat Nat Natc:Natrecurse f c 0 = cf:Nat Nat Natc:Nat (n : Nat), recurse f c (n++) = f n (recurse f c n) f:Nat Nat Natc:Natrecurse f c 0 = c All goals completed! 🐙 f:Nat Nat Natc:Nat (n : Nat), recurse f c (n++) = f n (recurse f c n) All goals completed! 🐙 f:Nat Nat Natc:Nata:Nat Nat(a 0 = c (n : Nat), a (n++) = f n (a n)) a = recurse f c All goals completed! 🐙
end Chapter2