have h₃ : (a + b) / ulp n a * ulp n a % ulp n (a + b) ≤
            b / ulp n a * ulp n a := by
  trans ulp n (a + b) - ulp n a
  . apply le_sub_of_dvd_of_dvd_of_lt
    . rewrite [Nat.dvd_mod_iff h₁]
      exact Nat.dvd_mul_left _ _
    . exact h₁
    . exact Nat.mod_lt _ (ulp_pos n _)
  . rewrite [ulp_add_eq_two_mul_ulp]
    rewrite [← Nat.mul_pred_left]
    rewrite [← one_add_one_eq_two, Nat.add_one, Nat.pred_succ]
    apply Nat.mul_le_mul_right
    rewrite [Nat.one_le_div_iff (ulp_pos n _)]
    exact ulp_le
round : ℕ → ℕ
n a b : ℕ
npos : 0 < n
hfaithful₁ : faithful₁ n round
hfa : trunc n a = a
hfb : trunc n b = b
hba : b ≤ a
no_uflow : 2 ^ n ≤ a + b
carry : 2 ^ Nat.size a ≤ a + b
round_le : round (a + b) ≤ a + b
ulp_add_eq_two_mul_ulp : ulp n (a + b) = 2 * ulp n a
ulp_le : ulp n a ≤ b
h₀ : b % ulp n a = (a + b) % ulp n a
h₁ : ulp n a ∣ ulp n (a + b)
h₂ : a + b - trunc n (a + b) = (a + b) / ulp n a * ulp n a % ulp n (a + b) + b % ulp n a
⊢ trunc n (a + b - round (a + b)) = a + b - round (a + b)
round : ℕ → ℕ
n a b : ℕ
npos : 0 < n
hfaithful₁ : faithful₁ n round
hfa : trunc n a = a
hfb : trunc n b = b
hba : b ≤ a
no_uflow : 2 ^ n ≤ a + b
carry : 2 ^ Nat.size a ≤ a + b
round_le : round (a + b) ≤ a + b
ulp_add_eq_two_mul_ulp : ulp n (a + b) = 2 * ulp n a
ulp_le : ulp n a ≤ b
h₀ : b % ulp n a = (a + b) % ulp n a
h₁ : ulp n a ∣ ulp n (a + b)
h₂ : a + b - trunc n (a + b) = (a + b) / ulp n a * ulp n a % ulp n (a + b) + b % ulp n a
h₃ : (a + b) / ulp n a * ulp n a % ulp n (a + b) ≤ b / ulp n a * ulp n a
⊢ trunc n (a + b - round (a + b)) = a + b - round (a + b)