Zulip Chat Archive

Stream: lean4

Topic: Mechanics of Proof "Or" and proof by cases


Luka Ivanić (Nov 26 2024 at 21:36):

This is a tip for people doing the exercises.
I have been struggling with the syntax while doing an example exercise 2.3.4.

example {x : } (hx : x ^ 2 - 3 * x + 2 = 0) : x = 1  x = 2 := by
  have h1 :=
    calc
    (x - 1) * (x - 2) = x ^ 2 - 3 * x + 2 := by ring
    _ = 0 := by rw [hx]
  have h2 := eq_zero_or_eq_zero_of_mul_eq_zero h1
  obtain h3 | h4 := h2
  left
  calc
    x = 1 := by addarith [h3]
    _ = 1 := by ring

  right
  calc
    x = 2 := by addarith [h4]

This is the correct answer, or at least one way of writing it, however, this has an addition in the "left" block:

    _ = 1 := by ring

Without it, the lean infoview persistently flashes a (syntax) error. So I guess for some reason the calculation block has to have multiple lines.

Of course if anyone can offer an explaination for the syntax behaviour that would be a bonus!

Also, for readability sake, it is also possible to divide the left/right blocks like this:

-- first part of the exercise
  . left
    calc
      x = 1 := by addarith [h3]
      _ = 1 := by ring

  . right
    calc
      x = 2 := by addarith [h4]

Patrick Massot (Nov 26 2024 at 22:20):

calc is definitely not intended for single line computation. Why don’t you simply write

-- first part of the exercise
  . left
    addarith [h3]
  . right
    addarith [h4]

Luka Ivanić (Nov 26 2024 at 22:56):

That's amazing! With this improvement, my code is half as long, thank you very much


Last updated: May 02 2025 at 03:31 UTC