Skip to content

Commit 551cdcf

Browse files
authored
Nested transformers (#98)
* Nested transformers * Remove deprecated methods * Update examples * Upgrade version to 0.5.0
1 parent fbe2aa1 commit 551cdcf

File tree

8 files changed

+80
-52
lines changed

8 files changed

+80
-52
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ repositories {
1414
}
1515

1616
// core
17-
implementation("com.github.UnitTestBot.ksmt:ksmt-core:0.4.6")
17+
implementation("com.github.UnitTestBot.ksmt:ksmt-core:0.5.0")
1818
// z3 solver
19-
implementation("com.github.UnitTestBot.ksmt:ksmt-z3:0.4.6")
19+
implementation("com.github.UnitTestBot.ksmt:ksmt-z3:0.5.0")
2020
```
2121

2222
## Usage

buildSrc/src/main/kotlin/org.ksmt.ksmt-base.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ plugins {
99
}
1010

1111
group = "org.ksmt"
12-
version = "0.4.6"
12+
version = "0.5.0"
1313

1414
repositories {
1515
mavenCentral()

docs/getting-started.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@ repositories {
1818
```kotlin
1919
dependencies {
2020
// core
21-
implementation("com.github.UnitTestBot.ksmt:ksmt-core:0.4.6")
21+
implementation("com.github.UnitTestBot.ksmt:ksmt-core:0.5.0")
2222
}
2323
```
2424

2525
#### 3. Add one or more SMT solver dependencies:
2626
```kotlin
2727
dependencies {
2828
// z3
29-
implementation("com.github.UnitTestBot.ksmt:ksmt-z3:0.4.6")
29+
implementation("com.github.UnitTestBot.ksmt:ksmt-z3:0.5.0")
3030
// bitwuzla
31-
implementation("com.github.UnitTestBot.ksmt:ksmt-bitwuzla:0.4.6")
31+
implementation("com.github.UnitTestBot.ksmt:ksmt-bitwuzla:0.5.0")
3232
}
3333
```
3434
SMT solver specific packages are provided with solver native binaries.

examples/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ repositories {
1010

1111
dependencies {
1212
// core
13-
implementation("com.github.UnitTestBot.ksmt:ksmt-core:0.4.6")
13+
implementation("com.github.UnitTestBot.ksmt:ksmt-core:0.5.0")
1414
// z3 solver
15-
implementation("com.github.UnitTestBot.ksmt:ksmt-z3:0.4.6")
15+
implementation("com.github.UnitTestBot.ksmt:ksmt-z3:0.5.0")
1616
}
1717

1818
java {

examples/src/main/kotlin/CustomExpressions.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.ksmt.cache.structurallyEqual
44
import org.ksmt.decl.KConstDecl
55
import org.ksmt.decl.KDecl
66
import org.ksmt.expr.KExpr
7+
import org.ksmt.expr.KUninterpretedSortValue
78
import org.ksmt.expr.printer.ExpressionPrinter
89
import org.ksmt.expr.transformer.KNonRecursiveTransformer
910
import org.ksmt.expr.transformer.KTransformer
@@ -221,7 +222,7 @@ class CustomModel(
221222
override fun <T : KSort> interpretation(decl: KDecl<T>): KModel.KFuncInterp<T>? =
222223
model.interpretation(decl)
223224

224-
override fun uninterpretedSortUniverse(sort: KUninterpretedSort): Set<KExpr<KUninterpretedSort>>? =
225+
override fun uninterpretedSortUniverse(sort: KUninterpretedSort): Set<KUninterpretedSortValue>? =
225226
model.uninterpretedSortUniverse(sort)
226227

227228
override fun detach(): KModel = CustomModel(model.detach(), transformer)

ksmt-core/src/main/kotlin/org/ksmt/KContext.kt

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -689,14 +689,6 @@ open class KContext(
689689
createNoSimplify = ::mkAndNoSimplify
690690
)
691691

692-
@Deprecated(
693-
"NoFlat builders are deprecated",
694-
replaceWith = ReplaceWith("mkAnd(args, flat = false)"),
695-
level = DeprecationLevel.ERROR
696-
)
697-
open fun mkAndNoFlat(args: List<KExpr<KBoolSort>>): KExpr<KBoolSort> =
698-
mkAnd(args, flat = false)
699-
700692
/**
701693
* Create boolean binary AND expression.
702694
*
@@ -715,14 +707,6 @@ open class KContext(
715707
createNoSimplify = ::mkAndNoSimplify
716708
)
717709

718-
@Deprecated(
719-
"NoFlat builders are deprecated",
720-
replaceWith = ReplaceWith("mkAnd(lhs, rhs, flat = false)"),
721-
level = DeprecationLevel.ERROR
722-
)
723-
open fun mkAndNoFlat(lhs: KExpr<KBoolSort>, rhs: KExpr<KBoolSort>): KExpr<KBoolSort> =
724-
mkAnd(lhs, rhs, flat = false)
725-
726710
open fun mkAndNoSimplify(args: List<KExpr<KBoolSort>>): KAndExpr =
727711
if (args.size == 2) {
728712
mkAndNoSimplify(args.first(), args.last())
@@ -759,14 +743,6 @@ open class KContext(
759743
createNoSimplify = ::mkOrNoSimplify
760744
)
761745

762-
@Deprecated(
763-
"NoFlat builders are deprecated",
764-
replaceWith = ReplaceWith("mkOr(args, flat = false)"),
765-
level = DeprecationLevel.ERROR
766-
)
767-
open fun mkOrNoFlat(args: List<KExpr<KBoolSort>>): KExpr<KBoolSort> =
768-
mkOr(args, flat = false)
769-
770746
/**
771747
* Create boolean binary OR expression.
772748
*
@@ -785,14 +761,6 @@ open class KContext(
785761
createNoSimplify = ::mkOrNoSimplify
786762
)
787763

788-
@Deprecated(
789-
"NoFlat builders are deprecated",
790-
replaceWith = ReplaceWith("mkOr(lhs, rhs, flat = false)"),
791-
level = DeprecationLevel.ERROR
792-
)
793-
open fun mkOrNoFlat(lhs: KExpr<KBoolSort>, rhs: KExpr<KBoolSort>): KExpr<KBoolSort> =
794-
mkOr(lhs, rhs, flat = false)
795-
796764
open fun mkOrNoSimplify(args: List<KExpr<KBoolSort>>): KOrExpr =
797765
if (args.size == 2) {
798766
mkOrNoSimplify(args.first(), args.last())

ksmt-core/src/main/kotlin/org/ksmt/expr/transformer/KNonRecursiveTransformerBase.kt

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,22 @@ abstract class KNonRecursiveTransformerBase: KTransformer {
4040
return cachedExpr
4141
}
4242

43-
// In case of exceptional execution we may have some expressions on the stack
44-
exprStack.clear()
45-
46-
exprStack.add(expr)
47-
while (exprStack.isNotEmpty()) {
48-
val e = exprStack.removeLast()
49-
exprWasTransformed = true
50-
val transformedExpr = e.accept(this)
51-
52-
if (exprWasTransformed) {
53-
transformed[e] = transformedExpr
43+
val initialStackSize = exprStack.size
44+
try {
45+
exprStack.add(expr)
46+
while (exprStack.size > initialStackSize) {
47+
val e = exprStack.removeLast()
48+
exprWasTransformed = true
49+
val transformedExpr = e.accept(this)
50+
51+
if (exprWasTransformed) {
52+
transformed[e] = transformedExpr
53+
}
54+
}
55+
} finally {
56+
// cleanup stack after exceptions
57+
while (exprStack.size > initialStackSize) {
58+
exprStack.removeLast()
5459
}
5560
}
5661

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package org.ksmt
2+
3+
import org.ksmt.expr.KExpr
4+
import org.ksmt.expr.printer.ExpressionPrinter
5+
import org.ksmt.expr.transformer.KNonRecursiveTransformer
6+
import org.ksmt.expr.transformer.KTransformerBase
7+
import org.ksmt.sort.KSort
8+
import org.ksmt.utils.getValue
9+
import kotlin.test.Test
10+
import kotlin.test.assertEquals
11+
12+
class NestedTransformationTest {
13+
14+
@Test
15+
fun nestedTransformationTest(): Unit = with(KContext()) {
16+
val a by intSort
17+
val b by intSort
18+
19+
val transformer = TestAuxTransformer(this)
20+
21+
val e0 = TestAuxExpr(this, TestAuxExpr(this, a) + TestAuxExpr(this, b))
22+
val e1 = TestAuxExpr(this, e0 * TestAuxExpr(this, a))
23+
val expr = TestAuxExpr(this, e1 / TestAuxExpr(this, b))
24+
val actual = transformer.apply(expr)
25+
26+
val expected = transformer.apply(((a + b) * a) / b)
27+
28+
assertEquals(expected, actual)
29+
}
30+
31+
class TestAuxTransformer(ctx: KContext) : KNonRecursiveTransformer(ctx) {
32+
fun <T : KSort> transformAux(expr: TestAuxExpr<T>): KExpr<T> {
33+
// nested transformation
34+
return apply(expr.nested)
35+
}
36+
}
37+
38+
class TestAuxExpr<T : KSort>(ctx: KContext, val nested: KExpr<T>) : KExpr<T>(ctx) {
39+
override val sort: T
40+
get() = nested.sort
41+
42+
override fun accept(transformer: KTransformerBase): KExpr<T> {
43+
transformer as TestAuxTransformer
44+
return transformer.transformAux(this)
45+
}
46+
47+
override fun print(printer: ExpressionPrinter) {
48+
printer.append(nested)
49+
}
50+
51+
override fun internEquals(other: Any): Boolean = error("Interning is not used")
52+
override fun internHashCode(): Int = error("Interning is not used")
53+
}
54+
}

0 commit comments

Comments
 (0)