diff --git a/testcases/synthesis/ZuneBug.scala b/testcases/synthesis/ZuneBug.scala new file mode 100644 index 0000000000000000000000000000000000000000..c6ea3522b72a5331e36155f4ef21d3a7d15961ac --- /dev/null +++ b/testcases/synthesis/ZuneBug.scala @@ -0,0 +1,31 @@ +import leon.lang._ +import leon.lang.synthesis._ + +/* Inspired by the Zune bug that caused looping. + This encodes the task of date conversion into + integer linear arithmetic and tries to synthesize it. +*/ + +object ZuneBug { + def leapsTill(year: BigInt): BigInt = { + require(year >= 0) + val y1 = year - 1 + y1/4 + y1/100 + y1/400 + } + def isLeap(year: BigInt): Boolean = { + require(year >= 0) + leapsTill(year+1) > leapsTill(year) + } + + def yearDay(daysSince1980: BigInt): (BigInt, BigInt) = { + require(daysSince1980 >= 0) + ???[(BigInt,BigInt)] + } ensuring (res => { + val (year, day) = res + year >= 1980 && + 0 <= day && day <= 366 && + (day == 366 ==> isLeap(year)) && + daysSince1980 == (year - 1980)*365 + + leapsTill(year) - leapsTill(1980) + day + }) +}