Skip to content

Commit 6ae2918

Browse files
committed
feat: a < b + c ↔ a < b ∨ ∃ d < c, a = b + d (leanprover-community#27701)
...and analogous results on `CanonicallyOrderedAdd`.
1 parent 4fdaa87 commit 6ae2918

1 file changed

Lines changed: 80 additions & 0 deletions

File tree

Mathlib/Algebra/Order/Monoid/Canonical/Basic.lean

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,83 @@ theorem range_add_eq_image_Ici : range (fun x ↦ f (x + k)) = f '' Ici k :=
3333
fun ⟨y, hy, hfy⟩ ↦ ⟨y - k, by simpa [tsub_add_cancel_of_le hy] using hfy⟩⟩
3434

3535
end Set
36+
37+
section LinearOrder
38+
variable {α : Type*} [LinearOrder α] {P : α → Prop} {a b c : α}
39+
40+
section Add
41+
variable [Add α] [CanonicallyOrderedAdd α]
42+
43+
theorem lt_add_iff_lt_left_or_exists_lt [AddLeftReflectLT α] [IsLeftCancelAdd α] :
44+
a < b + c ↔ a < b ∨ ∃ d < c, a = b + d := by
45+
obtain h | h := lt_or_ge a b
46+
· have : a < b + c := h.trans_le (le_self_add ..)
47+
tauto
48+
· obtain ⟨a, rfl⟩ := exists_add_of_le h
49+
simp
50+
51+
theorem forall_lt_add_iff_lt_left [AddLeftReflectLT α] [IsLeftCancelAdd α] :
52+
(∀ a < b + c, P a) ↔ (∀ a < b, P a) ∧ (∀ d < c, P (b + d)) := by
53+
simp_rw [lt_add_iff_lt_left_or_exists_lt]
54+
aesop
55+
56+
theorem exists_lt_add_iff_lt_left [AddLeftReflectLT α] [IsLeftCancelAdd α] :
57+
(∃ a < b + c, P a) ↔ (∃ a < b, P a) ∨ (∃ d < c, P (b + d)) := by
58+
simp_rw [lt_add_iff_lt_left_or_exists_lt]
59+
aesop
60+
61+
theorem le_add_iff_lt_left_or_exists_le [AddLeftMono α] [IsLeftCancelAdd α] :
62+
a ≤ b + c ↔ a < b ∨ ∃ d ≤ c, a = b + d := by
63+
obtain h | h := lt_or_ge a b
64+
· have : a ≤ b + c := h.le.trans (le_self_add ..)
65+
tauto
66+
· obtain ⟨a, rfl⟩ := exists_add_of_le h
67+
simp
68+
69+
theorem forall_le_add_iff_le_left [AddLeftMono α] [IsLeftCancelAdd α] :
70+
(∀ a ≤ b + c, P a) ↔ (∀ a < b, P a) ∧ (∀ d ≤ c, P (b + d)) := by
71+
simp_rw [le_add_iff_lt_left_or_exists_le]
72+
aesop
73+
74+
theorem exists_le_add_iff_le_left [AddLeftMono α] [IsLeftCancelAdd α] :
75+
(∃ a ≤ b + c, P a) ↔ (∃ a < b, P a) ∨ (∃ d ≤ c, P (b + d)) := by
76+
simp_rw [le_add_iff_lt_left_or_exists_le]
77+
aesop
78+
79+
end Add
80+
81+
section AddCommMagma
82+
variable [AddCommMagma α] [CanonicallyOrderedAdd α]
83+
84+
theorem lt_add_iff_lt_right_or_exists_lt [AddLeftReflectLT α] [IsLeftCancelAdd α] :
85+
a < b + c ↔ a < c ∨ ∃ d < b, a = d + c := by
86+
rw [add_comm, lt_add_iff_lt_left_or_exists_lt]
87+
simp_rw [add_comm]
88+
89+
theorem forall_lt_add_iff_lt_right [AddLeftReflectLT α] [IsLeftCancelAdd α] :
90+
(∀ a < b + c, P a) ↔ (∀ a < c, P a) ∧ (∀ d < b, P (d + c)) := by
91+
simp_rw [lt_add_iff_lt_right_or_exists_lt]
92+
aesop
93+
94+
theorem exists_lt_add_iff_lt_right [AddLeftReflectLT α] [IsLeftCancelAdd α] :
95+
(∃ a < b + c, P a) ↔ (∃ a < c, P a) ∨ (∃ d < b, P (d + c)) := by
96+
simp_rw [lt_add_iff_lt_right_or_exists_lt]
97+
aesop
98+
99+
theorem le_add_iff_lt_right_or_exists_le [AddLeftMono α] [IsLeftCancelAdd α] :
100+
a ≤ b + c ↔ a < c ∨ ∃ d ≤ b, a = d + c := by
101+
rw [add_comm, le_add_iff_lt_left_or_exists_le]
102+
simp_rw [add_comm]
103+
104+
theorem forall_le_add_iff_le_right [AddLeftMono α] [IsLeftCancelAdd α] :
105+
(∀ a ≤ b + c, P a) ↔ (∀ a < c, P a) ∧ (∀ d ≤ b, P (d + c)) := by
106+
simp_rw [le_add_iff_lt_right_or_exists_le]
107+
aesop
108+
109+
theorem exists_le_add_iff_le_right [AddLeftMono α] [IsLeftCancelAdd α] :
110+
(∃ a ≤ b + c, P a) ↔ (∃ a < c, P a) ∨ (∃ d ≤ b, P (d + c)) := by
111+
simp_rw [le_add_iff_lt_right_or_exists_le]
112+
aesop
113+
114+
end AddCommMagma
115+
end LinearOrder

0 commit comments

Comments
 (0)