Skip to content

Commit

Permalink
feat: more add lemmas for Nat (#197)
Browse files Browse the repository at this point in the history
Potentially breaking:

* Implicit parameters for `Nat.lt_add_right`.
* Implicit parameters for `Nat.add_le_add_iff_left`.
* Implicit parameters for `Nat.add_le_add_iff_right`.
* Implicit parameters for `Nat.add_lt_add_iff_left`.
* Implicit parameters for `Nat.add_lt_add_iff_right`.
* Deprecated `Nat.succ_add_eq_succ_add`.
* Some implicit parameters may have been renamed or reordered.
  • Loading branch information
fgdorais authored Dec 8, 2023
1 parent ddcb086 commit dbb4045
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 50 deletions.
4 changes: 2 additions & 2 deletions Std/Data/Fin/Lemmas.lean
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ theorem add_one_pos (i : Fin (n + 1)) (h : i < Fin.last n) : (0 : Fin (n + 1)) <
match n with
| 0 => cases h
| n+1 =>
rw [Fin.lt_def, val_last, ← Nat.add_lt_add_iff_right 1] at h
rw [Fin.lt_def, val_last, ← Nat.add_lt_add_iff_right] at h
rw [Fin.lt_def, val_add, val_zero, val_one, Nat.mod_eq_of_lt h]
exact Nat.zero_lt_succ _

Expand Down Expand Up @@ -313,7 +313,7 @@ theorem castLE_of_eq {m n : Nat} (h : m = n) {h' : m ≤ n} : castLE h' = Fin.ca
theorem castAdd_lt {m : Nat} (n : Nat) (i : Fin m) : (castAdd n i : Nat) < m := by simp

@[simp] theorem castAdd_mk (m : Nat) (i : Nat) (h : i < n) :
castAdd m ⟨i, h⟩ = ⟨i, Nat.lt_add_right i n m h⟩ := rfl
castAdd m ⟨i, h⟩ = ⟨i, Nat.lt_add_right m h⟩ := rfl

@[simp] theorem castAdd_castLT (m : Nat) (i : Fin (n + m)) (hi : i.val < n) :
castAdd m (castLT i hi) = i := rfl
Expand Down
2 changes: 1 addition & 1 deletion Std/Data/List/Lemmas.lean
Original file line number Diff line number Diff line change
Expand Up @@ -701,7 +701,7 @@ theorem get_zero : ∀ {l : List α} (h : 0 < l.length), l.get ⟨0, h⟩ = l.he
| _::_, _ => rfl

theorem get_append : ∀ {l₁ l₂ : List α} (n : Nat) (h : n < l₁.length),
(l₁ ++ l₂).get ⟨n, length_append .. ▸ Nat.lt_add_right _ _ _ h⟩ = l₁.get ⟨n, h⟩
(l₁ ++ l₂).get ⟨n, length_append .. ▸ Nat.lt_add_right _ h⟩ = l₁.get ⟨n, h⟩
| a :: l, _, 0, h => rfl
| a :: l, _, n+1, h => by simp only [get, cons_append]; apply get_append

Expand Down
100 changes: 56 additions & 44 deletions Std/Data/Nat/Lemmas.lean
Original file line number Diff line number Diff line change
Expand Up @@ -333,84 +333,96 @@ theorem lt_of_le_pred (h : 0 < m) : n ≤ pred m → n < m := (le_pred_iff_lt h)

theorem le_pred_of_lt (h : n < m) : n ≤ pred m := (le_pred_iff_lt (Nat.zero_lt_of_lt h)).2 h

/-! ### add -/
/-! ## add -/

protected theorem eq_zero_of_add_eq_zero_right : ∀ {n m : Nat}, n + m = 0 → n = 0
| 0, m => by simp [Nat.zero_add]
| n+1, m => fun h => by
rw [add_one, succ_add] at h
cases succ_ne_zero _ h
protected theorem add_add_add_comm (a b c d : Nat) : (a + b) + (c + d) = (a + c) + (b + d) := by
rw [Nat.add_assoc, Nat.add_assoc, Nat.add_left_comm b]

protected theorem eq_zero_of_add_eq_zero_left {n m : Nat} (h : n + m = 0) : m = 0 :=
@Nat.eq_zero_of_add_eq_zero_right m n (Nat.add_comm n m ▸ h)
theorem one_add (n) : 1 + n = succ n := Nat.add_comm ..

theorem succ_add_eq_succ_add (n m : Nat) : succ n + m = n + succ m := by
simp [succ_add, add_succ]
theorem succ_eq_one_add (n) : succ n = 1 + n := (one_add _).symm

theorem one_add (n : Nat) : 1 + n = succ n := Nat.add_comm ..
theorem succ_add_eq_add_succ (a b) : succ a + b = a + succ b := Nat.succ_add ..
@[deprecated] alias succ_add_eq_succ_add := Nat.succ_add_eq_add_succ

theorem succ_eq_one_add (n) : succ n = 1 + n := (one_add _).symm
theorem eq_zero_of_add_eq_zero : ∀ {n m}, n + m = 0 → n = 0 ∧ m = 0
| 0, 0, _ => ⟨rfl, rfl⟩
| _+1, 0, h => Nat.noConfusion h

protected theorem eq_zero_of_add_eq_zero_right (h : n + m = 0) : n = 0 :=
(Nat.eq_zero_of_add_eq_zero h).1

protected theorem eq_zero_of_add_eq_zero_left (h : n + m = 0) : m = 0 :=
(Nat.eq_zero_of_add_eq_zero h).2

theorem eq_zero_of_add_eq_zero {n m : Nat} (H : n + m = 0) : n = 0 ∧ m = 0 :=
⟨Nat.eq_zero_of_add_eq_zero_right H, Nat.eq_zero_of_add_eq_zero_left H
protected theorem add_eq_zero_iff : n + m = 0 n = 0 ∧ m = 0 :=
⟨Nat.eq_zero_of_add_eq_zero, fun ⟨h₁, h₂⟩ => h₂.symm ▸ h₁

protected theorem add_left_cancel_iff {n m k : Nat} : n + m = n + k ↔ m = k :=
protected theorem add_left_cancel_iff {n : Nat} : n + m = n + k ↔ m = k :=
⟨Nat.add_left_cancel, fun | rfl => rfl⟩

protected theorem add_right_cancel_iff {n m k : Nat} : n + m = k + mn = k :=
protected theorem add_right_cancel_iff {n : Nat} : m + n = k + nm = k :=
⟨Nat.add_right_cancel, fun | rfl => rfl⟩

protected theorem add_le_add_iff_left (k n m : Nat) : k + nk + mnm :=
protected theorem add_le_add_iff_left {n : Nat} : n + mn + kmk :=
⟨Nat.le_of_add_le_add_left, fun h => Nat.add_le_add_left h _⟩

protected theorem add_le_add_iff_right (k n m : Nat) : n + km + knm :=
protected theorem add_le_add_iff_right {n : Nat} : m + nk + nmk :=
⟨Nat.le_of_add_le_add_right, fun h => Nat.add_le_add_right h _⟩

protected theorem lt_of_add_lt_add_left {k n m : Nat} (h : k + n < k + m) : n < m :=
Nat.lt_of_le_of_ne (Nat.le_of_add_le_add_left (Nat.le_of_lt h)) fun heq =>
Nat.lt_irrefl (k + m) <| by rwa [heq] at h
protected theorem lt_of_add_lt_add_right : ∀ {n : Nat}, k + n < m + n → k < m
| 0, h => h
| _+1, h => Nat.lt_of_add_lt_add_right (Nat.lt_of_succ_lt_succ h)

protected theorem lt_of_add_lt_add_right {a b c : Nat} (h : a + b < c + b) : a < c :=
Nat.lt_of_add_lt_add_left ((by rwa [Nat.add_comm b a, Nat.add_comm b c]): b + a < b + c)
protected theorem lt_of_add_lt_add_left {n : Nat} : n + k < n + m → k < m := by
rw [Nat.add_comm n, Nat.add_comm n]; exact Nat.lt_of_add_lt_add_right

protected theorem add_lt_add_iff_left (k n m : Nat) : k + n < k + m ↔ n < m :=
protected theorem add_lt_add_iff_left {k n m : Nat} : k + n < k + m ↔ n < m :=
⟨Nat.lt_of_add_lt_add_left, fun h => Nat.add_lt_add_left h _⟩

protected theorem add_lt_add_iff_right (k n m : Nat) : n + k < m + k ↔ n < m :=
protected theorem add_lt_add_iff_right {k n m : Nat} : n + k < m + k ↔ n < m :=
⟨Nat.lt_of_add_lt_add_right, fun h => Nat.add_lt_add_right h _⟩

protected theorem lt_add_right (a b c : Nat) (h : a < b) : a < b + c :=
Nat.lt_of_lt_of_le h (Nat.le_add_right _ _)
protected theorem add_lt_add_of_le_of_lt {a b c d : Nat} (hle : a ≤ b) (hlt : c < d) :
a + c < b + d :=
Nat.lt_of_le_of_lt (Nat.add_le_add_right hle _) (Nat.add_lt_add_left hlt _)

protected theorem add_lt_add_of_lt_of_le {a b c d : Nat} (hlt : a < b) (hle : c ≤ d) :
a + c < b + d :=
Nat.lt_of_le_of_lt (Nat.add_le_add_left hle _) (Nat.add_lt_add_right hlt _)

protected theorem lt_add_left (c : Nat) (h : a < b) : a < c + b :=
Nat.lt_of_lt_of_le h (Nat.le_add_left ..)

protected theorem lt_add_right (c : Nat) (h : a < b) : a < b + c :=
Nat.lt_of_lt_of_le h (Nat.le_add_right ..)

protected theorem lt_add_of_pos_right {n k : Nat} (h : 0 < k) : n < n + k :=
protected theorem lt_add_of_pos_right (h : 0 < k) : n < n + k :=
Nat.add_lt_add_left h n

protected theorem lt_add_of_pos_left {n k : Nat} (h : 0 < k) : n < k + n := by
rw [Nat.add_comm]; exact Nat.lt_add_of_pos_right h
protected theorem lt_add_of_pos_left : 0 < k n < k + n := by
rw [Nat.add_comm]; exact Nat.lt_add_of_pos_right

protected theorem pos_of_lt_add_right {n k : Nat} (h : n < n + k) : 0 < k :=
protected theorem pos_of_lt_add_right (h : n < n + k) : 0 < k :=
Nat.lt_of_add_lt_add_left h

protected theorem pos_of_lt_add_left {n k : Nat} (h : n < k + n) : 0 < k :=
Nat.lt_of_add_lt_add_right (by rw [Nat.zero_add]; exact h)
protected theorem pos_of_lt_add_left : n < k + n 0 < k := by
rw [Nat.add_comm]; exact Nat.pos_of_lt_add_right

protected theorem lt_add_right_iff_pos {n k : Nat} : n < n + k ↔ 0 < k :=
protected theorem lt_add_right_iff_pos : n < n + k ↔ 0 < k :=
⟨Nat.pos_of_lt_add_right, Nat.lt_add_of_pos_right⟩

protected theorem lt_add_left_iff_pos {n k : Nat} : n < k + n ↔ 0 < k :=
protected theorem lt_add_left_iff_pos : n < k + n ↔ 0 < k :=
⟨Nat.pos_of_lt_add_left, Nat.lt_add_of_pos_left⟩

theorem add_pos_left (h : 0 < m) (n : Nat) : 0 < m + n :=
Nat.lt_of_le_of_lt (zero_le n) (Nat.lt_add_of_pos_left h)
protected theorem add_pos_left (h : 0 < m) (n) : 0 < m + n :=
Nat.lt_of_lt_of_le h (Nat.le_add_right ..)

theorem add_pos_right (m : Nat) (h : 0 < n) : 0 < m + n := by
rw [Nat.add_comm]
exact add_pos_left h m
protected theorem add_pos_right (m) (h : 0 < n) : 0 < m + n :=
Nat.lt_of_lt_of_le h (Nat.le_add_left ..)

protected theorem add_self_ne_one : ∀ (n : Nat), n + n ≠ 1
| n+1, h =>
have h1 : succ (succ (n + n)) = 1 := succ_add n n ▸ h
Nat.noConfusion h1 fun.
protected theorem add_self_ne_one : ∀ n, n + n ≠ 1
| n+1, h => by rw [Nat.succ_add, Nat.succ_inj'] at h; contradiction

/-! ## sub -/

Expand Down
6 changes: 3 additions & 3 deletions Std/Data/String/Lemmas.lean
Original file line number Diff line number Diff line change
Expand Up @@ -458,7 +458,7 @@ theorem extract_of_valid (l m r : List Char) :
extract ⟨l ++ m ++ r⟩ ⟨utf8Len l⟩ ⟨utf8Len l + utf8Len m⟩ = ⟨m⟩ := by
simp only [extract]
split
· next h => rw [utf8Len_eq_zero.1 <| Nat.le_zero.1 <| (Nat.add_le_add_iff_left _ _ 0).1 h]
· next h => rw [utf8Len_eq_zero.1 <| Nat.le_zero.1 <| Nat.add_le_add_iff_left.1 h]
· congr; rw [List.append_assoc, extract.go₁_append_right _ _ _ _ _ (by rfl)]
apply extract.go₂_append_left; apply Nat.add_comm

Expand Down Expand Up @@ -581,7 +581,7 @@ theorem prev_nil : ∀ {it}, ValidFor [] r it → ValidFor [] r it.prev
theorem atEnd : ∀ {it}, ValidFor l r it → (it.atEnd ↔ r = [])
| it, h => by
simp [Iterator.atEnd, h.pos, h.toString]
exact (Nat.add_le_add_iff_left _ _ 0).trans <| Nat.le_zero.trans utf8Len_eq_zero
exact Nat.add_le_add_iff_left.trans <| Nat.le_zero.trans utf8Len_eq_zero

theorem hasNext : ∀ {it}, ValidFor l r it → (it.hasNext ↔ r ≠ [])
| it, h => by simp [Iterator.hasNext, ← h.atEnd, Iterator.atEnd]
Expand Down Expand Up @@ -925,7 +925,7 @@ theorem extract : ∀ {s}, ValidFor l m r s → ValidFor ml mm mr ⟨⟨m⟩, b,
| _, ⟨⟩, ⟨⟩ => by
simp [Substring.extract]; split
· next h =>
rw [utf8Len_eq_zero.1 <| Nat.le_zero.1 <| (Nat.add_le_add_iff_left _ _ 0).1 h]
rw [utf8Len_eq_zero.1 <| Nat.le_zero.1 <| Nat.add_le_add_iff_left.1 h]
exact ⟨[], [], ⟨⟩⟩
· next h =>
refine ⟨l ++ ml, mr ++ r, .of_eq _ (by simp) ?_ ?_⟩ <;>
Expand Down

0 comments on commit dbb4045

Please sign in to comment.