From acb2f8d38bcab702c63b8d641b36e1562efdf6f3 Mon Sep 17 00:00:00 2001
From: Viktor Kuncak <viktor.kuncak@epfl.ch>
Date: Mon, 27 Apr 2015 16:54:46 -0700
Subject: [PATCH] Added a web tutorial that expands on Sort and is listed on
 0th position

---
 testcases/web/demos/00_Tutorial.scala | 177 ++++++++++++++++++++++++++
 1 file changed, 177 insertions(+)
 create mode 100644 testcases/web/demos/00_Tutorial.scala

diff --git a/testcases/web/demos/00_Tutorial.scala b/testcases/web/demos/00_Tutorial.scala
new file mode 100644
index 000000000..dc8734368
--- /dev/null
+++ b/testcases/web/demos/00_Tutorial.scala
@@ -0,0 +1,177 @@
+import leon.lang._
+import leon.lang.synthesis._
+import leon.annotation._
+object Sort {
+// ==================================================================
+//                        Max
+// ==================================================================
+
+/*
+  def max(x: Int, y: Int): Int = {
+    val d = x - y
+    if (d > 0) x
+    else y
+  } ensuring(res =>
+    x <= res && y <= res && (res == x || res == y))
+
+  def test1 = max(10, 5)
+  def test2 = max(-5, 5)
+  def test3 = max(-5, -7)
+
+  def test4 = max(-1639624704, 1879048192)
+ */
+
+/*
+def max(x: BigInt, y: BigInt): BigInt = {
+  val d = x - y
+  if (d > 0) x
+  else y
+} ensuring(res =>
+  x <= res && y <= res && (res == x || res == y))
+ */
+
+/*
+def max(x: BigInt, y: BigInt): BigInt = {
+  val d = x - y
+  if (d > 0) x
+  else y
+} ensuring(res =>  res==rmax(x,y))
+
+def rmax(x: BigInt, y: BigInt) =
+  if (x <= y) x else y
+ */
+
+/*
+def max_lemma(x: BigInt, y: BigInt, z: BigInt): Boolean = {
+  max(x,x) == x &&
+  max(x,y) == max(y,x) &&
+  max(x,max(y,z)) == max(max(x,y), z) &&
+  max(x,y) + z == max(x + z, y + z)
+} holds
+ */
+
+/*
+def max(x: Int, y: Int): Int = {
+  require(0 <= x && 0 <= y)
+  val d = x - y
+  if (d > 0) x
+  else y
+} ensuring (res =>
+  x <= res && y <= res && (res == x || res == y))
+ */
+
+// ==================================================================
+//                        Sort 2-3 ELements
+// ==================================================================
+
+/*
+  def sort2(x : BigInt, y : BigInt) = choose{(res: (BigInt,BigInt)) =>
+    Set(x,y) == Set(res._1, res._2) && res._1 <= res._2
+  }
+*/
+
+// def testSort2 = sort2(30, 4)
+
+/*
+  def sort2(x : BigInt, y : BigInt) = choose{(res: (BigInt,BigInt)) => 
+    sort2spec(x,y,res)
+  }
+
+  def sort2spec(x: BigInt, y: BigInt, res: (BigInt, BigInt)): Boolean = {
+    Set(x,y) == Set(res._1, res._2) && res._1 <= res._2
+  }
+
+  def unique2(x: BigInt, y: BigInt,
+              res1: (BigInt, BigInt),
+              res2: (BigInt, BigInt)): Boolean = {
+    require(sort2spec(x,y,res1) && sort2spec(x,y,res2))
+    res1 == res2
+  } holds
+ */
+
+/*
+  def sort3spec(x: BigInt, y: BigInt, z: BigInt, res: (BigInt, BigInt, BigInt)): Boolean = {
+    Set(x,y,z) == Set(res._1, res._2, res._3) && 
+    res._1 <= res._2 && res._2 <= res._3
+  }
+
+  def unique3(x: BigInt, y: BigInt, z: BigInt,
+         res1: (BigInt, BigInt, BigInt),
+         res2: (BigInt, BigInt, BigInt)): Boolean = {
+    require(sort3spec(x,y,z,res1) && sort3spec(x,y,z,res2))
+    res1 == res2
+  }.holds
+ */
+
+// ==================================================================
+//                        Sort a List
+// ==================================================================
+
+/*
+  sealed abstract class List
+  case object Nil extends List
+  case class Cons(head: BigInt, tail: List) extends List
+
+  def size(l: List) : BigInt = (l match {
+      case Nil => 0
+      case Cons(x, rest) => x + size(rest)
+  }) 
+*/
+  // ensuring(res =>  res > 0)
+
+  // def s1 = size(Cons(10, Cons(1000, Nil)))
+
+/*
+  def content(l: List): Set[BigInt] = l match {
+    case Nil => Set()
+    case Cons(i, t) => Set(i) ++ content(t)
+  }
+*/
+
+/*
+  def isSorted(l : List) : Boolean = l match {
+    case Nil => true
+    case Cons(_,Nil) => true
+    case Cons(x1, Cons(x2, rest)) => 
+      x1 < x2 && isSorted(Cons(x2,rest))
+  }
+*/
+  //def t1 = isSorted(Cons(10, Cons(20, Nil)))
+  //def t2 = isSorted(Cons(15, Cons(15, Nil)))
+
+/*
+  def sInsert(x : BigInt, l : List) : List = {
+    require(isSorted(l))
+    l match {
+      case Nil => Cons(x, Nil)
+      case Cons(e, rest) if (x == e) => l
+      case Cons(e, rest) if (x < e) => Cons(x, Cons(e,rest))
+      case Cons(e, rest) if (x > e) => Cons(e, sInsert(x,rest))
+    }
+  } ensuring {(res:List) => 
+     isSorted(res) && content(res) == content(l) ++ Set(x)}
+
+   // size(res) == size(l) + 1
+*/
+
+/*  
+  def insertMagic(x: BigInt, l: List): List = {
+    require(isSorted(l))
+    choose {(res: List) => 
+      isSorted(res) && content(res) == content(l) ++ Set[BigInt](x)
+    }
+  }
+*/
+
+  //def m = insertMagic(17, Cons(10, Cons(15, Cons(20, Nil))))
+
+/*
+  def sortMagic(l : List) = {
+     ???[List]
+  } ensuring((res:List) => 
+    isSorted(res) && content(res) == content(l))
+*/
+
+  // def mm = sortMagic(Cons(20, Cons(5, Cons(50, Cons(2, Nil)))))
+
+}
-- 
GitLab