From a3e44cf33e3f2b1c640e0890c3b94b63251858ff Mon Sep 17 00:00:00 2001
From: Viktor Kuncak <vkuncak@gmail.com>
Date: Fri, 11 Jan 2013 14:24:43 +0100
Subject: [PATCH] Benchmark: Incremen Time, or Sequence of Times. Combine ADTs
 and Int

---
 testcases/synthesis/cav2013/ManyTimeSec.scala | 77 +++++++++++++++++++
 1 file changed, 77 insertions(+)
 create mode 100644 testcases/synthesis/cav2013/ManyTimeSec.scala

diff --git a/testcases/synthesis/cav2013/ManyTimeSec.scala b/testcases/synthesis/cav2013/ManyTimeSec.scala
new file mode 100644
index 000000000..ef521e146
--- /dev/null
+++ b/testcases/synthesis/cav2013/ManyTimeSec.scala
@@ -0,0 +1,77 @@
+import scala.collection.immutable.Set
+import leon.Annotations._
+import leon.Utils._
+
+object ManyTimeSec { 
+  case class Time(h:Int,m:Int,s:Int)
+  case class Seconds(total:Int)
+
+  def timeAndSec(t:Time,seconds:Seconds) : Boolean = {
+    3600*t.h + 60*t.m + t.s == seconds.total && 
+    t.h >= 0 && t.m >= 0 && t.m < 60 && t.s >= 0 && t.s < 60
+  }
+  def time2sec(t:Time) : Seconds = 
+    choose((seconds:Seconds) => timeAndSec(t,seconds))
+  def sec2time(seconds:Seconds):Time = 
+    choose((t:Time) => timeAndSec(t,seconds))
+  def incTime(t0:Time,k:Int) : Time =
+    choose((t1:Time) => time2sec(t1).total == time2sec(t0).total + k)
+
+  def incTime2(h1:Int,m1:Int,s1:Int,k:Int) : (Int,Int,Int) = {
+    require(0 <= k && 0 <= h1 && 0 <= m1 && m1 < 60 && 0 <= s1 && s1 < 60)
+    choose((h2:Int,m2:Int,s2:Int) => 
+      0 <= m2 && m2 < 60 && 0 <= s2 && s2 < 60 &&
+      3600*h2+60*m2+s2 == 3600*h1+60*m1+s1 + k)
+  }
+
+  def incTime2one(h1:Int,m1:Int,s1:Int) : (Int,Int,Int) = {
+    require(0 <= h1 && 0 <= m1 && m1 < 60 && 0 <= s1 && s1 < 60)
+    choose((h2:Int,m2:Int,s2:Int) => 
+      0 <= m2 && m2 < 60 && 0 <= s2 && s2 < 60 &&
+      3600*h2+60*m2+s2 == 3600*h1+60*m1+s1 + 1)
+  }
+
+  // Yes, we can, do it without multiply and divide
+  def incTime3one(h1:Int,m1:Int,s1:Int) : (Int,Int,Int) = {
+    require(0 <= h1 && 0 <= m1 && m1 < 60 && 0 <= s1 && s1 < 60)
+    if (s1 + 1 < 60)
+      (h1,m1,s1+1)
+    else
+      if (m1 + 1 < 60)
+	(h1,m1+1,0)
+      else
+	(h1+1,0,0)
+  } ensuring(res => {
+    val (h2,m2,s2) = res
+    0 <= m2 && m2 < 60 && 0 <= s2 && s2 < 60 && 
+    3600*h2+60*m2+s2 == 3600*h1+60*m1+s1 + 1
+  })
+
+  case class RedundantTime(t:Time, s:Seconds)
+  def isOkRT(rt:RedundantTime) : Boolean = timeAndSec(rt.t, rt.s)
+
+  def incRT(rt0:RedundantTime, k:Int) : RedundantTime = {
+    require(isOkRT(rt0))
+    choose((rt1:RedundantTime) => isOkRT(rt1) && rt1.s.total == rt0.s.total + k)
+  }
+
+  abstract class RedundantTimeList
+  case class Nil() extends RedundantTimeList
+  case class Cons(head:RedundantTime,tail:RedundantTimeList) extends RedundantTimeList
+
+  def isInced(l1:RedundantTimeList, k:Int, l2:RedundantTimeList) : Boolean = {
+    (l1,l2) match {
+      case (Nil(),Nil()) => true
+      case (Cons(rt1,rest1),Cons(rt2,rest2)) => {
+	isOkRT(rt1) && isOkRT(rt2) &&
+	(rt2.s.total == rt2.s.total + k) &&
+        isInced(rest1,k,rest2)
+      }
+      case _ => false
+    }
+  }
+
+  def incAll(l:RedundantTimeList, k:Int) : RedundantTimeList =
+    choose((res:RedundantTimeList) => isInced(l,k,res))
+
+}
-- 
GitLab