Skip to content

Commit d771e78

Browse files
committed
Implement regular expression complement operation
1 parent 2a500d7 commit d771e78

File tree

3 files changed

+47
-0
lines changed

3 files changed

+47
-0
lines changed

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ import io.ksmt.decl.KRegexIntersectionDecl
147147
import io.ksmt.decl.KRegexKleeneClosureDecl
148148
import io.ksmt.decl.KRegexKleeneCrossDecl
149149
import io.ksmt.decl.KRegexDifferenceDecl
150+
import io.ksmt.decl.KRegexComplementDecl
150151
import io.ksmt.decl.KIteDecl
151152
import io.ksmt.decl.KNotDecl
152153
import io.ksmt.decl.KOrDecl
@@ -308,6 +309,7 @@ import io.ksmt.expr.KRegexIntersectionExpr
308309
import io.ksmt.expr.KRegexKleeneClosureExpr
309310
import io.ksmt.expr.KRegexKleeneCrossExpr
310311
import io.ksmt.expr.KRegexDifferenceExpr
312+
import io.ksmt.expr.KRegexComplementExpr
311313
import io.ksmt.expr.KIteExpr
312314
import io.ksmt.expr.KLeArithExpr
313315
import io.ksmt.expr.KLtArithExpr
@@ -2213,6 +2215,22 @@ open class KContext(
22132215
KRegexDifferenceExpr(this, arg0, arg1)
22142216
}
22152217

2218+
private val regexComplementExprCache = mkAstInterner<KRegexComplementExpr>()
2219+
2220+
/**
2221+
* Create regular expression's complement.
2222+
* */
2223+
open fun mkRegexComplement(arg: KExpr<KRegexSort>): KExpr<KRegexSort> =
2224+
mkSimplified(arg, KContext::mkRegexComplementNoSimplify, ::mkRegexComplementNoSimplify) // Add simplified version
2225+
2226+
/**
2227+
* Create regular expression's complement.
2228+
* */
2229+
open fun mkRegexComplementNoSimplify(arg: KExpr<KRegexSort>): KRegexComplementExpr = regexComplementExprCache.createIfContextActive {
2230+
ensureContextMatch(arg)
2231+
KRegexComplementExpr(this, arg)
2232+
}
2233+
22162234
// bitvectors
22172235
private val bv1Cache = mkAstInterner<KBitVec1Value>()
22182236
private val bv8Cache = mkAstInterner<KBitVec8Value>()
@@ -4850,6 +4868,8 @@ open class KContext(
48504868

48514869
fun mkRegexDifferenceDecl(): KRegexDifferenceDecl = KRegexDifferenceDecl(this)
48524870

4871+
fun mkRegexComplementDecl(): KRegexComplementDecl = KRegexComplementDecl(this)
4872+
48534873
// Bit vectors
48544874
fun mkBvDecl(value: Boolean): KDecl<KBv1Sort> =
48554875
KBitVec1ValueDecl(this, value)

ksmt-core/src/main/kotlin/io/ksmt/decl/Regex.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,9 @@ class KRegexDifferenceDecl internal constructor(
9595
): KApp<KRegexSort, *> = mkRegexDifferenceNoSimplify(arg0, arg1)
9696
}
9797

98+
class KRegexComplementDecl internal constructor(
99+
ctx: KContext
100+
) : KFuncDecl1<KRegexSort, KRegexSort>(ctx, "comp", ctx.mkRegexSort(), ctx.mkRegexSort()) {
101+
override fun KContext.apply(arg: KExpr<KRegexSort>): KApp<KRegexSort, KRegexSort> = mkRegexComplementNoSimplify(arg)
102+
override fun <R> accept(visitor: KDeclVisitor<R>): R = visitor.visit(this)
103+
}

ksmt-core/src/main/kotlin/io/ksmt/expr/Regex.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import io.ksmt.decl.KDecl
77
import io.ksmt.decl.KRegexKleeneClosureDecl
88
import io.ksmt.decl.KRegexLiteralDecl
99
import io.ksmt.decl.KRegexKleeneCrossDecl
10+
import io.ksmt.decl.KRegexComplementDecl
1011
import io.ksmt.expr.transformer.KTransformerBase
1112
import io.ksmt.sort.KRegexSort
1213

@@ -151,3 +152,23 @@ class KRegexDifferenceExpr internal constructor(
151152
override fun internHashCode(): Int = hash(arg0, arg1)
152153
override fun internEquals(other: Any): Boolean = structurallyEqual(other, { arg0 }, { arg1 })
153154
}
155+
156+
class KRegexComplementExpr internal constructor(
157+
ctx: KContext,
158+
val arg: KExpr<KRegexSort>
159+
) : KApp<KRegexSort, KRegexSort>(ctx) {
160+
override val sort: KRegexSort = ctx.regexSort
161+
162+
override val decl: KRegexComplementDecl
163+
get() = ctx.mkRegexComplementDecl()
164+
165+
override val args: List<KExpr<KRegexSort>>
166+
get() = listOf(arg)
167+
168+
override fun accept(transformer: KTransformerBase): KExpr<KRegexSort> {
169+
TODO("Not yet implemented")
170+
}
171+
172+
override fun internHashCode(): Int = hash(arg)
173+
override fun internEquals(other: Any): Boolean = structurallyEqual(other) { arg }
174+
}

0 commit comments

Comments
 (0)