Skip to content

Commit 3944aca

Browse files
committed
Implement basic and nested string concat simplification
1 parent 4eadbb0 commit 3944aca

2 files changed

Lines changed: 49 additions & 1 deletion

File tree

ksmt-core/src/main/kotlin/io/ksmt/expr/rewrite/simplify/StringSimplification.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ import io.ksmt.sort.KStringSort
1010
fun KContext.simplifyStringConcat(
1111
arg0: KExpr<KStringSort>,
1212
arg1: KExpr<KStringSort>
13-
): KExpr<KStringSort> = mkStringConcatNoSimplify(arg0, arg1) // Temporarily
13+
): KExpr<KStringSort> = simplifyStringBasicConcat(arg0, arg1) {arg2, arg3 ->
14+
simplifyStringNestedConcat(arg2, arg3, KContext::simplifyStringConcat, ::mkStringConcatNoSimplify)
15+
}
1416

1517
fun KContext.simplifyStringLen(
1618
arg: KExpr<KStringSort>

ksmt-core/src/main/kotlin/io/ksmt/expr/rewrite/simplify/StringSimplificationRules.kt

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,54 @@
11
package io.ksmt.expr.rewrite.simplify
22

3+
import io.ksmt.KContext
34
import io.ksmt.expr.KExpr
5+
import io.ksmt.expr.KStringConcatExpr
46
import io.ksmt.expr.KStringLiteralExpr
57
import io.ksmt.sort.KStringSort
8+
import io.ksmt.utils.StringUtils
9+
10+
inline fun KContext.simplifyStringBasicConcat(
11+
arg0: KExpr<KStringSort>,
12+
arg1: KExpr<KStringSort>,
13+
cont: (KExpr<KStringSort>, KExpr<KStringSort>) -> KExpr<KStringSort>
14+
): KExpr<KStringSort> =
15+
tryEvalStringLiteralOperation(arg0, arg1, { a1, a2 -> StringUtils.concatStrings(a1, a2) }) {
16+
cont(arg0, arg1)
17+
}
18+
19+
inline fun KContext.simplifyStringNestedConcat(
20+
arg0: KExpr<KStringSort>,
21+
arg1: KExpr<KStringSort>,
22+
rewriteStringConcatExpr: KContext.(KExpr<KStringSort>, KExpr<KStringSort>) -> KExpr<KStringSort>,
23+
cont: (KExpr<KStringSort>, KExpr<KStringSort>) -> KExpr<KStringSort>
24+
): KExpr<KStringSort> {
25+
if (arg0 is KStringLiteralExpr && arg1 is KStringConcatExpr) {
26+
val arg1Left = arg1.arg0
27+
if (arg1Left is KStringLiteralExpr) {
28+
return rewriteStringConcatExpr(StringUtils.concatStrings(arg0, arg1Left), arg1.arg1)
29+
}
30+
}
31+
32+
if (arg1 is KStringLiteralExpr && arg0 is KStringConcatExpr) {
33+
val arg0Right = arg0.arg1
34+
if (arg0Right is KStringLiteralExpr) {
35+
return rewriteStringConcatExpr(arg0.arg0, StringUtils.concatStrings(arg0Right, arg1))
36+
}
37+
}
38+
39+
if (arg0 is KStringConcatExpr && arg1 is KStringConcatExpr) {
40+
val arg0Right = arg0.arg1
41+
val arg1Left = arg1.arg0
42+
if (arg0Right is KStringLiteralExpr && arg1Left is KStringLiteralExpr) {
43+
return rewriteStringConcatExpr(
44+
arg0.arg0,
45+
mkStringConcat(StringUtils.concatStrings(arg0Right, arg1Left), arg1.arg1)
46+
)
47+
}
48+
}
49+
50+
return cont(arg0, arg1)
51+
}
652

753
inline fun tryEvalStringLiteralOperation(
854
lhs: KExpr<KStringSort>,

0 commit comments

Comments
 (0)