Аналіз I, Додаток A.1

Вступ до математичних тверджень. Демонструє деякі базові тактики та синтаксис Lean.

-- Приклад A.1.1. Те, що в підручнику називається «твердженнями», є об'єктами типу `Prop` в Lean. Крім того, в Lean ми схильні присвоювати "мусорні" значення виразам, які зазвичай вважаються невизначеними, тому обговорення невизначених термінів у підручнику слід відповідно скоригувати. 2 + 2 = 4 : Prop#check 2+2=4
2 + 2 = 4 : Prop
2 + 2 = 5 : Prop#check 2+2=5
2 + 2 = 5 : Prop

Кожне добре сформульоване твердження або істинне, або хибне...

example (P:Prop) : (P=true) (P=false) := P:PropP = (true = true) P = (false = true) P:PropP ¬P; All goals completed! 🐙

.. але не одночасно.

example (P:Prop) : ¬ ((P=true) (P=false)) := P:Prop¬(P = (true = true) P = (false = true)) All goals completed! 🐙
-- Примітка: `P=true` та `P=false` спрощуються до `P` та `¬P` відповідно.

Щоб довести істинність твердження, достатньо показати, що воно не є хибним,

example {P:Prop} (h: P false) : P = true := P:Proph:P (false = true)P = (true = true) P:Proph:P (false = true)P; All goals completed! 🐙

тоді як для того, щоб довести, що твердження хибне, достатньо довести, що воно не є істинним.

example {P:Prop} (h: P true) : P = false := P:Proph:P (true = true)P = (false = true) P:Proph:P (true = true)¬P; All goals completed! 🐙

Це твердження істінне, але навряд чи буде дуже корисним.

example : 2 = 2 := rfl

Це твердження також істінне, але не дуже ефективне.

example : 4 4 := 4 4 All goals completed! 🐙
/- This is an expression, not a statement. -/ 2 + 3 * 5 : ℕ#check 2 + 3*5
2 + 3 * 5 : ℕ
/- Це твердження, а не вираз. -/ 2 + 3 * 5 = 17 : Prop#check 2 + 3*5 = 17
2 + 3 * 5 = 17 : Prop
Prime (30 + 5) : Prop#check Prime (30+5)
Prime (30 + 5) : Prop
30 + 5 ≤ 42 - 7 : Prop#check 30+5 42-7
30 + 5 ≤ 42 - 7 : Prop

Кон'юнкція

example {X Y: Prop} (hX: X) (hY: Y) : X Y := X:PropY:ProphX:XhY:YX Y X:PropY:ProphX:XhY:YXX:PropY:ProphX:XhY:YY X:PropY:ProphX:XhY:YX All goals completed! 🐙 All goals completed! 🐙
example {X Y: Prop} (hXY: X Y) : X := X:PropY:ProphXY:X YX All goals completed! 🐙example {X Y: Prop} (hXY: X Y) : Y := X:PropY:ProphXY:X YY All goals completed! 🐙example {X Y: Prop} (hX: ¬ X) : ¬ (X Y) := X:PropY:ProphX:¬X¬(X Y) X:PropY:ProphX:X YX All goals completed! 🐙example {X Y: Prop} (hY: ¬ Y) : ¬ (X Y) := X:PropY:ProphY:¬Y¬(X Y) X:PropY:ProphY:X YY All goals completed! 🐙example : (2+2=4) (3+3=6) := 2 + 2 = 4 3 + 3 = 6 2 + 2 = 43 + 3 = 6 2 + 2 = 4 All goals completed! 🐙 All goals completed! 🐙

Диз'юнкція

example {X Y: Prop} (hX: X) : X Y := X:PropY:ProphX:XX Y X:PropY:ProphX:XX All goals completed! 🐙
example {X Y: Prop} (hY: Y) : X Y := X:PropY:ProphY:YX Y X:PropY:ProphY:YY All goals completed! 🐙example {X Y: Prop} (hX: ¬ X) (hY: ¬ Y) : ¬ (X Y) := X:PropY:ProphX:¬XhY:¬Y¬(X Y) X:PropY:ProphX:¬XhY:¬Y¬X ¬Y X:PropY:ProphX:¬XhY:¬Y¬XX:PropY:ProphX:¬XhY:¬Y¬Y X:PropY:ProphX:¬XhY:¬Y¬X All goals completed! 🐙 All goals completed! 🐙example : (2+2=4) (3+3=5) := 2 + 2 = 4 3 + 3 = 5 2 + 2 = 4 All goals completed! 🐙example : ¬ ((2+2=5) (3+3=5)) := ¬(2 + 2 = 5 3 + 3 = 5) All goals completed! 🐙example : (2+2=4) (3+3=6) := 2 + 2 = 4 3 + 3 = 6 2 + 2 = 4 All goals completed! 🐙example : (2+2=4) (3+3=6) := 2 + 2 = 4 3 + 3 = 6 2 + 2 = 43 + 3 = 6 2 + 2 = 4 All goals completed! 🐙 All goals completed! 🐙example : (2+2=4) (2353 + 5931 = 7284) := 2 + 2 = 4 2353 + 5931 = 7284 2 + 2 = 4 All goals completed! 🐙Xor' (a b : Prop) : Prop#check Xor'
Xor' (a b : Prop) : Prop

Заперечення

example {X:Prop} : (¬ X = true) (X = false) := X:Prop¬X = (true = true) X = (false = true) All goals completed! 🐙
example {X:Prop} : (¬ X = false) (X = true) := X:Prop¬X = (false = true) X = (true = true) All goals completed! 🐙example : ¬ (2+2=5) := ¬2 + 2 = 5 All goals completed! 🐙example : 2+2 5 := 2 + 2 5 All goals completed! 🐙example (Jane_black_hair Jane_blue_eyes:Prop) : (¬ (Jane_black_hair Jane_blue_eyes)) (¬ Jane_black_hair ¬ Jane_blue_eyes) := Jane_black_hair:PropJane_blue_eyes:Prop¬(Jane_black_hair Jane_blue_eyes) ¬Jane_black_hair ¬Jane_blue_eyes Jane_black_hair:PropJane_blue_eyes:PropJane_black_hair ¬Jane_blue_eyes ¬Jane_black_hair ¬Jane_blue_eyes; All goals completed! 🐙example (x:) : ¬ (Even x x 0) (Odd x x < 0) := x:¬(Even x x 0) Odd x x < 0 x:this:¬Odd x Even x¬(Even x x 0) Odd x x < 0 x:this✝:¬Odd x Even xthis:¬x 0 x < 0¬(Even x x 0) Odd x x < 0 All goals completed! 🐙example (x:) : ¬ (x 2 x 6) (x < 2 x > 6) := x:¬(x 2 x 6) x < 2 x > 6 x:this:¬x 2 x < 2¬(x 2 x 6) x < 2 x > 6 x:this✝:¬x 2 x < 2this:¬x 6 x > 6¬(x 2 x 6) x < 2 x > 6 All goals completed! 🐙example (John_brown_hair John_black_hair:Prop) : (¬ (John_brown_hair John_black_hair)) (¬ John_brown_hair ¬ John_black_hair) := John_brown_hair:PropJohn_black_hair:Prop¬(John_brown_hair John_black_hair) ¬John_brown_hair ¬John_black_hair All goals completed! 🐙example (x:) : ¬ (x 1 x -1) (x < 1 x > -1) := x:¬(x 1 x -1) x < 1 x > -1 x:this:¬x 1 x < 1¬(x 1 x -1) x < 1 x > -1 x:this✝:¬x 1 x < 1this:¬x -1 x > -1¬(x 1 x -1) x < 1 x > -1 All goals completed! 🐙example (x:) : ¬ (Even x Odd x) (¬ Even x ¬ Odd x) := x:¬(Even x Odd x) ¬Even x ¬Odd x All goals completed! 🐙example (X:Prop) : ¬ (¬ X) X := X:Prop¬¬X X All goals completed! 🐙

Тоді і тільки тоді (iff)

example {X Y: Prop} (hXY: X Y) (hX: X) : Y := X:PropY:ProphXY:X YhX:XY X:PropY:ProphXY:X YhX:YY All goals completed! 🐙
example {X Y: Prop} (hXY: X Y) (hY: Y) : X := X:PropY:ProphXY:X YhY:YX X:PropY:ProphXY:X YhY:XX All goals completed! 🐙example {X Y: Prop} (hXY: X Y) (hX: X) : Y := X:PropY:ProphXY:X YhX:XY All goals completed! 🐙example {X Y: Prop} (hXY: X Y) (hY: Y) : X := X:PropY:ProphXY:X YhY:YX All goals completed! 🐙example {X Y: Prop} (hXY: X Y) : X=Y := X:PropY:ProphXY:X YX = Y All goals completed! 🐙example (x:) : x = 3 2 * x = 6 := x:x = 3 2 * x = 6 x:x = 3 2 * x = 6x:2 * x = 6 x = 3 x:x = 3 2 * x = 6 x:h:x = 32 * x = 6 All goals completed! 🐙 x:h:2 * x = 6x = 3 All goals completed! 🐙example : ¬ ( x:, x = 3 x^2 = 9) := ¬ (x : ), x = 3 x ^ 2 = 9 x, ¬(x = 3 x ^ 2 = 9) ¬(-3 = 3 (-3) ^ 2 = 9) All goals completed! 🐙example {X Y: Prop} (hXY: X Y) (hX: ¬ X) : ¬ Y := X:PropY:ProphXY:X YhX:¬X¬Y X:PropY:ProphXY:X YhX:¬Xthis:YFalse X:PropY:ProphXY:X YhX:¬Xthis:XFalse All goals completed! 🐙example : (2+2=5) (4+4=10) := 2 + 2 = 5 4 + 4 = 10 All goals completed! 🐙example {X Y Z:Prop} (hXY: X Y) (hXZ: X Z) : [X,Y,Z].TFAE := X:PropY:PropZ:ProphXY:X YhXZ:X Z[X, Y, Z].TFAE tfae_have 1 2 := X:PropY:PropZ:ProphXY:X YhXZ:X Z[X, Y, Z].TFAE All goals completed! 🐙 -- Цей рядок необов'язковий tfae_have 1 3 := X:PropY:PropZ:ProphXY:X YhXZ:X Z[X, Y, Z].TFAE All goals completed! 🐙 -- Цей рядок необов'язковий All goals completed! 🐙

Зверніть увагу, що для методу invalid dotted identifier notation, expected type is not of the form (... → C ...) where C is a constant ?m.62224.out індексація починається з 0, на відміну від тактики unknown identifier 'tfae_have'tfae_have.

example {X Y Z:Prop} (h: [X,Y,Z].TFAE) : X Y := X:PropY:PropZ:Proph:[X, Y, Z].TFAEX Y All goals completed! 🐙

Вправа A.1.1. Заповніть перше sorry : ?m.62233sorry чимось прийнятним

declaration uses 'sorry'example {X Y:Prop} : ¬ ((X Y) ¬ (X Y)) sorry := X:PropY:Prop¬((X Y) ¬(X Y)) sorry All goals completed! 🐙

Вправа A.1.2. Заповніть перше sorry : ?m.62238sorry чимось прийнятним

declaration uses 'sorry'example {X Y:Prop} : ¬ (X Y) sorry := X:PropY:Prop¬(X Y) sorry All goals completed! 🐙

Вправа A.1.3.

def declaration uses 'sorry'Exercise_A_1_3 : Decidable ( (X Y: Prop), (X Y) (¬X ¬ Y) (X Y)) := Decidable (∀ (X Y : Prop), (X Y) (¬X ¬Y) (X Y)) -- перший рядок цієї конструкції має бути або `apply isTrue`, або `apply isFalse`, залежно від того, чи вважаєте ви дане твердження істинним чи хибним. All goals completed! 🐙

Вправа A.1.4.

def declaration uses 'sorry'Exercise_A_1_4 : Decidable ( (X Y: Prop), (X Y) (¬Y ¬ X) (X Y)) := Decidable (∀ (X Y : Prop), (X Y) (¬Y ¬X) (X Y)) -- перший рядок цієї конструкції має бути або `apply isTrue`, або `apply isFalse`. All goals completed! 🐙

Вправа A.1.5.

def declaration uses 'sorry'Exercise_A_1_5 : Decidable ( (X Y Z: Prop), (X Y) (Y Z) [X,Y,Z].TFAE) := Decidable (∀ (X Y Z : Prop), (X Y) (Y Z) [X, Y, Z].TFAE) -- перший рядок цієї конструкції має бути або `apply isTrue`, або `apply isFalse`. All goals completed! 🐙

Вправа A.1.6.

def declaration uses 'sorry'Exercise_A_1_6 : Decidable ( (X Y Z: Prop), (X Y) (Y Z) (Z X) [X,Y,Z].TFAE) := Decidable (∀ (X Y Z : Prop), (X Y) (Y Z) (Z X) [X, Y, Z].TFAE) -- перший рядок цієї конструкції має бути або `apply isTrue`, або `apply isFalse`. All goals completed! 🐙