From dbd24fd7e165c08dc1e3d220bf37cf4d02eada6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Mayer?= <a-mikmay@microsoft.com> Date: Mon, 23 Nov 2015 16:50:46 +0100 Subject: [PATCH] Better prioritization for string splitting. --- src/main/scala/leon/solvers/string/StringSolver.scala | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/scala/leon/solvers/string/StringSolver.scala b/src/main/scala/leon/solvers/string/StringSolver.scala index b953b8cb1..9e87d53d0 100644 --- a/src/main/scala/leon/solvers/string/StringSolver.scala +++ b/src/main/scala/leon/solvers/string/StringSolver.scala @@ -198,6 +198,15 @@ object StringSolver { res } + def prioritizedPositions(s: String): Stream[Int] = { + val separations = "\\b".r.findAllMatchIn(s).map(m => m.start) + separations.toStream #::: { + val done = separations.toSet + for( i <- (0 to s.length).toStream if !done(i)) yield i + } + } + + /** Solves the equation x1x2x3...xn = CONSTANT */ def simpleSplit(ids: List[Identifier], rhs: String): Stream[Assignment] = { ids match { @@ -205,7 +214,7 @@ object StringSolver { case List(x) => Stream(Map(x -> rhs)) case x :: ys => for{ - i <- (0 to rhs.length).toStream + i <- prioritizedPositions(rhs) // Prioritization on positions which are separators. xvalue = rhs.substring(0, i) rvalue = rhs.substring(i) remaining_splits = simpleSplit(ys, rvalue) -- GitLab