. cases Nat.lt_or_ge b (ulp n (a - b)) with
  | inl lt_ulp =>
    cases Nat.eq_or_lt_of_le (ulp_le_ulp n tsub_le_self) with
    | inl ulp_eq_ulp =>
      exact b₁_lo_of_round_lt_of_no_uflow_of_ulp_eq_ulp_of_two_mul_lt_of_pos_of_le_ulp
        npos hfaithful₀ hfaithful₁ hcorrect₀ hfa hfb hba
        round_lt no_uflow ulp_eq_ulp bpos (ulp_eq_ulp ▸ lt_ulp.le)
    | inr ulp_lt_ulp =>
      exact b₁_lo_of_round_lt_of_no_uflow_of_ulp_lt_ulp_of_two_mul_lt_of_pos_of_le_ulp
        npos hfaithful₀ hfaithful₁ hcorrect₀ hfa hfb hba
        round_lt no_uflow ulp_lt_ulp two_mul_lt bpos lt_ulp.le
  | inr ulp_le =>
    exact b₁_lo_of_round_le_of_two_mul_le_of_ulp_le npos hfaithful₁
      hfa hfb round_lt.le two_mul_lt.le ulp_le
case inr.inr.inl.inr.inr.left
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
bpos : b > 0
two_mul_lt : 2 * b < a
round_lt : round (a - b) < a - b
⊢ trunc n (a - b - round (a - b)) = a - b - round (a - b)

case inr.inr.inl.inr.inr.right
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
bpos : b > 0
two_mul_lt : 2 * b < a
round_lt : round (a - b) < a - b
⊢ trunc n (round (a - b) - (a - b)) = round (a - b) - (a - b)
case inr.inr.inl.inr.inr.right
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
bpos : b > 0
two_mul_lt : 2 * b < a
round_lt : round (a - b) < a - b
⊢ trunc n (round (a - b) - (a - b)) = round (a - b) - (a - b)