Oops! I checked the spec and it's supposed do something more like this:
def f (n : Nat) : String :=
Option.getD
(Option.merge String.append
(if n % 3 = 0 then "Fizz" else none)
(if n % 5 = 0 then "Buzz" else none))
(toString n)
#eval List.map (fun k => f (k + 1)) (List.range 100)
theorem poop (n : Nat) :
f n = "FizzBuzz" ∨ f n = "Fizz" ∨ f n = "Buzz" ∨ f n = toString n := by
unfold f
split <;> split
· exact Or.inl rfl
· exact Or.inr (Or.inl rfl)
· exact Or.inr (Or.inr (Or.inl rfl))
· exact Or.inr (Or.inr (Or.inr rfl))