diff --git a/testcases/verification/sorting/MergeSort.scala b/testcases/verification/sorting/MergeSort.scala new file mode 100644 index 0000000000000000000000000000000000000000..474f768a5a10b32eec99e6eebacfd3680d6ccda2 --- /dev/null +++ b/testcases/verification/sorting/MergeSort.scala @@ -0,0 +1,25 @@ +import leon.lang._ +import leon.collection._ +object MergeSort { + + def merge[T](less: (T, T) => Boolean)(xs: List[T], ys: List[T]): List[T] = { + (xs, ys) match { + case (Nil(), _) => ys + case (_, Nil()) => xs + case (Cons(x,xtail), Cons(y,ytail)) => + if (less(x, y)) + x :: merge(less)(xtail, ys) + else + y :: merge(less)(xs, ytail) + } + } ensuring { res => res.content == xs.content ++ ys.content && + res.size == xs.size + ys.size } + + def msort[T](less: (T, T) => Boolean)(l: List[T]): List[T] = { + if (l.size <= 1) l + else { + val (first, second) = l.evenSplit + merge(less)(msort(less)(first), msort(less)(second)) + } + } ensuring { res => res.content == l.content && res.size == l.size } +}