GuessNumber.scala [raw]


/* Copyright 2009-2016 EPFL, Lausanne */

import stainless.lang._

object GuessNumber {

  case class State(var seed: BigInt)

  def between(a: Int, x: Int, b: Int): Boolean = a <= x && x <= b

  def random(min: Int, max: Int)(implicit state: State): Int = {
    require(min <= max)
    state.seed += 1
    assert(between(min, min, max))
    choose((x: Int) => between(min, x, max))
  }

  def main()(implicit state: State): Unit = {
    val choice = random(0, 10)

    var guess = random(0, 10)
    var top = 10
    var bot = 0

    (while(bot < top) {
      if(isGreater(guess, choice)) {
        top = guess-1
        guess = random(bot, top)
      } else if(isSmaller(guess, choice)) {
        bot = guess+1
        guess = random(bot, top)
      }
    }) invariant(guess >= bot && guess <= top && bot >= 0 && top <= 10 && bot <= top && choice >= bot && choice <= top &&
                 true)
    val answer = bot
    assert(answer == choice)
  }

  def isGreater(guess: Int, choice: Int): Boolean = guess > choice
  def isSmaller(guess: Int, choice: Int): Boolean = guess < choice

}

back