-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMinimo_de_suma.lean
163 lines (141 loc) · 5.05 KB
/
Minimo_de_suma.lean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
-- Minimo_de_suma.lean
-- En ℝ, min(a,b)+c = min(a+c,b+c).
-- José A. Alonso Jiménez <https://jaalonso.github.io>
-- Sevilla, 8-septiembre-2023
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
-- Sean a, b y c números reales. Demostrar que
-- min a b + c = min (a + c) (b + c)
-- ----------------------------------------------------------------------
-- Demostraciones en lenguaje natural (LN)
-- =======================================
-- 1ª demostración en LN
-- =====================
-- Aplicando la propiedad antisimétrica a las siguientes desigualdades
-- min(a, b) + c ≤ min(a + c, b + c) (1)
-- min(a + c, b + c) ≤ min(a, b) + c (2)
--
-- Para demostrar (1) basta demostrar que se verifican las siguientes
-- desigualdades
-- min(a, b) + c ≤ a + c (1a)
-- min(a, b) + c ≤ b + c (1b)
-- que se tienen porque se verifican las siguientes desigualdades
-- min(a, b) ≤ a
-- min(a, b) ≤ b
--
-- Para demostrar (2) basta demostrar que se verifica
-- min(a + c, b + c) - c ≤ min(a, b)
-- que se demuestra usando (1); en efecto,
-- min(a + c, b + c) - c ≤ min(a + c - c, b + c - c) [por (1)]
-- = min(a, b)
-- 2ª demostración en LN
-- =====================
-- Por casos según a ≤ b.
--
-- 1º caso: Supongamos que a ≤ b. Entonces,
-- min(a, b) + c = a + c
-- = min(a + c, b + c)
--
-- 2º caso: Supongamos que a ≰ b. Entonces,
-- min(a, b) + c = b + c
-- = min(a + c, b + c)
-- Demostraciones con Lean4
-- ========================
import Mathlib.Data.Real.Basic
import Mathlib.Tactic
variable {a b c : ℝ}
-- En las demostraciones se usarán los siguientes lemas auxiliares
-- aux1 : min a b + c ≤ min (a + c) (b + c)
-- aux2 : min (a + c) (b + c) ≤ min a b + c
-- cuyas demostraciones se exponen a continuación.
-- 1ª demostración de aux1
lemma aux1 :
min a b + c ≤ min (a + c) (b + c) :=
by
have h1 : min a b ≤ a :=
min_le_left a b
have h2 : min a b + c ≤ a + c :=
add_le_add_right h1 c
have h3 : min a b ≤ b :=
min_le_right a b
have h4 : min a b + c ≤ b + c :=
add_le_add_right h3 c
show min a b + c ≤ min (a + c) (b + c)
exact le_min h2 h4
-- 2ª demostración de aux1
example :
min a b + c ≤ min (a + c) (b + c) :=
by
apply le_min
{ apply add_le_add_right
exact min_le_left a b }
{ apply add_le_add_right
exact min_le_right a b }
-- 3ª demostración de aux1
example :
min a b + c ≤ min (a + c) (b + c) :=
le_min (add_le_add_right (min_le_left a b) c)
(add_le_add_right (min_le_right a b) c)
-- 1ª demostración de aux2
lemma aux2 :
min (a + c) (b + c) ≤ min a b + c :=
by
have h1 : min (a + c) (b + c) + -c ≤ min a b
{ calc min (a + c) (b + c) + -c
≤ min (a + c + -c) (b + c + -c) := aux1
_ = min a b := by ring_nf }
show min (a + c) (b + c) ≤ min a b + c
exact add_neg_le_iff_le_add.mp h1
-- 1ª demostración del ejercicio
example :
min a b + c = min (a + c) (b + c) :=
by
have h1 : min a b + c ≤ min (a + c) (b + c) := aux1
have h2 : min (a + c) (b + c) ≤ min a b + c := aux2
show min a b + c = min (a + c) (b + c)
exact le_antisymm h1 h2
-- 2ª demostración del ejercicio
example :
min a b + c = min (a + c) (b + c) :=
by
apply le_antisymm
{ show min a b + c ≤ min (a + c) (b + c)
exact aux1 }
{ show min (a + c) (b + c) ≤ min a b + c
exact aux2 }
-- 3ª demostración del ejercicio
example :
min a b + c = min (a + c) (b + c) :=
by
apply le_antisymm
{ exact aux1 }
{ exact aux2 }
-- 4ª demostración del ejercicio
example :
min a b + c = min (a + c) (b + c) :=
le_antisymm aux1 aux2
-- 5ª demostración del ejercicio
example : min a b + c = min (a + c) (b + c) :=
by
by_cases h : a ≤ b
{ have h1 : a + c ≤ b + c := add_le_add_right h c
calc min a b + c = a + c := by simp [min_eq_left h]
_ = min (a + c) (b + c) := by simp [min_eq_left h1]}
{ have h2: b ≤ a := le_of_not_le h
have h3 : b + c ≤ a + c := add_le_add_right h2 c
calc min a b + c = b + c := by simp [min_eq_right h2]
_ = min (a + c) (b + c) := by simp [min_eq_right h3]}
-- 6ª demostración del ejercicio
example : min a b + c = min (a + c) (b + c) :=
(min_add_add_right a b c).symm
-- Lemas usados
-- ============
-- #check (add_le_add_right : b ≤ c → ∀ (a : ℝ), b + a ≤ c + a)
-- #check (add_neg_le_iff_le_add : a - b ≤ c ↔ a ≤ c + b)
-- #check (le_antisymm : a ≤ b → b ≤ a → a = b)
-- #check (le_min : c ≤ a → c ≤ b → c ≤ min a b)
-- #check (min_add_add_right a b c : min (a + c) (b + c) = min a b + c)
-- #check (min_eq_left : a ≤ b → min a b = a)
-- #check (min_eq_right : b ≤ a → min a b = b)
-- #check (min_le_left a b : min a b ≤ a)
-- #check (min_le_right a b : min a b ≤ b)