CS1950Y Lecture #5 Code, Part 2
2/1/2019



// Mixing and matching languages; just be sure you know which you're using
function method sumzeroton_math(n: int): int
  requires n >= 0
{
  (n * (n+1)) / 2
}

method sumzeroton(n: int) returns (r: int) 
  requires n >= 1
  ensures r == sumzeroton_math(n)
{
  r := 0;
  var i := 1;  
  while(i <= n)
    decreases n-i
    // invariant r == sumzeroton_math(n) // BAD INVAR
    //invariant r == sumzeroton_math(i)// BAD INVAR (better)
    invariant r == sumzeroton_math(i-1)
    //invariant r + i == sumzeroton_math(i)
    invariant 1 <= i <= n+1
  {      
      r := r + i;
      i := i + 1;
  }
  
}

method Main() {
    var i := 1;
    while(i <= 10)
      decreases 10-i
    {
        var v := sumzeroton(i);
        print v," ",sumzeroton_math(i),"\n";
        i := i + 1;
    }
}