have ulp_le : ulp n (a + b) ≤ b := by
  rewrite [← Nat.not_lt]
  intro lt_ulp
  apply Nat.lt_le_asymm lt_round
  exact round_le_of_no_uflow_of_carry_of_lt_ulp
    npos hfaithful₀ hfaithful₁ hcorrect₁ hfa hba no_uflow carry lt_ulp
case inr.inl.right.inr
round : ℕ → ℕ
n a b : ℕ
npos : 0 < n
hfaithful₀ : faithful₀ n round
hfaithful₁ : faithful₁ n round
hcorrect₁ : correct₁ n round
hfa : trunc n a = a
hfb : trunc n b = b
hba : b ≤ a
no_uflow : a + b ≥ 2 ^ n
lt_round : a + b < round (a + b)
carry : a + b ≥ 2 ^ Nat.size a
⊢ trunc n (round (a + b) - (a + b)) = round (a + b) - (a + b)
case inr.inl.right.inr
round : ℕ → ℕ
n a b : ℕ
npos : 0 < n
hfaithful₀ : faithful₀ n round
hfaithful₁ : faithful₁ n round
hcorrect₁ : correct₁ n round
hfa : trunc n a = a
hfb : trunc n b = b
hba : b ≤ a
no_uflow : a + b ≥ 2 ^ n
lt_round : a + b < round (a + b)
carry : a + b ≥ 2 ^ Nat.size a
ulp_le : ulp n (a + b) ≤ b
⊢ trunc n (round (a + b) - (a + b)) = round (a + b) - (a + b)