Wiki Agenda Contact English version

White and black balls

A small puzzle from The Correctness Problem in Computer Science (Robert S. Boyer, J. Strother Moore, Academic Prees, 1982).


Auteurs: Jean-Christophe Filliâtre

Catégories: Historical examples / Divisibility

Outils: Why3

see also the index (by topic, by tool, by reference, by year)


A small puzzle from

The Correctness Problem in Computer Science Robert S. Boyer, J. Strother Moore Academic Prees, 1982

(suggested by Shankar at the Sixth Summer School on Formal Techniques)

Given a bag containing white and black balls, repeatedly - remove a pair from the bag - if they are of the same color, insert a white ball - if they are of difference colors, insert a black ball What is the color of the last ball?

Author: Jean-Christophe FilliĆ¢tre (CNRS)

module WhiteAndBlackBalls

  use int.Int
  use ref.Ref
  use number.Parity

  (* answer: the color of the last ball depends on the parity of the
     number of black balls, which is an invariant of the process *)

  let last_is_black (b0 w0: int) : bool
    requires { b0 >= 0 && w0 >= 0 && b0 + w0 >= 1 }
    ensures  { result <-> odd b0 }
  =
    let ref b = b0 in
    let ref w = w0 in
    while b + w >= 2 do
      invariant { b >= 0 && w >= 0 && b + w >= 1 }
      invariant { odd b <-> odd b0 }
      variant   { b + w }
      let x, y = any (x: int, y: int) ensures {
        0 <= x && 0 <= y && x + y = 2 && x <= b && y <= w } in
      if x = 0 || y = 0 then begin (* same color -> insert a white *)
        b <- b - x;
        w <- w - y + 1
      end else begin (* different color -> insert a black *)
        b <- b - x + 1;
        w <- w - y
      end
    done;
    b > 0

end

download ZIP archive

Why3 Proof Results for Project "white_and_black_balls"

Theory "white_and_black_balls.WhiteAndBlackBalls": fully verified

ObligationsAlt-Ergo 2.0.0
VC for last_is_black9.30