diff --git a/build.gradle.kts b/build.gradle.kts index 6c37249226..6f16239c2b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -29,7 +29,7 @@ buildscript { allprojects { group = "hu.bme.mit.theta" - version = "6.17.7" + version = "6.18.1" apply(from = rootDir.resolve("gradle/shared-with-buildSrc/mirrors.gradle.kts")) diff --git a/settings.gradle.kts b/settings.gradle.kts index 6f8adcc960..fd9a83a92b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -20,6 +20,7 @@ include( "common/common", "common/core", "common/grammar", + "common/ksp-processor", "common/multi-tests", "common/ltl", "common/ltl-cli", diff --git a/subprojects/cfa/cfa-analysis/src/main/kotlin/hu/bme/mit/theta/cfa/analysis/CfaToMonolithicExpr.kt b/subprojects/cfa/cfa-analysis/src/main/kotlin/hu/bme/mit/theta/cfa/analysis/CfaToMonolithicExpr.kt index 74e15224fe..c7593b2304 100644 --- a/subprojects/cfa/cfa-analysis/src/main/kotlin/hu/bme/mit/theta/cfa/analysis/CfaToMonolithicExpr.kt +++ b/subprojects/cfa/cfa-analysis/src/main/kotlin/hu/bme/mit/theta/cfa/analysis/CfaToMonolithicExpr.kt @@ -21,7 +21,10 @@ import hu.bme.mit.theta.analysis.expl.ExplState import hu.bme.mit.theta.cfa.CFA import hu.bme.mit.theta.core.decl.Decls import hu.bme.mit.theta.core.model.Valuation -import hu.bme.mit.theta.core.stmt.* +import hu.bme.mit.theta.core.stmt.AssignStmt +import hu.bme.mit.theta.core.stmt.AssumeStmt +import hu.bme.mit.theta.core.stmt.NonDetStmt +import hu.bme.mit.theta.core.stmt.SequenceStmt import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neq @@ -29,7 +32,8 @@ import hu.bme.mit.theta.core.type.booltype.BoolExprs.And import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.bvtype.BvType -import hu.bme.mit.theta.core.type.fptype.FpExprs.* +import hu.bme.mit.theta.core.type.fptype.FpExprs.FpAssign +import hu.bme.mit.theta.core.type.fptype.FpExprs.NaN import hu.bme.mit.theta.core.type.fptype.FpType import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.type.inttype.IntLitExpr @@ -38,7 +42,6 @@ import hu.bme.mit.theta.core.utils.BvUtils import hu.bme.mit.theta.core.utils.StmtUtils import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory import java.math.BigInteger -import java.util.* fun CFA.toMonolithicExpr(): MonolithicExpr { Preconditions.checkArgument(this.errorLoc.isPresent) diff --git a/subprojects/cfa/cfa/src/main/java/hu/bme/mit/theta/cfa/dsl/CfaExpression.java b/subprojects/cfa/cfa/src/main/java/hu/bme/mit/theta/cfa/dsl/CfaExpression.java index cac8b45802..bc6ad9193f 100644 --- a/subprojects/cfa/cfa/src/main/java/hu/bme/mit/theta/cfa/dsl/CfaExpression.java +++ b/subprojects/cfa/cfa/src/main/java/hu/bme/mit/theta/cfa/dsl/CfaExpression.java @@ -15,23 +15,18 @@ */ package hu.bme.mit.theta.cfa.dsl; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; +import static com.google.common.base.Preconditions.*; import static hu.bme.mit.theta.cfa.dsl.gen.CfaDslParser.*; -import static hu.bme.mit.theta.common.Utils.head; -import static hu.bme.mit.theta.common.Utils.singleElementOf; -import static hu.bme.mit.theta.common.Utils.tail; +import static hu.bme.mit.theta.common.Utils.*; import static hu.bme.mit.theta.core.decl.Decls.Param; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.*; import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Add; import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Div; import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq; import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Geq; import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Gt; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Ite; import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Leq; import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Lt; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Mod; import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Mul; import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neg; import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neq; @@ -39,44 +34,22 @@ import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Rem; import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Sub; import static hu.bme.mit.theta.core.type.anytype.Exprs.Prime; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.ArrayInit; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Write; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; import static hu.bme.mit.theta.core.type.booltype.BoolExprs.And; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Exists; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.False; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Forall; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Iff; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply; import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Not; import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Or; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Xor; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Extract; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.SExt; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.ZExt; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.Abs; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.FromBv; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.IsNan; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.Max; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.Min; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.RoundToIntegral; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.Sqrt; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.ToBv; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.ToFp; +import static hu.bme.mit.theta.core.type.bvtype.BvExprs.*; +import static hu.bme.mit.theta.core.type.fptype.FpExprs.*; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; import static hu.bme.mit.theta.core.utils.ExprUtils.simplify; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; +import static hu.bme.mit.theta.core.utils.TypeUtils.*; import static java.util.stream.Collectors.toList; import com.google.common.collect.ImmutableList; import hu.bme.mit.theta.cfa.dsl.gen.CfaDslBaseVisitor; -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.common.dsl.BasicScope; import hu.bme.mit.theta.common.dsl.Env; import hu.bme.mit.theta.common.dsl.Scope; @@ -87,29 +60,13 @@ import hu.bme.mit.theta.core.dsl.ParseException; import hu.bme.mit.theta.core.type.Expr; import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.abstracttype.AddExpr; -import hu.bme.mit.theta.core.type.abstracttype.DivExpr; -import hu.bme.mit.theta.core.type.abstracttype.ModExpr; -import hu.bme.mit.theta.core.type.abstracttype.MulExpr; -import hu.bme.mit.theta.core.type.abstracttype.RemExpr; -import hu.bme.mit.theta.core.type.abstracttype.SubExpr; +import hu.bme.mit.theta.core.type.abstracttype.*; import hu.bme.mit.theta.core.type.anytype.RefExpr; import hu.bme.mit.theta.core.type.arraytype.ArrayType; import hu.bme.mit.theta.core.type.booltype.BoolType; import hu.bme.mit.theta.core.type.booltype.FalseExpr; import hu.bme.mit.theta.core.type.booltype.TrueExpr; -import hu.bme.mit.theta.core.type.bvtype.BvAddExpr; -import hu.bme.mit.theta.core.type.bvtype.BvConcatExpr; -import hu.bme.mit.theta.core.type.bvtype.BvExprs; -import hu.bme.mit.theta.core.type.bvtype.BvLitExpr; -import hu.bme.mit.theta.core.type.bvtype.BvMulExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSDivExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSModExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSRemExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSubExpr; -import hu.bme.mit.theta.core.type.bvtype.BvType; -import hu.bme.mit.theta.core.type.bvtype.BvUDivExpr; -import hu.bme.mit.theta.core.type.bvtype.BvURemExpr; +import hu.bme.mit.theta.core.type.bvtype.*; import hu.bme.mit.theta.core.type.fptype.FpExprs; import hu.bme.mit.theta.core.type.fptype.FpLitExpr; import hu.bme.mit.theta.core.type.fptype.FpRoundingMode; @@ -118,16 +75,13 @@ import hu.bme.mit.theta.core.type.inttype.IntLitExpr; import hu.bme.mit.theta.core.type.rattype.RatLitExpr; import java.math.BigInteger; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; +import kotlin.Pair; import org.antlr.v4.runtime.Token; final class CfaExpression { @@ -1105,11 +1059,11 @@ private Expr createArrayLitExpr( } valueType = (T2) ctx.elseExpr.accept(this).getType(); - final List, Expr>> elems = + final List, Expr>> elems = IntStream.range(0, ctx.indexExpr.size()) .mapToObj( i -> - Tuple2.of( + new Pair<>( cast( ctx.indexExpr.get(i).accept(this), indexType), diff --git a/subprojects/cfa/cfa/src/test/java/hu/bme/mit/theta/cfa/CfaTest.java b/subprojects/cfa/cfa/src/test/java/hu/bme/mit/theta/cfa/CfaTest.java index 41d0937af9..ff9afe7e73 100644 --- a/subprojects/cfa/cfa/src/test/java/hu/bme/mit/theta/cfa/CfaTest.java +++ b/subprojects/cfa/cfa/src/test/java/hu/bme/mit/theta/cfa/CfaTest.java @@ -15,6 +15,8 @@ */ package hu.bme.mit.theta.cfa; +import static org.junit.Assert.assertEquals; + import hu.bme.mit.theta.core.decl.Decls; import hu.bme.mit.theta.core.decl.VarDecl; import hu.bme.mit.theta.core.stmt.Stmts; @@ -43,6 +45,7 @@ public void testDuplicateVarName() { builder.createEdge(init, loc1, Stmts.Havoc(v1)); builder.createEdge(init, loc2, Stmts.Havoc(v2)); builder.setInitLoc(init); - builder.build(); + CFA cfa = builder.build(); + assertEquals(1, cfa.getVars().size()); } } diff --git a/subprojects/cfa/cfa/src/test/kotlin/hu/bme/mit/theta/cfa/CFAVarChangerUnitTest.kt b/subprojects/cfa/cfa/src/test/kotlin/hu/bme/mit/theta/cfa/CFAVarChangerUnitTest.kt index 7ba89089f1..a1afedb744 100644 --- a/subprojects/cfa/cfa/src/test/kotlin/hu/bme/mit/theta/cfa/CFAVarChangerUnitTest.kt +++ b/subprojects/cfa/cfa/src/test/kotlin/hu/bme/mit/theta/cfa/CFAVarChangerUnitTest.kt @@ -32,7 +32,7 @@ class CFAVarChangerUnitTest { val newVar = Decls.Var("x", IntType.getInstance()) val newCfa = origCfa.copyWithReplacingVars(listOf(newVar).associateBy { it.name }) - assert(!newCfa.vars.any { origCfa.vars.contains(it) }) - assert(origCfa.vars.iterator().next() != newCfa.vars.iterator().next()) + assert(!newCfa.vars.any { it in origCfa.vars }) + assert(origCfa.vars.first() != newCfa.vars.first()) } } diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/AbstractMonolithicExpr.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/AbstractMonolithicExpr.kt index 8acda592d3..c5fc50946b 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/AbstractMonolithicExpr.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/AbstractMonolithicExpr.kt @@ -27,10 +27,11 @@ import hu.bme.mit.theta.core.type.booltype.BoolExprs import hu.bme.mit.theta.core.type.booltype.BoolLitExpr import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.booltype.IffExpr -import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.* +import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.And +import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.Not +import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.Or import hu.bme.mit.theta.core.utils.ExprUtils import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory -import java.util.HashMap fun MonolithicExpr.createAbstract(prec: PredPrec): MonolithicExpr { // TODO: handle initOffsetIndex in abstract initExpr @@ -101,7 +102,7 @@ fun MonolithicExpr.createAbstract(prec: PredPrec): MonolithicExpr { .map { when ((it.value as BoolLitExpr).value) { true -> literalToPred[it.key] - false -> Not(literalToPred[it.key]) + false -> Not(literalToPred[it.key]!!) } } .toList() diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/BoundedChecker.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/BoundedChecker.kt index ff0ce88a04..d626fd51e9 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/BoundedChecker.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/BoundedChecker.kt @@ -29,8 +29,9 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType -import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs -import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.* +import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.And +import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.Not +import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.Or import hu.bme.mit.theta.core.utils.ExprUtils import hu.bme.mit.theta.core.utils.PathUtils import hu.bme.mit.theta.core.utils.indexings.VarIndexing @@ -39,7 +40,6 @@ import hu.bme.mit.theta.solver.ItpSolver import hu.bme.mit.theta.solver.Solver import hu.bme.mit.theta.solver.utils.WithPushPop import java.util.* -import kotlin.collections.plus /** * A checker for bounded model checking. @@ -310,7 +310,7 @@ constructor( if (needProof) { // we enumerate all states explored by previous iteration of BMC val expr = - SmartBoolExprs.And( + And( exprs.subList(0, exprs.size - 1) + // loopfree.subList(0, loopfree.size - 1) + unfoldedInitExpr diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/MonolithicL2S.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/MonolithicL2S.kt index cb668401c2..7eb7255eca 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/MonolithicL2S.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/MonolithicL2S.kt @@ -33,8 +33,7 @@ import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory import java.util.* private val reprEq = { e1: Expr<*>, e2: Expr<*> -> - if (e1.getType() is FpType) FpExprs.FpAssign(e1 as Expr, e2 as Expr) - else Eq(e1, e2) + if (e1.type is FpType) FpExprs.FpAssign(e1 as Expr, e2 as Expr) else Eq(e1, e2) } fun MonolithicExpr.createMonolithicL2S(): MonolithicExpr { @@ -70,7 +69,7 @@ fun MonolithicExpr.createMonolithicL2S(): MonolithicExpr { newTransExpr.add(skipOrSave) // New prop expr - var prop: Expr? = saved.ref + var prop: Expr = saved.ref for ((key, value) in saveMap) { val exp = reprEq(value.ref, key.ref) prop = And(exp, prop) diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/refinement/BoundedUnrollingASGTraceCheckerStrategy.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/refinement/BoundedUnrollingASGTraceCheckerStrategy.kt index abb31864f7..0908ed7ce6 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/refinement/BoundedUnrollingASGTraceCheckerStrategy.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/refinement/BoundedUnrollingASGTraceCheckerStrategy.kt @@ -122,8 +122,8 @@ class BoundedUnrollingASGTraceCheckerStrategy( .map { state -> val filtVars = usedVariablesPrecision.vars.filter(ExprUtils.getVars(state.toExpr())::contains) - val types = filtVars.map(VarDecl<*>::getType) - val sizes = types.map(Type::getDomainSize) + val types = filtVars.map(VarDecl<*>::type) + val sizes = types.map(Type::domainSize) val res = sizes.fold(DomainSize.ONE, DomainSize::multiply) res } diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/util/VarCollectorStmtVisitor.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/util/VarCollectorStmtVisitor.kt index 45d7da0847..d021149b78 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/util/VarCollectorStmtVisitor.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/util/VarCollectorStmtVisitor.kt @@ -70,9 +70,9 @@ class VarCollectorStmtVisitor : StmtVisitor>, Set>> { override fun visit(stmt: IfStmt, param: Set>) = param + stmt.then.accept(this, param) + stmt.elze.accept(this, param) - override fun visit( - stmt: MemoryAssignStmt?, - param: Set>?, + override fun visit( + stmt: MemoryAssignStmt, + param: Set>, ): Set> { TODO("Not yet implemented") } diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/oc/IDLOcChecker.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/oc/IDLOcChecker.kt index dc337c6fd6..b199e96f10 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/oc/IDLOcChecker.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/oc/IDLOcChecker.kt @@ -19,10 +19,14 @@ import hu.bme.mit.theta.core.decl.ConstDecl import hu.bme.mit.theta.core.decl.Decls import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.type.Expr -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply import hu.bme.mit.theta.core.type.booltype.BoolLitExpr import hu.bme.mit.theta.core.type.booltype.BoolType -import hu.bme.mit.theta.core.type.inttype.IntExprs.* +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.type.inttype.IntExprs.Lt +import hu.bme.mit.theta.core.type.inttype.IntExprs.Neq import hu.bme.mit.theta.core.type.inttype.IntLitExpr import hu.bme.mit.theta.core.type.inttype.IntType import hu.bme.mit.theta.solver.Solver diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/oc/OcChecker.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/oc/OcChecker.kt index 0dbd6db6c5..d4a422c06a 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/oc/OcChecker.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/oc/OcChecker.kt @@ -16,7 +16,9 @@ package hu.bme.mit.theta.analysis.algorithm.oc import hu.bme.mit.theta.core.decl.VarDecl -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or import hu.bme.mit.theta.solver.Solver import hu.bme.mit.theta.solver.SolverStatus diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrAction.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrAction.kt index e52a55e086..3e8dc33d4b 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrAction.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrAction.kt @@ -15,7 +15,6 @@ */ package hu.bme.mit.theta.analysis.ptr -import com.google.common.base.Preconditions import hu.bme.mit.theta.analysis.expr.StmtAction import hu.bme.mit.theta.core.decl.Decls.Var import hu.bme.mit.theta.core.decl.VarDecl @@ -64,26 +63,25 @@ abstract class PtrAction(writeTriples: WriteTriples = emptyMap(), val inCnt: Int val postList = ArrayList() for ((deref, type) in stmt.dereferencesWithAccessTypes) { - Preconditions.checkState( - deref.uniquenessIdx.isPresent, - "Incomplete dereferences (missing uniquenessIdx) are not handled properly.", - ) + requireNotNull(deref.uniquenessIdx) { + "Incomplete dereferences (missing uniquenessIdx) are not handled properly." + } val expr = deref.getIte(nextWriteTriples) if (type == AccessType.WRITE) { val writeExpr = ExprUtils.simplify(IntExprs.Add(expr, IntExprs.Int(1))) nextWriteTriples .getOrPut(deref.type) { ArrayList() } - .add(Triple(lookup[deref]!!.first, lookup[deref]!!.second, deref.uniquenessIdx.get())) + .add(Triple(lookup[deref]!!.first, lookup[deref]!!.second, deref.uniquenessIdx!!)) postList.add( Stmts.Assume( ExprUtils.simplify( - BoolExprs.And(listOf(AbstractExprs.Eq(writeExpr, deref.uniquenessIdx.get()))) + BoolExprs.And(listOf(AbstractExprs.Eq(writeExpr, deref.uniquenessIdx!!))) ) ) ) } else { preList.add( - Stmts.Assume(ExprUtils.simplify(AbstractExprs.Eq(expr, deref.uniquenessIdx.get()))) + Stmts.Assume(ExprUtils.simplify(AbstractExprs.Eq(expr, deref.uniquenessIdx!!))) ) } // postList.add(Stmts.Assume(Eq(vargen("value", deref.type).ref, deref))) // diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrUtils.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrUtils.kt index b090884c49..c36d2f8302 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrUtils.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrUtils.kt @@ -15,7 +15,6 @@ */ package hu.bme.mit.theta.analysis.ptr -import com.google.common.base.Preconditions import hu.bme.mit.theta.analysis.Prec import hu.bme.mit.theta.analysis.expl.ExplPrec import hu.bme.mit.theta.analysis.expl.ExplState @@ -113,7 +112,7 @@ fun Stmt.uniqueDereferences( is AssumeStmt -> AssumeStmt.of(cond.uniqueDereferences(vargen, lookup).also { ret.addAll(it.first) }.second) - is SequenceStmt -> Stmts.SequenceStmt(stmts.map { it.uniqueDereferences(vargen, lookup) }) + is SequenceStmt -> Stmts.Sequence(stmts.map { it.uniqueDereferences(vargen, lookup) }) is HavocStmt<*> -> this is SkipStmt -> this is NonDetStmt -> this @@ -130,10 +129,7 @@ fun Expr.uniqueDereferences( ): Pair, Expr> = if (this is Dereference<*, *, T>) { val ret = ArrayList() - Preconditions.checkState( - this.uniquenessIdx.isEmpty, - "Only non-pretransformed dereferences should be here", - ) + require(this.uniquenessIdx == null) { "Only non-pretransformed dereferences should be here" } val arrayExpr = ExprUtils.simplify( array.uniqueDereferences(vargen, lookup).also { ret.addAll(it.first) }.second diff --git a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/HornTest.kt b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/HornTest.kt index 376bb714d4..820a8e42af 100644 --- a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/HornTest.kt +++ b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/HornTest.kt @@ -21,7 +21,9 @@ import hu.bme.mit.theta.common.logging.NullLogger import hu.bme.mit.theta.core.Relation import hu.bme.mit.theta.core.decl.Decls.Param import hu.bme.mit.theta.core.plus -import hu.bme.mit.theta.core.type.inttype.IntExprs.* +import hu.bme.mit.theta.core.type.inttype.IntExprs.Add +import hu.bme.mit.theta.core.type.inttype.IntExprs.Eq +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.solver.z3.Z3SolverFactory import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Assumptions diff --git a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/utils/VarCollectorStmtVisitorTest.kt b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/utils/VarCollectorStmtVisitorTest.kt index 86105b2f93..64fcfdba19 100644 --- a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/utils/VarCollectorStmtVisitorTest.kt +++ b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/utils/VarCollectorStmtVisitorTest.kt @@ -25,7 +25,6 @@ import hu.bme.mit.theta.core.type.booltype.BoolExprs import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.inttype.IntExprs import hu.bme.mit.theta.core.type.inttype.IntType -import java.util.* import org.junit.Assert import org.junit.Test import org.junit.runner.RunWith @@ -46,9 +45,9 @@ class VarCollectorStmtVisitorTest( companion object { - private val VA: VarDecl = Decls.Var("a", BoolExprs.Bool()) - private val VB: VarDecl = Decls.Var("b", IntExprs.Int()) - private val VC: VarDecl = Decls.Var("d", IntExprs.Int()) + private val VA: VarDecl = Decls.Var("a", BoolExprs.Bool()) + private val VB: VarDecl = Decls.Var("b", IntExprs.Int()) + private val VC: VarDecl = Decls.Var("d", IntExprs.Int()) @JvmStatic @Parameterized.Parameters diff --git a/subprojects/common/analysis/src/test/kotlin/hu/bme/mit/theta/analysis/multi/MultiAnalysisTest.kt b/subprojects/common/analysis/src/test/kotlin/hu/bme/mit/theta/analysis/multi/MultiAnalysisTest.kt index 556a043b73..4c72d3e27b 100644 --- a/subprojects/common/analysis/src/test/kotlin/hu/bme/mit/theta/analysis/multi/MultiAnalysisTest.kt +++ b/subprojects/common/analysis/src/test/kotlin/hu/bme/mit/theta/analysis/multi/MultiAnalysisTest.kt @@ -40,45 +40,35 @@ class MultiAnalysisTest { class NumberedState(val num: Int) : ExprState { - override fun toExpr(): Expr? = True() + override fun toExpr(): Expr = True() override fun isBottom(): Boolean = false } class NumberedAction() : StmtAction() { - override fun getStmts(): List? { + override fun getStmts(): List { return listOf(SkipStmt.getInstance()) } } class NumberedAnalysis : Analysis { - override fun getPartialOrd(): PartialOrd? = - object : PartialOrd { - override fun isLeq(state1: NumberedState?, state2: NumberedState?): Boolean = - state1!!.num <= state2!!.num - } + override fun getPartialOrd(): PartialOrd = + PartialOrd { state1, state2 -> state1.num <= state2.num } - override fun getInitFunc(): InitFunc? = - object : InitFunc { - override fun getInitStates(prec: UnitPrec?): Collection? = - listOf(NumberedState(0)) - } + override fun getInitFunc(): InitFunc = + InitFunc { listOf(NumberedState(0)) } - override fun getTransFunc(): TransFunc? = - object : TransFunc { - override fun getSuccStates( - state: NumberedState?, - action: NumberedAction?, - prec: UnitPrec?, - ): Collection? = listOf(NumberedState(state!!.num + 1)) + override fun getTransFunc(): TransFunc = + TransFunc { state, action, prec -> + listOf(NumberedState(state.num + 1)) } } class NumberedLTS : LTS { - override fun getEnabledActionsFor(state: NumberedState?): Collection? = + override fun getEnabledActionsFor(state: NumberedState): Collection = listOf(NumberedAction()) } @@ -96,10 +86,7 @@ class MultiAnalysisTest { > = MultiAnalysisSide( NumberedAnalysis(), - object : InitFunc { - override fun getInitStates(prec: UnitPrec?): Collection? = - listOf(NumberedState(0)) - }, + { listOf(NumberedState(0)) }, { c: NumberedState, _: UnitState -> c }, { c: NumberedState -> c }, { c: NumberedState -> UnitState.getInstance() }, @@ -114,10 +101,7 @@ class MultiAnalysisTest { if (ms.sourceSide == MultiSide.RIGHT || ms.leftState.num % 2 == 1) MultiSide.LEFT else MultiSide.RIGHT }, - object : InitFunc { - override fun getInitStates(prec: UnitPrec?): Collection? = - listOf(UnitState.getInstance()) - }, + { listOf(UnitState.getInstance()) }, ) val multiAnalysis = builderResult.side.analysis diff --git a/subprojects/common/core/build.gradle.kts b/subprojects/common/core/build.gradle.kts index e8b16987d2..1479cb3891 100644 --- a/subprojects/common/core/build.gradle.kts +++ b/subprojects/common/core/build.gradle.kts @@ -18,12 +18,33 @@ plugins { id("antlr-grammar") id("java-test-fixtures") id("kotlin-common") + id("kaml-serialization") + id("kotlinx-serialization") + id("com.google.devtools.ksp") version "1.9.25-1.0.20" } dependencies { implementation(project(":theta-common")) + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") testFixturesImplementation(project(":theta-common")) val libPath: String by rootProject.extra testFixturesImplementation(fileTree(mapOf("dir" to libPath, "include" to listOf("*.jar")))) testFixturesImplementation(Deps.guava) + ksp(project(":theta-ksp-processor")) +} + +kotlin { + sourceSets["main"].kotlin.srcDir("build/generated/ksp/main/kotlin") +} + +tasks.withType { + when (name) { + "kspKotlin" -> dependsOn("generateGrammarSource") + "kspTestKotlin" -> dependsOn("generateTestGrammarSource") + "kspTestFixturesKotlin" -> dependsOn("generateTestFixturesGrammarSource") + } +} + +ksp { + arg("incremental", "false") } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ConstDecl.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ConstDecl.java deleted file mode 100644 index 5331999b49..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ConstDecl.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.decl; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.Type; - -/** - * Abstract base class for constants. Use {@link BasicConstDecl} for a basic constant, or {@link - * IndexedConstDecl} if the constant belongs to a variable for some index (e.g., during unfolding - * paths). - * - * @param - */ -public abstract class ConstDecl extends Decl { - - private static final String DECL_LABEL = "Const"; - - ConstDecl(final String name, final DeclType type) { - super(name, type); - } - - @Override - public final String toString() { - return Utils.lispStringBuilder(DECL_LABEL).add(getName()).add(getType()).toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decl.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decl.java deleted file mode 100644 index d08caf12f2..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decl.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.decl; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.type.anytype.Exprs.Ref; - -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.anytype.RefExpr; - -public abstract class Decl { - - private static final int HASH_SEED = 5351; - private volatile int hashCode = 0; - - private final String name; - private final DeclType type; - private final RefExpr ref; - - public Decl(final String name, final DeclType type) { - checkNotNull(name); - checkArgument(!name.isEmpty()); - this.name = name; - this.type = checkNotNull(type); - this.ref = Ref(this); - } - - public final String getName() { - return name; - } - - public final DeclType getType() { - return type; - } - - public final RefExpr getRef() { - return ref; - } - - @Override - public final int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + getName().hashCode(); - result = 31 * result + getType().hashCode(); - hashCode = result; - } - return result; - } - - @Override - public final boolean equals(final Object obj) { - return this == obj; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.java deleted file mode 100644 index a5efae9451..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.decl; - -import hu.bme.mit.theta.core.type.Type; - -/** Factory class to create declarations. */ -public final class Decls { - - private Decls() {} - - /** - * Create a constant declaration with a given name and type. - * - * @param name - * @param type - * @param - * @return - */ - public static ConstDecl Const(final String name, final T type) { - return new BasicConstDecl<>(name, type); - } - - /** - * Create a parameter declaration with a given name and type. - * - * @param name - * @param type - * @param - * @return - */ - public static ParamDecl Param(final String name, final T type) { - return new ParamDecl<>(name, type); - } - - /** - * Create a variable declaration with a given type. - * - * @param name - * @param type - * @param - * @return - */ - public static VarDecl Var(final String name, final T type) { - return new VarDecl<>(name, type); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedConstDecl.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedConstDecl.java deleted file mode 100644 index 8a50879cde..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedConstDecl.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.decl; - -import static com.google.common.base.Preconditions.checkArgument; - -import hu.bme.mit.theta.core.type.Type; - -/** - * A constant declaration that belongs to a variable ({@link VarDecl} declaration for a given index. - * For example, when unfolding a path, each variable will have a new constant for each step of the - * path. - * - * @param - */ -public final class IndexedConstDecl extends ConstDecl { - - private static final String NAME_FORMAT = "_%s:%d"; - - private final VarDecl varDecl; - private final int index; - - IndexedConstDecl(final VarDecl varDecl, final int index) { - super(String.format(NAME_FORMAT, varDecl.getName(), index), varDecl.getType()); - checkArgument(index >= 0); - this.varDecl = varDecl; - this.index = index; - } - - public VarDecl getVarDecl() { - return varDecl; - } - - public int getIndex() { - return index; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedVarDecl.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedVarDecl.java deleted file mode 100644 index c84943485d..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedVarDecl.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.decl; - -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.anytype.RefExpr; - -public class IndexedVarDecl extends VarDecl { - - private final VarDecl original; - private final ConstDecl constDecl; - private final RefExpr constRef; - - IndexedVarDecl(final String name, final VarDecl original) { - super(name, original.getType()); - this.original = original; - this.constDecl = Decls.Const(name, original.getType()); - this.constRef = RefExpr.of(constDecl); - } - - public static IndexedVarDecl of( - final String name, final VarDecl original) { - return new IndexedVarDecl<>(name, original); - } - - public VarDecl getOriginal() { - return original; - } - - public RefExpr getConstRef() { - return constRef; - } - - public ConstDecl getConst() { - return constDecl; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/VarDecl.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/VarDecl.java deleted file mode 100644 index d416347a7a..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/VarDecl.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.decl; - -import static com.google.common.base.Preconditions.checkArgument; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.common.container.Containers; -import hu.bme.mit.theta.core.type.Type; -import java.util.Map; - -/** - * Represents a variable declaration. Variables cannot be directly passed to the SMT solver, they - * must be replaced with constants for a given index ({@link IndexedConstDecl}). See also {@link - * hu.bme.mit.theta.core.utils.PathUtils}. - * - * @param - */ -public class VarDecl extends Decl { - - private static final String DECL_LABEL = "var"; - - private final Map> indexToConst; - - VarDecl(final String name, final DeclType type) { - super(name, type); - indexToConst = Containers.createMap(); - } - - public static VarDecl copyOf(VarDecl from) { - return new VarDecl<>(from.getName(), from.getType()); - } - - public IndexedConstDecl getConstDecl(final int index) { - checkArgument(index >= 0); - IndexedConstDecl constDecl = indexToConst.get(index); - if (constDecl == null) { - constDecl = new IndexedConstDecl<>(this, index); - indexToConst.put(index, constDecl); - } - return constDecl; - } - - @Override - public String toString() { - return Utils.lispStringBuilder(DECL_LABEL).add(getName()).add(getType()).toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/dsl/impl/ExprWriter.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/dsl/impl/ExprWriter.java index 1c05beeebb..943552ccde 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/dsl/impl/ExprWriter.java +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/dsl/impl/ExprWriter.java @@ -397,7 +397,7 @@ private String bvLit(final BvLitExpr expr) { private String arrayLit(final ArrayLitExpr expr) { return "[" + expr.getElements().stream() - .map(e -> write(e.get1()) + " <- " + write(e.get2())) + .map(e -> write(e.getFirst()) + " <- " + write(e.getSecond())) .collect(Collectors.joining(", ")) + "<" + expr.getType().getIndexType().toString() @@ -410,7 +410,7 @@ private String arrayLit(final ArrayLitExpr expr) { private String arrayInit(final ArrayInitExpr expr) { return "[" + expr.getElements().stream() - .map(e -> write(e.get1()) + " <- " + write(e.get2())) + .map(e -> write(e.getFirst()) + " <- " + write(e.getSecond())) .collect(Collectors.joining(", ")) + "<" + expr.getType().getIndexType().toString() diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssignStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssignStmt.java deleted file mode 100644 index a1ca15e0a7..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssignStmt.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.decl.VarDecl; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; - -/** - * Assignment statement of the form VARIABLE := EXPRESSION. The statement updates the VARIABLE with - * the result of EXPRESSION. - * - * @param - */ -public final class AssignStmt implements Stmt { - - private static final int HASH_SEED = 409; - private static final String STMT_LABEL = "assign"; - - private volatile int hashCode = 0; - - private final VarDecl varDecl; - private final Expr expr; - - private AssignStmt(final VarDecl varDecl, final Expr expr) { - this.varDecl = checkNotNull(varDecl); - this.expr = checkNotNull(expr); - } - - public static AssignStmt of( - final VarDecl lhs, final Expr rhs) { - return new AssignStmt<>(lhs, rhs); - } - - public static AssignStmt create( - final VarDecl lhs, final Expr rhs) { - @SuppressWarnings("unchecked") - final VarDecl newLhs = (VarDecl) lhs; - final Expr newRhs = cast(rhs, newLhs.getType()); - return AssignStmt.of(newLhs, newRhs); - } - - public VarDecl getVarDecl() { - return varDecl; - } - - public Expr getExpr() { - return expr; - } - - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + varDecl.hashCode(); - result = 31 * result + expr.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final AssignStmt that = (AssignStmt) obj; - return this.getVarDecl().equals(that.getVarDecl()) - && this.getExpr().equals(that.getExpr()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(STMT_LABEL).add(varDecl.getName()).add(expr).toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.java deleted file mode 100644 index 0a6c4e5d7f..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -/** - * Assume statement of the form [EXPRESSION], where EXPRESSION is a Boolean {@link Expr}. The - * statement is a guard that can only be passed if EXPRESSION evaluates to true. - */ -public final class AssumeStmt implements Stmt { - - private static final int HASH_SEED = 547; - private static final String STMT_LABEL = "assume"; - - private final Expr cond; - - private volatile int hashCode = 0; - - private AssumeStmt(final Expr cond) { - this.cond = checkNotNull(cond); - } - - public static AssumeStmt of(final Expr cond) { - return new AssumeStmt(cond); - } - - public static AssumeStmt create(final Expr cond) { - final Expr newCond = cast(cond, Bool()); - return AssumeStmt.of(newCond); - } - - public Expr getCond() { - return cond; - } - - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + cond.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final AssumeStmt that = (AssumeStmt) obj; - return this.getCond().equals(that.getCond()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(STMT_LABEL).add(cond).toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/HavocStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/HavocStmt.java deleted file mode 100644 index 106e9e0496..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/HavocStmt.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import static com.google.common.base.Preconditions.checkNotNull; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.decl.VarDecl; -import hu.bme.mit.theta.core.type.Type; - -/** - * Havoc statement of the form havoc VARIABLE, which performs a non-deterministic assignment to - * VARIABLE. - * - * @param - */ -public final class HavocStmt implements Stmt { - - private static final int HASH_SEED = 929; - private static final String STMT_LABEL = "havoc"; - - private final VarDecl varDecl; - - private volatile int hashCode = 0; - - private HavocStmt(final VarDecl varDecl) { - this.varDecl = checkNotNull(varDecl); - } - - public static HavocStmt of(final VarDecl varDecl) { - return new HavocStmt<>(varDecl); - } - - public VarDecl getVarDecl() { - return varDecl; - } - - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + varDecl.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final HavocStmt that = (HavocStmt) obj; - return this.getVarDecl().equals(that.getVarDecl()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(STMT_LABEL).add(varDecl.getName()).toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/IfStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/IfStmt.java deleted file mode 100644 index 1ae942ce28..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/IfStmt.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import static com.google.common.base.Preconditions.checkNotNull; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public class IfStmt implements Stmt { - - private final Expr cond; - private final Stmt then; - private final Stmt elze; - - private static final int HASH_SEED = 361; - private static final String STMT_LABEL = "if"; - - private volatile int hashCode = 0; - - private IfStmt(final Expr cond, final Stmt then, final Stmt elze) { - this.cond = checkNotNull(cond); - this.then = checkNotNull(then); - this.elze = checkNotNull(elze); - } - - public static IfStmt of(final Expr cond, final Stmt then, final Stmt elze) { - return new IfStmt(cond, then, elze); - } - - public static IfStmt of(final Expr cond, final Stmt then) { - return new IfStmt(cond, then, SkipStmt.getInstance()); - } - - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + cond.hashCode(); - result = 31 * result + then.hashCode(); - result = 31 * result + elze.hashCode(); - hashCode = result; - } - return result; - } - - public Expr getCond() { - return cond; - } - - public Stmt getThen() { - return then; - } - - public Stmt getElze() { - return elze; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IfStmt that = (IfStmt) obj; - return this.cond.equals(that.getCond()) - && this.then.equals(that.getThen()) - && this.elze.equals(that.getElze()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(STMT_LABEL).add(cond).add(then).add(elze).toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/LoopStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/LoopStmt.java deleted file mode 100644 index 398f15b928..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/LoopStmt.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.decl.VarDecl; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.inttype.IntType; - -public final class LoopStmt implements Stmt { - - private final Stmt stmt; - private final VarDecl loopVariable; - private final Expr from; - private final Expr to; - - private static final int HASH_SEED = 361; - private static final String STMT_LABEL = "loop"; - - private volatile int hashCode = 0; - - private LoopStmt( - final Stmt stmt, - final VarDecl loopVariable, - final Expr from, - final Expr to) { - this.stmt = stmt; - this.loopVariable = loopVariable; - this.from = from; - this.to = to; - } - - public static LoopStmt of( - final Stmt stmt, - final VarDecl loopVariable, - final Expr from, - final Expr to) { - return new LoopStmt(stmt, loopVariable, from, to); - } - - public Stmt getStmt() { - return stmt; - } - - public VarDecl getLoopVariable() { - return loopVariable; - } - - public Expr getFrom() { - return from; - } - - public Expr getTo() { - return to; - } - - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = - 37 * result - + stmt.hashCode() - + loopVariable.hashCode() - + from.hashCode() - + to.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final LoopStmt that = (LoopStmt) obj; - return this.getStmt().equals(that.getStmt()) - && this.loopVariable.equals(that.loopVariable) - && this.from.equals(that.from) - && this.to.equals(that.to); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(STMT_LABEL) - .add(loopVariable + " from " + from + " to " + to + " " + stmt) - .toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.java deleted file mode 100644 index ddbcfd8b88..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import static com.google.common.base.Preconditions.checkNotNull; - -import com.google.common.base.Objects; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.anytype.Dereference; - -/** - * Assignment statement of the form *(DEREF_EXPRESSION) := EXPRESSION. The statement updates the - * value pointed to by DEREF_EXPRESSION with the result of EXPRESSION. - * - * @param - */ -public final class MemoryAssignStmt< - PtrType extends Type, OffsetType extends Type, DeclType extends Type> - implements Stmt { - - private static final String STMT_LABEL = "memassign"; - - private final Dereference deref; - private final Expr expr; - - private MemoryAssignStmt( - final Dereference deref, final Expr expr) { - this.deref = checkNotNull(deref); - this.expr = checkNotNull(expr); - } - - public static - MemoryAssignStmt of( - final Dereference deref, - final Expr expr) { - return new MemoryAssignStmt<>(deref, expr); - } - - @SuppressWarnings("unchecked") - public static - MemoryAssignStmt create( - final Dereference deref, final Expr expr) { - final Dereference typedDeref = - (Dereference) deref; - final Expr typedExpr = expr; - return MemoryAssignStmt.of(typedDeref, typedExpr); - } - - public Dereference getDeref() { - return deref; - } - - public Expr getExpr() { - return expr; - } - - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } - - @Override - public int hashCode() { - return Objects.hashCode(deref, expr); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - return Objects.equal(deref, ((MemoryAssignStmt) obj).deref) - && Objects.equal(expr, ((MemoryAssignStmt) obj).expr); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(STMT_LABEL).add(deref).add(expr).toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/NonDetStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/NonDetStmt.java deleted file mode 100644 index a6d074665f..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/NonDetStmt.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import java.util.List; - -public final class NonDetStmt implements Stmt { - - private final List stmts; - - private static final int HASH_SEED = 361; - private static final String STMT_LABEL = "nondet"; - - private volatile int hashCode = 0; - - private NonDetStmt(final List stmts) { - if (stmts.isEmpty()) { - this.stmts = ImmutableList.of(SkipStmt.getInstance()); - } else { - this.stmts = stmts; - } - } - - public static NonDetStmt of(final List stmts) { - return new NonDetStmt(stmts); - } - - public List getStmts() { - return stmts; - } - - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + stmts.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final NonDetStmt that = (NonDetStmt) obj; - return this.getStmts().equals(that.getStmts()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(STMT_LABEL).addAll(stmts).toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/OrtStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/OrtStmt.java deleted file mode 100644 index 2e79eec0fd..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/OrtStmt.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import java.util.List; - -public final class OrtStmt implements Stmt { - - private final List stmts; - - private static final int HASH_SEED = 241; - private static final String STMT_LABEL = "ort"; - - private volatile int hashCode = 0; - - private OrtStmt(final List stmts) { - if (stmts.isEmpty()) { - this.stmts = ImmutableList.of(SkipStmt.getInstance()); - } else { - this.stmts = stmts; - } - } - - public static OrtStmt of(final List stmts) { - return new OrtStmt(stmts); - } - - public List getStmts() { - return stmts; - } - - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 62 * result + stmts.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final OrtStmt that = (OrtStmt) obj; - return this.getStmts().equals(that.getStmts()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(STMT_LABEL).addAll(stmts).toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SequenceStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SequenceStmt.java deleted file mode 100644 index 22fc264288..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SequenceStmt.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import java.util.List; - -public final class SequenceStmt implements Stmt { - - private final List stmts; - - private static final int HASH_SEED = 241; - - private volatile int hashCode = 0; - - private SequenceStmt(final List stmts) { - if (stmts.isEmpty()) { - this.stmts = ImmutableList.of(SkipStmt.getInstance()); - } else { - this.stmts = stmts; - } - } - - public static SequenceStmt of(final List stmts) { - return new SequenceStmt(stmts); - } - - public List getStmts() { - return stmts; - } - - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + stmts.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final SequenceStmt that = (SequenceStmt) obj; - return this.getStmts().equals(that.getStmts()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder().addAll(stmts).toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.java deleted file mode 100644 index 0336c5310f..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -/** A skip statement is a placeholder that does not perform any operation. */ -public final class SkipStmt implements Stmt { - - private static final int HASH_CODE = 1310147; - private static final String STMT_LABEL = "skip"; - - private SkipStmt() {} - - private static class LazyHolder { - - static final SkipStmt INSTANCE = new SkipStmt(); - } - - public static SkipStmt getInstance() { - return LazyHolder.INSTANCE; - } - - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } - - @Override - public int hashCode() { - return HASH_CODE; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj == null) { - return false; - } else { - return obj != null && this.getClass() == obj.getClass(); - } - } - - @Override - public String toString() { - return STMT_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/StmtVisitor.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/StmtVisitor.java deleted file mode 100644 index ce9ca2185d..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/StmtVisitor.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import hu.bme.mit.theta.core.type.Type; - -public interface StmtVisitor { - - R visit(SkipStmt stmt, P param); - - R visit(AssumeStmt stmt, P param); - - R visit(AssignStmt stmt, P param); - - R visit( - MemoryAssignStmt stmt, P param); - - R visit(HavocStmt stmt, P param); - - R visit(SequenceStmt stmt, P param); - - R visit(NonDetStmt stmt, P param); - - R visit(OrtStmt stmt, P param); - - R visit(LoopStmt stmt, P param); - - R visit(IfStmt stmt, P param); -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.java deleted file mode 100644 index 818cb605db..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import hu.bme.mit.theta.core.decl.VarDecl; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.anytype.Dereference; -import hu.bme.mit.theta.core.type.booltype.BoolType; -import java.util.List; - -/** - * Factory class to instantiate different statements. - * - * @see Stmt - */ -public final class Stmts { - - private Stmts() {} - - public static SkipStmt Skip() { - return SkipStmt.getInstance(); - } - - public static AssumeStmt Assume(final Expr cond) { - return AssumeStmt.of(cond); - } - - public static AssignStmt Assign(final VarDecl lhs, final Expr rhs) { - return AssignStmt.of(lhs, rhs); - } - - public static

- MemoryAssignStmt MemoryAssign( - final Dereference deref, final Expr expr) { - return MemoryAssignStmt.of(deref, expr); - } - - public static HavocStmt Havoc(final VarDecl varDecl) { - return HavocStmt.of(varDecl); - } - - public static SequenceStmt SequenceStmt(final List stmts) { - return SequenceStmt.of(stmts); - } - - public static NonDetStmt NonDetStmt(final List stmts) { - return NonDetStmt.of(stmts); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.java deleted file mode 100644 index 8a0ca0fa2e..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; - -public abstract class BinaryExpr - implements Expr { - - private final Expr leftOp; - private final Expr rightOp; - - private volatile int hashCode = 0; - - protected BinaryExpr(final Expr leftOp, final Expr rightOp) { - this.leftOp = checkNotNull(leftOp); - this.rightOp = checkNotNull(rightOp); - } - - public final Expr getLeftOp() { - return leftOp; - } - - public final Expr getRightOp() { - return rightOp; - } - - @Override - public final int getArity() { - return 2; - } - - @Override - public final List> getOps() { - return ImmutableList.of(leftOp, rightOp); - } - - @Override - public final BinaryExpr withOps(final List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 2); - final OpType opType = getLeftOp().getType(); - final Expr newLeftOp = TypeUtils.cast(ops.get(0), opType); - final Expr newRightOp = TypeUtils.cast(ops.get(1), opType); - return with(newLeftOp, newRightOp); - } - - @Override - public final int hashCode() { - int result = hashCode; - if (result == 0) { - result = getHashSeed(); - result = 31 * result + getLeftOp().hashCode(); - result = 31 * result + getRightOp().hashCode(); - hashCode = result; - } - return result; - } - - @Override - public final String toString() { - return Utils.lispStringBuilder(getOperatorLabel()) - .body() - .add(leftOp) - .add(rightOp) - .toString(); - } - - public abstract BinaryExpr with( - final Expr leftOp, final Expr rightOp); - - public abstract BinaryExpr withLeftOp(final Expr leftOp); - - public abstract BinaryExpr withRightOp(final Expr rightOp); - - protected abstract int getHashSeed(); - - public abstract String getOperatorLabel(); -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.java deleted file mode 100644 index 046581d89e..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type; - -import static com.google.common.collect.ImmutableList.toImmutableList; - -import hu.bme.mit.theta.core.model.Valuation; -import java.util.List; -import java.util.function.Function; - -public interface Expr { - - int getArity(); - - ExprType getType(); - - LitExpr eval(Valuation val); - - List> getOps(); - - default boolean isInvalid() { - for (var op : getOps()) { - if (op.isInvalid()) { - return true; - } - } - return false; - } - - Expr withOps(List> ops); - - default Expr map(final Function, ? extends Expr> function) { - return withOps(getOps().stream().map(function::apply).collect(toImmutableList())); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/LitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/LitExpr.java deleted file mode 100644 index 153f01977c..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/LitExpr.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type; - -public interface LitExpr extends Expr {} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.java deleted file mode 100644 index d30e2c176e..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; - -public abstract class MultiaryExpr - implements Expr { - - private final List> ops; - - private volatile int hashCode = 0; - - protected MultiaryExpr(final Iterable> ops) { - checkNotNull(ops); - this.ops = ImmutableList.copyOf(ops); - } - - @Override - public final int getArity() { - return ops.size(); - } - - @Override - public final List> getOps() { - return ops; - } - - @Override - public MultiaryExpr withOps(final List> ops) { - checkNotNull(ops); - if (ops.isEmpty()) { - return with(ImmutableList.of()); - } else { - final OpType opType = getOps().get(0).getType(); - final List> newOps = - ops.stream().map(op -> TypeUtils.cast(op, opType)).collect(toImmutableList()); - return with(newOps); - } - } - - @Override - public final int hashCode() { - int result = hashCode; - if (result == 0) { - result = getHashSeed(); - result = 31 * result + getOps().hashCode(); - hashCode = result; - } - return result; - } - - @Override - public final String toString() { - return Utils.lispStringBuilder(getOperatorLabel()).body().addAll(ops).toString(); - } - - public abstract MultiaryExpr with(final Iterable> ops); - - protected abstract int getHashSeed(); - - public abstract String getOperatorLabel(); -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/NullaryExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/NullaryExpr.java deleted file mode 100644 index e1d686b6a8..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/NullaryExpr.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; - -import com.google.common.collect.ImmutableList; -import java.util.List; - -public abstract class NullaryExpr implements Expr { - - @Override - public final List> getOps() { - return ImmutableList.of(); - } - - @Override - public final NullaryExpr withOps(final List> ops) { - checkNotNull(ops); - checkArgument(ops.isEmpty()); - return this; - } - - @Override - public final int getArity() { - return 0; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.java deleted file mode 100644 index 0d32e7e1f7..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; - -public abstract class UnaryExpr - implements Expr { - - private final Expr op; - - private volatile int hashCode = 0; - - public UnaryExpr(final Expr op) { - this.op = checkNotNull(op); - } - - public final Expr getOp() { - return op; - } - - @Override - public final List> getOps() { - return ImmutableList.of(op); - } - - @Override - public final UnaryExpr withOps(final List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 1); - final OpType opType = op.getType(); - final Expr newOp = TypeUtils.cast(ops.get(0), opType); - return with(newOp); - } - - @Override - public int getArity() { - return 1; - } - - @Override - public final int hashCode() { - int result = hashCode; - if (result == 0) { - result = getHashSeed(); - result = 37 * result + getOp().hashCode(); - hashCode = result; - } - return result; - } - - @Override - public final String toString() { - return Utils.lispStringBuilder(getOperatorLabel()).body().add(op).toString(); - } - - public abstract UnaryExpr with(final Expr op); - - protected abstract int getHashSeed(); - - public abstract String getOperatorLabel(); -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.java deleted file mode 100644 index e3aa3d2338..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.java +++ /dev/null @@ -1,323 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static com.google.common.base.Preconditions.checkArgument; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Try; -import hu.bme.mit.theta.common.Tuple2; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.anytype.Exprs; -import hu.bme.mit.theta.core.type.anytype.IteExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; -import java.util.List; - -public final class AbstractExprs { - - private AbstractExprs() {} - - /* - * General - */ - - public static IteExpr Ite( - final Expr cond, final Expr then, final Expr elze) { - final Tuple2, Expr> newOps = unify(then, elze); - final Expr newThen = newOps.get1(); - final Expr newElse = newOps.get2(); - return Exprs.Ite(cond, newThen, newElse); - } - - /* - * Additive - */ - - public static > AddExpr Add(final Iterable> ops) { - final List> opList = ImmutableList.copyOf(ops); - checkArgument(!opList.isEmpty()); - final Expr head = Utils.head(opList); - final List> tail = Utils.tail(opList); - return combineAdd(head, tail); - } - - private static > AddExpr combineAdd( - final Expr head, final List> tail) { - if (tail.isEmpty()) { - final Expr newOp = bind(head); - final List> newOps = getAddOps(newOp); - final T type = newOp.getType(); - return type.Add(newOps); - - } else { - final Expr newHead = Utils.head(tail); - final List> newTail = Utils.tail(tail); - - final Tuple2, Expr> unifiedOps = unify(head, newHead); - final Expr newLeftOp = unifiedOps.get1(); - final Expr newRightOp = unifiedOps.get2(); - final T type = newLeftOp.getType(); - - final List> newLeftOps = getAddOps(newLeftOp); - final List> newOps = - ImmutableList.>builder().addAll(newLeftOps).add(newRightOp).build(); - final AddExpr newAddExpr = type.Add(newOps); - return combineAdd(newAddExpr, newTail); - } - } - - private static > List> getAddOps(final Expr expr) { - if (expr instanceof AddExpr) { - final AddExpr addExpr = (AddExpr) expr; - return addExpr.getOps(); - } else { - return ImmutableList.of(expr); - } - } - - public static > SubExpr Sub( - final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Sub(newLeftOp, newRightOp); - } - - public static > PosExpr Pos(final Expr op) { - final Expr tOp = bind(op); - final T type = tOp.getType(); - return type.Pos(tOp); - } - - public static > NegExpr Neg(final Expr op) { - final Expr tOp = bind(op); - final T type = tOp.getType(); - return type.Neg(tOp); - } - - /* - * Multiplicative - */ - - public static > MulExpr Mul( - final Iterable> ops) { - final List> opList = ImmutableList.copyOf(ops); - checkArgument(!opList.isEmpty()); - final Expr head = Utils.head(opList); - final List> tail = Utils.tail(opList); - return combineMul(head, tail); - } - - private static > MulExpr combineMul( - final Expr head, final List> tail) { - if (tail.isEmpty()) { - final Expr newOp = bind(head); - final List> newOps = getMulOps(newOp); - final T type = newOp.getType(); - return type.Mul(newOps); - - } else { - final Expr newHead = Utils.head(tail); - final List> newTail = Utils.tail(tail); - - final Tuple2, Expr> unifiedOps = unify(head, newHead); - final Expr newLeftOp = unifiedOps.get1(); - final Expr newRightOp = unifiedOps.get2(); - final T type = newLeftOp.getType(); - - final List> newLeftOps = getMulOps(newLeftOp); - final List> newOps = - ImmutableList.>builder().addAll(newLeftOps).add(newRightOp).build(); - final MulExpr newMulExpr = type.Mul(newOps); - return combineMul(newMulExpr, newTail); - } - } - - private static > List> getMulOps(final Expr expr) { - if (expr instanceof MulExpr) { - final MulExpr mulExpr = (MulExpr) expr; - return mulExpr.getOps(); - } else { - return ImmutableList.of(expr); - } - } - - public static > DivExpr Div( - final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Div(newLeftOp, newRightOp); - } - - /* - * Divisible - */ - - public static > ModExpr Mod( - final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Mod(newLeftOp, newRightOp); - } - - public static > RemExpr Rem( - final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Rem(newLeftOp, newRightOp); - } - - /* - * Equational - */ - - public static > EqExpr Eq( - final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Eq(newLeftOp, newRightOp); - } - - public static > NeqExpr Neq( - final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Neq(newLeftOp, newRightOp); - } - - /* - * Ordered - */ - - public static > LtExpr Lt(final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Lt(newLeftOp, newRightOp); - } - - public static > LeqExpr Leq( - final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Leq(newLeftOp, newRightOp); - } - - public static > GtExpr Gt(final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Gt(newLeftOp, newRightOp); - } - - public static > GeqExpr Geq( - final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Geq(newLeftOp, newRightOp); - } - - /* - * Convenience methods - */ - - public static > AddExpr Add( - final Expr leftOp, final Expr rightOp) { - return Add(ImmutableList.of(leftOp, rightOp)); - } - - public static > MulExpr Mul( - final Expr leftOp, final Expr rightOp) { - return Mul(ImmutableList.of(leftOp, rightOp)); - } - - /* - * Helper methods - */ - - private static > - Tuple2, Expr> unify(final Expr expr1, final Expr expr2) { - final T1 type1 = expr1.getType(); - final T2 type2 = expr2.getType(); - - if (expr1.getType().equals(expr2.getType())) { - @SuppressWarnings("unchecked") - final Expr t1Expr2 = (Expr) expr2; - return bind(expr1, t1Expr2); - } - - if (type1 instanceof Castable) { - @SuppressWarnings("unchecked") - final C cType1 = (C) type1; - @SuppressWarnings("unchecked") - final Expr cExpr1 = (Expr) expr1; - final Try> tryToCast = Try.attempt(() -> cType1.Cast(cExpr1, type2)); - if (tryToCast.isSuccess()) { - final Expr t2Expr1 = tryToCast.asSuccess().getValue(); - return bind(t2Expr1, expr2); - } - } - - if (type2 instanceof Castable) { - @SuppressWarnings("unchecked") - final C cType2 = (C) type2; - @SuppressWarnings("unchecked") - final Expr cExpr2 = (Expr) expr2; - final Try> tryToCast = Try.attempt(() -> cType2.Cast(cExpr2, type1)); - if (tryToCast.isSuccess()) { - final Expr t1Expr2 = tryToCast.asSuccess().getValue(); - return bind(expr1, t1Expr2); - } - } - - throw new ClassCastException( - "Types " + expr1.getType() + " and " + expr2.getType() + " can not be unified"); - } - - private static Expr bind(final Expr expr) { - @SuppressWarnings("unchecked") - final Expr trExpr = (Expr) expr; - return trExpr; - } - - private static Tuple2, Expr> bind( - final Expr expr1, final Expr expr2) { - @SuppressWarnings("unchecked") - final Expr trExpr1 = (Expr) expr1; - @SuppressWarnings("unchecked") - final Expr trExpr2 = (Expr) expr2; - return Tuple2.of(trExpr1, trExpr2); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.java deleted file mode 100644 index 56e801acff..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.MultiaryExpr; -import java.util.List; - -public abstract class AddExpr> - extends MultiaryExpr { - - protected AddExpr(final Iterable> ops) { - super(ops); - } - - public static > AddExpr create2( - final List> ops) { - checkArgument(!ops.isEmpty()); - @SuppressWarnings("unchecked") - final ExprType type = (ExprType) ops.get(0).getType(); - return type.Add(ops.stream().map(op -> cast(op, type)).collect(toImmutableList())); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.java deleted file mode 100644 index 348ee7d2dd..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; - -public abstract class DivExpr> - extends BinaryExpr { - - protected DivExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static > DivExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final ExprType type = (ExprType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Div(newLeftOp, newRightOp); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.java deleted file mode 100644 index d2629acd9d..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public abstract class EqExpr> - extends BinaryExpr { - - protected EqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static > EqExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final OpType type = (OpType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Eq(newLeftOp, newRightOp); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.java deleted file mode 100644 index b9f16e3edd..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public abstract class GeqExpr> extends BinaryExpr { - - protected GeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static > GeqExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final OpType type = (OpType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Geq(newLeftOp, newRightOp); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.java deleted file mode 100644 index 856205d2a6..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public abstract class GtExpr> extends BinaryExpr { - - protected GtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static > GtExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final OpType type = (OpType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Gt(newLeftOp, newRightOp); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.java deleted file mode 100644 index f59627f12a..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public abstract class LeqExpr> extends BinaryExpr { - - protected LeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static > LeqExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final OpType type = (OpType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Leq(newLeftOp, newRightOp); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.java deleted file mode 100644 index 338f192286..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public abstract class LtExpr> extends BinaryExpr { - - protected LtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static > LtExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final OpType type = (OpType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Lt(newLeftOp, newRightOp); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.java deleted file mode 100644 index 7906c9af04..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; - -public abstract class ModExpr> - extends BinaryExpr { - - protected ModExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static > ModExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final ExprType type = (ExprType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Mod(newLeftOp, newRightOp); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/MulExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/MulExpr.java deleted file mode 100644 index 5197c1f81a..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/MulExpr.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.MultiaryExpr; -import java.util.List; - -public abstract class MulExpr> - extends MultiaryExpr { - - protected MulExpr(final Iterable> ops) { - super(ops); - } - - public static > MulExpr create2( - final List> ops) { - checkArgument(!ops.isEmpty()); - @SuppressWarnings("unchecked") - final T type = (T) ops.get(0).getType(); - return type.Mul(ops.stream().map(op -> cast(op, type)).collect(toImmutableList())); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.java deleted file mode 100644 index 0f708ead4a..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; - -public interface Multiplicative> extends Type { - - MulExpr Mul(Iterable> ops); - - DivExpr Div(Expr leftOp, Expr rightOp); -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NegExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NegExpr.java deleted file mode 100644 index 0750164827..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NegExpr.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; - -public abstract class NegExpr> - extends UnaryExpr { - - protected NegExpr(final Expr op) { - super(op); - } - - public static > NegExpr create2(final Expr op) { - @SuppressWarnings("unchecked") - final ExprType type = (ExprType) op.getType(); - final Expr newOp = cast(op, type); - return type.Neg(newOp); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.java deleted file mode 100644 index 254ae454d8..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public abstract class NeqExpr> - extends BinaryExpr { - - protected NeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static > NeqExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final OpType type = (OpType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Neq(newLeftOp, newRightOp); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/PosExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/PosExpr.java deleted file mode 100644 index 7ea1cfc0e2..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/PosExpr.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; - -public abstract class PosExpr> - extends UnaryExpr { - - protected PosExpr(final Expr op) { - super(op); - } - - public static > PosExpr create2(final Expr op) { - @SuppressWarnings("unchecked") - final ExprType type = (ExprType) op.getType(); - final Expr newOp = cast(op, type); - return type.Pos(newOp); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/RemExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/RemExpr.java deleted file mode 100644 index b93e4864e4..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/RemExpr.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; - -public abstract class RemExpr> - extends BinaryExpr { - - protected RemExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static > RemExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final ExprType type = (ExprType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Rem(newLeftOp, newRightOp); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/SubExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/SubExpr.java deleted file mode 100644 index a263048118..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/SubExpr.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; - -public abstract class SubExpr> - extends BinaryExpr { - - protected SubExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static > SubExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final ExprType type = (ExprType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Sub(newLeftOp, newRightOp); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Dereference.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Dereference.java deleted file mode 100644 index 57ab22b884..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Dereference.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.anytype; - -import static com.google.common.base.Preconditions.checkState; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.inttype.IntType; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -public final class Dereference implements Expr { - - private static final String OPERATOR_LABEL = "deref"; - private final Expr array; - private final Expr offset; - private final T type; - - private final Optional> uniquenessIdx; - - private Dereference(Expr array, Expr offset, T type) { - this.array = array; - this.offset = offset; - this.type = type; - uniquenessIdx = Optional.empty(); - } - - private Dereference(Expr array, Expr offset, Expr uniqueness, T type) { - this.array = array; - this.offset = offset; - this.type = type; - this.uniquenessIdx = Optional.ofNullable(uniqueness); - } - - public Expr getArray() { - return array; - } - - public Expr getOffset() { - return offset; - } - - public static Dereference of( - Expr array, Expr offset, T type) { - return new Dereference<>(array, offset, type); - } - - private static Dereference of( - Expr array, Expr offset, Expr uniqueness, T type) { - return new Dereference<>(array, offset, uniqueness, type); - } - - public Dereference withUniquenessExpr(Expr expr) { - return Dereference.of(array, offset, expr, type); // TODO: this kills the stuck check - } - - @Override - public int getArity() { - return 3; - } - - @Override - public T getType() { - return type; - } - - @Override - public LitExpr eval(Valuation val) { - throw new IllegalStateException( - "Reference/Dereference expressions are not meant to be evaluated!"); - } - - @Override - public List> getOps() { - return uniquenessIdx.isPresent() - ? List.of(array, offset, uniquenessIdx.get()) - : List.of(array, offset); - } - - @Override - public Expr withOps(List> ops) { - checkState(ops.size() == 3 || ops.size() == 2); - if (ops.size() == 3) { - return Dereference.of(ops.get(0), ops.get(1), (Expr) ops.get(2), type); - } else { - return Dereference.of(ops.get(0), ops.get(1), type); - } - } - - @Override - public int hashCode() { - return Objects.hash(array, offset, uniquenessIdx, type); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof Dereference that) { - return Objects.equals(this.array, that.array) - && Objects.equals(this.offset, that.offset) - && Objects.equals(this.uniquenessIdx, that.uniquenessIdx) - && Objects.equals(this.type, that.type); - } - return false; - } - - @Override - public String toString() { - var base = Utils.lispStringBuilder(OPERATOR_LABEL).body().add(getArray()).add(getOffset()); - uniquenessIdx.ifPresent(base::add); - return base.add(type).toString(); - } - - public Optional> getUniquenessIdx() { - return uniquenessIdx; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.java deleted file mode 100644 index cea816fb2e..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.anytype; - -import static com.google.common.base.Preconditions.checkArgument; - -import hu.bme.mit.theta.core.decl.Decl; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class Exprs { - - private Exprs() {} - - public static RefExpr Ref(final Decl decl) { - return RefExpr.of(decl); - } - - public static IteExpr Ite( - final Expr cond, final Expr then, final Expr elze) { - return IteExpr.of(cond, then, elze); - } - - public static PrimeExpr Prime(final Expr op) { - return PrimeExpr.of(op); - } - - public static - Dereference Dereference( - final Expr arr, final Expr offset, final ExprType type) { - return Dereference.of(arr, offset, type); - } - - public static - Reference Reference(final Expr expr, final ArrType type) { - return Reference.of(expr, type); - } - - /* - * Convenience methods - */ - - public static Expr Prime( - final Expr op, final int i) { - checkArgument(i >= 0); - if (i == 0) { - return op; - } else if (i == 1) { - return Prime(op); - } else { - return Prime(Prime(op, i - 1)); - } - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.java deleted file mode 100644 index d9aef00d67..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.anytype; - -import com.google.common.base.Preconditions; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.Type; - -public class InvalidLitExpr extends NullaryExpr - implements LitExpr { - - private final ExprType type; - - public InvalidLitExpr(ExprType type) { - this.type = Preconditions.checkNotNull(type); - } - - @Override - public ExprType getType() { - return type; - } - - @Override - public LitExpr eval(Valuation val) { - return this; - } - - @Override - public boolean isInvalid() { - return true; - } - - @Override - public boolean equals(Object obj) { - return false; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.java deleted file mode 100644 index 9857c29003..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.anytype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; -import java.util.List; - -public final class IteExpr implements Expr { - - private static final int HASH_SEED = 181; - private static final String OPERATOR_LABEL = "ite"; - - private final Expr cond; - private final Expr then; - private final Expr elze; - - private volatile int hashCode = 0; - - private IteExpr( - final Expr cond, final Expr then, final Expr elze) { - this.cond = checkNotNull(cond); - this.then = checkNotNull(then); - this.elze = checkNotNull(elze); - } - - public static IteExpr of( - final Expr cond, final Expr then, final Expr elze) { - return new IteExpr<>(cond, then, elze); - } - - public static IteExpr create( - final Expr cond, final Expr then, final Expr elze) { - final Expr newCond = cast(cond, Bool()); - @SuppressWarnings("unchecked") - final Expr newThen = (Expr) then; - final Expr newElze = cast(elze, newThen.getType()); - return IteExpr.of(newCond, newThen, newElze); - } - - public Expr getCond() { - return cond; - } - - public Expr getThen() { - return then; - } - - public Expr getElse() { - return elze; - } - - @Override - public List> getOps() { - return ImmutableList.of(cond, then, elze); - } - - @Override - public int getArity() { - return 3; - } - - @Override - public ExprType getType() { - return getThen().getType(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BoolLitExpr condVal = (BoolLitExpr) cond.eval(val); - if (condVal.getValue()) { - return then.eval(val); - } else { - return elze.eval(val); - } - } - - @Override - public IteExpr withOps(final List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 3); - final ExprType exprType = getType(); - final Expr newCond = cast(ops.get(0), Bool()); - final Expr newThen = cast(ops.get(1), exprType); - final Expr newElze = cast(ops.get(2), exprType); - return with(newCond, newThen, newElze); - } - - public IteExpr with( - final Expr cond, final Expr then, final Expr elze) { - if (this.cond == cond && this.then == then && this.elze == elze) { - return this; - } else { - return IteExpr.of(cond, then, elze); - } - } - - public IteExpr withCond(final Expr cond) { - return with(cond, getThen(), getElse()); - } - - public IteExpr withThen(final Expr then) { - return with(getCond(), then, getElse()); - } - - public IteExpr withElse(final Expr elze) { - return with(getCond(), getThen(), elze); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + cond.hashCode(); - result = 31 * result + then.hashCode(); - result = 31 * result + elze.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IteExpr that = (IteExpr) obj; - return this.getCond().equals(that.getCond()) - && this.getThen().equals(that.getThen()) - && this.getElse().equals(that.getElse()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .add(getCond()) - .add(getThen()) - .add(getElse()) - .toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.java deleted file mode 100644 index 1f88acb42a..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.anytype; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.UnaryExpr; - -public final class PrimeExpr extends UnaryExpr { - - private static final int HASH_SEED = 4561; - - private static final String OPERATOR_LABEL = "prime"; - - private PrimeExpr(final Expr op) { - super(op); - } - - public static PrimeExpr of(final Expr op) { - return new PrimeExpr<>(op); - } - - @Override - public final ExprType getType() { - return getOp().getType(); - } - - @Override - public LitExpr eval(final Valuation val) { - throw new UnsupportedOperationException(); - } - - @Override - public final UnaryExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return PrimeExpr.of(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final PrimeExpr that = (PrimeExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected final int getHashSeed() { - return HASH_SEED; - } - - @Override - public final String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.java deleted file mode 100644 index 2b08b82e0c..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.anytype; - -import static com.google.common.base.Preconditions.checkNotNull; - -import hu.bme.mit.theta.core.decl.Decl; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.Type; - -public final class RefExpr extends NullaryExpr { - - private static final int HASH_SEED = 167; - private volatile int hashCode = 0; - - private final Decl decl; - - private RefExpr(final Decl decl) { - this.decl = checkNotNull(decl); - } - - public static RefExpr of(final Decl decl) { - return new RefExpr<>(decl); - } - - public Decl getDecl() { - return decl; - } - - @Override - public DeclType getType() { - return decl.getType(); - } - - @Override - public LitExpr eval(final Valuation val) { - return val.eval(decl).get(); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + decl.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RefExpr that = (RefExpr) obj; - return this.getDecl().equals(that.getDecl()); - } else { - return false; - } - } - - @Override - public String toString() { - return decl.getName(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.java deleted file mode 100644 index b1bb3cb257..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.anytype; - -import static com.google.common.base.Preconditions.checkState; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.decl.VarDecl; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import java.util.List; -import java.util.Objects; - -public final class Reference implements Expr { - - private static final String OPERATOR_LABEL = "ref"; - private final Expr expr; - private final A type; - - private Reference(Expr expr, A type) { - this.expr = expr; - this.type = type; - } - - public Expr getExpr() { - return expr; - } - - public static Reference of(Expr expr, A type) { - return new Reference<>(expr, type); - } - - @Override - public int getArity() { - return 1; - } - - @Override - public A getType() { - return type; - } - - @Override - public LitExpr eval(Valuation val) { - throw new IllegalStateException( - "Reference/Dereference expressions are not meant to be evaluated!"); - } - - @Override - public List> getOps() { - return List.of(expr); - } - - @Override - public Expr withOps(List> ops) { - checkState(ops.size() == 1); - checkState( - ops.get(0) instanceof RefExpr - && ((RefExpr) ops.get(0)).getDecl() instanceof VarDecl, - "Don't transform references to constants."); - return Reference.of((Expr) ops.get(0), type); - } - - @Override - public int hashCode() { - return Objects.hash(expr, type); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof Reference that) { - return Objects.equals(this.expr, that.expr) && Objects.equals(this.type, that.type); - } - return false; - } - - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL).body().add(getExpr()).add(type).toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.java deleted file mode 100644 index 85990b461f..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.arraytype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class ArrayEqExpr - extends EqExpr> { - - private static final int HASH_SEED = 4261; - private static final String OPERATOR_LABEL = "="; - - private ArrayEqExpr( - final Expr> leftOp, - final Expr> rightOp) { - super(leftOp, rightOp); - } - - public static - ArrayEqExpr of( - final Expr> leftOp, - final Expr> rightOp) { - return new ArrayEqExpr<>(leftOp, rightOp); - } - - public static ArrayEqExpr create( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final ArrayType arrayType = - (ArrayType) leftOp.getType(); - final Expr> newLeftOp = cast(leftOp, arrayType); - final Expr> newRightOp = cast(rightOp, arrayType); - return ArrayEqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - throw new UnsupportedOperationException(); - } - - @Override - public BinaryExpr, BoolType> with( - final Expr> leftOp, - final Expr> rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return ArrayEqExpr.of(leftOp, rightOp); - } - } - - @Override - public BinaryExpr, BoolType> withLeftOp( - final Expr> leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BinaryExpr, BoolType> withRightOp( - final Expr> rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ArrayEqExpr that = (ArrayEqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.java deleted file mode 100644 index 077bb661eb..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.arraytype; - -import hu.bme.mit.theta.common.Tuple2; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import java.util.List; - -public final class ArrayExprs { - - private ArrayExprs() {} - - public static - ArrayType Array( - final IndexType indexType, final ElemType elemType) { - return ArrayType.of(indexType, elemType); - } - - public static - ArrayLitExpr Array( - final List, ? extends Expr>> elems, - final Expr elseElem, - final ArrayType type) { - return ArrayLitExpr.of(elems, elseElem, type); - } - - public static - ArrayInitExpr ArrayInit( - final List, Expr>> elems, - final Expr elseElem, - final ArrayType type) { - return ArrayInitExpr.of(elems, elseElem, type); - } - - public static - ArrayReadExpr Read( - final Expr> array, final Expr index) { - return ArrayReadExpr.of(array, index); - } - - public static - ArrayWriteExpr Write( - final Expr> array, - final Expr index, - final Expr elem) { - return ArrayWriteExpr.of(array, index, elem); - } - - public static - ArrayEqExpr Eq( - final Expr> leftOp, - final Expr> rightOp) { - return ArrayEqExpr.of(leftOp, rightOp); - } - - public static - ArrayNeqExpr Neq( - final Expr> leftOp, - final Expr> rightOp) { - return ArrayNeqExpr.of(leftOp, rightOp); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.java deleted file mode 100644 index cb4c601a4e..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.arraytype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Tuple2; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.MultiaryExpr; -import hu.bme.mit.theta.core.type.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; - -/** - * ArrayInitExpr is a way to specify arbitrary array 'literals' that may contain non-literal - * elements as well. Note that while this class is a descendant of MultiaryExpr, it is used in a - * non-standard way: - ops is only used as a generic Type type, - ops are solely used for - * inter-object interactions, intra-class the `elems` and `elseElem` are used. - `elems` and - * `elseElem` are mapped to `ops` by first placing the `elseElem`, then all indices, then all - * elements. - */ -public final class ArrayInitExpr - extends MultiaryExpr> { - - private static final int HASH_SEED = 241; - private static final String OPERATOR_LABEL = "arrayinit"; - - private final ArrayType type; - - private final List, Expr>> elems; - - private final Expr elseElem; - - private ArrayInitExpr( - final List, Expr>> elems, - final Expr elseElem, - final ArrayType type) { - //noinspection unchecked - super( - Stream.concat( - List.of((Expr) elseElem).stream(), - Stream.concat( - elems.stream().map(objects -> (Expr) objects.get1()), - elems.stream().map(objects -> (Expr) objects.get2()))) - .collect(Collectors.toList())); - this.type = checkNotNull(type); - this.elseElem = checkNotNull(elseElem); - this.elems = checkNotNull(elems); - } - - public static - ArrayInitExpr of( - final List, Expr>> elems, - final Expr elseElem, - final ArrayType type) { - return new ArrayInitExpr<>(elems, elseElem, type); - } - - public static - ArrayInitExpr create( - final List, Expr>> elems, - final Expr elseElem, - final ArrayType type) { - final List, Expr>> typedElems = - elems.stream() - .map(i -> Tuple2.of((Expr) i.get1(), (Expr) i.get2())) - .collect(Collectors.toList()); - final Expr typedElseElem = (Expr) elseElem; - final ArrayType typedType = (ArrayType) type; - return of(typedElems, typedElseElem, typedType); - } - - public List, Expr>> getElements() { - return ImmutableList.copyOf(elems); - } - - public Expr getElseElem() { - return elseElem; - } - - @Override - public ArrayType getType() { - return type; - } - - @Override - public LitExpr> eval(final Valuation val) { - return ArrayLitExpr.of( - elems.stream() - .map( - objects -> - Tuple2.of( - objects.get1().eval(val), objects.get2().eval(val))) - .collect(Collectors.toList()), - elseElem, - type); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ArrayInitExpr that = (ArrayInitExpr) obj; - return this.type.equals(that.type) - && this.elems.equals(that.elems) - && elseElem.equals(that.elseElem); - } else { - return false; - } - } - - @SuppressWarnings("unchecked") - @Override - public MultiaryExpr> with( - Iterable> ops) { - long size = StreamSupport.stream(ops.spliterator(), false).count(); - checkState(size % 2 == 1, "Ops must be odd long!"); - long counter = 0; - Expr elseElem = null; - List> indices = new ArrayList<>(); - List> elems = new ArrayList<>(); - for (Expr op : ops) { - if (counter == 0) elseElem = (Expr) op; - else if (counter <= (size - 1) / 2) indices.add((Expr) op); - else elems.add((Expr) op); - ++counter; - } - List, Expr>> newOps = new ArrayList<>(); - for (int i = 0; i < indices.size(); i++) { - newOps.add(Tuple2.of(indices.get(i), elems.get(i))); - } - return ArrayInitExpr.of(newOps, elseElem, type); - } - - @Override - public MultiaryExpr> withOps(List> ops) { - return with(ops.stream().map(op -> (Expr) op).collect(Collectors.toList())); - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.java deleted file mode 100644 index df077122fc..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.arraytype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Tuple2; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.ImmutableValuation; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.utils.ExprSimplifier; -import java.util.List; -import java.util.stream.Collectors; - -public final class ArrayLitExpr - extends NullaryExpr> - implements LitExpr> { - - private static final int HASH_SEED = 229; - private static final String OPERATOR_LABEL = "array"; - - private final ArrayType type; - - private final List, LitExpr>> elems; - - private final LitExpr elseElem; - - private volatile int hashCode; - - private ArrayLitExpr( - final List, ? extends Expr>> elems, - final Expr elseElem, - final ArrayType type) { - this.type = checkNotNull(type); - final ExprSimplifier exprSimplifier = ExprSimplifier.create(); - Expr simplifiedElem = - exprSimplifier.simplify(checkNotNull(elseElem), ImmutableValuation.empty()); - checkState( - simplifiedElem instanceof LitExpr, - "ArrayLitExprs shall only contain literal values!"); - this.elseElem = (LitExpr) simplifiedElem; - this.elems = - checkNotNull(elems).stream() - .map( - elem -> { - Expr index = - exprSimplifier.simplify( - elem.get1(), ImmutableValuation.empty()); - Expr element = - exprSimplifier.simplify( - elem.get2(), ImmutableValuation.empty()); - checkState( - index instanceof LitExpr && element instanceof LitExpr, - "ArrayLitExprs shall only contain literal values"); - return Tuple2.of( - (LitExpr) index, - (LitExpr) element); - }) - .collect(Collectors.toList()); - } - - public static - ArrayLitExpr of( - final List, ? extends Expr>> elems, - final Expr elseElem, - final ArrayType type) { - return new ArrayLitExpr<>(elems, elseElem, type); - } - - public List, LitExpr>> getElements() { - return ImmutableList.copyOf(elems); - } - - public LitExpr getElseElem() { - return elseElem; - } - - @Override - public ArrayType getType() { - return type; - } - - @Override - public LitExpr> eval(final Valuation val) { - return this; - } - - @Override - public int hashCode() { - int tmp = hashCode; - if (tmp == 0) { - tmp = HASH_SEED; - tmp = 31 * tmp + type.hashCode(); - for (Tuple2, LitExpr> elem : elems) { - tmp = 31 * tmp + elem.hashCode(); - } - hashCode = tmp; - } - return tmp; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ArrayLitExpr that = (ArrayLitExpr) obj; - return this.type.equals(that.type) - && this.elems.equals(that.elems) - && elseElem.equals(that.elseElem); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .addAll( - elems.stream() - .map(elem -> String.format("(%s %s)", elem.get1(), elem.get2()))) - .add((String.format("(default %s)", elseElem))) - .toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.java deleted file mode 100644 index 86a4961787..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.arraytype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class ArrayNeqExpr - extends NeqExpr> { - - private static final int HASH_SEED = 5233; - private static final String OPERATOR_LABEL = "/="; - - private ArrayNeqExpr( - final Expr> leftOp, - final Expr> rightOp) { - super(leftOp, rightOp); - } - - public static - ArrayNeqExpr of( - final Expr> leftOp, - final Expr> rightOp) { - return new ArrayNeqExpr<>(leftOp, rightOp); - } - - public static ArrayNeqExpr create( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final ArrayType arrayType = - (ArrayType) leftOp.getType(); - final Expr> newLeftOp = cast(leftOp, arrayType); - final Expr> newRightOp = cast(rightOp, arrayType); - return ArrayNeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - throw new UnsupportedOperationException(); - } - - @Override - public BinaryExpr, BoolType> with( - final Expr> leftOp, - final Expr> rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return new ArrayNeqExpr<>(leftOp, rightOp); - } - } - - @Override - public BinaryExpr, BoolType> withLeftOp( - final Expr> leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BinaryExpr, BoolType> withRightOp( - final Expr> rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ArrayNeqExpr that = (ArrayNeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.java deleted file mode 100644 index fddd4141c3..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.arraytype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Tuple2; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import java.util.List; - -public final class ArrayReadExpr - implements Expr { - - private static final int HASH_SEED = 1321; - - private static final String OPERATOR_LABEL = "read"; - - private volatile int hashCode = 0; - - private final Expr> array; - private final Expr index; - - private ArrayReadExpr( - final Expr> array, final Expr index) { - this.array = checkNotNull(array); - this.index = checkNotNull(index); - } - - public static - ArrayReadExpr of( - final Expr> array, final Expr index) { - return new ArrayReadExpr<>(array, index); - } - - public static ArrayReadExpr create( - final Expr array, final Expr index) { - @SuppressWarnings("unchecked") - final ArrayType arrayType = - (ArrayType) array.getType(); - final Expr> newArray = cast(array, arrayType); - final Expr newIndex = cast(index, arrayType.getIndexType()); - return ArrayReadExpr.of(newArray, newIndex); - } - - public Expr> getArray() { - return array; - } - - public Expr getIndex() { - return index; - } - - @Override - public ElemType getType() { - return array.getType().getElemType(); - } - - @Override - public LitExpr eval(final Valuation val) { - ArrayLitExpr arrayVal = - (ArrayLitExpr) array.eval(val); - LitExpr indexVal = index.eval(val); - for (Tuple2, LitExpr> elem : arrayVal.getElements()) { - if (elem.get1().equals(indexVal)) { - return elem.get2(); - } - } - return (LitExpr) arrayVal.getElseElem(); - } - - @Override - public int getArity() { - return 2; - } - - @Override - public List> getOps() { - return ImmutableList.of(array, index); - } - - @Override - public Expr withOps(final List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 2); - final Expr> newArray = cast(ops.get(0), array.getType()); - final Expr newIndex = cast(ops.get(1), index.getType()); - return with(newArray, newIndex); - } - - public ArrayReadExpr with( - final Expr> array, final Expr index) { - if (this.array == array && this.index == index) { - return this; - } else { - return ArrayReadExpr.of(array, index); - } - } - - public ArrayReadExpr withArray( - final Expr> array) { - return with(array, getIndex()); - } - - public ArrayReadExpr withIndex(final Expr index) { - return with(getArray(), index); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + array.hashCode(); - result = 31 * result + index.hashCode(); - hashCode = result; - } - - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ArrayReadExpr that = (ArrayReadExpr) obj; - return this.getArray().equals(that.getArray()) - && this.getIndex().equals(that.getIndex()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL).body().add(array).add(index).toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.java deleted file mode 100644 index b6da9d0fad..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.arraytype; - -import static com.google.common.base.Preconditions.checkNotNull; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.DomainSize; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.abstracttype.Equational; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; - -public final class ArrayType - implements Equational> { - - private static final int HASH_SEED = 4919; - private static final String TYPE_LABEL = "Array"; - - private final IndexType indexType; - private final ElemType elemType; - - private volatile int hashCode = 0; - - private ArrayType(final IndexType indexType, final ElemType elemType) { - this.indexType = checkNotNull(indexType); - this.elemType = checkNotNull(elemType); - } - - public static ArrayType of( - final IndexType indexType, final ElemType elemType) { - return new ArrayType<>(indexType, elemType); - } - - public IndexType getIndexType() { - return indexType; - } - - public ElemType getElemType() { - return elemType; - } - - @Override - public EqExpr> Eq( - final Expr> leftOp, - final Expr> rightOp) { - return ArrayExprs.Eq(leftOp, rightOp); - } - - @Override - public NeqExpr> Neq( - final Expr> leftOp, - final Expr> rightOp) { - return ArrayExprs.Neq(leftOp, rightOp); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + indexType.hashCode(); - result = 31 * result + elemType.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ArrayType that = (ArrayType) obj; - return this.getIndexType().equals(that.getIndexType()) - && this.getElemType().equals(that.getElemType()); - } else { - return false; - } - } - - @Override - public String toString() { - final String indexString = String.format("([%s] -> %s)", indexType, elemType); - return Utils.lispStringBuilder(TYPE_LABEL).add(indexString).toString(); - } - - @Override - public DomainSize getDomainSize() { - return DomainSize.pow(elemType.getDomainSize(), indexType.getDomainSize()); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.java deleted file mode 100644 index c3a4a8a23c..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.arraytype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Tuple2; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import java.util.ArrayList; -import java.util.List; - -public final class ArrayWriteExpr - implements Expr> { - - private static final int HASH_SEED = 1699; - - private static final String OPERATOR_LABEL = "write"; - - private volatile int hashCode = 0; - - private final Expr> array; - private final Expr index; - private final Expr elem; - - private ArrayWriteExpr( - final Expr> array, - final Expr index, - final Expr elem) { - this.array = checkNotNull(array); - this.index = checkNotNull(index); - this.elem = checkNotNull(elem); - } - - public static - ArrayWriteExpr of( - final Expr> array, - final Expr index, - final Expr elem) { - return new ArrayWriteExpr<>(array, index, elem); - } - - public static ArrayWriteExpr create( - final Expr array, final Expr index, final Expr elem) { - @SuppressWarnings("unchecked") - final ArrayType arrayType = - (ArrayType) array.getType(); - final Expr> newArray = cast(array, arrayType); - final Expr newIndex = cast(index, arrayType.getIndexType()); - final Expr newElem = cast(elem, arrayType.getElemType()); - return ArrayWriteExpr.of(newArray, newIndex, newElem); - } - - public Expr> getArray() { - return array; - } - - public Expr getIndex() { - return index; - } - - public Expr getElem() { - return elem; - } - - @Override - public ArrayType getType() { - return Array(index.getType(), elem.getType()); - } - - @Override - public LitExpr> eval(final Valuation val) { - ArrayLitExpr arrayVal = - (ArrayLitExpr) array.eval(val); - LitExpr indexVal = index.eval(val); - LitExpr elemVal = elem.eval(val); - - List, ? extends Expr>> elemList = - new ArrayList<>(); - for (Tuple2, LitExpr> elem : arrayVal.getElements()) { - if (!elem.get1().equals(indexVal)) { - elemList.add(elem); - } - } - elemList.add(Tuple2.of(indexVal, elemVal)); - - return Array(elemList, arrayVal.getElseElem(), arrayVal.getType()); - } - - @Override - public int getArity() { - return 3; - } - - @Override - public List> getOps() { - return ImmutableList.of(array, index, elem); - } - - @Override - public Expr> withOps(final List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 3); - final Expr> newArray = cast(ops.get(0), array.getType()); - final Expr newIndex = cast(ops.get(1), index.getType()); - final Expr newElem = cast(ops.get(2), elem.getType()); - return with(newArray, newIndex, newElem); - } - - public ArrayWriteExpr with( - final Expr> array, - final Expr index, - final Expr elem) { - if (this.array == array && this.index == index && elem == this.elem) { - return this; - } else { - return ArrayWriteExpr.of(array, index, elem); - } - } - - public ArrayWriteExpr withIndex(final Expr index) { - return with(getArray(), index, getElem()); - } - - public ArrayWriteExpr withElem(final Expr elem) { - return with(getArray(), getIndex(), elem); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + array.hashCode(); - result = 31 * result + index.hashCode(); - result = 31 * result + elem.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ArrayWriteExpr that = (ArrayWriteExpr) obj; - return this.getArray().equals(that.getArray()) - && this.getIndex().equals(that.getIndex()) - && this.getElem().equals(that.getElem()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .add(array) - .add(index) - .add(elem) - .toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.java deleted file mode 100644 index 42b8167b48..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.False; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.MultiaryExpr; -import java.util.List; - -public final class AndExpr extends MultiaryExpr { - - private static final int HASH_SEED = 41; - private static final String OPERATOR_LABEL = "and"; - - private AndExpr(final Iterable> ops) { - super(ops); - } - - public static AndExpr of(final Iterable> ops) { - return new AndExpr(ops); - } - - public static AndExpr create(final List> ops) { - return AndExpr.of(ops.stream().map(op -> cast(op, Bool())).collect(toImmutableList())); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - for (final Expr op : getOps()) { - final BoolLitExpr opVal = (BoolLitExpr) op.eval(val); - if (!opVal.getValue()) { - return False(); - } - } - return True(); - } - - @Override - public AndExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return AndExpr.of(ops); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final AndExpr that = (AndExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.java deleted file mode 100644 index 72ba2f936e..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.core.decl.ParamDecl; -import hu.bme.mit.theta.core.type.Expr; - -public final class BoolExprs { - - private BoolExprs() {} - - public static BoolType Bool() { - return BoolType.getInstance(); - } - - public static BoolLitExpr Bool(final boolean value) { - return BoolLitExpr.of(value); - } - - public static TrueExpr True() { - return TrueExpr.getInstance(); - } - - public static FalseExpr False() { - return FalseExpr.getInstance(); - } - - public static NotExpr Not(final Expr op) { - return NotExpr.of(op); - } - - public static ImplyExpr Imply(final Expr leftOp, final Expr rightOp) { - return ImplyExpr.of(leftOp, rightOp); - } - - public static IffExpr Iff(final Expr leftOp, final Expr rightOp) { - return IffExpr.of(leftOp, rightOp); - } - - public static XorExpr Xor(final Expr leftOp, final Expr rightOp) { - return XorExpr.of(leftOp, rightOp); - } - - public static AndExpr And(final Iterable> ops) { - return AndExpr.of(ops); - } - - public static OrExpr Or(final Iterable> ops) { - return OrExpr.of(ops); - } - - public static ForallExpr Forall( - final Iterable> paramDecls, final Expr op) { - return ForallExpr.of(paramDecls, op); - } - - public static ExistsExpr Exists( - final Iterable> paramDecls, final Expr op) { - return ExistsExpr.of(paramDecls, op); - } - - /* - * Convenience methods - */ - - public static AndExpr And(final Expr op1, final Expr op2) { - return AndExpr.of(ImmutableList.of(op1, op2)); - } - - public static AndExpr And( - final Expr op1, final Expr op2, final Expr op3) { - return AndExpr.of(ImmutableList.of(op1, op2, op3)); - } - - public static AndExpr And( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4) { - return AndExpr.of(ImmutableList.of(op1, op2, op3, op4)); - } - - public static AndExpr And( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4, - final Expr op5) { - return AndExpr.of(ImmutableList.of(op1, op2, op3, op4, op5)); - } - - //// - - public static OrExpr Or(final Expr op1, final Expr op2) { - return OrExpr.of(ImmutableList.of(op1, op2)); - } - - public static OrExpr Or( - final Expr op1, final Expr op2, final Expr op3) { - return OrExpr.of(ImmutableList.of(op1, op2, op3)); - } - - public static OrExpr Or( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4) { - return OrExpr.of(ImmutableList.of(op1, op2, op3, op4)); - } - - public static OrExpr Or( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4, - final Expr op5) { - return OrExpr.of(ImmutableList.of(op1, op2, op3, op4, op5)); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.java deleted file mode 100644 index 92c2a35d12..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import hu.bme.mit.theta.core.type.DomainSize; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.Equational; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; - -public final class BoolType implements Equational { - - private static final BoolType INSTANCE = new BoolType(); - private static final int HASH_SEED = 754364; - private static final String TYPE_LABEL = "Bool"; - - private BoolType() {} - - public static BoolType getInstance() { - return INSTANCE; - } - - @Override - public int hashCode() { - return HASH_SEED; - } - - @Override - public boolean equals(final Object obj) { - return obj != null && this.getClass() == obj.getClass(); - } - - @Override - public String toString() { - return TYPE_LABEL; - } - - //// - - @Override - public IffExpr Eq(final Expr leftOp, final Expr rightOp) { - return BoolExprs.Iff(leftOp, rightOp); - } - - @Override - public NeqExpr Neq(final Expr leftOp, final Expr rightOp) { - return BoolExprs.Xor(leftOp, rightOp); - } - - @Override - public DomainSize getDomainSize() { - return DomainSize.TWO; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ExistsExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ExistsExpr.java deleted file mode 100644 index 10ae6b17b9..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ExistsExpr.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.decl.ParamDecl; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; - -public final class ExistsExpr extends QuantifiedExpr { - - private static final int HASH_SEED = 7993; - - private static final String OPERATOR_LABEL = "exists"; - - private ExistsExpr(final Iterable> paramDecls, final Expr op) { - super(paramDecls, op); - } - - public static ExistsExpr of( - final Iterable> paramDecls, final Expr op) { - return new ExistsExpr(paramDecls, op); - } - - public static ExistsExpr create( - final Iterable> paramDecls, final Expr op) { - final Expr newOp = cast(op, Bool()); - return ExistsExpr.of(paramDecls, newOp); - } - - @Override - public LitExpr eval(final Valuation val) { - throw new UnsupportedOperationException(); - } - - @Override - public ExistsExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return ExistsExpr.of(getParamDecls(), op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ExistsExpr that = (ExistsExpr) obj; - return this.getParamDecls().equals(that.getParamDecls()) - && this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/FalseExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/FalseExpr.java deleted file mode 100644 index a18a9ac568..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/FalseExpr.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; - -public final class FalseExpr extends BoolLitExpr { - - private static final FalseExpr INSTANCE = new FalseExpr(); - private static final int HASH_SEED = 712514; - private static final String OPERATOR_LABEL = "false"; - - private FalseExpr() {} - - public static FalseExpr getInstance() { - return INSTANCE; - } - - @Override - public boolean getValue() { - return false; - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - return this; - } - - @Override - public int hashCode() { - return HASH_SEED; - } - - @Override - public boolean equals(final Object obj) { - return (obj != null && this.getClass() == obj.getClass()); - } - - @Override - public String toString() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ForallExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ForallExpr.java deleted file mode 100644 index 1afdf61c31..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ForallExpr.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.decl.ParamDecl; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; - -public final class ForallExpr extends QuantifiedExpr { - - private static final int HASH_SEED = 6871; - - private static final String OPERATOR_LABEL = "forall"; - - private ForallExpr(final Iterable> paramDecls, final Expr op) { - super(paramDecls, op); - } - - public static ForallExpr of( - final Iterable> paramDecls, final Expr op) { - return new ForallExpr(paramDecls, op); - } - - public static ForallExpr create( - final Iterable> paramDecls, final Expr op) { - final Expr newOp = cast(op, Bool()); - return ForallExpr.of(paramDecls, newOp); - } - - @Override - public LitExpr eval(final Valuation val) { - throw new UnsupportedOperationException(); - } - - @Override - public ForallExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return ForallExpr.of(getParamDecls(), op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ForallExpr that = (ForallExpr) obj; - return this.getParamDecls().equals(that.getParamDecls()) - && this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.java deleted file mode 100644 index a53c33dc15..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; - -public final class IffExpr extends EqExpr { - - private static final int HASH_SEED = 67; - - private static final String OPERATOR_LABEL = "iff"; - - private IffExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static IffExpr of(final Expr leftOp, final Expr rightOp) { - return new IffExpr(leftOp, rightOp); - } - - public static IffExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Bool()); - final Expr newRightOp = cast(rightOp, Bool()); - return IffExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final BoolLitExpr leftOpVal = (BoolLitExpr) getLeftOp().eval(val); - final BoolLitExpr rightOpVal = (BoolLitExpr) getRightOp().eval(val); - return Bool(leftOpVal.getValue() == rightOpVal.getValue()); - } - - @Override - public IffExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return new IffExpr(leftOp, rightOp); - } - } - - @Override - public IffExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public IffExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IffExpr that = (IffExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.java deleted file mode 100644 index 2ecc449679..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; - -public final class ImplyExpr extends BinaryExpr { - - private static final int HASH_SEED = 71; - - private static final String OPERATOR_LABEL = "=>"; - - private ImplyExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static ImplyExpr of(final Expr leftOp, final Expr rightOp) { - return new ImplyExpr(leftOp, rightOp); - } - - public static ImplyExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Bool()); - final Expr newRightOp = cast(rightOp, Bool()); - return ImplyExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final BoolLitExpr leftOpVal = (BoolLitExpr) getLeftOp().eval(val); - final BoolLitExpr rightOpVal = (BoolLitExpr) getRightOp().eval(val); - return Bool(!leftOpVal.getValue() || rightOpVal.getValue()); - } - - @Override - public ImplyExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return ImplyExpr.of(leftOp, rightOp); - } - } - - @Override - public ImplyExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public ImplyExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ImplyExpr that = (ImplyExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.java deleted file mode 100644 index 94ea26cb14..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; - -public final class NotExpr extends UnaryExpr { - - private static final int HASH_SEED = 127; - - private static final String OPERAND_LABEL = "not"; - - private NotExpr(final Expr op) { - super(op); - } - - public static NotExpr of(final Expr op) { - return new NotExpr(op); - } - - public static NotExpr create(final Expr op) { - final Expr newOp = cast(op, Bool()); - return NotExpr.of(newOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final BoolLitExpr opVal = (BoolLitExpr) getOp().eval(val); - return Bool(!opVal.getValue()); - } - - @Override - public NotExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return new NotExpr(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final NotExpr that = (NotExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERAND_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.java deleted file mode 100644 index cc51bc2334..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.False; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.MultiaryExpr; -import java.util.List; - -public final class OrExpr extends MultiaryExpr { - - private static final int HASH_SEED = 131; - - private static final String OPERATOR_LABEL = "or"; - - private OrExpr(final Iterable> ops) { - super(ops); - } - - public static OrExpr of(final Iterable> ops) { - return new OrExpr(ops); - } - - public static OrExpr create(final List> ops) { - return OrExpr.of(ops.stream().map(op -> cast(op, Bool())).collect(toImmutableList())); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - for (final Expr op : getOps()) { - final BoolLitExpr opVal = (BoolLitExpr) op.eval(val); - if (opVal.getValue()) { - return True(); - } - } - return False(); - } - - @Override - public OrExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return new OrExpr(ops); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final OrExpr that = (OrExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.java deleted file mode 100644 index 7dec9f0e7a..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static java.util.stream.Collectors.joining; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.decl.ParamDecl; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; - -public abstract class QuantifiedExpr implements Expr { - - private final List> paramDecls; - - private final Expr op; - - private volatile int hashCode = 0; - - protected QuantifiedExpr( - final Iterable> paramDecls, final Expr op) { - this.paramDecls = ImmutableList.copyOf(checkNotNull(paramDecls)); - this.op = checkNotNull(op); - } - - public final List> getParamDecls() { - return paramDecls; - } - - public final Expr getOp() { - return op; - } - - @Override - public final BoolType getType() { - return Bool(); - } - - @Override - public List> getOps() { - return ImmutableList.of(op); - } - - @Override - public Expr withOps(final List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 1); - final Expr newOp = TypeUtils.cast(ops.get(0), Bool()); - return with(newOp); - } - - @Override - public int getArity() { - return 1; - } - - @Override - public final int hashCode() { - int result = hashCode; - if (result == 0) { - result = getHashSeed(); - result = 31 * result + getParamDecls().hashCode(); - result = 31 * result + getOp().hashCode(); - hashCode = result; - } - return result; - } - - @Override - public final String toString() { - final String paramString = - paramDecls.stream() - .map(p -> "(" + p.getName() + " " + p.getType() + ")") - .collect(joining(" ", "(", ")")); - return Utils.lispStringBuilder(getOperatorLabel()) - .body() - .add(paramString) - .add(op) - .toString(); - } - - public abstract QuantifiedExpr with(final Expr op); - - protected abstract int getHashSeed(); - - protected abstract String getOperatorLabel(); -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.java deleted file mode 100644 index 60f63a1481..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.common.Utils.singleElementOf; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.False; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.core.type.Expr; -import java.util.Collection; -import java.util.LinkedHashSet; -import java.util.List; - -public final class SmartBoolExprs { - - private SmartBoolExprs() {} - - public static Expr Not(final Expr op) { - if (op.equals(True())) { - return False(); - } else if (op.equals(False())) { - return True(); - } else if (op instanceof NotExpr) { - return ((NotExpr) op).getOp(); - } else { - return BoolExprs.Not(op); - } - } - - public static Expr Imply(final Expr leftOp, final Expr rightOp) { - if (leftOp.equals(False())) { - return True(); - } else if (leftOp.equals(True())) { - return rightOp; - } else if (rightOp.equals(False())) { - return Not(leftOp); - } else if (rightOp.equals(True())) { - return True(); - } else { - return BoolExprs.Imply(leftOp, rightOp); - } - } - - public static Expr And(final Collection> ops) { - if (ops.isEmpty()) { - return True(); - } else if (ops.contains(False())) { - return False(); - } - - final List> filteredOps = - ops.stream().filter(o -> !o.equals(True())).collect(toImmutableList()); - - if (filteredOps.isEmpty()) { - return True(); - } else if (filteredOps.size() == 1) { - return singleElementOf(filteredOps); - } else { - return BoolExprs.And(new LinkedHashSet<>(filteredOps)); - } - } - - public static Expr Or(final Collection> ops) { - if (ops.isEmpty()) { - return False(); - } else if (ops.contains(True())) { - return True(); - } - - final List> filteredOps = - ops.stream().filter(o -> !o.equals(False())).collect(toImmutableList()); - - if (filteredOps.isEmpty()) { - return False(); - } else if (filteredOps.size() == 1) { - return singleElementOf(filteredOps); - } else { - return BoolExprs.Or(new LinkedHashSet<>(filteredOps)); - } - } - - /* - * Convenience methods - */ - - public static Expr And(final Expr op1, final Expr op2) { - return And(ImmutableList.of(op1, op2)); - } - - public static Expr And( - final Expr op1, final Expr op2, final Expr op3) { - return And(ImmutableList.of(op1, op2, op3)); - } - - public static Expr And( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4) { - return And(ImmutableList.of(op1, op2, op3, op4)); - } - - public static Expr And( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4, - final Expr op5) { - return And(ImmutableList.of(op1, op2, op3, op4, op5)); - } - - //// - - public static Expr Or(final Expr op1, final Expr op2) { - return Or(ImmutableList.of(op1, op2)); - } - - public static Expr Or( - final Expr op1, final Expr op2, final Expr op3) { - return Or(ImmutableList.of(op1, op2, op3)); - } - - public static Expr Or( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4) { - return Or(ImmutableList.of(op1, op2, op3, op4)); - } - - public static Expr Or( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4, - final Expr op5) { - return Or(ImmutableList.of(op1, op2, op3, op4, op5)); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/TrueExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/TrueExpr.java deleted file mode 100644 index a411c7bf73..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/TrueExpr.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; - -import hu.bme.mit.theta.core.model.Valuation; - -public final class TrueExpr extends BoolLitExpr { - - private static final TrueExpr INSTANCE = new TrueExpr(); - private static final int HASH_SEED = 242181; - private static final String OPERATOR = "true"; - - private TrueExpr() {} - - public static TrueExpr getInstance() { - return INSTANCE; - } - - @Override - public boolean getValue() { - return true; - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - return this; - } - - @Override - public int hashCode() { - return HASH_SEED; - } - - @Override - public boolean equals(final Object obj) { - return (obj != null && this.getClass() == obj.getClass()); - } - - @Override - public String toString() { - return OPERATOR; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.java deleted file mode 100644 index 940609473f..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; - -public final class XorExpr extends NeqExpr { - - private static final int HASH_SEED = 937; - - private static final String OPERATOR_LABEL = "xor"; - - private XorExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static XorExpr of(final Expr leftOp, final Expr rightOp) { - return new XorExpr(leftOp, rightOp); - } - - public static XorExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Bool()); - final Expr newRightOp = cast(rightOp, Bool()); - return XorExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BoolLitExpr leftOpVal = (BoolLitExpr) getLeftOp().eval(val); - final BoolLitExpr rightOpVal = (BoolLitExpr) getRightOp().eval(val); - return Bool(leftOpVal.getValue() != rightOpVal.getValue()); - } - - @Override - public BinaryExpr with( - final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return XorExpr.of(leftOp, rightOp); - } - } - - @Override - public BinaryExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BinaryExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final XorExpr that = (XorExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.java deleted file mode 100644 index 35e52f87e8..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.AddExpr; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; - -public final class BvAddExpr extends AddExpr { - - private static final int HASH_SEED = 6586; - private static final String OPERATOR_LABEL = "bvadd"; - - private BvAddExpr(final Iterable> ops) { - super(ops); - checkAllTypesEqual(ops); - } - - public static BvAddExpr of(final Iterable> ops) { - return new BvAddExpr(ops); - } - - public static BvAddExpr create(final List> ops) { - checkNotNull(ops); - return BvAddExpr.of(ops.stream().map(TypeUtils::castBv).collect(toImmutableList())); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - return getOps().stream() - .skip(1) - .reduce( - (BvLitExpr) getOps().get(0).eval(val), - (op1, op2) -> (op1.add((BvLitExpr) op2.eval(val))), - BvLitExpr::add); - } - - @Override - public BvAddExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return BvAddExpr.of(ops); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvAddExpr that = (BvAddExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.java deleted file mode 100644 index 9139a6a705..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.MultiaryExpr; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; - -public final class BvAndExpr extends MultiaryExpr { - - private static final int HASH_SEED = 9125; - private static final String OPERATOR_LABEL = "bvand"; - - private BvAndExpr(final Iterable> ops) { - super(ops); - checkAllTypesEqual(ops); - } - - public static BvAndExpr of(final Iterable> ops) { - return new BvAndExpr(ops); - } - - public static BvAndExpr create(final List> ops) { - checkNotNull(ops); - return BvAndExpr.of(ops.stream().map(TypeUtils::castBv).collect(toImmutableList())); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - return getOps().stream() - .skip(1) - .reduce( - (BvLitExpr) getOps().get(0).eval(val), - (op1, op2) -> (op1.and((BvLitExpr) op2.eval(val))), - BvLitExpr::and); - } - - @Override - public BvAndExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return BvAndExpr.of(ops); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvAndExpr that = (BvAndExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.java deleted file mode 100644 index 8b7c7130b6..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; - -public final class BvArithShiftRightExpr extends BinaryExpr { - - private static final int HASH_SEED = 965; - private static final String OPERATOR_LABEL = "bvashr"; - - private BvArithShiftRightExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvArithShiftRightExpr of(final Expr leftOp, final Expr rightOp) { - return new BvArithShiftRightExpr(leftOp, rightOp); - } - - public static BvArithShiftRightExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvArithShiftRightExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.arithShiftRight(rightOpVal); - } - - @Override - public BvArithShiftRightExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvArithShiftRightExpr.of(leftOp, rightOp); - } - } - - @Override - public BvArithShiftRightExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvArithShiftRightExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvArithShiftRightExpr that = (BvArithShiftRightExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.java deleted file mode 100644 index c8797e8c4b..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; - -public final class BvConcatExpr implements Expr { - - private static final int HASH_SEED = 8264; - private static final String OPERATOR_LABEL = "++"; - - private final List> ops; - - private volatile int hashCode = 0; - - private BvConcatExpr(final Iterable> ops) { - checkNotNull(ops); - checkArgument(ops.iterator().hasNext()); - this.ops = ImmutableList.copyOf(ops); - } - - public static BvConcatExpr of(final Iterable> ops) { - return new BvConcatExpr(ops); - } - - public static BvConcatExpr create(final List> ops) { - checkNotNull(ops); - return BvConcatExpr.of(ops.stream().map(TypeUtils::castBv).collect(toImmutableList())); - } - - @Override - public int getArity() { - return ops.size(); - } - - @Override - public BvType getType() { - return BvType.of(ops.stream().map(o -> o.getType().getSize()).reduce(0, Integer::sum)); - } - - @Override - public BvLitExpr eval(final Valuation val) { - return getOps().stream() - .skip(1) - .reduce( - (BvLitExpr) getOps().get(0).eval(val), - (op1, op2) -> (op1.concat((BvLitExpr) op2.eval(val))), - BvLitExpr::concat); - } - - @Override - public List> getOps() { - return ops; - } - - @Override - public Expr withOps(List> ops) { - checkNotNull(ops); - checkArgument(ops.size() >= 1); - - return of(ops.stream().map(TypeUtils::castBv).collect(toImmutableList())); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + getOps().hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvConcatExpr that = (BvConcatExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL).body().addAll(getOps()).toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.java deleted file mode 100644 index 9accdbc1ec..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class BvEqExpr extends EqExpr { - - private static final int HASH_SEED = 2487; - private static final String OPERATOR_LABEL = "="; - - private BvEqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvEqExpr of(final Expr leftOp, final Expr rightOp) { - return new BvEqExpr(leftOp, rightOp); - } - - public static BvEqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvEqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - - return leftOpVal.eq(rightOpVal); - } - - @Override - public BvEqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvEqExpr.of(leftOp, rightOp); - } - } - - @Override - public BvEqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvEqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvEqExpr that = (BvEqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.java deleted file mode 100644 index 56e1358f5d..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.inttype.IntLitExpr; -import java.util.List; - -public final class BvExprs { - - private BvExprs() {} - - public static BvType BvType(final int size, final Boolean signedness) { - return BvType.of(size, signedness); - } - - public static BvType BvType(final int size) { - return BvType(size, null); - } - - public static BvLitExpr Bv(final boolean[] value, final Boolean signedness) { - return BvLitExpr.of(value, signedness); - } - - public static BvLitExpr Bv(final boolean[] value) { - return Bv(value, null); - } - - public static BvConcatExpr Concat(final Iterable> ops) { - return BvConcatExpr.of(ops); - } - - public static BvExtractExpr Extract( - final Expr bitvec, final IntLitExpr from, final IntLitExpr until) { - return BvExtractExpr.of(bitvec, from, until); - } - - public static BvZExtExpr ZExt(final Expr bitvec, final BvType extendType) { - return BvZExtExpr.of(bitvec, extendType); - } - - public static BvSExtExpr SExt(final Expr bitvec, final BvType extendType) { - return BvSExtExpr.of(bitvec, extendType); - } - - public static BvAddExpr Add(final Iterable> ops) { - return BvAddExpr.of(ops); - } - - public static BvSubExpr Sub(final Expr leftOp, final Expr rightOp) { - return BvSubExpr.of(leftOp, rightOp); - } - - public static BvPosExpr Pos(final Expr op) { - return BvPosExpr.of(op); - } - - public static BvNegExpr Neg(final Expr op) { - return BvNegExpr.of(op); - } - - public static BvMulExpr Mul(final Iterable> ops) { - return BvMulExpr.of(ops); - } - - public static BvUDivExpr UDiv(final Expr leftOp, final Expr rightOp) { - return BvUDivExpr.of(leftOp, rightOp); - } - - public static BvSDivExpr SDiv(final Expr leftOp, final Expr rightOp) { - return BvSDivExpr.of(leftOp, rightOp); - } - - public static BvSModExpr SMod(final Expr leftOp, final Expr rightOp) { - return BvSModExpr.of(leftOp, rightOp); - } - - public static BvURemExpr URem(final Expr leftOp, final Expr rightOp) { - return BvURemExpr.of(leftOp, rightOp); - } - - public static BvSRemExpr SRem(final Expr leftOp, final Expr rightOp) { - return BvSRemExpr.of(leftOp, rightOp); - } - - public static BvOrExpr Or(final List> ops) { - return BvOrExpr.of(ops); - } - - public static BvAndExpr And(final List> ops) { - return BvAndExpr.of(ops); - } - - public static BvXorExpr Xor(final List> ops) { - return BvXorExpr.of(ops); - } - - public static BvNotExpr Not(final Expr op) { - return BvNotExpr.of(op); - } - - public static BvShiftLeftExpr ShiftLeft(final Expr leftOp, final Expr rightOp) { - return BvShiftLeftExpr.of(leftOp, rightOp); - } - - public static BvArithShiftRightExpr ArithShiftRight( - final Expr leftOp, final Expr rightOp) { - return BvArithShiftRightExpr.of(leftOp, rightOp); - } - - public static BvLogicShiftRightExpr LogicShiftRight( - final Expr leftOp, final Expr rightOp) { - return BvLogicShiftRightExpr.of(leftOp, rightOp); - } - - public static BvRotateLeftExpr RotateLeft( - final Expr leftOp, final Expr rightOp) { - return BvRotateLeftExpr.of(leftOp, rightOp); - } - - public static BvRotateRightExpr RotateRight( - final Expr leftOp, final Expr rightOp) { - return BvRotateRightExpr.of(leftOp, rightOp); - } - - public static BvEqExpr Eq(final Expr leftOp, final Expr rightOp) { - return BvEqExpr.of(leftOp, rightOp); - } - - public static BvNeqExpr Neq(final Expr leftOp, final Expr rightOp) { - return BvNeqExpr.of(leftOp, rightOp); - } - - public static BvULtExpr ULt(final Expr leftOp, final Expr rightOp) { - return BvULtExpr.of(leftOp, rightOp); - } - - public static BvULeqExpr ULeq(final Expr leftOp, final Expr rightOp) { - return BvULeqExpr.of(leftOp, rightOp); - } - - public static BvUGtExpr UGt(final Expr leftOp, final Expr rightOp) { - return BvUGtExpr.of(leftOp, rightOp); - } - - public static BvUGeqExpr UGeq(final Expr leftOp, final Expr rightOp) { - return BvUGeqExpr.of(leftOp, rightOp); - } - - public static BvSLtExpr SLt(final Expr leftOp, final Expr rightOp) { - return BvSLtExpr.of(leftOp, rightOp); - } - - public static BvSLeqExpr SLeq(final Expr leftOp, final Expr rightOp) { - return BvSLeqExpr.of(leftOp, rightOp); - } - - public static BvSGtExpr SGt(final Expr leftOp, final Expr rightOp) { - return BvSGtExpr.of(leftOp, rightOp); - } - - public static BvSGeqExpr SGeq(final Expr leftOp, final Expr rightOp) { - return BvSGeqExpr.of(leftOp, rightOp); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.java deleted file mode 100644 index 3786d3a35b..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.inttype.IntLitExpr; -import java.math.BigInteger; -import java.util.List; - -public final class BvExtractExpr implements Expr { - - private static final int HASH_SEED = 6586; - private static final String OPERATOR_LABEL = "extract"; - - private final Expr bitvec; - private final IntLitExpr from; - private final IntLitExpr until; - - private volatile int hashCode = 0; - - private BvExtractExpr( - final Expr bitvec, final IntLitExpr from, final IntLitExpr until) { - checkNotNull(bitvec); - checkNotNull(from); - checkNotNull(until); - checkArgument(from.getValue().compareTo(BigInteger.ZERO) >= 0); - checkArgument(until.getValue().compareTo(BigInteger.ZERO) >= 0); - checkArgument(until.getValue().compareTo(from.getValue()) > 0); - - this.bitvec = bitvec; - this.from = from; - this.until = until; - } - - public static BvExtractExpr of( - final Expr bitvec, final IntLitExpr from, final IntLitExpr until) { - return new BvExtractExpr(bitvec, from, until); - } - - public static BvExtractExpr create( - final Expr bitvec, final Expr from, final Expr until) { - final Expr newBitvec = castBv(bitvec); - final IntLitExpr newFrom = (IntLitExpr) cast(from, Int()); - final IntLitExpr newUntil = (IntLitExpr) cast(until, Int()); - return BvExtractExpr.of(newBitvec, newFrom, newUntil); - } - - public Expr getBitvec() { - return bitvec; - } - - public IntLitExpr getFrom() { - return from; - } - - public IntLitExpr getUntil() { - return until; - } - - @Override - public List> getOps() { - return ImmutableList.of(bitvec, from, until); - } - - @Override - public int getArity() { - return 3; - } - - @Override - public BvType getType() { - return bitvec.getType().withSize(until.getValue().subtract(from.getValue()).intValue()); - } - - @Override - public LitExpr eval(Valuation val) { - final BvLitExpr bvLitExpr = (BvLitExpr) bitvec.eval(val); - return bvLitExpr.extract(from, until); - } - - @Override - public Expr withOps(List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 3); - final Expr newBitvec = castBv(ops.get(0)); - final IntLitExpr newFrom = (IntLitExpr) cast(ops.get(1), Int()); - final IntLitExpr newUntil = (IntLitExpr) cast(ops.get(2), Int()); - - if (bitvec.equals(newBitvec) && from.equals(newFrom) && until.equals(newUntil)) { - return this; - } else { - return of(newBitvec, newFrom, newUntil); - } - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + bitvec.hashCode(); - result = 31 * result + from.hashCode(); - result = 31 * result + until.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvExtractExpr that = (BvExtractExpr) obj; - return this.getBitvec().equals(that.getBitvec()) - && this.getFrom().equals(that.getFrom()) - && this.getUntil().equals(that.getUntil()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .add(getBitvec()) - .add(getFrom()) - .add(getUntil()) - .toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.java deleted file mode 100644 index cdd88db510..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.java +++ /dev/null @@ -1,436 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; -import static hu.bme.mit.theta.core.utils.BvUtils.bigIntegerToNeutralBvLitExpr; -import static hu.bme.mit.theta.core.utils.BvUtils.bigIntegerToSignedBvLitExpr; -import static hu.bme.mit.theta.core.utils.BvUtils.bigIntegerToUnsignedBvLitExpr; -import static hu.bme.mit.theta.core.utils.BvUtils.fitBigIntegerIntoNeutralDomain; -import static hu.bme.mit.theta.core.utils.BvUtils.fitBigIntegerIntoSignedDomain; -import static hu.bme.mit.theta.core.utils.BvUtils.fitBigIntegerIntoUnsignedDomain; -import static hu.bme.mit.theta.core.utils.BvUtils.neutralBvLitExprToBigInteger; -import static hu.bme.mit.theta.core.utils.BvUtils.signedBvLitExprToBigInteger; -import static hu.bme.mit.theta.core.utils.BvUtils.unsignedBvLitExprToBigInteger; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.inttype.IntLitExpr; -import hu.bme.mit.theta.core.utils.BvUtils; -import java.math.BigInteger; -import java.util.Arrays; - -public final class BvLitExpr extends NullaryExpr - implements LitExpr, Comparable { - - private static final int HASH_SEED = 5624; - private volatile int hashCode = 0; - - private final boolean[] value; - private final Boolean signed; - - private BvLitExpr(final boolean[] value, final Boolean signed) { - this.signed = signed; - checkNotNull(value); - checkArgument(value.length > 0, "Bitvector must have positive size"); - - this.value = value; - } - - public static BvLitExpr of(final boolean[] value, final Boolean signed) { - return new BvLitExpr(value, signed); - } - - public static BvLitExpr of(final boolean[] value) { - return of(value, null); - } - - public boolean[] getValue() { - return value; - } - - @Override - public BvType getType() { - return BvType(value.length, signed); - } - - @Override - public LitExpr eval(Valuation val) { - return this; - } - - public BvLitExpr concat(final BvLitExpr that) { - boolean[] concated = new boolean[this.getType().getSize() + that.getType().getSize()]; - for (int i = 0; i < this.getType().getSize(); i++) { - concated[i] = this.getValue()[i]; - } - for (int i = 0; i < that.getType().getSize(); i++) { - concated[this.getType().getSize() + i] = that.getValue()[i]; - } - return Bv(concated); - } - - public BvLitExpr extract(final IntLitExpr from, final IntLitExpr until) { - final int fromValue = from.getValue().intValue(); - final int untilValue = until.getValue().intValue(); - checkArgument(fromValue >= 0); - checkArgument(untilValue >= 0); - checkArgument(untilValue > fromValue); - - boolean[] extracted = new boolean[untilValue - fromValue]; - for (int i = 0; i < extracted.length; i++) { - extracted[extracted.length - i - 1] = - this.getValue()[this.getValue().length - (fromValue + i) - 1]; - } - return Bv(extracted); - } - - public BvLitExpr zext(final BvType extendType) { - checkArgument(extendType.getSize() >= this.getType().getSize()); - - boolean[] extended = new boolean[extendType.getSize()]; - for (int i = 0; i < this.getValue().length; i++) { - extended[extended.length - i - 1] = this.getValue()[this.getValue().length - i - 1]; - } - for (int i = 0; i < extendType.getSize() - this.getType().getSize(); i++) { - extended[i] = false; - } - return Bv(extended); - } - - public BvLitExpr sext(final BvType extendType) { - checkArgument(extendType.getSize() >= this.getType().getSize()); - - boolean[] extended = new boolean[extendType.getSize()]; - for (int i = 0; i < this.getValue().length; i++) { - extended[extended.length - i - 1] = this.getValue()[this.getValue().length - i - 1]; - } - for (int i = 0; i < extendType.getSize() - this.getType().getSize(); i++) { - extended[i] = this.getValue()[0]; - } - return Bv(extended); - } - - public BvLitExpr add(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - BigInteger sum = neutralBvLitExprToBigInteger(this).add(neutralBvLitExprToBigInteger(that)); - sum = fitBigIntegerIntoNeutralDomain(sum, getType().getSize()); - return bigIntegerToNeutralBvLitExpr(sum, getType().getSize()); - } - - public BvLitExpr sub(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - BigInteger sub = - neutralBvLitExprToBigInteger(this).subtract(neutralBvLitExprToBigInteger(that)); - sub = fitBigIntegerIntoNeutralDomain(sub, getType().getSize()); - return bigIntegerToNeutralBvLitExpr(sub, getType().getSize()); - } - - public BvLitExpr mul(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - BigInteger prod = - neutralBvLitExprToBigInteger(this).multiply(neutralBvLitExprToBigInteger(that)); - prod = fitBigIntegerIntoNeutralDomain(prod, getType().getSize()); - return bigIntegerToNeutralBvLitExpr(prod, getType().getSize()); - } - - public BvLitExpr pos() { - BigInteger pos = signedBvLitExprToBigInteger(this); - pos = fitBigIntegerIntoSignedDomain(pos, getType().getSize()); - return bigIntegerToSignedBvLitExpr(pos, getType().getSize()); - } - - public BvLitExpr neg() { - BigInteger neg = signedBvLitExprToBigInteger(this).negate(); - neg = fitBigIntegerIntoSignedDomain(neg, getType().getSize()); - return bigIntegerToSignedBvLitExpr(neg, getType().getSize()); - } - - public BvLitExpr udiv(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - BigInteger div = - unsignedBvLitExprToBigInteger(this).divide(unsignedBvLitExprToBigInteger(that)); - div = fitBigIntegerIntoUnsignedDomain(div, getType().getSize()); - return bigIntegerToUnsignedBvLitExpr(div, getType().getSize()); - } - - public BvLitExpr sdiv(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - BigInteger div = - signedBvLitExprToBigInteger(this).divide(signedBvLitExprToBigInteger(that)); - div = fitBigIntegerIntoSignedDomain(div, getType().getSize()); - return bigIntegerToSignedBvLitExpr(div, getType().getSize()); - } - - public BvLitExpr and(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - BigInteger and = neutralBvLitExprToBigInteger(this).and(neutralBvLitExprToBigInteger(that)); - return bigIntegerToNeutralBvLitExpr(and, getType().getSize()); - } - - public BvLitExpr or(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - BigInteger or = neutralBvLitExprToBigInteger(this).or(neutralBvLitExprToBigInteger(that)); - return bigIntegerToNeutralBvLitExpr(or, getType().getSize()); - } - - public BvLitExpr xor(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - BigInteger xor = neutralBvLitExprToBigInteger(this).xor(neutralBvLitExprToBigInteger(that)); - return bigIntegerToNeutralBvLitExpr(xor, getType().getSize()); - } - - public BvLitExpr not() { - BigInteger not = neutralBvLitExprToBigInteger(this).not(); - return bigIntegerToNeutralBvLitExpr(not, getType().getSize()); - } - - public BvLitExpr shiftLeft(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - - boolean[] shifted = Arrays.copyOf(this.getValue(), this.getValue().length); - for (BigInteger i = BigInteger.ZERO; - i.compareTo(neutralBvLitExprToBigInteger(that)) < 0; - i = i.add(BigInteger.ONE)) { - for (int j = 0; j < shifted.length - 1; j++) { - shifted[j] = shifted[j + 1]; - } - shifted[shifted.length - 1] = false; - } - return Bv(shifted); - } - - public BvLitExpr arithShiftRight(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - - boolean[] shifted = Arrays.copyOf(this.getValue(), this.getValue().length); - boolean insert = shifted[0]; - for (BigInteger i = BigInteger.ZERO; - i.compareTo(neutralBvLitExprToBigInteger(that)) < 0; - i = i.add(BigInteger.ONE)) { - for (int j = shifted.length - 1; j > 0; j--) { - shifted[j] = shifted[j - 1]; - } - shifted[0] = insert; - } - return Bv(shifted); - } - - public BvLitExpr logicShiftRight(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - - boolean[] shifted = Arrays.copyOf(this.getValue(), this.getValue().length); - boolean insert = false; - for (BigInteger i = BigInteger.ZERO; - i.compareTo(neutralBvLitExprToBigInteger(that)) < 0; - i = i.add(BigInteger.ONE)) { - for (int j = shifted.length - 1; j > 0; j--) { - shifted[j] = shifted[j - 1]; - } - shifted[0] = insert; - } - return Bv(shifted); - } - - public BvLitExpr rotateLeft(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - - boolean[] shifted = Arrays.copyOf(this.getValue(), this.getValue().length); - for (BigInteger i = BigInteger.ZERO; - i.compareTo(neutralBvLitExprToBigInteger(that)) < 0; - i = i.add(BigInteger.ONE)) { - boolean rotated = shifted[0]; - for (int j = 0; j < shifted.length - 1; j++) { - shifted[j] = shifted[j + 1]; - } - shifted[shifted.length - 1] = rotated; - } - return Bv(shifted); - } - - public BvLitExpr rotateRight(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - - boolean[] shifted = Arrays.copyOf(this.getValue(), this.getValue().length); - for (BigInteger i = BigInteger.ZERO; - i.compareTo(neutralBvLitExprToBigInteger(that)) < 0; - i = i.add(BigInteger.ONE)) { - boolean rotated = shifted[shifted.length - 1]; - for (int j = shifted.length - 1; j > 0; j--) { - shifted[j] = shifted[j - 1]; - } - shifted[0] = rotated; - } - return Bv(shifted); - } - - public BvLitExpr smod(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - // Always positive semantics: - // 5 mod 3 = 2 - // 5 mod -3 = 2 - // -5 mod 3 = 1 - // -5 mod -3 = 1 - BigInteger result = - signedBvLitExprToBigInteger(this).mod(signedBvLitExprToBigInteger(that)); - if (result.compareTo(BigInteger.ZERO) < 0) { - result = result.add(signedBvLitExprToBigInteger(that).abs()); - } - assert result.compareTo(BigInteger.ZERO) >= 0; - return bigIntegerToSignedBvLitExpr(result, getType().getSize()); - } - - public BvLitExpr urem(final BvLitExpr that) { - // Semantics: - // 5 rem 3 = 2 - BigInteger thisInt = signedBvLitExprToBigInteger(this); - BigInteger thatInt = signedBvLitExprToBigInteger(that); - return bigIntegerToSignedBvLitExpr(thisInt.mod(thatInt), getType().getSize()); - } - - public BvLitExpr srem(final BvLitExpr that) { - // Semantics: - // 5 rem 3 = 2 - // 5 rem -3 = 2 - // -5 rem 3 = -1 - // -5 rem -3 = -1 - BigInteger thisInt = BvUtils.signedBvLitExprToBigInteger(this); - BigInteger thatInt = BvUtils.signedBvLitExprToBigInteger(that); - BigInteger thisAbs = thisInt.abs(); - BigInteger thatAbs = thatInt.abs(); - if (thisInt.compareTo(BigInteger.ZERO) < 0 && thatInt.compareTo(BigInteger.ZERO) < 0) { - return bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs).negate(), getType().getSize()); - } else if (thisInt.compareTo(BigInteger.ZERO) >= 0 - && thatInt.compareTo(BigInteger.ZERO) < 0) { - return bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs), getType().getSize()); - } else if (thisInt.compareTo(BigInteger.ZERO) < 0 - && thatInt.compareTo(BigInteger.ZERO) >= 0) { - return bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs).negate(), getType().getSize()); - } else { - return bigIntegerToSignedBvLitExpr(thisInt.mod(thatInt), getType().getSize()); - } - } - - public BoolLitExpr eq(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - return Bool(Arrays.equals(this.getValue(), that.getValue())); - } - - public BoolLitExpr neq(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - return Bool(!Arrays.equals(this.getValue(), that.getValue())); - } - - public BoolLitExpr ult(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - return Bool( - unsignedBvLitExprToBigInteger(this).compareTo(unsignedBvLitExprToBigInteger(that)) - < 0); - } - - public BoolLitExpr ule(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - return Bool( - unsignedBvLitExprToBigInteger(this).compareTo(unsignedBvLitExprToBigInteger(that)) - <= 0); - } - - public BoolLitExpr ugt(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - return Bool( - unsignedBvLitExprToBigInteger(this).compareTo(unsignedBvLitExprToBigInteger(that)) - > 0); - } - - public BoolLitExpr uge(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - return Bool( - unsignedBvLitExprToBigInteger(this).compareTo(unsignedBvLitExprToBigInteger(that)) - >= 0); - } - - public BoolLitExpr slt(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - return Bool( - signedBvLitExprToBigInteger(this).compareTo(signedBvLitExprToBigInteger(that)) < 0); - } - - public BoolLitExpr sle(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - return Bool( - signedBvLitExprToBigInteger(this).compareTo(signedBvLitExprToBigInteger(that)) - <= 0); - } - - public BoolLitExpr sgt(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - return Bool( - signedBvLitExprToBigInteger(this).compareTo(signedBvLitExprToBigInteger(that)) > 0); - } - - public BoolLitExpr sge(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - return Bool( - signedBvLitExprToBigInteger(this).compareTo(signedBvLitExprToBigInteger(that)) - >= 0); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + Arrays.hashCode(value); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvLitExpr that = (BvLitExpr) obj; - return Arrays.equals(this.value, that.value); - } else { - return false; - } - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder(); - // sb.append(getType().getSize()); - sb.append("#b"); - for (boolean bit : value) { - sb.append(bit ? "1" : "0"); - } - return sb.toString(); - } - - @Override - public int compareTo(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - return neutralBvLitExprToBigInteger(this).compareTo(neutralBvLitExprToBigInteger(that)); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.java deleted file mode 100644 index d4fd45089b..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; - -public final class BvLogicShiftRightExpr extends BinaryExpr { - - private static final int HASH_SEED = 962; - private static final String OPERATOR_LABEL = "bvlshr"; - - private BvLogicShiftRightExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvLogicShiftRightExpr of(final Expr leftOp, final Expr rightOp) { - return new BvLogicShiftRightExpr(leftOp, rightOp); - } - - public static BvLogicShiftRightExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvLogicShiftRightExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.logicShiftRight(rightOpVal); - } - - @Override - public BvLogicShiftRightExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvLogicShiftRightExpr.of(leftOp, rightOp); - } - } - - @Override - public BvLogicShiftRightExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvLogicShiftRightExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvLogicShiftRightExpr that = (BvLogicShiftRightExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.java deleted file mode 100644 index 92a12a7599..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.MulExpr; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; - -public final class BvMulExpr extends MulExpr { - - private static final int HASH_SEED = 9825; - private static final String OPERATOR_LABEL = "bvmul"; - - private BvMulExpr(final Iterable> ops) { - super(ops); - checkAllTypesEqual(ops); - } - - public static BvMulExpr of(final Iterable> ops) { - return new BvMulExpr(ops); - } - - public static BvMulExpr create(final List> ops) { - checkNotNull(ops); - return BvMulExpr.of(ops.stream().map(TypeUtils::castBv).collect(toImmutableList())); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - return getOps().stream() - .skip(1) - .reduce( - (BvLitExpr) getOps().get(0).eval(val), - (op1, op2) -> (op1.mul((BvLitExpr) op2.eval(val))), - BvLitExpr::mul); - } - - @Override - public BvMulExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return BvMulExpr.of(ops); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvMulExpr that = (BvMulExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.java deleted file mode 100644 index cc1b6de612..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.NegExpr; - -public final class BvNegExpr extends NegExpr { - - private static final int HASH_SEED = 8325; - private static final String OPERATOR_LABEL = "bvneg"; - - private BvNegExpr(final Expr op) { - super(op); - } - - public static BvNegExpr of(final Expr op) { - return new BvNegExpr(op); - } - - public static BvNegExpr create(final Expr op) { - final Expr newOp = castBv(op); - return BvNegExpr.of(newOp); - } - - @Override - public BvType getType() { - return getOp().getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr opVal = (BvLitExpr) getOp().eval(val); - return opVal.neg(); - } - - @Override - public BvNegExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return BvNegExpr.of(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvNegExpr that = (BvNegExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.java deleted file mode 100644 index c9db1875c1..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class BvNeqExpr extends NeqExpr { - - private static final int HASH_SEED = 2488; - private static final String OPERATOR_LABEL = "/="; - - private BvNeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvNeqExpr of(final Expr leftOp, final Expr rightOp) { - return new BvNeqExpr(leftOp, rightOp); - } - - public static BvNeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvNeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - - return leftOpVal.neq(rightOpVal); - } - - @Override - public BvNeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvNeqExpr.of(leftOp, rightOp); - } - } - - @Override - public BvNeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvNeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvNeqExpr that = (BvNeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.java deleted file mode 100644 index f4132cf51d..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; - -public final class BvNotExpr extends UnaryExpr { - - private static final int HASH_SEED = 1527; - private static final String OPERATOR_LABEL = "bvnot"; - - private BvNotExpr(final Expr op) { - super(op); - } - - public static BvNotExpr of(final Expr op) { - return new BvNotExpr(op); - } - - public static BvNotExpr create(final Expr op) { - final Expr newOp = castBv(op); - return BvNotExpr.of(newOp); - } - - @Override - public BvType getType() { - return getOp().getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr opVal = (BvLitExpr) getOp().eval(val); - return opVal.not(); - } - - @Override - public BvNotExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return BvNotExpr.of(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvNotExpr that = (BvNotExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.java deleted file mode 100644 index 32fd5b8507..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.MultiaryExpr; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; - -public final class BvOrExpr extends MultiaryExpr { - - private static final int HASH_SEED = 2745; - private static final String OPERATOR_LABEL = "bvor"; - - private BvOrExpr(final Iterable> ops) { - super(ops); - checkAllTypesEqual(ops); - } - - public static BvOrExpr of(final Iterable> ops) { - return new BvOrExpr(ops); - } - - public static BvOrExpr create(final List> ops) { - checkNotNull(ops); - return BvOrExpr.of(ops.stream().map(TypeUtils::castBv).collect(toImmutableList())); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - return getOps().stream() - .skip(1) - .reduce( - (BvLitExpr) getOps().get(0).eval(val), - (op1, op2) -> (op1.or((BvLitExpr) op2.eval(val))), - BvLitExpr::or); - } - - @Override - public BvOrExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return BvOrExpr.of(ops); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvOrExpr that = (BvOrExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.java deleted file mode 100644 index 8ab76b35bf..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.PosExpr; - -public final class BvPosExpr extends PosExpr { - - private static final int HASH_SEED = 8962; - private static final String OPERATOR_LABEL = "bvpos"; - - private BvPosExpr(final Expr op) { - super(op); - } - - public static BvPosExpr of(final Expr op) { - return new BvPosExpr(op); - } - - public static BvPosExpr create(final Expr op) { - final Expr newOp = castBv(op); - return BvPosExpr.of(newOp); - } - - @Override - public BvType getType() { - return getOp().getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr opVal = (BvLitExpr) getOp().eval(val); - return opVal.pos(); - } - - @Override - public BvPosExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return BvPosExpr.of(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvPosExpr that = (BvPosExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.java deleted file mode 100644 index a61b63aacf..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; - -public final class BvRotateLeftExpr extends BinaryExpr { - - private static final int HASH_SEED = 4282; - private static final String OPERATOR_LABEL = "bvrol"; - - private BvRotateLeftExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvRotateLeftExpr of(final Expr leftOp, final Expr rightOp) { - return new BvRotateLeftExpr(leftOp, rightOp); - } - - public static BvRotateLeftExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvRotateLeftExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.rotateLeft(rightOpVal); - } - - @Override - public BvRotateLeftExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvRotateLeftExpr.of(leftOp, rightOp); - } - } - - @Override - public BvRotateLeftExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvRotateLeftExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvRotateLeftExpr that = (BvRotateLeftExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.java deleted file mode 100644 index 5aaa5acb4f..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; - -public final class BvRotateRightExpr extends BinaryExpr { - - private static final int HASH_SEED = 2564; - private static final String OPERATOR_LABEL = "bvror"; - - private BvRotateRightExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvRotateRightExpr of(final Expr leftOp, final Expr rightOp) { - return new BvRotateRightExpr(leftOp, rightOp); - } - - public static BvRotateRightExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvRotateRightExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.rotateRight(rightOpVal); - } - - @Override - public BvRotateRightExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvRotateRightExpr.of(leftOp, rightOp); - } - } - - @Override - public BvRotateRightExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvRotateRightExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvRotateRightExpr that = (BvRotateRightExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.java deleted file mode 100644 index d562041f00..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.DivExpr; - -public final class BvSDivExpr extends DivExpr { - - private static final int HASH_SEED = 9830; - - private static final String OPERATOR_LABEL = "bvsdiv"; - - private BvSDivExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvSDivExpr of(final Expr leftOp, final Expr rightOp) { - return new BvSDivExpr(leftOp, rightOp); - } - - public static BvSDivExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvSDivExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - - return leftOpVal.sdiv(rightOpVal); - } - - @Override - public BvSDivExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvSDivExpr.of(leftOp, rightOp); - } - } - - @Override - public BvSDivExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvSDivExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSDivExpr that = (BvSDivExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.java deleted file mode 100644 index fe0eebe8b0..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import java.util.List; - -public final class BvSExtExpr implements Expr { - - private static final int HASH_SEED = 6126; - private static final String OPERATOR_LABEL = "bv_sign_extend"; - - private final Expr op; - private final BvType extendType; - - private volatile int hashCode = 0; - - private BvSExtExpr(final Expr op, final BvType extendType) { - checkNotNull(op); - checkNotNull(extendType); - checkArgument(extendType.getSize() >= op.getType().getSize()); - - this.op = op; - this.extendType = extendType; - } - - public static BvSExtExpr of(final Expr op, final BvType extendType) { - return new BvSExtExpr(op, extendType); - } - - public static BvSExtExpr create(final Expr op, final BvType extendType) { - return new BvSExtExpr(castBv(op), extendType); - } - - public Expr getOp() { - return op; - } - - public BvType getExtendType() { - return extendType; - } - - @Override - public int getArity() { - return 1; - } - - @Override - public BvType getType() { - return extendType; - } - - @Override - public LitExpr eval(Valuation val) { - final BvLitExpr bvLitExpr = (BvLitExpr) op.eval(val); - return bvLitExpr.sext(extendType); - } - - @Override - public List> getOps() { - return ImmutableList.of(op); - } - - @Override - public Expr withOps(List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 1); - final Expr newBitvec = castBv(ops.get(0)); - return of(newBitvec, extendType); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + op.hashCode(); - result = 31 * result + extendType.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSExtExpr that = (BvSExtExpr) obj; - return this.getOps().equals(that.getOps()) && this.getType().equals(that.getType()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .add(getOp()) - .add(getType()) - .toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.java deleted file mode 100644 index 19df57e9ce..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.GeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class BvSGeqExpr extends GeqExpr { - - private static final int HASH_SEED = 6234; - private static final String OPERATOR_LABEL = "bvsge"; - - private BvSGeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvSGeqExpr of(final Expr leftOp, final Expr rightOp) { - return new BvSGeqExpr(leftOp, rightOp); - } - - public static BvSGeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvSGeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.sge(rightOpVal); - } - - @Override - public BvSGeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvSGeqExpr.of(leftOp, rightOp); - } - } - - @Override - public BvSGeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvSGeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSGeqExpr that = (BvSGeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.java deleted file mode 100644 index 7200247f8d..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.GtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class BvSGtExpr extends GtExpr { - - private static final int HASH_SEED = 6231; - private static final String OPERATOR_LABEL = "bvsgt"; - - private BvSGtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvSGtExpr of(final Expr leftOp, final Expr rightOp) { - return new BvSGtExpr(leftOp, rightOp); - } - - public static BvSGtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvSGtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.sgt(rightOpVal); - } - - @Override - public BvSGtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvSGtExpr.of(leftOp, rightOp); - } - } - - @Override - public BvSGtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvSGtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSGtExpr that = (BvSGtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.java deleted file mode 100644 index ff70b42471..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.LeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class BvSLeqExpr extends LeqExpr { - - private static final int HASH_SEED = 1458; - private static final String OPERATOR_LABEL = "bvsle"; - - private BvSLeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvSLeqExpr of(final Expr leftOp, final Expr rightOp) { - return new BvSLeqExpr(leftOp, rightOp); - } - - public static BvSLeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvSLeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.sle(rightOpVal); - } - - @Override - public BvSLeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvSLeqExpr.of(leftOp, rightOp); - } - } - - @Override - public BvSLeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvSLeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSLeqExpr that = (BvSLeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.java deleted file mode 100644 index 163a9e2aea..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.LtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class BvSLtExpr extends LtExpr { - - private static final int HASH_SEED = 2798; - private static final String OPERATOR_LABEL = "bvslt"; - - private BvSLtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvSLtExpr of(final Expr leftOp, final Expr rightOp) { - return new BvSLtExpr(leftOp, rightOp); - } - - public static BvSLtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvSLtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.slt(rightOpVal); - } - - @Override - public BvSLtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvSLtExpr.of(leftOp, rightOp); - } - } - - @Override - public BvSLtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvSLtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSLtExpr that = (BvSLtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.java deleted file mode 100644 index 207f4b8578..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.ModExpr; - -public final class BvSModExpr extends ModExpr { - - private static final int HASH_SEED = 1451; - private static final String OPERATOR_LABEL = "bvsmod"; - - private BvSModExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvSModExpr of(final Expr leftOp, final Expr rightOp) { - return new BvSModExpr(leftOp, rightOp); - } - - public static BvSModExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvSModExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.smod(rightOpVal); - } - - @Override - public BvSModExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvSModExpr.of(leftOp, rightOp); - } - } - - @Override - public BvSModExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvSModExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSModExpr that = (BvSModExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.java deleted file mode 100644 index 9741aa6ae0..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.RemExpr; - -public final class BvSRemExpr extends RemExpr { - - private static final int HASH_SEED = 985; - - private static final String OPERATOR_LABEL = "bvsrem"; - - private BvSRemExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvSRemExpr of(final Expr leftOp, final Expr rightOp) { - return new BvSRemExpr(leftOp, rightOp); - } - - public static BvSRemExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvSRemExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.srem(rightOpVal); - } - - @Override - public BvSRemExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvSRemExpr.of(leftOp, rightOp); - } - } - - @Override - public BvSRemExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvSRemExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSRemExpr that = (BvSRemExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.java deleted file mode 100644 index 2db425db64..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; - -public final class BvShiftLeftExpr extends BinaryExpr { - - private static final int HASH_SEED = 4288; - private static final String OPERATOR_LABEL = "bvshl"; - - private BvShiftLeftExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvShiftLeftExpr of(final Expr leftOp, final Expr rightOp) { - return new BvShiftLeftExpr(leftOp, rightOp); - } - - public static BvShiftLeftExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvShiftLeftExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.shiftLeft(rightOpVal); - } - - @Override - public BvShiftLeftExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvShiftLeftExpr.of(leftOp, rightOp); - } - } - - @Override - public BvShiftLeftExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvShiftLeftExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvShiftLeftExpr that = (BvShiftLeftExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.java deleted file mode 100644 index 25fd0a207d..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.PosExpr; - -public final class BvSignChangeExpr extends PosExpr { - - private static final int HASH_SEED = 8963; - private static final String OPERATOR_LABEL = "bvpos"; - - private final BvType newType; - - private BvSignChangeExpr(final Expr op, final BvType newType) { - super(op); - this.newType = newType; - } - - public static BvSignChangeExpr of(final Expr op, final BvType newType) { - return new BvSignChangeExpr(op, newType); - } - - public static BvSignChangeExpr create(final Expr op, final BvType newType) { - final Expr newOp = castBv(op); - return BvSignChangeExpr.of(newOp, newType); - } - - @Override - public BvType getType() { - return newType; - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr opVal = (BvLitExpr) getOp().eval(val); - return opVal.pos(); - } - - @Override - public BvSignChangeExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return BvSignChangeExpr.of(op, newType); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSignChangeExpr that = (BvSignChangeExpr) obj; - return this.getOp().equals(that.getOp()) && this.getType().equals(that.getType()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.java deleted file mode 100644 index 37a5d75509..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.SubExpr; - -public final class BvSubExpr extends SubExpr { - - private static final int HASH_SEED = 2567; - private static final String OPERATOR = "bvsub"; - - private BvSubExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvSubExpr of(final Expr leftOp, final Expr rightOp) { - return new BvSubExpr(leftOp, rightOp); - } - - public static BvSubExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvSubExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - - return leftOpVal.sub(rightOpVal); - } - - @Override - public BvSubExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvSubExpr.of(leftOp, rightOp); - } - } - - @Override - public BvSubExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvSubExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSubExpr that = (BvSubExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.java deleted file mode 100644 index dd43197b2d..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkState; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.FromBv; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.DomainSize; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.abstracttype.*; -import hu.bme.mit.theta.core.type.fptype.FpRoundingMode; -import hu.bme.mit.theta.core.type.fptype.FpType; -import java.math.BigInteger; - -public class BvType - implements Additive, - Multiplicative, - Divisible, - Equational, - Ordered, - Castable { - - private static final int HASH_SEED = 5674; - private static final String TYPE_LABEL = "Bv"; - - private final int size; - private final Boolean signed; - - private volatile int hashCode = 0; - - protected BvType(final int size, Boolean signed) { - this.signed = signed; - checkArgument(size > 0); - this.size = size; - } - - public static BvType of(final int size) { - return new BvType(size, null); - } - - public static BvType of(final int size, final Boolean signed) { - return new BvType(size, signed); - } - - public BvType withSize(final int size) { - return new BvType(size, signed); - } - - public int getSize() { - return size; - } - - public Boolean getSigned() { - checkState(signed != null); - return signed; - } - - @Override - public EqExpr Eq(Expr leftOp, Expr rightOp) { - return BvEqExpr.of(leftOp, rightOp); - } - - @Override - public NeqExpr Neq(Expr leftOp, Expr rightOp) { - return BvNeqExpr.of(leftOp, rightOp); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + size; - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvType that = (BvType) obj; - return this.getSize() == that.getSize(); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(TYPE_LABEL).add(size).toString(); - } - - @Override - public AddExpr Add(Iterable> ops) { - return BvExprs.Add(ops); - } - - @Override - public SubExpr Sub(Expr leftOp, Expr rightOp) { - return BvExprs.Sub(leftOp, rightOp); - } - - @Override - public PosExpr Pos(Expr op) { - return BvExprs.Pos(op); - } - - @Override - public NegExpr Neg(Expr op) { - return BvExprs.Neg(op); - } - - @Override - public Expr Cast(Expr op, TargetType type) { - if (type instanceof FpType && signed != null) { - //noinspection unchecked - return (Expr) - FromBv(FpRoundingMode.getDefaultRoundingMode(), op, (FpType) type, signed); - } - throw new ClassCastException("Bv cannot be cast to " + type); - } - - @Override - public ModExpr Mod(Expr leftOp, Expr rightOp) { - checkState(signed != null, "Neutral BvType cannot be used here"); - checkState(signed, "Unsigned BvType cannot be used here"); - return BvExprs.SMod(leftOp, rightOp); - } - - @Override - public RemExpr Rem(Expr leftOp, Expr rightOp) { - checkState(signed != null, "Neutral BvType cannot be used here"); - if (signed) { - return BvExprs.SRem(leftOp, rightOp); - } else { - return BvExprs.URem(leftOp, rightOp); - } - } - - @Override - public MulExpr Mul(Iterable> ops) { - return BvExprs.Mul(ops); - } - - @Override - public DivExpr Div(Expr leftOp, Expr rightOp) { - checkState(signed != null, "Neutral BvType cannot be used here"); - if (signed) { - return BvExprs.SDiv(leftOp, rightOp); - } else { - return BvExprs.UDiv(leftOp, rightOp); - } - } - - @Override - public LtExpr Lt(Expr leftOp, Expr rightOp) { - checkState(signed != null, "Neutral BvType cannot be used here"); - if (signed) { - return BvExprs.SLt(leftOp, rightOp); - } else { - return BvExprs.ULt(leftOp, rightOp); - } - } - - @Override - public LeqExpr Leq(Expr leftOp, Expr rightOp) { - checkState(signed != null, "Neutral BvType cannot be used here"); - if (signed) { - return BvExprs.SLeq(leftOp, rightOp); - } else { - return BvExprs.ULeq(leftOp, rightOp); - } - } - - @Override - public GtExpr Gt(Expr leftOp, Expr rightOp) { - checkState(signed != null, "Neutral BvType cannot be used here"); - if (signed) { - return BvExprs.SGt(leftOp, rightOp); - } else { - return BvExprs.UGt(leftOp, rightOp); - } - } - - @Override - public GeqExpr Geq(Expr leftOp, Expr rightOp) { - checkState(signed != null, "Neutral BvType cannot be used here"); - if (signed) { - return BvExprs.SGeq(leftOp, rightOp); - } else { - return BvExprs.UGeq(leftOp, rightOp); - } - } - - @Override - public DomainSize getDomainSize() { - return DomainSize.of(BigInteger.TWO.pow(size)); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.java deleted file mode 100644 index 8e2f0ae196..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.DivExpr; - -public final class BvUDivExpr extends DivExpr { - - private static final int HASH_SEED = 9832; - - private static final String OPERATOR_LABEL = "bvudiv"; - - private BvUDivExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvUDivExpr of(final Expr leftOp, final Expr rightOp) { - return new BvUDivExpr(leftOp, rightOp); - } - - public static BvUDivExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvUDivExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - - return leftOpVal.udiv(rightOpVal); - } - - @Override - public BvUDivExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvUDivExpr.of(leftOp, rightOp); - } - } - - @Override - public BvUDivExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvUDivExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvUDivExpr that = (BvUDivExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.java deleted file mode 100644 index 75e5aa7ac4..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.GeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class BvUGeqExpr extends GeqExpr { - - private static final int HASH_SEED = 6234; - private static final String OPERATOR_LABEL = "bvuge"; - - private BvUGeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvUGeqExpr of(final Expr leftOp, final Expr rightOp) { - return new BvUGeqExpr(leftOp, rightOp); - } - - public static BvUGeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvUGeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.uge(rightOpVal); - } - - @Override - public BvUGeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvUGeqExpr.of(leftOp, rightOp); - } - } - - @Override - public BvUGeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvUGeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvUGeqExpr that = (BvUGeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.java deleted file mode 100644 index 73f475896c..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.GtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class BvUGtExpr extends GtExpr { - - private static final int HASH_SEED = 6231; - private static final String OPERATOR_LABEL = "bvugt"; - - private BvUGtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvUGtExpr of(final Expr leftOp, final Expr rightOp) { - return new BvUGtExpr(leftOp, rightOp); - } - - public static BvUGtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvUGtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.ugt(rightOpVal); - } - - @Override - public BvUGtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvUGtExpr.of(leftOp, rightOp); - } - } - - @Override - public BvUGtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvUGtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvUGtExpr that = (BvUGtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.java deleted file mode 100644 index 4fbf91b875..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.LeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class BvULeqExpr extends LeqExpr { - - private static final int HASH_SEED = 1458; - private static final String OPERATOR_LABEL = "bvule"; - - private BvULeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvULeqExpr of(final Expr leftOp, final Expr rightOp) { - return new BvULeqExpr(leftOp, rightOp); - } - - public static BvULeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvULeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.ule(rightOpVal); - } - - @Override - public BvULeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvULeqExpr.of(leftOp, rightOp); - } - } - - @Override - public BvULeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvULeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvULeqExpr that = (BvULeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.java deleted file mode 100644 index ba97949df5..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.LtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class BvULtExpr extends LtExpr { - - private static final int HASH_SEED = 2798; - private static final String OPERATOR_LABEL = "bvult"; - - private BvULtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvULtExpr of(final Expr leftOp, final Expr rightOp) { - return new BvULtExpr(leftOp, rightOp); - } - - public static BvULtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvULtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.ult(rightOpVal); - } - - @Override - public BvULtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvULtExpr.of(leftOp, rightOp); - } - } - - @Override - public BvULtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvULtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvULtExpr that = (BvULtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.java deleted file mode 100644 index 784c1eee29..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.RemExpr; - -public final class BvURemExpr extends RemExpr { - - private static final int HASH_SEED = 995; - - private static final String OPERATOR_LABEL = "bvurem"; - - private BvURemExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvURemExpr of(final Expr leftOp, final Expr rightOp) { - return new BvURemExpr(leftOp, rightOp); - } - - public static BvURemExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvURemExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.urem(rightOpVal); - } - - @Override - public BvURemExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvURemExpr.of(leftOp, rightOp); - } - } - - @Override - public BvURemExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvURemExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvURemExpr that = (BvURemExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.java deleted file mode 100644 index a74dbc31d3..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.MultiaryExpr; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; - -public final class BvXorExpr extends MultiaryExpr { - - private static final int HASH_SEED = 9457; - private static final String OPERATOR_LABEL = "bvxor"; - - private BvXorExpr(final Iterable> ops) { - super(ops); - checkAllTypesEqual(ops); - } - - public static BvXorExpr of(final Iterable> ops) { - return new BvXorExpr(ops); - } - - public static BvXorExpr create(final List> ops) { - checkNotNull(ops); - return BvXorExpr.of(ops.stream().map(TypeUtils::castBv).collect(toImmutableList())); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - return getOps().stream() - .skip(1) - .reduce( - (BvLitExpr) getOps().get(0).eval(val), - (op1, op2) -> (op1.xor((BvLitExpr) op2.eval(val))), - BvLitExpr::xor); - } - - @Override - public BvXorExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return BvXorExpr.of(ops); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvXorExpr that = (BvXorExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.java deleted file mode 100644 index caf191202d..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.bvtype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import java.util.List; - -public final class BvZExtExpr implements Expr { - - private static final int HASH_SEED = 6526; - private static final String OPERATOR_LABEL = "bv_zero_extend"; - - private final Expr op; - private final BvType extendType; - - private volatile int hashCode = 0; - - private BvZExtExpr(final Expr op, final BvType extendType) { - checkNotNull(op); - checkNotNull(extendType); - checkArgument(extendType.getSize() >= op.getType().getSize()); - - this.op = op; - this.extendType = extendType; - } - - public static BvZExtExpr of(final Expr op, final BvType extendType) { - return new BvZExtExpr(op, extendType); - } - - public static BvZExtExpr create(final Expr op, final BvType extendType) { - return new BvZExtExpr(castBv(op), extendType); - } - - public Expr getOp() { - return op; - } - - public BvType getExtendType() { - return extendType; - } - - @Override - public int getArity() { - return 1; - } - - @Override - public BvType getType() { - return extendType; - } - - @Override - public LitExpr eval(Valuation val) { - final BvLitExpr bvLitExpr = (BvLitExpr) op.eval(val); - return bvLitExpr.zext(extendType); - } - - @Override - public List> getOps() { - return ImmutableList.of(op); - } - - @Override - public Expr withOps(List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 1); - final Expr newBitvec = castBv(ops.get(0)); - return of(newBitvec, extendType); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + op.hashCode(); - result = 31 * result + extendType.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvZExtExpr that = (BvZExtExpr) obj; - return this.getOps().equals(that.getOps()) && this.getType().equals(that.getType()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .add(getOp()) - .add(getType()) - .toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.java deleted file mode 100644 index 4125c1e3b9..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.enumtype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; -import java.util.Objects; - -public class EnumEqExpr extends EqExpr { - - private static final int HASH_SEED = 5326; - private static final String OPERATOR_LABEL = "="; - - private EnumEqExpr(Expr leftOp, Expr rightOp) { - super(leftOp, rightOp); - } - - public static EnumEqExpr of(Expr leftOp, Expr rightOp) { - return new EnumEqExpr(leftOp, rightOp); - } - - @Override - public BinaryExpr with(Expr leftOp, Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return EnumEqExpr.of(leftOp, rightOp); - } - } - - @Override - public BinaryExpr withLeftOp(Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BinaryExpr withRightOp(Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(Valuation val) { - return EnumLitExpr.eq( - (EnumLitExpr) getLeftOp().eval(val), (EnumLitExpr) getRightOp().eval(val)); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final EnumEqExpr that = (EnumEqExpr) obj; - return Objects.equals(this.getLeftOp(), that.getLeftOp()) - && Objects.equals(this.getRightOp(), that.getRightOp()); - } else { - return false; - } - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.java deleted file mode 100644 index 906654db17..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.enumtype; - -import static com.google.common.base.Preconditions.checkArgument; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; - -import com.google.common.base.Objects; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; - -public final class EnumLitExpr extends NullaryExpr implements LitExpr { - - private final EnumType type; - private final String value; - - private EnumLitExpr(EnumType type, String value) { - this.type = type; - this.value = value; - } - - public static EnumLitExpr of(EnumType type, String literalName) { - String value = EnumType.getShortName(literalName); - checkArgument( - type.getValues().contains(value), - "Invalid value %s for type %s", - value, - type.getName()); - return new EnumLitExpr(type, value); - } - - public static BoolLitExpr eq(EnumLitExpr l, EnumLitExpr r) { - return Bool(l.type.equals(r.type) && l.value.equals(r.value)); - } - - public static BoolLitExpr neq(EnumLitExpr l, EnumLitExpr r) { - return Bool(!l.type.equals(r.type) || !l.value.equals(r.value)); - } - - @Override - public EnumType getType() { - return type; - } - - public String getValue() { - return value; - } - - @Override - public LitExpr eval(Valuation val) { - return this; - } - - @Override - public String toString() { - return EnumType.makeLongName(type.getName(), value); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - EnumLitExpr that = (EnumLitExpr) o; - return Objects.equal(type, that.type) && Objects.equal(value, that.value); - } - - @Override - public int hashCode() { - return Objects.hashCode(type, value); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.java deleted file mode 100644 index 00761b2b89..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.enumtype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; -import java.util.Objects; - -public final class EnumNeqExpr extends NeqExpr { - - private static final int HASH_SEED = 7212; - private static final String OPERATOR_LABEL = "!="; - - private EnumNeqExpr(Expr leftOp, Expr rightOp) { - super(leftOp, rightOp); - } - - public static EnumNeqExpr of(Expr leftOp, Expr rightOp) { - return new EnumNeqExpr(leftOp, rightOp); - } - - @Override - public BinaryExpr with(Expr leftOp, Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return EnumNeqExpr.of(leftOp, rightOp); - } - } - - @Override - public BinaryExpr withLeftOp(Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BinaryExpr withRightOp(Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(Valuation val) { - return EnumLitExpr.neq( - (EnumLitExpr) getLeftOp().eval(val), (EnumLitExpr) getRightOp().eval(val)); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final EnumNeqExpr that = (EnumNeqExpr) obj; - return Objects.equals(this.getLeftOp(), that.getLeftOp()) - && Objects.equals(this.getRightOp(), that.getRightOp()); - } else { - return false; - } - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.java deleted file mode 100644 index 58a1c30b79..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.enumtype; - -import static com.google.common.base.Preconditions.checkArgument; - -import hu.bme.mit.theta.core.type.DomainSize; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.abstracttype.Equational; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; -import hu.bme.mit.theta.core.type.anytype.InvalidLitExpr; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -public final class EnumType implements Equational, Type { - - public static final String FULLY_QUALIFIED_NAME_SEPARATOR = "."; - private final Map literals; - private final String name; - private int counter = 0; - - private EnumType(String name, Collection values) { - this.name = name; - this.literals = new LinkedHashMap<>(); - values.forEach(value -> literals.put(value, counter++)); - } - - public static EnumType of(String name, Collection values) { - return new EnumType(name, values); - } - - public static String makeLongName(String typeName, String literal) { - return String.format("%s%s%s", typeName, FULLY_QUALIFIED_NAME_SEPARATOR, literal); - } - - public static String makeLongName(EnumType type, String literal) { - return makeLongName(type.getName(), literal); - } - - public static String getShortName(String longName) { - if (!longName.contains(FULLY_QUALIFIED_NAME_SEPARATOR)) return longName; - return longName.substring( - longName.indexOf(FULLY_QUALIFIED_NAME_SEPARATOR) - + FULLY_QUALIFIED_NAME_SEPARATOR.length()); - } - - @Override - public DomainSize getDomainSize() { - return DomainSize.of(literals.size()); - } - - @Override - public EqExpr Eq(Expr leftOp, Expr rightOp) { - return EnumEqExpr.of(leftOp, rightOp); - } - - @Override - public NeqExpr Neq(Expr leftOp, Expr rightOp) { - return EnumNeqExpr.of(leftOp, rightOp); - } - - public Set getValues() { - return literals.keySet(); - } - - public Set getLongValues() { - return literals.keySet().stream() - .map(val -> makeLongName(this, val)) - .collect(Collectors.toSet()); - } - - public String getName() { - return name; - } - - public int getIntValue(EnumLitExpr literal) { - return getIntValue(literal.getValue()); - } - - public int getIntValue(String literal) { - checkArgument( - literals.containsKey(literal), - String.format("Enum type %s does not contain literal '%s'", name, literal)); - return literals.get(literal); - } - - public LitExpr litFromShortName(String shortName) { - try { - return EnumLitExpr.of(this, shortName); - } catch (Exception e) { - throw new RuntimeException( - String.format("%s is not valid for type %s", shortName, name), e); - } - } - - public LitExpr litFromLongName(String longName) { - if (!longName.contains(FULLY_QUALIFIED_NAME_SEPARATOR)) - throw new RuntimeException(String.format("%s is an invalid enum longname")); - String[] parts = longName.split(Pattern.quote(FULLY_QUALIFIED_NAME_SEPARATOR)); - String type = parts[0]; - checkArgument( - name.equals(type), String.format("%s does not belong to type %s", type, name)); - return litFromShortName(parts[1]); - } - - public LitExpr litFromIntValue(int value) { - for (Map.Entry entry : literals.entrySet()) { - if (entry.getValue() == value) { - return EnumLitExpr.of(this, entry.getKey()); - } - } - return new InvalidLitExpr<>(this); - } - - @Override - public String toString() { - return String.format("EnumType{%s}", name); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.java deleted file mode 100644 index ca5e0567a8..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; - -public class FpAbsExpr extends UnaryExpr { - - private static final int HASH_SEED = 6666; - private static final String OPERATOR_LABEL = "fpabs"; - - private FpAbsExpr(final Expr op) { - super(op); - } - - public static FpAbsExpr of(final Expr op) { - return new FpAbsExpr(castFp(op)); - } - - public static FpAbsExpr create(final Expr op) { - checkNotNull(op); - return FpAbsExpr.of(castFp(op)); - } - - @Override - public FpType getType() { - return getOp().getType(); - } - - @Override - public FpLitExpr eval(Valuation val) { - final FpLitExpr opVal = (FpLitExpr) getOp().eval(val); - if (opVal.getHidden()) { - return opVal.neg(); - } else { - return opVal; - } - } - - @Override - public FpAbsExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return FpAbsExpr.of(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpAbsExpr that = (FpAbsExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.java deleted file mode 100644 index 7793314b71..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.AddExpr; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; - -public class FpAddExpr extends AddExpr { - - private static final int HASH_SEED = 6588; - private static final String OPERATOR_LABEL = "fpadd"; - - private final FpRoundingMode roundingMode; - - private FpAddExpr( - final FpRoundingMode roundingMode, final Iterable> ops) { - super(ops); - checkAllTypesEqual(ops); - checkNotNull(roundingMode); - this.roundingMode = roundingMode; - } - - public static FpAddExpr of( - final FpRoundingMode roundingMode, final Iterable> ops) { - return new FpAddExpr(roundingMode, ops); - } - - public static FpAddExpr create( - final FpRoundingMode roundingMode, final List> ops) { - checkNotNull(ops); - return FpAddExpr.of( - roundingMode, ops.stream().map(TypeUtils::castFp).collect(toImmutableList())); - } - - public FpRoundingMode getRoundingMode() { - return roundingMode; - } - - @Override - public FpType getType() { - return getOps().get(0).getType(); - } - - @Override - public FpLitExpr eval(final Valuation val) { - return getOps().stream() - .skip(1) - .reduce( - (FpLitExpr) getOps().get(0).eval(val), - (op1, op2) -> (op1.add(roundingMode, (FpLitExpr) op2.eval(val))), - (op1, op2) -> (op1.add(roundingMode, op2))); - } - - @Override - public FpAddExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return FpAddExpr.of(roundingMode, ops); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpAddExpr that = (FpAddExpr) obj; - return this.getOps().equals(that.getOps()) && roundingMode == that.roundingMode; - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.java deleted file mode 100644 index d5cb83f45f..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class FpAssignExpr extends EqExpr { - - private static final int HASH_SEED = 1747; - private static final String OPERATOR_LABEL = "="; - - private FpAssignExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static FpAssignExpr of(final Expr leftOp, final Expr rightOp) { - return new FpAssignExpr(leftOp, rightOp); - } - - public static FpAssignExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpAssignExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); - - return leftOpVal.assign(rightOpVal); - } - - @Override - public FpAssignExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpAssignExpr.of(leftOp, rightOp); - } - } - - @Override - public FpAssignExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public FpAssignExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpAssignExpr that = (FpAssignExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.java deleted file mode 100644 index c3f9f23a97..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.DivExpr; - -public final class FpDivExpr extends DivExpr { - private static final int HASH_SEED = 1646; - private static final String OPERATOR = "fpdiv"; - - private final FpRoundingMode roundingMode; - - private FpDivExpr( - final FpRoundingMode roundingMode, - final Expr leftOp, - final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - this.roundingMode = roundingMode; - } - - public static FpDivExpr of( - final FpRoundingMode roundingMode, - final Expr leftOp, - final Expr rightOp) { - return new FpDivExpr(roundingMode, leftOp, rightOp); - } - - public static FpDivExpr create( - final FpRoundingMode roundingMode, final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpDivExpr.of(roundingMode, newLeftOp, newRightOp); - } - - public FpRoundingMode getRoundingMode() { - return roundingMode; - } - - @Override - public FpType getType() { - return getOps().get(0).getType(); - } - - @Override - public FpLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); - - return leftOpVal.div(roundingMode, rightOpVal); - } - - @Override - public FpDivExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpDivExpr.of(roundingMode, leftOp, rightOp); - } - } - - @Override - public FpDivExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public FpDivExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpDivExpr that = (FpDivExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()) - && roundingMode == that.roundingMode; - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR + "[" + roundingMode.name().toLowerCase() + "]"; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.java deleted file mode 100644 index 217b01d16e..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class FpEqExpr extends EqExpr { - - private static final int HASH_SEED = 1746; - private static final String OPERATOR_LABEL = "="; - - private FpEqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static FpEqExpr of(final Expr leftOp, final Expr rightOp) { - return new FpEqExpr(leftOp, rightOp); - } - - public static FpEqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpEqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); - - return leftOpVal.eq(rightOpVal); - } - - @Override - public FpEqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpEqExpr.of(leftOp, rightOp); - } - } - - @Override - public FpEqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public FpEqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpEqExpr that = (FpEqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpExprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpExprs.java deleted file mode 100644 index 38c449bf53..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpExprs.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.bvtype.BvLitExpr; -import hu.bme.mit.theta.core.type.bvtype.BvType; -import java.util.Arrays; - -public final class FpExprs { - - private FpExprs() {} - - public static FpType FpType(final int exponent, final int significand) { - return FpType.of(exponent, significand); - } - - public static FpLitExpr Fp(boolean hidden, BvLitExpr exponent, BvLitExpr significand) { - return FpLitExpr.of(hidden, exponent, significand); - } - - public static FpLitExpr NaN(final FpType fpType) { - final var exponent = new boolean[fpType.getExponent()]; - Arrays.fill(exponent, true); - final var significand = new boolean[fpType.getSignificand() - 1]; - Arrays.fill(significand, true); - - return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)); - } - - public static FpLitExpr PositiveInfinity(final FpType fpType) { - final var exponent = new boolean[fpType.getExponent()]; - Arrays.fill(exponent, true); - final var significand = new boolean[fpType.getSignificand() - 1]; - Arrays.fill(significand, false); - - return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)); - } - - public static FpLitExpr NegativeInfinity(final FpType fpType) { - final var exponent = new boolean[fpType.getExponent()]; - Arrays.fill(exponent, true); - final var significand = new boolean[fpType.getSignificand() - 1]; - Arrays.fill(significand, false); - - return Fp(true, BvLitExpr.of(exponent), BvLitExpr.of(significand)); - } - - public static FpLitExpr PositiveZero(final FpType fpType) { - final var exponent = new boolean[fpType.getExponent()]; - Arrays.fill(exponent, false); - final var significand = new boolean[fpType.getSignificand() - 1]; - Arrays.fill(significand, false); - - return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)); - } - - public static FpLitExpr NegativeZero(final FpType fpType) { - final var exponent = new boolean[fpType.getExponent()]; - Arrays.fill(exponent, false); - final var significand = new boolean[fpType.getSignificand() - 1]; - Arrays.fill(significand, false); - - return Fp(true, BvLitExpr.of(exponent), BvLitExpr.of(significand)); - } - - public static FpAddExpr Add( - final FpRoundingMode roundingMode, final Iterable> ops) { - return FpAddExpr.of(roundingMode, ops); - } - - public static FpSubExpr Sub( - final FpRoundingMode roundingMode, - final Expr leftOp, - final Expr rightOp) { - return FpSubExpr.of(roundingMode, leftOp, rightOp); - } - - public static FpPosExpr Pos(final Expr op) { - return FpPosExpr.of(op); - } - - public static FpNegExpr Neg(final Expr op) { - return FpNegExpr.of(op); - } - - public static FpMulExpr Mul( - final FpRoundingMode roundingMode, final Iterable> ops) { - return FpMulExpr.of(roundingMode, ops); - } - - public static FpDivExpr Div( - final FpRoundingMode roundingMode, - final Expr leftOp, - final Expr rightOp) { - return FpDivExpr.of(roundingMode, leftOp, rightOp); - } - - public static FpRemExpr Rem(final Expr leftOp, final Expr rightOp) { - return FpRemExpr.of(leftOp, rightOp); - } - - public static FpAbsExpr Abs(final Expr op) { - return FpAbsExpr.of(op); - } - - public static FpFromBvExpr FromBv( - final FpRoundingMode roundingMode, - final Expr op, - final FpType fpType, - final boolean signed) { - return FpFromBvExpr.of(roundingMode, op, fpType, signed); - } - - public static FpEqExpr Eq(final Expr leftOp, final Expr rightOp) { - return FpEqExpr.of(leftOp, rightOp); - } - - public static FpAssignExpr FpAssign(final Expr leftOp, final Expr rightOp) { - return FpAssignExpr.of(leftOp, rightOp); - } - - public static FpNeqExpr Neq(final Expr leftOp, final Expr rightOp) { - return FpNeqExpr.of(leftOp, rightOp); - } - - public static FpGtExpr Gt(final Expr leftOp, final Expr rightOp) { - return FpGtExpr.of(leftOp, rightOp); - } - - public static FpGeqExpr Geq(final Expr leftOp, final Expr rightOp) { - return FpGeqExpr.of(leftOp, rightOp); - } - - public static FpLtExpr Lt(final Expr leftOp, final Expr rightOp) { - return FpLtExpr.of(leftOp, rightOp); - } - - public static FpLeqExpr Leq(final Expr leftOp, final Expr rightOp) { - return FpLeqExpr.of(leftOp, rightOp); - } - - public static FpIsNanExpr IsNan(final Expr op) { - return FpIsNanExpr.of(op); - } - - public static FpIsInfiniteExpr IsInfinite(final Expr op) { - return FpIsInfiniteExpr.of(op); - } - - public static FpRoundToIntegralExpr RoundToIntegral( - final FpRoundingMode roundingMode, final Expr op) { - return FpRoundToIntegralExpr.of(roundingMode, op); - } - - public static FpSqrtExpr Sqrt(final FpRoundingMode roundingMode, final Expr op) { - return FpSqrtExpr.of(roundingMode, op); - } - - public static FpMaxExpr Max(final Expr leftOp, final Expr rightOp) { - return FpMaxExpr.of(leftOp, rightOp); - } - - public static FpMinExpr Min(final Expr leftOp, final Expr rightOp) { - return FpMinExpr.of(leftOp, rightOp); - } - - public static FpToBvExpr ToBv( - final FpRoundingMode roundingMode, - final Expr op, - final int size, - final boolean sgn) { - return FpToBvExpr.of(roundingMode, op, size, sgn); - } - - public static FpToFpExpr ToFp( - final FpRoundingMode roundingMode, - final Expr op, - final int exp, - final int sig) { - return FpToFpExpr.of(roundingMode, op, exp, sig); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.java deleted file mode 100644 index ec213f5af1..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static com.google.common.base.Preconditions.checkNotNull; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLitExpr; -import hu.bme.mit.theta.core.type.bvtype.BvType; -import hu.bme.mit.theta.core.utils.BvUtils; -import hu.bme.mit.theta.core.utils.FpUtils; -import org.kframework.mpfr.BigFloat; -import org.kframework.mpfr.BinaryMathContext; - -public class FpFromBvExpr extends UnaryExpr { - - private static final int HASH_SEED = 6696; - private static final String OPERATOR_LABEL = "fpfrombv"; - - private final FpRoundingMode roundingMode; - private final FpType fpType; - private final boolean signed; - - private FpFromBvExpr( - final FpRoundingMode roundingMode, - final Expr op, - final FpType fpType, - final boolean signed) { - super(op); - this.fpType = fpType; - this.signed = signed; - checkNotNull(roundingMode); - this.roundingMode = roundingMode; - } - - public static FpFromBvExpr of( - final FpRoundingMode roundingMode, - final Expr op, - final FpType fpType, - final boolean signed) { - return new FpFromBvExpr(roundingMode, op, fpType, signed); - } - - public static FpFromBvExpr create( - final FpRoundingMode roundingMode, - final Expr op, - final FpType fpType, - final boolean signed) { - return FpFromBvExpr.of(roundingMode, op, fpType, signed); - } - - public FpRoundingMode getRoundingMode() { - return roundingMode; - } - - public FpType getFpType() { - return fpType; - } - - public boolean isSigned() { - return signed; - } - - @Override - public FpType getType() { - return fpType; - } - - @Override - public FpLitExpr eval(Valuation val) { - BinaryMathContext mathContext = FpUtils.getMathContext(fpType, roundingMode); - BvLitExpr eval = (BvLitExpr) getOp().eval(val); - return FpUtils.bigFloatToFpLitExpr( - new BigFloat( - signed - ? BvUtils.signedBvLitExprToBigInteger(eval) - : BvUtils.unsignedBvLitExprToBigInteger(eval), - mathContext), - fpType); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && obj.getClass() == this.getClass()) { - final FpFromBvExpr that = (FpFromBvExpr) obj; - return this.getOp().equals(that.getOp()) - && fpType.equals(that.fpType) - && roundingMode.equals(that.roundingMode); - } else { - return false; - } - } - - @Override - public FpFromBvExpr with(Expr op) { - return new FpFromBvExpr(roundingMode, op, fpType, signed); - } - - protected int getHashSeed() { - return HASH_SEED; - } - - public String getOperatorLabel() { - return OPERATOR_LABEL - + "[" - + fpType.getExponent() - + "," - + fpType.getSignificand() - + "][" - + (isSigned() ? "s" : "u") - + "]"; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.java deleted file mode 100644 index 916328d31b..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.GeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class FpGeqExpr extends GeqExpr { - - private static final int HASH_SEED = 1647; - private static final String OPERATOR_LABEL = ">="; - - private FpGeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static FpGeqExpr of(final Expr leftOp, final Expr rightOp) { - return new FpGeqExpr(leftOp, rightOp); - } - - public static FpGeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpGeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); - - return leftOpVal.geq(rightOpVal); - } - - @Override - public FpGeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpGeqExpr.of(leftOp, rightOp); - } - } - - @Override - public FpGeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public FpGeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpGeqExpr that = (FpGeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.java deleted file mode 100644 index 7eaca72c4b..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.GtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class FpGtExpr extends GtExpr { - - private static final int HASH_SEED = 1648; - private static final String OPERATOR_LABEL = ">"; - - private FpGtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static FpGtExpr of(final Expr leftOp, final Expr rightOp) { - return new FpGtExpr(leftOp, rightOp); - } - - public static FpGtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpGtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); - - return leftOpVal.gt(rightOpVal); - } - - @Override - public FpGtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpGtExpr.of(leftOp, rightOp); - } - } - - @Override - public FpGtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public FpGtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpGtExpr that = (FpGtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.java deleted file mode 100644 index 4bbdb7557c..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Or; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; -import hu.bme.mit.theta.core.type.booltype.OrExpr; - -public final class FpIsInfiniteExpr extends UnaryExpr { - - private static final int HASH_SEED = 1756; - private static final String OPERATOR_LABEL = "isinfinite"; - - private FpIsInfiniteExpr(final Expr op) { - super(op); - checkAllTypesEqual(op); - } - - public static FpIsInfiniteExpr of(final Expr op) { - return new FpIsInfiniteExpr(op); - } - - public static FpIsInfiniteExpr create(final Expr op) { - final Expr newOp = castFp(op); - return FpIsInfiniteExpr.of(newOp); - } - - @Override - public UnaryExpr with(Expr op) { - if (op == getOp()) { - return this; - } else { - return FpIsInfiniteExpr.of(op); - } - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr opVal = (FpLitExpr) getOp().eval(val); - - OrExpr or = Or(Bool(opVal.isNegativeInfinity()), Bool(opVal.isPositiveInfinity())); - final BoolLitExpr boolExpr = or.eval(val); - return boolExpr; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpIsInfiniteExpr that = (FpIsInfiniteExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.java deleted file mode 100644 index 9a95a85d7f..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class FpIsNanExpr extends UnaryExpr { - - private static final int HASH_SEED = 1786; - private static final String OPERATOR_LABEL = "fpisnan"; - - private FpIsNanExpr(final Expr op) { - super(op); - checkAllTypesEqual(op); - } - - public static FpIsNanExpr of(final Expr op) { - return new FpIsNanExpr(op); - } - - public static FpIsNanExpr create(final Expr op) { - final Expr newOp = castFp(op); - return FpIsNanExpr.of(newOp); - } - - @Override - public UnaryExpr with(Expr op) { - if (op == getOp()) { - return this; - } else { - return FpIsNanExpr.of(op); - } - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr opVal = (FpLitExpr) getOp().eval(val); - - return Bool(opVal.isNaN()); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpIsNanExpr that = (FpIsNanExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.java deleted file mode 100644 index 2576f3fccf..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.LeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class FpLeqExpr extends LeqExpr { - - private static final int HASH_SEED = 1649; - private static final String OPERATOR_LABEL = "<="; - - private FpLeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static FpLeqExpr of(final Expr leftOp, final Expr rightOp) { - return new FpLeqExpr(leftOp, rightOp); - } - - public static FpLeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpLeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); - - return leftOpVal.leq(rightOpVal); - } - - @Override - public FpLeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpLeqExpr.of(leftOp, rightOp); - } - } - - @Override - public FpLeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public FpLeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpLeqExpr that = (FpLeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.java deleted file mode 100644 index 4ca92763e9..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.java +++ /dev/null @@ -1,330 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.FpUtils.bigFloatToFpLitExpr; -import static hu.bme.mit.theta.core.utils.FpUtils.fpLitExprToBigFloat; -import static hu.bme.mit.theta.core.utils.FpUtils.getMathContext; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.booltype.BoolExprs; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLitExpr; -import java.util.Arrays; - -public class FpLitExpr extends NullaryExpr implements LitExpr, Comparable { - private static final int HASH_SEED = 4254; - private final boolean hidden; - private final BvLitExpr exponent; - private final BvLitExpr significand; - private volatile int hashCode = 0; - - private FpLitExpr(final boolean hidden, final BvLitExpr exponent, final BvLitExpr significand) { - checkNotNull(exponent); - checkNotNull(significand); - - this.hidden = hidden; - this.exponent = exponent; - this.significand = significand; - } - - public static FpLitExpr of( - final boolean hidden, final BvLitExpr exponent, final BvLitExpr significand) { - return new FpLitExpr(hidden, exponent, significand); - } - - public static FpLitExpr of(final BvLitExpr value, final FpType fpType) { - boolean[] literal = value.getValue(); - checkArgument(fpType.getExponent() + fpType.getSignificand() + 1 == literal.length); - return new FpLitExpr( - literal[0], - BvLitExpr.of(Arrays.copyOfRange(literal, 1, fpType.getExponent() + 1)), - BvLitExpr.of( - Arrays.copyOfRange( - literal, - fpType.getExponent() + 1, - fpType.getExponent() + fpType.getSignificand() + 1))); - } - - public static FpLitExpr of( - final BvLitExpr hidden, final BvLitExpr exponent, final BvLitExpr significand) { - boolean[] hiddenLit = hidden.getValue(); - return new FpLitExpr(hiddenLit[0], exponent, significand); - } - - public boolean getHidden() { - return hidden; - } - - public BvLitExpr getExponent() { - return exponent; - } - - public BvLitExpr getSignificand() { - return significand; - } - - public boolean isNaN() { - var isNaN = true; - for (final var i : exponent.getValue()) { - isNaN = isNaN && i; - } - var atLeastOne = false; - for (final var i : significand.getValue()) { - atLeastOne = atLeastOne || i; - } - return isNaN && atLeastOne; - } - - public boolean isPositiveInfinity() { - var isNaN = !hidden; - for (final var i : exponent.getValue()) { - isNaN = isNaN && i; - } - for (final var i : significand.getValue()) { - isNaN = isNaN && !i; - } - return isNaN; - } - - public boolean isNegativeInfinity() { - var isNaN = hidden; - for (final var i : exponent.getValue()) { - isNaN = isNaN && i; - } - for (final var i : significand.getValue()) { - isNaN = isNaN && !i; - } - return isNaN; - } - - public boolean isNegativeZero() { - var isNaN = !hidden; - for (final var i : exponent.getValue()) { - isNaN = isNaN && !i; - } - for (final var i : significand.getValue()) { - isNaN = isNaN && !i; - } - return isNaN; - } - - public boolean isPositiveZero() { - var isNaN = hidden; - for (final var i : exponent.getValue()) { - isNaN = isNaN && !i; - } - for (final var i : significand.getValue()) { - isNaN = isNaN && !i; - } - return isNaN; - } - - public FpLitExpr add(final FpRoundingMode roundingMode, final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var sum = - fpLitExprToBigFloat(roundingMode, this) - .add( - fpLitExprToBigFloat(roundingMode, that), - getMathContext(this.getType(), roundingMode)); - return bigFloatToFpLitExpr(sum, getType()); - } - - public FpLitExpr sub(final FpRoundingMode roundingMode, final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var sub = - fpLitExprToBigFloat(roundingMode, this) - .subtract( - fpLitExprToBigFloat(roundingMode, that), - getMathContext(this.getType(), roundingMode)); - return bigFloatToFpLitExpr(sub, getType()); - } - - public FpLitExpr pos() { - return this; - } - - public FpLitExpr neg() { - var neg = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), this).negate(); - return bigFloatToFpLitExpr(neg, getType()); - } - - public FpLitExpr mul(final FpRoundingMode roundingMode, final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var sub = - fpLitExprToBigFloat(roundingMode, this) - .multiply( - fpLitExprToBigFloat(roundingMode, that), - getMathContext(this.getType(), roundingMode)); - return bigFloatToFpLitExpr(sub, getType()); - } - - public FpLitExpr div(final FpRoundingMode roundingMode, final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var sub = - fpLitExprToBigFloat(roundingMode, this) - .divide( - fpLitExprToBigFloat(roundingMode, that), - getMathContext(this.getType(), roundingMode)); - return bigFloatToFpLitExpr(sub, getType()); - } - - public BoolLitExpr eq(final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var left = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), this); - var right = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), that); - if (left.isNaN() || right.isNaN()) { - return BoolExprs.False(); - } - return BoolExprs.Bool( - this.hidden == that.hidden - && this.exponent.equals(that.exponent) - && this.significand.equals(that.significand)); - } - - public BoolLitExpr assign(final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var left = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), this); - var right = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), that); - return BoolExprs.Bool( - this.hidden == that.hidden - && this.exponent.equals(that.exponent) - && this.significand.equals(that.significand)); - } - - public BoolLitExpr gt(final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var left = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), this); - var right = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), that); - if (left.isNaN() || right.isNaN()) { - return BoolExprs.False(); - } - if (left.greaterThan(right)) { - return BoolExprs.True(); - } else { - return BoolExprs.False(); - } - } - - public BoolLitExpr lt(final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var left = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), this); - var right = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), that); - if (left.isNaN() || right.isNaN()) { - return BoolExprs.False(); - } - if (left.lessThan(right)) { - return BoolExprs.True(); - } else { - return BoolExprs.False(); - } - } - - public BoolLitExpr geq(final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var left = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), this); - var right = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), that); - if (left.isNaN() || right.isNaN()) { - return BoolExprs.False(); - } - if (left.greaterThanOrEqualTo(right)) { - return BoolExprs.True(); - } else { - return BoolExprs.False(); - } - } - - public BoolLitExpr leq(final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var left = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), this); - var right = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), that); - if (left.isNaN() || right.isNaN()) { - return BoolExprs.False(); - } - if (left.lessThanOrEqualTo(right)) { - return BoolExprs.True(); - } else { - return BoolExprs.False(); - } - } - - public BoolLitExpr neq(final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var left = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), this); - var right = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), that); - if (left.isNaN() || right.isNaN()) { - return BoolExprs.False(); - } - return BoolExprs.Bool( - !(this.hidden == that.hidden - && this.exponent.equals(that.exponent) - && this.significand.equals(that.significand))); - } - - @Override - public FpType getType() { - return FpType.of(exponent.getType().getSize(), significand.getType().getSize() + 1); - } - - @Override - public LitExpr eval(Valuation val) { - return this; - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + Boolean.hashCode(hidden); - result = 31 * result + exponent.hashCode(); - result = 31 * result + significand.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (obj != null - && this.getClass() == obj.getClass() - && getType().equals(((FpLitExpr) obj).getType())) { - return this.exponent.equals(((FpLitExpr) obj).exponent) - && this.hidden == ((FpLitExpr) obj).hidden - && this.significand.equals(((FpLitExpr) obj).significand); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(hidden ? "#b1" : "#b0") - .add(exponent.toString()) - .add(significand.toString()) - .toString(); - } - - @Override - public int compareTo(FpType fpType) { - return 0; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.java deleted file mode 100644 index 7e9c2847f9..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.LtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class FpLtExpr extends LtExpr { - - private static final int HASH_SEED = 1745; - private static final String OPERATOR_LABEL = "<"; - - private FpLtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static FpLtExpr of(final Expr leftOp, final Expr rightOp) { - return new FpLtExpr(leftOp, rightOp); - } - - public static FpLtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpLtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); - - return leftOpVal.lt(rightOpVal); - } - - @Override - public FpLtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpLtExpr.of(leftOp, rightOp); - } - } - - @Override - public FpLtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public FpLtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpLtExpr that = (FpLtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.java deleted file mode 100644 index 3e9e97137c..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.utils.FpUtils; - -public class FpMaxExpr extends BinaryExpr { - - private static final int HASH_SEED = 6668; - private static final String OPERATOR_LABEL = "fpmax"; - - private FpMaxExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static FpMaxExpr of(final Expr leftOp, final Expr rightOp) { - return new FpMaxExpr(leftOp, rightOp); - } - - public static FpMaxExpr create(final Expr leftOp, final Expr rightOp) { - checkNotNull(leftOp, rightOp); - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpMaxExpr.of(newLeftOp, newRightOp); - } - - @Override - public BinaryExpr with(Expr leftOp, Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpMaxExpr.of(leftOp, rightOp); - } - } - - @Override - public BinaryExpr withLeftOp(Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BinaryExpr withRightOp(Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } - - @Override - public FpType getType() { - return getLeftOp().getType(); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpMaxExpr that = (FpMaxExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - public LitExpr eval(Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); - if (FpUtils.fpLitExprToBigFloat(null, leftOpVal) - .greaterThan(FpUtils.fpLitExprToBigFloat(null, rightOpVal))) { - return leftOpVal; - } else { - return rightOpVal; - } - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.java deleted file mode 100644 index f78442635f..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.utils.FpUtils; - -public class FpMinExpr extends BinaryExpr { - - private static final int HASH_SEED = 6667; - private static final String OPERATOR_LABEL = "fpmin"; - - private FpMinExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static FpMinExpr of(final Expr leftOp, final Expr rightOp) { - return new FpMinExpr(leftOp, rightOp); - } - - public static FpMinExpr create(final Expr leftOp, final Expr rightOp) { - checkNotNull(leftOp, rightOp); - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpMinExpr.of(newLeftOp, newRightOp); - } - - @Override - public BinaryExpr with(Expr leftOp, Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpMinExpr.of(leftOp, rightOp); - } - } - - @Override - public BinaryExpr withLeftOp(Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BinaryExpr withRightOp(Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } - - @Override - public FpType getType() { - return getLeftOp().getType(); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpMinExpr that = (FpMinExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - public LitExpr eval(Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); - if (FpUtils.fpLitExprToBigFloat(null, leftOpVal) - .lessThan(FpUtils.fpLitExprToBigFloat(null, rightOpVal))) { - return leftOpVal; - } else { - return rightOpVal; - } - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.java deleted file mode 100644 index 50ad817027..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.MulExpr; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; - -public class FpMulExpr extends MulExpr { - - private static final int HASH_SEED = 4276; - private static final String OPERATOR_LABEL = "fpmul"; - - private final FpRoundingMode roundingMode; - - private FpMulExpr( - final FpRoundingMode roundingMode, final Iterable> ops) { - super(ops); - checkAllTypesEqual(ops); - checkNotNull(roundingMode); - this.roundingMode = roundingMode; - } - - public static FpMulExpr of( - final FpRoundingMode roundingMode, final Iterable> ops) { - return new FpMulExpr(roundingMode, ops); - } - - public static FpMulExpr create( - final FpRoundingMode roundingMode, final List> ops) { - checkNotNull(ops); - return FpMulExpr.of( - roundingMode, ops.stream().map(TypeUtils::castFp).collect(toImmutableList())); - } - - public FpRoundingMode getRoundingMode() { - return roundingMode; - } - - @Override - public FpType getType() { - return getOps().get(0).getType(); - } - - @Override - public FpLitExpr eval(final Valuation val) { - return getOps().stream() - .skip(1) - .reduce( - (FpLitExpr) getOps().get(0).eval(val), - (op1, op2) -> (op1.mul(roundingMode, (FpLitExpr) op2.eval(val))), - (op1, op2) -> (op1.mul(roundingMode, op2))); - } - - @Override - public FpMulExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return FpMulExpr.of(roundingMode, ops); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpMulExpr that = (FpMulExpr) obj; - return this.getOps().equals(that.getOps()) && roundingMode == that.roundingMode; - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.java deleted file mode 100644 index dbe07ef320..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.NegExpr; - -public final class FpNegExpr extends NegExpr { - - private static final int HASH_SEED = 4622; - private static final String OPERATOR_LABEL = "fpneg"; - - private FpNegExpr(final Expr op) { - super(op); - } - - public static FpNegExpr of(final Expr op) { - return new FpNegExpr(op); - } - - public static FpNegExpr create(final Expr op) { - final Expr newOp = castFp(op); - return FpNegExpr.of(newOp); - } - - @Override - public FpType getType() { - return getOp().getType(); - } - - @Override - public FpLitExpr eval(final Valuation val) { - final FpLitExpr opVal = (FpLitExpr) getOp().eval(val); - return opVal.neg(); - } - - @Override - public FpNegExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return FpNegExpr.of(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpNegExpr that = (FpNegExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.java deleted file mode 100644 index a0cafbd3b1..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class FpNeqExpr extends NeqExpr { - - private static final int HASH_SEED = 7646; - private static final String OPERATOR_LABEL = "/="; - - private FpNeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static FpNeqExpr of(final Expr leftOp, final Expr rightOp) { - return new FpNeqExpr(leftOp, rightOp); - } - - public static FpNeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpNeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); - - return leftOpVal.neq(rightOpVal); - } - - @Override - public FpNeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpNeqExpr.of(leftOp, rightOp); - } - } - - @Override - public FpNeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public FpNeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpNeqExpr that = (FpNeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.java deleted file mode 100644 index 5252cfd7b2..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.PosExpr; - -public final class FpPosExpr extends PosExpr { - - private static final int HASH_SEED = 9424; - private static final String OPERATOR_LABEL = "fppos"; - - private FpPosExpr(final Expr op) { - super(op); - } - - public static FpPosExpr of(final Expr op) { - return new FpPosExpr(op); - } - - public static FpPosExpr create(final Expr op) { - final Expr newOp = castFp(op); - return FpPosExpr.of(newOp); - } - - @Override - public FpType getType() { - return getOp().getType(); - } - - @Override - public FpLitExpr eval(final Valuation val) { - final FpLitExpr opVal = (FpLitExpr) getOp().eval(val); - return opVal.pos(); - } - - @Override - public FpPosExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return FpPosExpr.of(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpPosExpr that = (FpPosExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.java deleted file mode 100644 index d7c00578e2..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.utils.FpUtils; -import org.kframework.mpfr.BigFloat; - -public final class FpRemExpr extends BinaryExpr { - - private static final int HASH_SEED = 6670; - - private static final String OPERATOR_LABEL = "fprem"; - - private FpRemExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static FpRemExpr of(final Expr leftOp, final Expr rightOp) { - return new FpRemExpr(leftOp, rightOp); - } - - public static FpRemExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpRemExpr.of(newLeftOp, newRightOp); - } - - @Override - public FpType getType() { - return getLeftOp().getType(); - } - - @Override - public FpLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); - BigFloat leftFloat = FpUtils.fpLitExprToBigFloat(null, leftOpVal); - BigFloat rightFloat = FpUtils.fpLitExprToBigFloat(null, rightOpVal); - BigFloat remainder = - leftFloat.remainder(rightFloat, FpUtils.getMathContext(this.getType(), null)); - - return FpUtils.bigFloatToFpLitExpr(remainder, this.getType()); - } - - @Override - public FpRemExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpRemExpr.of(leftOp, rightOp); - } - } - - @Override - public FpRemExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public FpRemExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpRemExpr that = (FpRemExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.java deleted file mode 100644 index 491c621864..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; -import hu.bme.mit.theta.core.utils.FpUtils; -import java.math.BigInteger; -import org.kframework.mpfr.BigFloat; -import org.kframework.mpfr.BinaryMathContext; - -public class FpRoundToIntegralExpr extends UnaryExpr { // round to integral - - private static final int HASH_SEED = 6671; - private static final String OPERATOR_LABEL = "fproundtoint"; - - private final FpRoundingMode roundingMode; - - private FpRoundToIntegralExpr(final FpRoundingMode roundingMode, final Expr op) { - super(op); - checkNotNull(roundingMode); - this.roundingMode = roundingMode; - } - - public static FpRoundToIntegralExpr of(final FpRoundingMode roundingMode, Expr op) { - return new FpRoundToIntegralExpr(roundingMode, op); - } - - public static FpRoundToIntegralExpr create(final FpRoundingMode roundingMode, Expr op) { - checkNotNull(op); - return FpRoundToIntegralExpr.of(roundingMode, castFp(op)); - } - - public FpRoundingMode getRoundingMode() { - return roundingMode; - } - - @Override - public FpType getType() { - return getOp().getType(); - } - - @Override - public FpLitExpr eval(Valuation val) { - final FpLitExpr opVal = (FpLitExpr) getOp().eval(val); - BigFloat value = FpUtils.fpLitExprToBigFloat(roundingMode, opVal); - BigInteger bigInteger = value.toBigInteger(); - BigFloat round = - value.round( - new BinaryMathContext( - bigInteger.bitLength(), - opVal.getType().getExponent(), - FpUtils.getMathContextRoundingMode(roundingMode))); - round = round.round(FpUtils.getMathContext(getType(), roundingMode)); - FpLitExpr fpLitExpr = FpUtils.bigFloatToFpLitExpr(round, this.getType()); - return fpLitExpr; - } - - @Override - public FpRoundToIntegralExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return FpRoundToIntegralExpr.of(roundingMode, op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpRoundToIntegralExpr that = (FpRoundToIntegralExpr) obj; - return this.getOp().equals(that.getOp()) && roundingMode.equals(that.roundingMode); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL + "[" + roundingMode.toString() + "]"; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.java deleted file mode 100644 index fc0b568c1d..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -public enum FpRoundingMode { - RNE, /* Round nearest ties to even */ - RNA, /* Round nearest ties to away */ - RTP, /* Round toward positive */ - RTN, /* Round toward negative */ - RTZ; /* Round toward zero */ - - public static FpRoundingMode getDefaultRoundingMode() { - return RNE; /* Default because it is default in the C standard */ - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.java deleted file mode 100644 index 4deb866ccb..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.UnaryExpr; -import hu.bme.mit.theta.core.utils.FpUtils; -import org.kframework.mpfr.BigFloat; - -public class FpSqrtExpr extends UnaryExpr { - - private static final int HASH_SEED = 6669; - private static final String OPERATOR_LABEL = "fpsqrt"; - - private final FpRoundingMode roundingMode; - - private FpSqrtExpr(final FpRoundingMode roundingMode, final Expr op) { - super(op); - checkNotNull(roundingMode); - this.roundingMode = roundingMode; - } - - public static FpSqrtExpr of(final FpRoundingMode roundingMode, final Expr op) { - return new FpSqrtExpr(roundingMode, castFp(op)); - } - - public static FpSqrtExpr create(final FpRoundingMode roundingMode, final Expr op) { - checkNotNull(op); - return FpSqrtExpr.of(roundingMode, castFp(op)); - } - - public FpRoundingMode getRoundingMode() { - return roundingMode; - } - - @Override - public FpType getType() { - return getOp().getType(); - } - - @Override - public LitExpr eval(Valuation val) { - final FpLitExpr opVal = (FpLitExpr) getOp().eval(val); - BigFloat sqrt = - FpUtils.fpLitExprToBigFloat(roundingMode, opVal) - .sqrt(FpUtils.getMathContext(getType(), roundingMode)); - return FpUtils.bigFloatToFpLitExpr(sqrt, getType()); - } - - @Override - public UnaryExpr with(Expr op) { - if (op == getOp()) { - return this; - } else { - return FpSqrtExpr.of(roundingMode, op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpSqrtExpr that = (FpSqrtExpr) obj; - return this.getOp().equals(that.getOp()) && roundingMode.equals(that.roundingMode); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.java deleted file mode 100644 index 0109195ac7..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.SubExpr; - -public final class FpSubExpr extends SubExpr { - - private static final int HASH_SEED = 2498; - private static final String OPERATOR = "fpsub"; - - private final FpRoundingMode roundingMode; - - private FpSubExpr( - final FpRoundingMode roundingMode, - final Expr leftOp, - final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - this.roundingMode = roundingMode; - } - - public static FpSubExpr of( - final FpRoundingMode roundingMode, - final Expr leftOp, - final Expr rightOp) { - return new FpSubExpr(roundingMode, leftOp, rightOp); - } - - public static FpSubExpr create( - final FpRoundingMode roundingMode, final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpSubExpr.of(roundingMode, newLeftOp, newRightOp); - } - - public FpRoundingMode getRoundingMode() { - return roundingMode; - } - - @Override - public FpType getType() { - return getOps().get(0).getType(); - } - - @Override - public FpLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); - - return leftOpVal.sub(roundingMode, rightOpVal); - } - - @Override - public FpSubExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpSubExpr.of(roundingMode, leftOp, rightOp); - } - } - - @Override - public FpSubExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public FpSubExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpSubExpr that = (FpSubExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()) - && roundingMode == that.roundingMode; - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.java deleted file mode 100644 index 2ff4baa121..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static com.google.common.base.Preconditions.checkNotNull; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLitExpr; -import hu.bme.mit.theta.core.type.bvtype.BvType; -import hu.bme.mit.theta.core.utils.BvUtils; -import hu.bme.mit.theta.core.utils.FpUtils; -import java.math.BigInteger; - -/** Sign and significand is presumed to be unsigned Exponent is presumed to be signed */ -public class FpToBvExpr extends UnaryExpr { - - private static final int HASH_SEED = 6796; - private static final String OPERATOR_LABEL = "fptobv"; - - private final Expr op; - private final int size; - private final boolean sgn; - - private final FpRoundingMode roundingMode; - - private FpToBvExpr( - final FpRoundingMode roundingMode, - final Expr op, - final int size, - final boolean sgn) { - super(op); - checkNotNull(op); - this.op = op; - - this.size = size; - this.sgn = sgn; - - checkNotNull(roundingMode); - this.roundingMode = roundingMode; - } - - public static FpToBvExpr of( - final FpRoundingMode roundingMode, - final Expr op, - final int size, - final boolean sgn) { - return new FpToBvExpr(roundingMode, op, size, sgn); - } - - public static FpToBvExpr create( - final FpRoundingMode roundingMode, - final Expr op, - final int size, - final boolean sgn) { - return FpToBvExpr.of(roundingMode, op, size, sgn); - } - - public int getSize() { - return size; - } - - public boolean getSgn() { - return sgn; - } - - @Override - public FpToBvExpr with(Expr op) { - if (op == getOp()) { - return this; - } else { - return FpToBvExpr.of(roundingMode, op, size, sgn); - } - } - - @Override - public BvType getType() { - return BvType.of(size); - } - - @Override - public BvLitExpr eval(Valuation val) { - final FpLitExpr op = (FpLitExpr) this.op.eval(val); - - BigInteger bigIntegerValue = FpUtils.fpLitExprToBigFloat(roundingMode, op).toBigInteger(); - if (sgn) { - return BvUtils.bigIntegerToSignedBvLitExpr(bigIntegerValue, size); - } else { - return BvUtils.bigIntegerToUnsignedBvLitExpr(bigIntegerValue, size); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpToBvExpr that = (FpToBvExpr) obj; - return this.getOp().equals(that.getOp()) - && size == that.size - && sgn == that.sgn - && roundingMode.equals(that.roundingMode); - } else { - return false; - } - } - - protected int getHashSeed() { - return HASH_SEED; - } - - public FpRoundingMode getRoundingMode() { - return roundingMode; - } - - public String getOperatorLabel() { - return OPERATOR_LABEL - + "[" - + size - + "'" - + (sgn ? "s" : "u") - + "][" - + roundingMode.name() - + "]"; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.java deleted file mode 100644 index 1406cb86be..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static com.google.common.base.Preconditions.checkNotNull; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; -import hu.bme.mit.theta.core.utils.FpUtils; -import org.kframework.mpfr.BigFloat; - -public class FpToFpExpr extends UnaryExpr { - - private static final int HASH_SEED = 6799; - private static final String OPERATOR_LABEL = "fptofp"; - - private final Expr op; - private final int expBits; - private final int signBits; - - private final FpRoundingMode roundingMode; - - private FpToFpExpr( - final FpRoundingMode roundingMode, - final Expr op, - final int expBits, - final int signBits) { - super(op); - checkNotNull(op); - this.op = op; - - this.signBits = signBits; - this.expBits = expBits; - - checkNotNull(roundingMode); - this.roundingMode = roundingMode; - } - - public static FpToFpExpr of( - final FpRoundingMode roundingMode, - final Expr op, - final int exp, - final int signBits) { - return new FpToFpExpr(roundingMode, op, exp, signBits); - } - - public static FpToFpExpr create( - final FpRoundingMode roundingMode, - final Expr op, - final int exp, - final int signBits) { - return FpToFpExpr.of(roundingMode, op, exp, signBits); - } - - public int getExpBits() { - return expBits; - } - - public int getSignBits() { - return signBits; - } - - @Override - public FpToFpExpr with(Expr op) { - if (op == getOp()) { - return this; - } else { - return FpToFpExpr.of(roundingMode, op, expBits, signBits); - } - } - - @Override - public FpType getType() { - return FpType.of(expBits, signBits); - } - - @Override - public FpLitExpr eval(Valuation val) { - final FpLitExpr op = (FpLitExpr) this.op.eval(val); - - BigFloat value = FpUtils.fpLitExprToBigFloat(roundingMode, op); - return FpUtils.bigFloatToFpLitExpr(value, getType()); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpToFpExpr that = (FpToFpExpr) obj; - return this.getOp().equals(that.getOp()) - && expBits == that.expBits - && signBits == that.signBits - && roundingMode.equals(that.roundingMode); - } else { - return false; - } - } - - protected int getHashSeed() { - return HASH_SEED; - } - - public String getOperatorLabel() { - return OPERATOR_LABEL + "[" + expBits + "," + signBits + "]"; - } - - public FpRoundingMode getRoundingMode() { - return roundingMode; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpType.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpType.java deleted file mode 100644 index 0095fa1bcd..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpType.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.fptype; - -import static com.google.common.base.Preconditions.checkArgument; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.DomainSize; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.*; -import java.math.BigInteger; - -public class FpType - implements Equational, Additive, Multiplicative, Ordered { - - private static final int HASH_SEED = 5424; - private static final String TYPE_LABEL = "Fp"; - - private final int exponent; - private final int significand; - - private volatile int hashCode = 0; - - private FpType(final int exponent, final int significand) { - checkArgument(exponent > 1); - checkArgument(significand > 1); - this.exponent = exponent; - this.significand = significand; - } - - public static FpType of(final int exponent, final int significand) { - return new FpType(exponent, significand); - } - - public int getExponent() { - return exponent; - } - - public int getSignificand() { - return significand; - } - - @Override - public EqExpr Eq(Expr leftOp, Expr rightOp) { - return FpEqExpr.of(leftOp, rightOp); - } - - @Override - public NeqExpr Neq(Expr leftOp, Expr rightOp) { - return FpNeqExpr.of(leftOp, rightOp); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + exponent; - result = 31 * result + significand; - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpType that = (FpType) obj; - return this.getExponent() == that.getExponent() - && this.getSignificand() == that.getSignificand(); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(TYPE_LABEL).add(exponent).add(significand).toString(); - } - - @Override - public AddExpr Add(Iterable> ops) { - return FpExprs.Add(FpRoundingMode.getDefaultRoundingMode(), ops); - } - - @Override - public SubExpr Sub(Expr leftOp, Expr rightOp) { - return FpExprs.Sub(FpRoundingMode.getDefaultRoundingMode(), leftOp, rightOp); - } - - @Override - public PosExpr Pos(Expr op) { - return FpExprs.Pos(op); - } - - @Override - public NegExpr Neg(Expr op) { - return FpExprs.Neg(op); - } - - @Override - public MulExpr Mul(Iterable> ops) { - return FpExprs.Mul(FpRoundingMode.getDefaultRoundingMode(), ops); - } - - @Override - public DivExpr Div(Expr leftOp, Expr rightOp) { - return FpExprs.Div(FpRoundingMode.getDefaultRoundingMode(), leftOp, rightOp); - } - - @Override - public LtExpr Lt(Expr leftOp, Expr rightOp) { - return FpExprs.Lt(leftOp, rightOp); - } - - @Override - public LeqExpr Leq(Expr leftOp, Expr rightOp) { - return FpExprs.Leq(leftOp, rightOp); - } - - @Override - public GtExpr Gt(Expr leftOp, Expr rightOp) { - return FpExprs.Gt(leftOp, rightOp); - } - - @Override - public GeqExpr Geq(Expr leftOp, Expr rightOp) { - return FpExprs.Geq(leftOp, rightOp); - } - - @Override - public DomainSize getDomainSize() { - return DomainSize.of( - BigInteger.TWO.pow(significand).multiply(BigInteger.TWO.pow(exponent))); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncAppExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncAppExpr.java deleted file mode 100644 index 516cbabcd4..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncAppExpr.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.functype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import java.util.List; - -public final class FuncAppExpr - implements Expr { - - private static final int HASH_SEED = 7951; - - private final Expr> func; - private final Expr param; - - private volatile int hashCode = 0; - - private FuncAppExpr( - final Expr> func, final Expr param) { - this.func = checkNotNull(func); - this.param = checkNotNull(param); - } - - public static - FuncAppExpr of( - final Expr> func, final Expr param) { - return new FuncAppExpr<>(func, param); - } - - public static FuncAppExpr create( - final Expr func, final Expr param) { - @SuppressWarnings("unchecked") - final FuncType funcType = - (FuncType) func.getType(); - final Expr> newFunc = cast(func, funcType); - final Expr newParam = cast(param, funcType.getParamType()); - return FuncAppExpr.of(newFunc, newParam); - } - - public Expr> getFunc() { - return func; - } - - public Expr getParam() { - return param; - } - - @Override - public ResultType getType() { - return getFunc().getType().getResultType(); - } - - @Override - public LitExpr eval(final Valuation val) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("TODO: auto-generated method stub"); - } - - @Override - public int getArity() { - return 2; - } - - @Override - public List> getOps() { - return ImmutableList.of(func, param); - } - - @Override - public Expr withOps(final List> ops) { - return cast(create(ops.get(0), ops.get(1)), getType()); - } - - public FuncAppExpr with( - final Expr> func, final Expr param) { - if (this.func == func && this.param == param) { - return this; - } else { - return FuncAppExpr.of(func, param); - } - } - - public FuncAppExpr withFunc( - final Expr> func) { - return with(func, getParam()); - } - - public FuncAppExpr withParam(final Expr param) { - return with(getFunc(), param); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + func.hashCode(); - result = 31 * result + param.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FuncAppExpr that = (FuncAppExpr) obj; - return this.getFunc().equals(that.getFunc()) && this.getParam().equals(that.getParam()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder().add(func).body().add(param).toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncLitExpr.java deleted file mode 100644 index 3aaab9f791..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncLitExpr.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.functype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.decl.ParamDecl; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; - -public final class FuncLitExpr - implements LitExpr> { - - private static final int HASH_SEED = 53; - private static final String OPERATOR_LABEL = "func"; - - private final ParamDecl param; - private final Expr result; - - private volatile int hashCode = 0; - - private FuncLitExpr(final ParamDecl param, final Expr result) { - this.param = checkNotNull(param); - this.result = checkNotNull(result); - } - - public static - FuncLitExpr of( - final ParamDecl param, final Expr result) { - return new FuncLitExpr<>(param, result); - } - - public ParamDecl getParam() { - return param; - } - - public Expr getResult() { - return result; - } - - @Override - public FuncType getType() { - return Func(param.getType(), result.getType()); - } - - @Override - public LitExpr> eval(final Valuation val) { - return this; - } - - @Override - public int getArity() { - return 1; - } - - @Override - public List> getOps() { - return ImmutableList.of(result); - } - - @Override - public Expr> withOps(final List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 1); - final Expr newResult = TypeUtils.cast(ops.get(0), result.getType()); - return with(newResult); - } - - public FuncLitExpr with(final Expr result) { - if (this.result == result) { - return this; - } else { - return FuncLitExpr.of(param, result); - } - } - - @Override - public int hashCode() { - int tmp = hashCode; - if (tmp == 0) { - tmp = HASH_SEED; - tmp = 31 * tmp + param.hashCode(); - tmp = 31 * tmp + result.hashCode(); - hashCode = tmp; - } - return tmp; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FuncLitExpr that = (FuncLitExpr) obj; - return this.getParam().equals(that.getParam()) - && this.getResult().equals(that.getResult()); - } else { - return false; - } - } - - @Override - public String toString() { - final String paramString = String.format("(%s %s)", param.getName(), param.getType()); - return Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .add(paramString) - .add(result) - .toString(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.java deleted file mode 100644 index 0f61b026cc..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.functype; - -import static com.google.common.base.Preconditions.checkNotNull; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.DomainSize; -import hu.bme.mit.theta.core.type.Type; - -public final class FuncType implements Type { - - private static final int HASH_SEED = 3931; - private static final String TYPE_LABEL = "Func"; - - private final ParamType paramType; - private final ResultType resultType; - - private volatile int hashCode = 0; - - private FuncType(final ParamType paramType, final ResultType resultType) { - this.paramType = checkNotNull(paramType); - this.resultType = checkNotNull(resultType); - } - - public static - FuncType of( - final ParamType paramType, final ResultType resultType) { - return new FuncType<>(paramType, resultType); - } - - public ParamType getParamType() { - return paramType; - } - - public ResultType getResultType() { - return resultType; - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + paramType.hashCode(); - result = 31 * result + resultType.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FuncType that = (FuncType) obj; - return this.getParamType().equals(that.getParamType()) - && this.getResultType().equals(that.getResultType()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(TYPE_LABEL).add(paramType).add(resultType).toString(); - } - - @Override - public DomainSize getDomainSize() { - throw new UnsupportedOperationException(); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.java deleted file mode 100644 index 0302063837..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.AddExpr; -import java.math.BigInteger; -import java.util.List; - -public final class IntAddExpr extends AddExpr { - - private static final int HASH_SEED = 5653; - private static final String OPERATOR_LABEL = "+"; - - private IntAddExpr(final Iterable> ops) { - super(ops); - } - - public static IntAddExpr of(final Iterable> ops) { - return new IntAddExpr(ops); - } - - public static IntAddExpr create(final List> ops) { - return IntAddExpr.of(ops.stream().map(op -> cast(op, Int())).collect(toImmutableList())); - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - var sum = BigInteger.ZERO; - for (final Expr op : getOps()) { - final IntLitExpr opVal = (IntLitExpr) op.eval(val); - sum = sum.add(opVal.getValue()); - } - return Int(sum); - } - - @Override - public IntAddExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return IntAddExpr.of(ops); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntAddExpr that = (IntAddExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.java deleted file mode 100644 index ea68a4f0ef..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.DivExpr; - -public final class IntDivExpr extends DivExpr { - - private static final int HASH_SEED = 79; - - private static final String OPERATOR_LABEL = "div"; - - private IntDivExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static IntDivExpr of(final Expr leftOp, final Expr rightOp) { - return new IntDivExpr(leftOp, rightOp); - } - - public static IntDivExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntDivExpr.of(newLeftOp, newRightOp); - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.div(rightOpVal); - } - - @Override - public IntDivExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntDivExpr.of(leftOp, rightOp); - } - } - - @Override - public IntDivExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public IntDivExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntDivExpr that = (IntDivExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.java deleted file mode 100644 index 825f429f46..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class IntEqExpr extends EqExpr { - - private static final int HASH_SEED = 2777; - private static final String OPERATOR_LABEL = "="; - - private IntEqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static IntEqExpr of(final Expr leftOp, final Expr rightOp) { - return new IntEqExpr(leftOp, rightOp); - } - - public static IntEqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntEqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.eq(rightOpVal); - } - - @Override - public IntEqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntEqExpr.of(leftOp, rightOp); - } - } - - @Override - public IntEqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public IntEqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntEqExpr that = (IntEqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.java deleted file mode 100644 index 1ef69c8cf5..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.core.type.Expr; -import java.math.BigInteger; - -public final class IntExprs { - - private IntExprs() {} - - public static IntType Int() { - return IntType.getInstance(); - } - - public static IntLitExpr Int(final int value) { - return IntLitExpr.of(BigInteger.valueOf(value)); - } - - public static IntLitExpr Int(final String value) { - return IntLitExpr.of(new BigInteger(value)); - } - - public static IntLitExpr Int(final BigInteger value) { - return IntLitExpr.of(value); - } - - public static IntToRatExpr ToRat(final Expr op) { - return IntToRatExpr.of(op); - } - - public static IntAddExpr Add(final Iterable> ops) { - return IntAddExpr.of(ops); - } - - public static IntSubExpr Sub(final Expr leftOp, final Expr rightOp) { - return IntSubExpr.of(leftOp, rightOp); - } - - public static IntPosExpr Pos(final Expr op) { - return IntPosExpr.of(op); - } - - public static IntNegExpr Neg(final Expr op) { - return IntNegExpr.of(op); - } - - public static IntMulExpr Mul(final Iterable> ops) { - return IntMulExpr.of(ops); - } - - public static IntDivExpr Div(final Expr leftOp, final Expr rightOp) { - return IntDivExpr.of(leftOp, rightOp); - } - - public static IntModExpr Mod(final Expr leftOp, final Expr rightOp) { - return IntModExpr.of(leftOp, rightOp); - } - - public static IntRemExpr Rem(final Expr leftOp, final Expr rightOp) { - return IntRemExpr.of(leftOp, rightOp); - } - - public static IntEqExpr Eq(final Expr leftOp, final Expr rightOp) { - return IntEqExpr.of(leftOp, rightOp); - } - - public static IntNeqExpr Neq(final Expr leftOp, final Expr rightOp) { - return IntNeqExpr.of(leftOp, rightOp); - } - - public static IntLtExpr Lt(final Expr leftOp, final Expr rightOp) { - return IntLtExpr.of(leftOp, rightOp); - } - - public static IntLeqExpr Leq(final Expr leftOp, final Expr rightOp) { - return IntLeqExpr.of(leftOp, rightOp); - } - - public static IntGtExpr Gt(final Expr leftOp, final Expr rightOp) { - return IntGtExpr.of(leftOp, rightOp); - } - - public static IntGeqExpr Geq(final Expr leftOp, final Expr rightOp) { - return IntGeqExpr.of(leftOp, rightOp); - } - - /* - * Convenience methods - */ - - public static IntAddExpr Add(final Expr op1, final Expr op2) { - return IntAddExpr.of(ImmutableList.of(op1, op2)); - } - - public static IntAddExpr Add( - final Expr op1, final Expr op2, final Expr op3) { - return IntAddExpr.of(ImmutableList.of(op1, op2, op3)); - } - - public static IntAddExpr Add( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4) { - return IntAddExpr.of(ImmutableList.of(op1, op2, op3, op4)); - } - - public static IntAddExpr Add( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4, - final Expr op5) { - return IntAddExpr.of(ImmutableList.of(op1, op2, op3, op4, op5)); - } - - //// - - public static IntMulExpr Mul(final Expr op1, final Expr op2) { - return IntMulExpr.of(ImmutableList.of(op1, op2)); - } - - public static IntMulExpr Mul( - final Expr op1, final Expr op2, final Expr op3) { - return IntMulExpr.of(ImmutableList.of(op1, op2, op3)); - } - - public static IntMulExpr Mul( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4) { - return IntMulExpr.of(ImmutableList.of(op1, op2, op3, op4)); - } - - public static IntMulExpr Mul( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4, - final Expr op5) { - return IntMulExpr.of(ImmutableList.of(op1, op2, op3, op4, op5)); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.java deleted file mode 100644 index 92f24c78de..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.GeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class IntGeqExpr extends GeqExpr { - - private static final int HASH_SEED = 7649; - private static final String OPERATOR_LABEL = ">="; - - private IntGeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static IntGeqExpr of(final Expr leftOp, final Expr rightOp) { - return new IntGeqExpr(leftOp, rightOp); - } - - public static IntGeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntGeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.geq(rightOpVal); - } - - @Override - public IntGeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntGeqExpr.of(leftOp, rightOp); - } - } - - @Override - public IntGeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public IntGeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntGeqExpr that = (IntGeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.java deleted file mode 100644 index fa6ff21239..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.GtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class IntGtExpr extends GtExpr { - - private static final int HASH_SEED = 7349; - private static final String OPERATOR_LABEL = ">"; - - private IntGtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static IntGtExpr of(final Expr leftOp, final Expr rightOp) { - return new IntGtExpr(leftOp, rightOp); - } - - public static IntGtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntGtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.gt(rightOpVal); - } - - @Override - public IntGtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntGtExpr.of(leftOp, rightOp); - } - } - - @Override - public IntGtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public IntGtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntGtExpr that = (IntGtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.java deleted file mode 100644 index 0f20b63c49..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.LeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class IntLeqExpr extends LeqExpr { - - private static final int HASH_SEED = 4673; - private static final String OPERATOR_LABEL = "<="; - - private IntLeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static IntLeqExpr of(final Expr leftOp, final Expr rightOp) { - return new IntLeqExpr(leftOp, rightOp); - } - - public static IntLeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntLeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.leq(rightOpVal); - } - - @Override - public IntLeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntLeqExpr.of(leftOp, rightOp); - } - } - - @Override - public IntLeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public IntLeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntLeqExpr that = (IntLeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.java deleted file mode 100644 index ddb5e064c9..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.rattype.RatLitExpr; -import java.math.BigInteger; - -public final class IntLitExpr extends NullaryExpr - implements LitExpr, Comparable { - - private static final int HASH_SEED = 4111; - private volatile int hashCode = 0; - - private final BigInteger value; - - private IntLitExpr(final BigInteger value) { - this.value = value; - } - - public static IntLitExpr of(final BigInteger value) { - return new IntLitExpr(value); - } - - public BigInteger getValue() { - return value; - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - return this; - } - - public RatLitExpr toRat() { - return Rat(this.value, 1); - } - - public IntLitExpr add(final IntLitExpr that) { - return IntLitExpr.of(this.value.add(that.value)); - } - - public IntLitExpr sub(final IntLitExpr that) { - return IntLitExpr.of(this.value.subtract(that.value)); - } - - public IntLitExpr neg() { - return IntLitExpr.of(this.value.negate()); - } - - public IntLitExpr pos() { - return IntLitExpr.of(this.value); - } - - public IntLitExpr div(final IntLitExpr that) { - // Semantics: - // 5 div 3 = 1 - // 5 div -3 = -1 - // -5 div 3 = -2 - // -5 div -3 = 2 - var result = this.value.divide(that.value); - if (this.value.compareTo(BigInteger.ZERO) < 0 - && this.value.mod(that.value.abs()).compareTo(BigInteger.ZERO) != 0) { - result = result.subtract(BigInteger.valueOf(that.value.signum())); - } - return IntLitExpr.of(result); - } - - public IntLitExpr mod(final IntLitExpr that) { - // Always positive semantics: - // 5 mod 3 = 2 - // 5 mod -3 = 2 - // -5 mod 3 = 1 - // -5 mod -3 = 1 - var result = this.value.mod(that.value.abs()); - if (result.compareTo(BigInteger.ZERO) < 0) { - result = result.add(that.value.abs()); - } - assert result.compareTo(BigInteger.ZERO) >= 0; - return IntLitExpr.of(result); - } - - public IntLitExpr rem(final IntLitExpr that) { - // Semantics: - // 5 rem 3 = 2 - // 5 rem -3 = -2 - // -5 rem 3 = 1 - // -5 rem -3 = -1 - final var thisAbs = this.value.abs(); - final var thatAbs = that.value.abs(); - if (this.value.compareTo(BigInteger.ZERO) < 0 - && that.value.compareTo(BigInteger.ZERO) < 0) { - var result = thisAbs.mod(thatAbs); - if (result.compareTo(BigInteger.ZERO) != 0) { - result = result.subtract(thatAbs); - } - return new IntLitExpr(result); - } else if (this.value.compareTo(BigInteger.ZERO) >= 0 - && that.value.compareTo(BigInteger.ZERO) < 0) { - return new IntLitExpr(thisAbs.mod(thatAbs).negate()); - } else if (this.value.compareTo(BigInteger.ZERO) < 0 - && that.value.compareTo(BigInteger.ZERO) >= 0) { - var result = thisAbs.mod(thatAbs); - if (result.compareTo(BigInteger.ZERO) != 0) { - result = thatAbs.subtract(result); - } - return IntLitExpr.of(result); - } else { - return IntLitExpr.of(this.value.mod(that.value)); - } - } - - public BoolLitExpr eq(final IntLitExpr that) { - return Bool(this.value.compareTo(that.value) == 0); - } - - public BoolLitExpr neq(final IntLitExpr that) { - return Bool(this.value.compareTo(that.value) != 0); - } - - public BoolLitExpr lt(final IntLitExpr that) { - return Bool(this.value.compareTo(that.value) < 0); - } - - public BoolLitExpr leq(final IntLitExpr that) { - return Bool(this.value.compareTo(that.value) <= 0); - } - - public BoolLitExpr gt(final IntLitExpr that) { - return Bool(this.value.compareTo(that.value) > 0); - } - - public BoolLitExpr geq(final IntLitExpr that) { - return Bool(this.value.compareTo(that.value) >= 0); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + value.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntLitExpr that = (IntLitExpr) obj; - return this.getValue().compareTo(that.getValue()) == 0; - } else { - return false; - } - } - - @Override - public String toString() { - return getValue().toString(); - } - - @Override - public int compareTo(final IntLitExpr that) { - return this.getValue().compareTo(that.getValue()); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.java deleted file mode 100644 index a1bd3fbe07..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.LtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class IntLtExpr extends LtExpr { - - private static final int HASH_SEED = 9431; - private static final String OPERATOR_LABEL = "<"; - - private IntLtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static IntLtExpr of(final Expr leftOp, final Expr rightOp) { - return new IntLtExpr(leftOp, rightOp); - } - - public static IntLtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntLtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.lt(rightOpVal); - } - - @Override - public IntLtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntLtExpr.of(leftOp, rightOp); - } - } - - @Override - public IntLtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public IntLtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntLtExpr that = (IntLtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.java deleted file mode 100644 index f2b1d17948..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.ModExpr; - -public final class IntModExpr extends ModExpr { - - private static final int HASH_SEED = 109; - private static final String OPERATOR_LABEL = "mod"; - - private IntModExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static IntModExpr of(final Expr leftOp, final Expr rightOp) { - return new IntModExpr(leftOp, rightOp); - } - - public static IntModExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntModExpr.of(newLeftOp, newRightOp); - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.mod(rightOpVal); - } - - @Override - public IntModExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntModExpr.of(leftOp, rightOp); - } - } - - @Override - public IntModExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public IntModExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntModExpr that = (IntModExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.java deleted file mode 100644 index ff29c783fd..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.MulExpr; -import java.math.BigInteger; -import java.util.List; - -public final class IntMulExpr extends MulExpr { - - private static final int HASH_SEED = 2707; - private static final String OPERATOR_LABEL = "*"; - - private IntMulExpr(final Iterable> ops) { - super(ops); - } - - public static IntMulExpr of(final Iterable> ops) { - return new IntMulExpr(ops); - } - - public static IntMulExpr create(final List> ops) { - return IntMulExpr.of(ops.stream().map(op -> cast(op, Int())).collect(toImmutableList())); - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - var prod = BigInteger.ONE; - for (final Expr op : getOps()) { - final IntLitExpr opVal = (IntLitExpr) op.eval(val); - prod = prod.multiply(opVal.getValue()); - } - return Int(prod); - } - - @Override - public IntMulExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return IntMulExpr.of(ops); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntMulExpr that = (IntMulExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.java deleted file mode 100644 index 9f7166ef8a..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.NegExpr; - -public final class IntNegExpr extends NegExpr { - - private static final int HASH_SEED = 3359; - private static final String OPERATOR_LABEL = "-"; - - private IntNegExpr(final Expr op) { - super(op); - } - - public static IntNegExpr of(final Expr op) { - return new IntNegExpr(op); - } - - public static IntNegExpr create(final Expr op) { - final Expr newOp = cast(op, Int()); - return IntNegExpr.of(newOp); - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - final IntLitExpr opVal = (IntLitExpr) getOp().eval(val); - return opVal.neg(); - } - - @Override - public IntNegExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return IntNegExpr.of(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntNegExpr that = (IntNegExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.java deleted file mode 100644 index f9706e01d5..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class IntNeqExpr extends NeqExpr { - - private static final int HASH_SEED = 9397; - private static final String OPERATOR_LABEL = "/="; - - private IntNeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static IntNeqExpr of(final Expr leftOp, final Expr rightOp) { - return new IntNeqExpr(leftOp, rightOp); - } - - public static IntNeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntNeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.neq(rightOpVal); - } - - @Override - public IntNeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntNeqExpr.of(leftOp, rightOp); - } - } - - @Override - public IntNeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public IntNeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntNeqExpr that = (IntNeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.java deleted file mode 100644 index 223199a3bb..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.PosExpr; - -public final class IntPosExpr extends PosExpr { - - private static final int HASH_SEED = 3547; - private static final String OPERATOR_LABEL = "+"; - - private IntPosExpr(final Expr op) { - super(op); - } - - public static IntPosExpr of(final Expr op) { - return new IntPosExpr(op); - } - - public static IntPosExpr create(final Expr op) { - final Expr newOp = cast(op, Int()); - return IntPosExpr.of(newOp); - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - final IntLitExpr opVal = (IntLitExpr) getOp().eval(val); - return opVal.pos(); - } - - @Override - public IntPosExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return IntPosExpr.of(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntPosExpr that = (IntPosExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.java deleted file mode 100644 index ee807b4e83..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.RemExpr; - -public final class IntRemExpr extends RemExpr { - - private static final int HASH_SEED = 199; - - private static final String OPERATOR_LABEL = "rem"; - - private IntRemExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static IntRemExpr of(final Expr leftOp, final Expr rightOp) { - return new IntRemExpr(leftOp, rightOp); - } - - public static IntRemExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntRemExpr.of(newLeftOp, newRightOp); - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.rem(rightOpVal); - } - - @Override - public IntRemExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntRemExpr.of(leftOp, rightOp); - } - } - - @Override - public IntRemExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public IntRemExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntRemExpr that = (IntRemExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.java deleted file mode 100644 index 42d109340a..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.SubExpr; - -public final class IntSubExpr extends SubExpr { - - private static final int HASH_SEED = 4547; - private static final String OPERATOR = "-"; - - private IntSubExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static IntSubExpr of(final Expr leftOp, final Expr rightOp) { - return new IntSubExpr(leftOp, rightOp); - } - - public static IntSubExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntSubExpr.of(newLeftOp, newRightOp); - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.sub(rightOpVal); - } - - @Override - public SubExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntSubExpr.of(leftOp, rightOp); - } - } - - @Override - public SubExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public SubExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntSubExpr that = (IntSubExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.java deleted file mode 100644 index b5f58ad689..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.CastExpr; -import hu.bme.mit.theta.core.type.rattype.RatLitExpr; -import hu.bme.mit.theta.core.type.rattype.RatType; - -public final class IntToRatExpr extends CastExpr { - - private static final int HASH_SEED = 1627; - private static final String OPERATOR_LABEL = "to_rat"; - - private IntToRatExpr(final Expr op) { - super(op); - } - - public static IntToRatExpr of(final Expr op) { - return new IntToRatExpr(op); - } - - public static IntToRatExpr create(final Expr op) { - final Expr newOp = cast(op, Int()); - return IntToRatExpr.of(newOp); - } - - @Override - public RatType getType() { - return Rat(); - } - - @Override - public RatLitExpr eval(final Valuation val) { - final IntLitExpr opVal = (IntLitExpr) getOp().eval(val); - return opVal.toRat(); - } - - @Override - public IntToRatExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return IntToRatExpr.of(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntToRatExpr that = (IntToRatExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.java deleted file mode 100644 index 9dd4ff99fd..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.inttype; - -import hu.bme.mit.theta.core.type.DomainSize; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.abstracttype.Additive; -import hu.bme.mit.theta.core.type.abstracttype.Castable; -import hu.bme.mit.theta.core.type.abstracttype.Divisible; -import hu.bme.mit.theta.core.type.abstracttype.Equational; -import hu.bme.mit.theta.core.type.abstracttype.ModExpr; -import hu.bme.mit.theta.core.type.abstracttype.Multiplicative; -import hu.bme.mit.theta.core.type.abstracttype.Ordered; -import hu.bme.mit.theta.core.type.abstracttype.RemExpr; -import hu.bme.mit.theta.core.type.rattype.RatType; - -public final class IntType - implements Additive, - Multiplicative, - Divisible, - Equational, - Ordered, - Castable { - - private static final IntType INSTANCE = new IntType(); - private static final int HASH_SEED = 222670; - private static final String TYPE_LABEL = "Int"; - - private IntType() {} - - public static IntType getInstance() { - return INSTANCE; - } - - @Override - public int hashCode() { - return HASH_SEED; - } - - @Override - public boolean equals(final Object obj) { - return (obj != null && this.getClass() == obj.getClass()); - } - - @Override - public String toString() { - return TYPE_LABEL; - } - - //// - - @Override - public IntAddExpr Add(final Iterable> ops) { - return IntExprs.Add(ops); - } - - @Override - public IntSubExpr Sub(final Expr leftOp, final Expr rightOp) { - return IntExprs.Sub(leftOp, rightOp); - } - - @Override - public IntPosExpr Pos(final Expr op) { - return IntExprs.Pos(op); - } - - @Override - public IntNegExpr Neg(final Expr op) { - return IntExprs.Neg(op); - } - - @Override - public IntMulExpr Mul(final Iterable> ops) { - return IntExprs.Mul(ops); - } - - @Override - public IntDivExpr Div(final Expr leftOp, final Expr rightOp) { - return IntExprs.Div(leftOp, rightOp); - } - - @Override - public ModExpr Mod(Expr leftOp, Expr rightOp) { - return IntExprs.Mod(leftOp, rightOp); - } - - @Override - public RemExpr Rem(Expr leftOp, Expr rightOp) { - return IntExprs.Rem(leftOp, rightOp); - } - - @Override - public IntEqExpr Eq(final Expr leftOp, final Expr rightOp) { - return IntExprs.Eq(leftOp, rightOp); - } - - @Override - public IntNeqExpr Neq(final Expr leftOp, final Expr rightOp) { - return IntExprs.Neq(leftOp, rightOp); - } - - @Override - public IntLtExpr Lt(final Expr leftOp, final Expr rightOp) { - return IntExprs.Lt(leftOp, rightOp); - } - - @Override - public IntLeqExpr Leq(final Expr leftOp, final Expr rightOp) { - return IntExprs.Leq(leftOp, rightOp); - } - - @Override - public IntGtExpr Gt(final Expr leftOp, final Expr rightOp) { - return IntExprs.Gt(leftOp, rightOp); - } - - @Override - public IntGeqExpr Geq(final Expr leftOp, final Expr rightOp) { - return IntExprs.Geq(leftOp, rightOp); - } - - @Override - public Expr Cast( - final Expr op, final TargetType type) { - if (type instanceof RatType) { - @SuppressWarnings("unchecked") - final Expr result = (Expr) IntExprs.ToRat(op); - return result; - } else { - throw new ClassCastException("Int cannot be cast to " + type); - } - } - - @Override - public DomainSize getDomainSize() { - return DomainSize.INFINITY; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.java deleted file mode 100644 index 217a7b3b38..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.rattype; - -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.AddExpr; -import java.math.BigInteger; -import java.util.List; - -public final class RatAddExpr extends AddExpr { - - private static final int HASH_SEED = 4909; - private static final String OPERATOR_LABEL = "+"; - - private RatAddExpr(final Iterable> ops) { - super(ops); - } - - public static RatAddExpr of(final Iterable> ops) { - return new RatAddExpr(ops); - } - - public static RatAddExpr create(final List> ops) { - return RatAddExpr.of(ops.stream().map(op -> cast(op, Rat())).collect(toImmutableList())); - } - - @Override - public RatType getType() { - return Rat(); - } - - @Override - public RatLitExpr eval(final Valuation val) { - var sumNum = BigInteger.ZERO; - var sumDenom = BigInteger.ONE; - for (final Expr op : getOps()) { - final RatLitExpr opLit = (RatLitExpr) op.eval(val); - final var leftNum = sumNum; - final var leftDenom = sumDenom; - final var rightNum = opLit.getNum(); - final var rightDenom = opLit.getDenom(); - sumNum = leftNum.multiply(rightDenom).add(leftDenom.multiply(rightNum)); - sumDenom = leftDenom.multiply(rightDenom); - } - return Rat(sumNum, sumDenom); - } - - @Override - public RatAddExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return RatAddExpr.of(ops); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatAddExpr that = (RatAddExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.java deleted file mode 100644 index 3ea6f47448..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.rattype; - -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.DivExpr; -import hu.bme.mit.theta.core.type.inttype.IntToRatExpr; -import hu.bme.mit.theta.core.type.inttype.IntType; - -public final class RatDivExpr extends DivExpr { - - private static final int HASH_SEED = 139; - - private static final String OPERATOR_LABEL = "/"; - - private RatDivExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static RatDivExpr of(final Expr leftOp, final Expr rightOp) { - return new RatDivExpr(leftOp, rightOp); - } - - public static RatDivExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp; - if (leftOp.getType() instanceof RatType) { - newLeftOp = cast(leftOp, Rat()); - } else if (leftOp.getType() instanceof IntType) { - newLeftOp = IntToRatExpr.create(leftOp); - } else { - throw new IllegalArgumentException("Unsupported type for RatDiv: " + leftOp.getType()); - } - - final Expr newRightOp; - if (rightOp.getType() instanceof RatType) { - newRightOp = cast(rightOp, Rat()); - } else if (rightOp.getType() instanceof IntType) { - newRightOp = IntToRatExpr.create(rightOp); - } else { - throw new IllegalArgumentException("Unsupported type for RatDiv: " + leftOp.getType()); - } - - return RatDivExpr.of(newLeftOp, newRightOp); - } - - @Override - public RatType getType() { - return Rat(); - } - - @Override - public RatLitExpr eval(final Valuation val) { - final RatLitExpr leftOpVal = (RatLitExpr) getLeftOp().eval(val); - final RatLitExpr rightOpVal = (RatLitExpr) getRightOp().eval(val); - return leftOpVal.div(rightOpVal); - } - - @Override - public RatDivExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return RatDivExpr.of(leftOp, rightOp); - } - } - - @Override - public RatDivExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public RatDivExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatDivExpr that = (RatDivExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.java deleted file mode 100644 index 06caf929ba..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.rattype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class RatEqExpr extends EqExpr { - - private static final int HASH_SEED = 3709; - private static final String OPERATOR_LABEL = "="; - - private RatEqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static RatEqExpr of(final Expr leftOp, final Expr rightOp) { - return new RatEqExpr(leftOp, rightOp); - } - - public static RatEqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Rat()); - final Expr newRightOp = cast(rightOp, Rat()); - return RatEqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final RatLitExpr leftOpVal = (RatLitExpr) getLeftOp().eval(val); - final RatLitExpr rightOpVal = (RatLitExpr) getRightOp().eval(val); - return leftOpVal.eq(rightOpVal); - } - - @Override - public RatEqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return RatEqExpr.of(leftOp, rightOp); - } - } - - @Override - public RatEqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public RatEqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatEqExpr that = (RatEqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.java deleted file mode 100644 index ac20b0388e..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.rattype; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.core.type.Expr; -import java.math.BigInteger; - -public final class RatExprs { - - private RatExprs() {} - - public static RatType Rat() { - return RatType.getInstance(); - } - - public static RatLitExpr Rat(final int num, final int denom) { - return RatLitExpr.of(BigInteger.valueOf(num), BigInteger.valueOf(denom)); - } - - public static RatLitExpr Rat(final int num, final String denom) { - return RatLitExpr.of(BigInteger.valueOf(num), new BigInteger(denom)); - } - - public static RatLitExpr Rat(final int num, final BigInteger denom) { - return RatLitExpr.of(BigInteger.valueOf(num), denom); - } - - public static RatLitExpr Rat(final String num, final int denom) { - return RatLitExpr.of(new BigInteger(num), BigInteger.valueOf(denom)); - } - - public static RatLitExpr Rat(final String num, final String denom) { - return RatLitExpr.of(new BigInteger(num), new BigInteger(denom)); - } - - public static RatLitExpr Rat(final String num, final BigInteger denom) { - return RatLitExpr.of(new BigInteger(num), denom); - } - - public static RatLitExpr Rat(final BigInteger num, final int denom) { - return RatLitExpr.of(num, BigInteger.valueOf(denom)); - } - - public static RatLitExpr Rat(final BigInteger num, final String denom) { - return RatLitExpr.of(num, new BigInteger(denom)); - } - - public static RatLitExpr Rat(final BigInteger num, final BigInteger denom) { - return RatLitExpr.of(num, denom); - } - - public static RatAddExpr Add(final Iterable> ops) { - return RatAddExpr.of(ops); - } - - public static RatSubExpr Sub(final Expr leftOp, final Expr rightOp) { - return RatSubExpr.of(leftOp, rightOp); - } - - public static RatPosExpr Pos(final Expr op) { - return RatPosExpr.of(op); - } - - public static RatNegExpr Neg(final Expr op) { - return RatNegExpr.of(op); - } - - public static RatMulExpr Mul(final Iterable> ops) { - return RatMulExpr.of(ops); - } - - public static RatDivExpr Div(final Expr leftOp, final Expr rightOp) { - return RatDivExpr.of(leftOp, rightOp); - } - - public static RatEqExpr Eq(final Expr leftOp, final Expr rightOp) { - return RatEqExpr.of(leftOp, rightOp); - } - - public static RatNeqExpr Neq(final Expr leftOp, final Expr rightOp) { - return RatNeqExpr.of(leftOp, rightOp); - } - - public static RatLtExpr Lt(final Expr leftOp, final Expr rightOp) { - return RatLtExpr.of(leftOp, rightOp); - } - - public static RatLeqExpr Leq(final Expr leftOp, final Expr rightOp) { - return RatLeqExpr.of(leftOp, rightOp); - } - - public static RatGtExpr Gt(final Expr leftOp, final Expr rightOp) { - return RatGtExpr.of(leftOp, rightOp); - } - - public static RatGeqExpr Geq(final Expr leftOp, final Expr rightOp) { - return RatGeqExpr.of(leftOp, rightOp); - } - - /* - * Convenience methods - */ - - public static RatAddExpr Add(final Expr op1, final Expr op2) { - return RatAddExpr.of(ImmutableList.of(op1, op2)); - } - - public static RatAddExpr Add( - final Expr op1, final Expr op2, final Expr op3) { - return RatAddExpr.of(ImmutableList.of(op1, op2, op3)); - } - - public static RatAddExpr Add( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4) { - return RatAddExpr.of(ImmutableList.of(op1, op2, op3, op4)); - } - - public static RatAddExpr Add( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4, - final Expr op5) { - return RatAddExpr.of(ImmutableList.of(op1, op2, op3, op4, op5)); - } - - //// - - public static RatMulExpr Mul(final Expr op1, final Expr op2) { - return RatMulExpr.of(ImmutableList.of(op1, op2)); - } - - public static RatMulExpr Mul( - final Expr op1, final Expr op2, final Expr op3) { - return RatMulExpr.of(ImmutableList.of(op1, op2, op3)); - } - - public static RatMulExpr Mul( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4) { - return RatMulExpr.of(ImmutableList.of(op1, op2, op3, op4)); - } - - public static RatMulExpr Mul( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4, - final Expr op5) { - return RatMulExpr.of(ImmutableList.of(op1, op2, op3, op4, op5)); - } - - public static RatToIntExpr ToInt(Expr op) { - return RatToIntExpr.of(op); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.java deleted file mode 100644 index fd85a817de..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.rattype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.GeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class RatGeqExpr extends GeqExpr { - - private static final int HASH_SEED = 6101; - private static final String OPERATOR_LABEL = ">="; - - private RatGeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static RatGeqExpr of(final Expr leftOp, final Expr rightOp) { - return new RatGeqExpr(leftOp, rightOp); - } - - public static RatGeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Rat()); - final Expr newRightOp = cast(rightOp, Rat()); - return RatGeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final RatLitExpr leftOpVal = (RatLitExpr) getLeftOp().eval(val); - final RatLitExpr rightOpVal = (RatLitExpr) getRightOp().eval(val); - return leftOpVal.geq(rightOpVal); - } - - @Override - public RatGeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return RatGeqExpr.of(leftOp, rightOp); - } - } - - @Override - public RatGeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public RatGeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatGeqExpr that = (RatGeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.java deleted file mode 100644 index f82cbd198c..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.rattype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.GtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class RatGtExpr extends GtExpr { - - private static final int HASH_SEED = 8161; - private static final String OPERATOR_LABEL = ">"; - - private RatGtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static RatGtExpr of(final Expr leftOp, final Expr rightOp) { - return new RatGtExpr(leftOp, rightOp); - } - - public static RatGtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Rat()); - final Expr newRightOp = cast(rightOp, Rat()); - return RatGtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final RatLitExpr leftOpVal = (RatLitExpr) getLeftOp().eval(val); - final RatLitExpr rightOpVal = (RatLitExpr) getRightOp().eval(val); - return leftOpVal.gt(rightOpVal); - } - - @Override - public RatGtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return RatGtExpr.of(leftOp, rightOp); - } - } - - @Override - public RatGtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public RatGtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatGtExpr that = (RatGtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.java deleted file mode 100644 index 11ac8d3c7d..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.rattype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.LeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class RatLeqExpr extends LeqExpr { - - private static final int HASH_SEED = 5479; - private static final String OPERATOR_LABEL = "<="; - - private RatLeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static RatLeqExpr of(final Expr leftOp, final Expr rightOp) { - return new RatLeqExpr(leftOp, rightOp); - } - - public static RatLeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Rat()); - final Expr newRightOp = cast(rightOp, Rat()); - return RatLeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final RatLitExpr leftOpVal = (RatLitExpr) getLeftOp().eval(val); - final RatLitExpr rightOpVal = (RatLitExpr) getRightOp().eval(val); - return leftOpVal.leq(rightOpVal); - } - - @Override - public RatLeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return RatLeqExpr.of(leftOp, rightOp); - } - } - - @Override - public RatLeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public RatLeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatLeqExpr that = (RatLeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLitExpr.java deleted file mode 100644 index 7cc6540a0d..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLitExpr.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.rattype; - -import static com.google.common.base.Preconditions.checkArgument; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.inttype.IntLitExpr; -import java.math.BigInteger; - -public final class RatLitExpr extends NullaryExpr - implements LitExpr, Comparable { - - private static final int HASH_SEED = 149; - - private final BigInteger num; - private final BigInteger denom; - - private volatile int hashCode = 0; - - private RatLitExpr(final BigInteger num, final BigInteger denom) { - checkArgument(denom.compareTo(BigInteger.ZERO) != 0); - - final var gcd = num.abs().gcd(denom.abs()); - if (denom.compareTo(BigInteger.ZERO) >= 0) { - this.num = num.divide(gcd); - this.denom = denom.divide(gcd); - } else { - this.num = num.divide(gcd).negate(); - this.denom = denom.divide(gcd).negate(); - } - } - - public static RatLitExpr of(final BigInteger num, final BigInteger denom) { - return new RatLitExpr(num, denom); - } - - @Override - public RatType getType() { - return Rat(); - } - - @Override - public LitExpr eval(final Valuation val) { - return this; - } - - public BigInteger getNum() { - return num; - } - - public BigInteger getDenom() { - return denom; - } - - public int sign() { - return num.signum(); - } - - public BigInteger floor() { - if (num.compareTo(BigInteger.ZERO) >= 0 || num.mod(denom).compareTo(BigInteger.ZERO) == 0) { - return num.divide(denom); - } else { - return num.divide(denom).subtract(BigInteger.ONE); - } - } - - public BigInteger ceil() { - if (num.compareTo(BigInteger.ZERO) <= 0 || num.mod(denom).compareTo(BigInteger.ZERO) == 0) { - return num.divide(denom); - } else { - return num.divide(denom).add(BigInteger.ONE); - } - } - - public RatLitExpr add(final RatLitExpr that) { - return RatLitExpr.of( - this.getNum() - .multiply(that.getDenom()) - .add(this.getDenom().multiply(that.getNum())), - this.getDenom().multiply(that.getDenom())); - } - - public RatLitExpr sub(final RatLitExpr that) { - return RatLitExpr.of( - this.getNum() - .multiply(that.getDenom()) - .subtract(this.getDenom().multiply(that.getNum())), - this.getDenom().multiply(that.getDenom())); - } - - public RatLitExpr pos() { - return RatLitExpr.of(this.getNum(), this.getDenom()); - } - - public RatLitExpr neg() { - return RatLitExpr.of(this.getNum().negate(), this.getDenom()); - } - - public RatLitExpr mul(final RatLitExpr that) { - return RatLitExpr.of( - this.getNum().multiply(that.getNum()), this.getDenom().multiply(that.getDenom())); - } - - public RatLitExpr div(final RatLitExpr that) { - return RatLitExpr.of( - this.getNum().multiply(that.getDenom()), this.getDenom().multiply(that.getNum())); - } - - public BoolLitExpr eq(final RatLitExpr that) { - return Bool( - this.getNum().compareTo(that.getNum()) == 0 - && this.getDenom().compareTo(that.getDenom()) == 0); - } - - public BoolLitExpr neq(final RatLitExpr that) { - return Bool( - this.getNum().compareTo(that.getNum()) != 0 - || this.getDenom().compareTo(that.getDenom()) != 0); - } - - public BoolLitExpr lt(final RatLitExpr that) { - return Bool( - this.getNum() - .multiply(that.getDenom()) - .compareTo(this.getDenom().multiply(that.getNum())) - < 0); - } - - public BoolLitExpr leq(final RatLitExpr that) { - return Bool( - this.getNum() - .multiply(that.getDenom()) - .compareTo(this.getDenom().multiply(that.getNum())) - <= 0); - } - - public BoolLitExpr gt(final RatLitExpr that) { - return Bool( - this.getNum() - .multiply(that.getDenom()) - .compareTo(this.getDenom().multiply(that.getNum())) - > 0); - } - - public BoolLitExpr geq(final RatLitExpr that) { - return Bool( - this.getNum() - .multiply(that.getDenom()) - .compareTo(this.getDenom().multiply(that.getNum())) - >= 0); - } - - public RatLitExpr abs() { - return RatLitExpr.of(num.abs(), denom); - } - - public RatLitExpr frac() { - return sub(of(floor(), BigInteger.ONE)); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + num.hashCode(); - result = 31 * result + denom.hashCode(); - hashCode = result; - } - return hashCode; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatLitExpr that = (RatLitExpr) obj; - return (this.getNum().compareTo(that.getNum()) == 0 - && this.getDenom().compareTo(that.getDenom()) == 0); - } else { - return false; - } - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder(); - sb.append(getNum()); - sb.append('%'); - sb.append(getDenom()); - return sb.toString(); - } - - @Override - public int compareTo(final RatLitExpr that) { - return this.getNum() - .multiply(that.getDenom()) - .compareTo(this.getDenom().multiply(that.getNum())); - } - - public IntLitExpr toInt() { - return IntLitExpr.of(num.divide(denom)); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.java deleted file mode 100644 index b8bdf550fa..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.rattype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.LtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class RatLtExpr extends LtExpr { - - private static final int HASH_SEED = 6311; - private static final String OPERATOR_LABEL = "<"; - - private RatLtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static RatLtExpr of(final Expr leftOp, final Expr rightOp) { - return new RatLtExpr(leftOp, rightOp); - } - - public static RatLtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Rat()); - final Expr newRightOp = cast(rightOp, Rat()); - return RatLtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final RatLitExpr leftOpVal = (RatLitExpr) getLeftOp().eval(val); - final RatLitExpr rightOpVal = (RatLitExpr) getRightOp().eval(val); - return leftOpVal.lt(rightOpVal); - } - - @Override - public RatLtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return new RatLtExpr(leftOp, rightOp); - } - } - - @Override - public RatLtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public RatLtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatLtExpr that = (RatLtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.java deleted file mode 100644 index 9663c45b12..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.rattype; - -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.MulExpr; -import java.math.BigInteger; -import java.util.List; - -public final class RatMulExpr extends MulExpr { - - private static final int HASH_SEED = 9479; - private static final String OPERATOR_LABEL = "*"; - - private RatMulExpr(final Iterable> ops) { - super(ops); - } - - public static RatMulExpr of(final Iterable> ops) { - return new RatMulExpr(ops); - } - - public static RatMulExpr create(final List> ops) { - return RatMulExpr.of(ops.stream().map(op -> cast(op, Rat())).collect(toImmutableList())); - } - - @Override - public RatType getType() { - return Rat(); - } - - @Override - public RatLitExpr eval(final Valuation val) { - var prodNum = BigInteger.ONE; - var prodDenom = BigInteger.ONE; - for (final Expr op : getOps()) { - final RatLitExpr opLit = (RatLitExpr) op.eval(val); - prodNum = prodNum.multiply(opLit.getNum()); - prodDenom = prodDenom.multiply(opLit.getDenom()); - } - return Rat(prodNum, prodDenom); - } - - @Override - public RatMulExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return new RatMulExpr(ops); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatMulExpr that = (RatMulExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.java deleted file mode 100644 index d6ffa6537f..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.rattype; - -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.NegExpr; - -public final class RatNegExpr extends NegExpr { - - private static final int HASH_SEED = 4127; - private static final String OPERATOR_LABEL = "-"; - - private RatNegExpr(final Expr op) { - super(op); - } - - public static RatNegExpr of(final Expr op) { - return new RatNegExpr(op); - } - - public static RatNegExpr create(final Expr op) { - final Expr newOp = cast(op, Rat()); - return RatNegExpr.of(newOp); - } - - @Override - public RatType getType() { - return Rat(); - } - - @Override - public RatLitExpr eval(final Valuation val) { - final RatLitExpr opVal = (RatLitExpr) getOp().eval(val); - return opVal.neg(); - } - - @Override - public RatNegExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return RatNegExpr.of(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatNegExpr that = (RatNegExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.java deleted file mode 100644 index 974061e667..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.rattype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class RatNeqExpr extends NeqExpr { - - private static final int HASH_SEED = 1997; - private static final String OPERATOR_LABEL = "/="; - - private RatNeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static RatNeqExpr of(final Expr leftOp, final Expr rightOp) { - return new RatNeqExpr(leftOp, rightOp); - } - - public static RatNeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Rat()); - final Expr newRightOp = cast(rightOp, Rat()); - return RatNeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final RatLitExpr leftOpVal = (RatLitExpr) getLeftOp().eval(val); - final RatLitExpr rightOpVal = (RatLitExpr) getRightOp().eval(val); - return leftOpVal.neq(rightOpVal); - } - - @Override - public RatNeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return RatNeqExpr.of(leftOp, rightOp); - } - } - - @Override - public RatNeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public RatNeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatNeqExpr that = (RatNeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.java deleted file mode 100644 index 62192436c7..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.rattype; - -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.PosExpr; - -public final class RatPosExpr extends PosExpr { - - private static final int HASH_SEED = 4827; - private static final String OPERATOR_LABEL = "+"; - - private RatPosExpr(final Expr op) { - super(op); - } - - public static RatPosExpr of(final Expr op) { - return new RatPosExpr(op); - } - - public static RatPosExpr create(final Expr op) { - final Expr newOp = cast(op, Rat()); - return RatPosExpr.of(newOp); - } - - @Override - public RatType getType() { - return Rat(); - } - - @Override - public RatLitExpr eval(final Valuation val) { - final RatLitExpr opVal = (RatLitExpr) getOp().eval(val); - return opVal.pos(); - } - - @Override - public RatPosExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return RatPosExpr.of(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatPosExpr that = (RatPosExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.java deleted file mode 100644 index 805670f434..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.rattype; - -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.SubExpr; - -public final class RatSubExpr extends SubExpr { - - private static final int HASH_SEED = 6287; - private static final String OPERATOR = "-"; - - private RatSubExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static RatSubExpr of(final Expr leftOp, final Expr rightOp) { - return new RatSubExpr(leftOp, rightOp); - } - - public static RatSubExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Rat()); - final Expr newRightOp = cast(rightOp, Rat()); - return RatSubExpr.of(newLeftOp, newRightOp); - } - - @Override - public RatType getType() { - return Rat(); - } - - @Override - public RatLitExpr eval(final Valuation val) { - final RatLitExpr leftOpVal = (RatLitExpr) getLeftOp().eval(val); - final RatLitExpr rightOpVal = (RatLitExpr) getRightOp().eval(val); - return leftOpVal.sub(rightOpVal); - } - - @Override - public SubExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return RatSubExpr.of(leftOp, rightOp); - } - } - - @Override - public SubExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public SubExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatSubExpr that = (RatSubExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.java deleted file mode 100644 index 90648969c4..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.rattype; - -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; -import hu.bme.mit.theta.core.type.inttype.IntLitExpr; -import hu.bme.mit.theta.core.type.inttype.IntType; - -public final class RatToIntExpr extends UnaryExpr { - - private static final int HASH_SEED = 4828; - private static final String OPERATOR_LABEL = "to_int"; - - private RatToIntExpr(final Expr op) { - super(op); - } - - public static RatToIntExpr of(final Expr op) { - return new RatToIntExpr(op); - } - - public static RatToIntExpr create(final Expr op) { - final Expr newOp = cast(op, Rat()); - return RatToIntExpr.of(newOp); - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - final RatLitExpr opVal = (RatLitExpr) getOp().eval(val); - return opVal.toInt(); - } - - @Override - public RatToIntExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return RatToIntExpr.of(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatToIntExpr that = (RatToIntExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatType.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatType.java deleted file mode 100644 index 5495c56d3e..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatType.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.rattype; - -import hu.bme.mit.theta.core.type.DomainSize; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.Additive; -import hu.bme.mit.theta.core.type.abstracttype.Equational; -import hu.bme.mit.theta.core.type.abstracttype.Multiplicative; -import hu.bme.mit.theta.core.type.abstracttype.Ordered; - -public final class RatType - implements Additive, - Multiplicative, - Equational, - Ordered { - - private static final RatType INSTANCE = new RatType(); - private static final int HASH_SEED = 385863; - private static final String TYPE_LABEL = "Rat"; - - private RatType() {} - - public static RatType getInstance() { - return INSTANCE; - } - - @Override - public int hashCode() { - return HASH_SEED; - } - - @Override - public boolean equals(final Object obj) { - return (obj != null && this.getClass() == obj.getClass()); - } - - @Override - public String toString() { - return TYPE_LABEL; - } - - //// - - @Override - public RatAddExpr Add(final Iterable> ops) { - return RatExprs.Add(ops); - } - - @Override - public RatSubExpr Sub(final Expr leftOp, final Expr rightOp) { - return RatExprs.Sub(leftOp, rightOp); - } - - @Override - public RatPosExpr Pos(final Expr op) { - return RatExprs.Pos(op); - } - - @Override - public RatNegExpr Neg(final Expr op) { - return RatExprs.Neg(op); - } - - @Override - public RatMulExpr Mul(final Iterable> ops) { - return RatExprs.Mul(ops); - } - - @Override - public RatDivExpr Div(final Expr leftOp, final Expr rightOp) { - return RatExprs.Div(leftOp, rightOp); - } - - @Override - public RatEqExpr Eq(final Expr leftOp, final Expr rightOp) { - return RatExprs.Eq(leftOp, rightOp); - } - - @Override - public RatNeqExpr Neq(final Expr leftOp, final Expr rightOp) { - return RatExprs.Neq(leftOp, rightOp); - } - - @Override - public RatLtExpr Lt(final Expr leftOp, final Expr rightOp) { - return RatExprs.Lt(leftOp, rightOp); - } - - @Override - public RatLeqExpr Leq(final Expr leftOp, final Expr rightOp) { - return RatExprs.Leq(leftOp, rightOp); - } - - @Override - public RatGtExpr Gt(final Expr leftOp, final Expr rightOp) { - return RatExprs.Gt(leftOp, rightOp); - } - - @Override - public RatGeqExpr Geq(final Expr leftOp, final Expr rightOp) { - return RatExprs.Geq(leftOp, rightOp); - } - - @Override - public DomainSize getDomainSize() { - return DomainSize.INFINITY; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java index a88f5071be..122b89db76 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java @@ -22,7 +22,6 @@ import static hu.bme.mit.theta.core.utils.SimplifierLevel.LITERAL_ONLY; import hu.bme.mit.theta.common.DispatchTable2; -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.common.Utils; import hu.bme.mit.theta.common.container.Containers; import hu.bme.mit.theta.core.model.Valuation; @@ -48,6 +47,7 @@ import hu.bme.mit.theta.core.type.rattype.*; import java.math.BigInteger; import java.util.*; +import kotlin.Pair; import org.kframework.mpfr.BigFloat; public final class ExprSimplifier { @@ -305,13 +305,13 @@ private Expr> simplifyGener private Expr> simplifyArrayInit( final ArrayInitExpr t, final Valuation val) { boolean nonLiteralFound = false; - List, Expr>> newElements = new ArrayList<>(); + List, Expr>> newElements = new ArrayList<>(); Expr newElseElem = simplify(t.getElseElem(), val); if (!(newElseElem instanceof LitExpr)) nonLiteralFound = true; - for (Tuple2, Expr> element : t.getElements()) { - Expr newIndex = simplify(element.get1(), val); - Expr newElement = simplify(element.get2(), val); - newElements.add(Tuple2.of(newIndex, newElement)); + for (Pair, Expr> element : t.getElements()) { + Expr newIndex = simplify(element.getFirst(), val); + Expr newElement = simplify(element.getSecond(), val); + newElements.add(new Pair(newIndex, newElement)); if (!(newElement instanceof LitExpr) || !(newIndex instanceof LitExpr)) nonLiteralFound = true; } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/ChcUtils.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/ChcUtils.kt similarity index 92% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/ChcUtils.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/ChcUtils.kt index ff8e00ad5d..8848b15629 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/ChcUtils.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/ChcUtils.kt @@ -21,7 +21,12 @@ import hu.bme.mit.theta.core.decl.Decls.Param import hu.bme.mit.theta.core.decl.ParamDecl import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.Type -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Forall +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.functype.FuncExprs import hu.bme.mit.theta.core.type.functype.FuncType diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt new file mode 100644 index 0000000000..98d583e6b2 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt @@ -0,0 +1,82 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.decl + +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.UniqueIdProvider +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** + * A basic constant declaration that can be directly passed to the SMT solver. + * + * @param + */ +@Serializable(with = BasicConstDecl.Serializer::class) +@SerialName("BasicConstDecl") +data class BasicConstDecl( + override val name: String, + override val type: DeclType, + override val id: Int = uniqueIdProvider.get(), +) : ConstDecl() { + + companion object { + private val uniqueIdProvider = UniqueIdProvider() + } + + object Serializer : KSerializer> { + + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("BasicConstDecl") { + element("name") + element("type") + element("id") + } + + override fun serialize(encoder: Encoder, value: BasicConstDecl) = + encoder.encodeStructure(descriptor) { + encodeStringElement(descriptor, 0, value.name) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) + encodeIntElement(descriptor, 2, value.id) + } + + override fun deserialize(decoder: Decoder): BasicConstDecl = + decoder.decodeStructure(descriptor) { + var name: String? = null + var type: Type? = null + var id: Int? = null + + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> name = decodeStringElement(descriptor, 0) + 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + 2 -> id = decodeIntElement(descriptor, 2) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unexpected index: $index") + } + } + + BasicConstDecl( + name = name ?: throw SerializationException("Missing name"), + type = type ?: throw SerializationException("Missing type"), + id = id ?: throw SerializationException("Missing id"), + ) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ConstDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ConstDecl.kt new file mode 100644 index 0000000000..55f7206553 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ConstDecl.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.decl + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.Serializable + +/** + * Abstract base class for constants. Use [BasicConstDecl] for a basic constant, or + * [IndexedConstDecl] if the constant belongs to a variable for some index (e.g., during unfolding + * paths). + * + * @param + */ +@Serializable +abstract class ConstDecl : Decl() { + companion object { + private const val DECL_LABEL = "Const" + } + + override fun toString(): String = + Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decl.kt new file mode 100644 index 0000000000..9559e7b576 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decl.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.decl + +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.anytype.Exprs.Ref +import hu.bme.mit.theta.core.type.anytype.RefExpr +import kotlinx.serialization.Serializable + +@Serializable +abstract class Decl { + + /** The name of the declaration. */ + abstract val name: String + + /** The type of the declaration. */ + abstract val type: DeclType + + /** + * Unique identifier for the declaration used for serialization. Do not use for other purposes! + */ + protected abstract val id: Int + + /** Reference to this declaration. */ + val ref: RefExpr by lazy { Ref(this) } +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Divisible.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decls.kt similarity index 50% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Divisible.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decls.kt index 7eeaf458cc..883ccbc8bf 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Divisible.java +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decls.kt @@ -13,14 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.abstracttype; +package hu.bme.mit.theta.core.decl -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; +import hu.bme.mit.theta.core.type.Type -public interface Divisible> extends Type { +/** Factory class to create declarations. */ +@Suppress("FunctionName") +object Decls { + /** Create a constant declaration with a given name and type. */ + @JvmStatic fun Const(name: String, type: T): ConstDecl = BasicConstDecl(name, type) - ModExpr Mod(Expr leftOp, Expr rightOp); + /** Create a parameter declaration with a given name and type. */ + @JvmStatic fun Param(name: String, type: T): ParamDecl = ParamDecl(name, type) - RemExpr Rem(Expr leftOp, Expr rightOp); + /** Create a variable declaration with a given type. */ + @JvmStatic fun Var(name: String, type: T): VarDecl = VarDecl(name, type) } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt new file mode 100644 index 0000000000..538ff28bc4 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt @@ -0,0 +1,93 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.decl + +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.UniqueIdProvider +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** + * A constant declaration that belongs to a variable ([VarDecl] declaration for a given index. For + * example, when unfolding a path, each variable will have a new constant for each step of the path. + * + * @param + */ +@Serializable(with = IndexedConstDecl.Serializer::class) +@SerialName("IndexedConstDecl") +data class IndexedConstDecl( + val varDecl: VarDecl, + val index: Int, + override val id: Int = uniqueIdProvider.get(), +) : ConstDecl() { + + init { + require(index >= 0) { "Index must be non-negative" } + } + + companion object { + + private val uniqueIdProvider = UniqueIdProvider() + + private const val NAME_FORMAT: String = "_%s:%d" + } + + override val name: String = String.format(NAME_FORMAT, varDecl.name, index) + override val type: DeclType = varDecl.type + + object Serializer : KSerializer> { + + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("IndexedConstDecl") { + element>("varDecl") + element("index") + element("id") + } + + override fun serialize(encoder: Encoder, value: IndexedConstDecl) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, VarDecl.Serializer, value.varDecl) + encodeIntElement(descriptor, 1, value.index) + encodeIntElement(descriptor, 2, value.id) + } + + override fun deserialize(decoder: Decoder): IndexedConstDecl = + decoder.decodeStructure(descriptor) { + var varDecl: VarDecl? = null + var index: Int? = null + var id: Int? = null + + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> varDecl = decodeSerializableElement(descriptor, 0, VarDecl.Serializer) + 1 -> index = decodeIntElement(descriptor, 1) + 2 -> id = decodeIntElement(descriptor, 2) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + + IndexedConstDecl( + varDecl = varDecl ?: throw SerializationException("Missing varDecl"), + index = index ?: throw SerializationException("Missing index"), + id = id ?: throw SerializationException("Missing id"), + ) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt new file mode 100644 index 0000000000..da1bb3d8ff --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt @@ -0,0 +1,84 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.decl + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.UniqueIdProvider +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +@Serializable(with = ParamDecl.Serializer::class) +@SerialName(ParamDecl.DECL_LABEL) +data class ParamDecl( + override val name: String, + override val type: DeclType, + override val id: Int = uniqueIdProvider.get(), +) : Decl() { + + companion object { + + private val uniqueIdProvider = UniqueIdProvider() + + internal const val DECL_LABEL: String = "Param" + } + + override fun toString(): String = + Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() + + object Serializer : KSerializer> { + + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("ParamDecl") { + element("name") + element("type") + element("id") + } + + override fun serialize(encoder: Encoder, value: ParamDecl) = + encoder.encodeStructure(descriptor) { + encodeStringElement(descriptor, 0, value.name) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) + encodeIntElement(descriptor, 2, value.id) + } + + override fun deserialize(decoder: Decoder): ParamDecl = + decoder.decodeStructure(descriptor) { + var name: String? = null + var type: Type? = null + var id: Int? = null + + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> name = decodeStringElement(descriptor, 0) + 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + 2 -> id = decodeIntElement(descriptor, 2) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unexpected index: $index") + } + } + + ParamDecl( + name = name ?: throw SerializationException("Missing name"), + type = type ?: throw SerializationException("Missing type"), + id = id ?: throw SerializationException("Missing id"), + ) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt new file mode 100644 index 0000000000..de6e50e82b --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt @@ -0,0 +1,100 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.decl + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.UniqueIdProvider +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** + * Represents a variable declaration. Variables cannot be directly passed to the SMT solver, they + * must be replaced with constants for a given index ([IndexedConstDecl]). See also + * [hu.bme.mit.theta.core.utils.PathUtils]. + * + * @param + */ +@Serializable(with = VarDecl.Serializer::class) +@SerialName(VarDecl.DECL_LABEL) +data class VarDecl( + override val name: String, + override val type: DeclType, + override val id: Int = uniqueIdProvider.get(), +) : Decl() { + + companion object { + + private val uniqueIdProvider = UniqueIdProvider() + + internal const val DECL_LABEL: String = "var" + + fun copyOf(from: VarDecl): VarDecl = VarDecl(from.name, from.type) + } + + @Transient private val indexToConst = mutableMapOf>() + + fun getConstDecl(index: Int): IndexedConstDecl { + require(index >= 0) { "Index must be non-negative" } + return indexToConst.getOrPut(index) { IndexedConstDecl(this, index) } + } + + override fun toString(): String = + Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() + + object Serializer : KSerializer> { + + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("VarDecl") { + element("name") + element("type") + element("id") + } + + override fun serialize(encoder: Encoder, value: VarDecl) = + encoder.encodeStructure(descriptor) { + encodeStringElement(descriptor, 0, value.name) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) + encodeIntElement(descriptor, 2, value.id) + } + + override fun deserialize(decoder: Decoder): VarDecl = + decoder.decodeStructure(descriptor) { + var name: String? = null + var type: Type? = null + var id: Int? = null + + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> name = decodeStringElement(descriptor, 0) + 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + 2 -> id = decodeIntElement(descriptor, 2) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unexpected index: $index") + } + } + + VarDecl( + name = name ?: throw SerializationException("Missing name"), + type = type ?: throw SerializationException("Missing type"), + id = id ?: throw SerializationException("Missing id"), + ) + } + } +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/package-info.java similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/package-info.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/package-info.java diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/BigIntegerSerializer.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/BigIntegerSerializer.kt new file mode 100644 index 0000000000..41f6a26732 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/BigIntegerSerializer.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.serialization + +import java.math.BigInteger +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +object BigIntegerSerializer : KSerializer { + + override val descriptor: SerialDescriptor = + PrimitiveSerialDescriptor("BigInteger", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: BigInteger) { + encoder.encodeString(value.toString()) + } + + override fun deserialize(decoder: Decoder): BigInteger { + return BigInteger(decoder.decodeString()) + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/SerializerModule.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/SerializerModule.kt new file mode 100644 index 0000000000..047e0a1fa3 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/SerializerModule.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.serialization + +import hu.bme.mit.theta.core.decl.generated.declSerializerModule +import hu.bme.mit.theta.core.stmt.generated.stmtSerializerModule +import hu.bme.mit.theta.core.type.generated.exprSerializerModule +import hu.bme.mit.theta.core.type.generated.typeSerializerModule +import kotlinx.serialization.json.Json +import kotlinx.serialization.modules.SerializersModule + +val coreSerializerModule = SerializersModule { + include(typeSerializerModule) + include(declSerializerModule) + include(stmtSerializerModule) + include(exprSerializerModule) +} + +val coreJson = Json { + serializersModule = coreSerializerModule + classDiscriminator = "class" +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssignStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssignStmt.kt new file mode 100644 index 0000000000..9f73b8a9c1 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssignStmt.kt @@ -0,0 +1,98 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.stmt + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.decl.VarDecl +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** + * Assignment statement of the form `VARIABLE := EXPRESSION`. The statement updates the VARIABLE + * with the result of EXPRESSION. + * + * @param + */ +@Serializable(with = AssignStmt.Serializer::class) +@SerialName(AssignStmt.STMT_LABEL) +data class AssignStmt(val varDecl: VarDecl, val expr: Expr) : + Stmt { + + companion object { + + internal const val STMT_LABEL = "assign" + + @JvmStatic + fun of(lhs: VarDecl, rhs: Expr): AssignStmt = + AssignStmt(lhs, rhs) + + @JvmStatic + @Suppress("UNCHECKED_CAST") + fun create(lhs: VarDecl<*>, rhs: Expr<*>): AssignStmt { + val newLhs = lhs as VarDecl + val newRhs = cast(rhs, newLhs.type) + return of(newLhs, newRhs) + } + } + + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) + + override fun toString(): String = + Utils.lispStringBuilder(STMT_LABEL).add(varDecl.name).add(expr).toString() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("AssignStmt") { + element>("varDecl") + element>("expr") + } + + override fun serialize(encoder: Encoder, value: AssignStmt) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, VarDecl.Serializer, value.varDecl) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.expr) + } + + override fun deserialize(decoder: Decoder): AssignStmt = + decoder.decodeStructure(descriptor) { + var varDecl: VarDecl? = null + var expr: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> + varDecl = + decodeSerializableElement(descriptor, 0, VarDecl.Serializer) as VarDecl + 1 -> + expr = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + AssignStmt( + varDecl = varDecl ?: throw SerializationException("Missing varDecl"), + expr = expr ?: throw SerializationException("Missing expr"), + ) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssumeStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssumeStmt.kt new file mode 100644 index 0000000000..0dccaf9073 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssumeStmt.kt @@ -0,0 +1,79 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.stmt + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** + * Assume statement of the form `[EXPRESSION]`, where EXPRESSION is a Boolean [Expr]. The statement + * is a guard that can only be passed if EXPRESSION evaluates to true. + */ +@Serializable(with = AssumeStmt.Serializer::class) +@SerialName(AssumeStmt.STMT_LABEL) +data class AssumeStmt(val cond: Expr) : Stmt { + + companion object { + + internal const val STMT_LABEL = "assume" + + @JvmStatic fun of(cond: Expr): AssumeStmt = AssumeStmt(cond) + + @JvmStatic + fun create(cond: Expr<*>): AssumeStmt { + val newCond = cast(cond, Bool()) + return of(newCond) + } + } + + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) + + override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(cond).toString() + + object Serializer : KSerializer { + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("AssumeStmt") { element>("cond") } + + override fun serialize(encoder: Encoder, value: AssumeStmt) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.cond) + } + + override fun deserialize(decoder: Decoder): AssumeStmt = + decoder.decodeStructure(descriptor) { + var cond: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> + cond = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + as Expr + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + AssumeStmt(cond = cond ?: throw SerializationException("Missing cond")) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/HavocStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/HavocStmt.kt new file mode 100644 index 0000000000..9407b668ae --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/HavocStmt.kt @@ -0,0 +1,69 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.stmt + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.decl.VarDecl +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** + * Havoc statement of the form `havoc VARIABLE`, which performs a non-deterministic assignment to + * VARIABLE. + * + * @param + */ +@Serializable(with = HavocStmt.Serializer::class) +@SerialName(HavocStmt.STMT_LABEL) +data class HavocStmt(val varDecl: VarDecl) : Stmt { + + companion object { + + internal const val STMT_LABEL = "havoc" + + @JvmStatic fun of(varDecl: VarDecl): HavocStmt = HavocStmt(varDecl) + } + + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) + + override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(varDecl.name).toString() + + object Serializer : KSerializer> { + override val descriptor = + buildClassSerialDescriptor("HavocStmt") { element>("varDecl") } + + override fun serialize(encoder: Encoder, value: HavocStmt) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, VarDecl.Serializer, value.varDecl) + } + + override fun deserialize(decoder: Decoder): HavocStmt = + decoder.decodeStructure(descriptor) { + var varDecl: VarDecl? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> varDecl = decodeSerializableElement(descriptor, 0, VarDecl.Serializer) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + HavocStmt(varDecl = varDecl ?: throw SerializationException("Missing varDecl")) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/IfStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/IfStmt.kt new file mode 100644 index 0000000000..71498d9978 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/IfStmt.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.stmt + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolType +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * If-then-else statement of the form `if (COND) THEN [else ELSE]`. The statement first evaluates + * the condition COND, and based on its value, executes either the THEN or the ELSE branch. The ELSE + * branch is optional and defaults to a skip statement. + */ +@Serializable +@SerialName(IfStmt.STMT_LABEL) +data class IfStmt(val cond: Expr, val then: Stmt, val elze: Stmt) : Stmt { + + companion object { + internal const val STMT_LABEL = "if" + + @JvmStatic + fun of(cond: Expr, then: Stmt, elze: Stmt): IfStmt = IfStmt(cond, then, elze) + + @JvmStatic fun of(cond: Expr, then: Stmt): IfStmt = IfStmt(cond, then, SkipStmt) + } + + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) + + override fun toString(): String = + Utils.lispStringBuilder(STMT_LABEL).add(cond).add(then).add(elze).toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/LoopStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/LoopStmt.kt new file mode 100644 index 0000000000..7a1b3e9c3f --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/LoopStmt.kt @@ -0,0 +1,54 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.stmt + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.decl.VarDecl +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.inttype.IntType +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Loop statement of the form `for (LOOP_VAR = FROM to TO) { BODY }`. The statement executes the + * BODY statement repeatedly, with LOOP_VAR taking on values from FROM to TO (inclusive). + */ +@Serializable +@SerialName(LoopStmt.STMT_LABEL) +data class LoopStmt( + val stmt: Stmt, + val loopVariable: VarDecl, + val from: Expr, + val to: Expr, +) : Stmt { + + companion object { + internal const val STMT_LABEL = "loop" + + @JvmStatic + fun of( + stmt: Stmt, + loopVar: VarDecl, + from: Expr, + to: Expr, + ): LoopStmt = LoopStmt(stmt, loopVar, from, to) + } + + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) + + override fun toString(): String = + Utils.lispStringBuilder(STMT_LABEL).add("$loopVariable from $from to $to $stmt").toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt new file mode 100644 index 0000000000..9af54d0107 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt @@ -0,0 +1,109 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.stmt + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.anytype.Dereference +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** + * Assignment statement of the form `*(DEREF_EXPRESSION) := EXPRESSION`. The statement updates the + * value pointed to by DEREF_EXPRESSION with the result of EXPRESSION. + * + * @param PtrType The type of the pointer + * @param OffsetType The type of the offset + * @param DeclType The type of the value being assigned + */ +@Serializable(with = MemoryAssignStmt.Serializer::class) +@SerialName(MemoryAssignStmt.STMT_LABEL) +data class MemoryAssignStmt( + val deref: Dereference, + val expr: Expr, +) : Stmt { + + companion object { + + internal const val STMT_LABEL = "memassign" + + @JvmStatic + fun of( + deref: Dereference, + expr: Expr, + ): MemoryAssignStmt = MemoryAssignStmt(deref, expr) + + @JvmStatic + @Suppress("UNCHECKED_CAST") + fun create( + deref: Dereference, + expr: Expr, + ): MemoryAssignStmt { + val typedDeref = deref as Dereference + return of(typedDeref, expr) + } + } + + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) + + override fun toString(): String = + Utils.lispStringBuilder(STMT_LABEL).add(deref).add(expr).toString() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("MemoryAssignStmt") { + element>("deref") + element>("expr") + } + + override fun serialize( + encoder: Encoder, + value: MemoryAssignStmt, + ) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, Dereference.Serializer, value.deref) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.expr) + } + + override fun deserialize(decoder: Decoder): MemoryAssignStmt = + decoder.decodeStructure(descriptor) { + var deref: Dereference? = null + var expr: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> + deref = + decodeSerializableElement(descriptor, 0, Dereference.Serializer) + as Dereference + 1 -> + expr = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + MemoryAssignStmt( + deref ?: throw SerializationException("Missing deref "), + expr ?: throw SerializationException("Missing expr "), + ) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/NonDetStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/NonDetStmt.kt new file mode 100644 index 0000000000..27bcfef622 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/NonDetStmt.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.stmt + +import hu.bme.mit.theta.common.Utils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Non-deterministic statement of the form `nondet { STMT1, STMT2, ... }`. The statement executes + * exactly one of the given statements, chosen non-deterministically. + */ +@Serializable +@SerialName(NonDetStmt.STMT_LABEL) +data class NonDetStmt(val stmts: List) : Stmt { + + init { + check(stmts.isNotEmpty()) + } + + companion object { + + internal const val STMT_LABEL = "nondet" + + @JvmStatic + fun of(stmts: List): NonDetStmt { + val stmtList = stmts.ifEmpty { listOf(SkipStmt) } + return NonDetStmt(stmtList) + } + } + + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) + + override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).addAll(stmts).toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/OrtStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/OrtStmt.kt new file mode 100644 index 0000000000..542c872312 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/OrtStmt.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.stmt + +import hu.bme.mit.theta.common.Utils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Orthogonal statement of the form `ort { STMT1, STMT2, ... }`. The statement executes all of the + * given statements in parallel. + */ +@Serializable +@SerialName(OrtStmt.STMT_LABEL) +data class OrtStmt(val stmts: List) : Stmt { + + init { + check(stmts.isNotEmpty()) + } + + companion object { + + internal const val STMT_LABEL = "ort" + + @JvmStatic + fun of(stmts: List): OrtStmt { + val stmtList = stmts.ifEmpty { listOf(SkipStmt) } + return OrtStmt(stmtList) + } + } + + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) + + override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).addAll(stmts).toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/SequenceStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/SequenceStmt.kt new file mode 100644 index 0000000000..3ff4cdabbe --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/SequenceStmt.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.stmt + +import hu.bme.mit.theta.common.Utils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Sequence statement of the form `sequence { STMT1; STMT2; ... }`. The statement executes all of + * the given statements in sequence. + */ +@Serializable +@SerialName(SequenceStmt.STMT_LABEL) +data class SequenceStmt(val stmts: List) : Stmt { + + init { + check(stmts.isNotEmpty()) + } + + companion object { + + internal const val STMT_LABEL = "sequence" + + @JvmStatic + fun of(stmts: List): SequenceStmt { + val stmtList = stmts.ifEmpty { listOf(SkipStmt) } + return SequenceStmt(stmtList) + } + } + + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) + + override fun toString(): String = Utils.lispStringBuilder().addAll(stmts).toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Equational.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/SkipStmt.kt similarity index 60% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Equational.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/SkipStmt.kt index 0fa1b66b59..dd455c69eb 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Equational.java +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/SkipStmt.kt @@ -13,14 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.abstracttype; +package hu.bme.mit.theta.core.stmt -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public interface Equational> extends Type { +@Serializable +@SerialName(SkipStmt.STMT_LABEL) +data object SkipStmt : Stmt { - EqExpr Eq(Expr leftOp, Expr rightOp); + internal const val STMT_LABEL = "skip" - NeqExpr Neq(Expr leftOp, Expr rightOp); + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) + + @JvmStatic fun getInstance(): SkipStmt = this + + override fun toString(): String = STMT_LABEL } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/Stmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/Stmt.kt new file mode 100644 index 0000000000..4765d9df20 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/Stmt.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.stmt + +import kotlinx.serialization.Polymorphic + +/** Base class for all statements in the Theta framework. All subclasses must be serializable. */ +@Polymorphic +interface Stmt { + /** + * Accepts a visitor and returns the result of the visit. + * + * @param visitor The visitor to accept + * @param param Additional parameter for the visitor + * @return The result of the visit + */ + fun accept(visitor: StmtVisitor, param: P): R +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/StmtVisitor.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/StmtVisitor.kt new file mode 100644 index 0000000000..f13aafb8a7 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/StmtVisitor.kt @@ -0,0 +1,49 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.stmt + +import hu.bme.mit.theta.core.type.Type + +/** + * Visitor interface for the statement hierarchy. + * + * @param

The type of the parameter + * @param The return type of the visit operations + */ +interface StmtVisitor { + fun visit(stmt: SkipStmt, param: P): R + + fun visit(stmt: AssumeStmt, param: P): R + + fun visit(stmt: AssignStmt, param: P): R + + fun visit( + stmt: MemoryAssignStmt, + param: P, + ): R + + fun visit(stmt: HavocStmt, param: P): R + + fun visit(stmt: SequenceStmt, param: P): R + + fun visit(stmt: NonDetStmt, param: P): R + + fun visit(stmt: OrtStmt, param: P): R + + fun visit(stmt: LoopStmt, param: P): R + + fun visit(stmt: IfStmt, param: P): R +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/Stmts.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/Stmts.kt new file mode 100644 index 0000000000..6a23456068 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/Stmts.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.stmt + +import hu.bme.mit.theta.core.decl.VarDecl +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.anytype.Dereference +import hu.bme.mit.theta.core.type.booltype.BoolType + +/** + * Factory class to instantiate different statements. + * + * @see Stmt + */ +@Suppress("FunctionName") +object Stmts { + + /** Create a skip statement */ + @JvmStatic fun Skip(): SkipStmt = SkipStmt + + /** Create an assume statement */ + @JvmStatic fun Assume(cond: Expr): AssumeStmt = AssumeStmt(cond) + + /** Create an assignment statement */ + @JvmStatic + fun Assign(lhs: VarDecl, rhs: Expr): AssignStmt = AssignStmt.of(lhs, rhs) + + /** Create a memory assignment statement */ + @JvmStatic + fun

MemoryAssign( + deref: Dereference, + expr: Expr, + ): MemoryAssignStmt = MemoryAssignStmt.of(deref, expr) + + /** Create a havoc statement */ + @JvmStatic fun Havoc(varDecl: VarDecl): HavocStmt = HavocStmt.of(varDecl) + + /** Create a sequence statement */ + @JvmStatic fun Sequence(stmts: List): SequenceStmt = SequenceStmt.of(stmts) + + /** Create a non-deterministic choice statement */ + @JvmStatic fun NonDet(stmts: List): NonDetStmt = NonDetStmt.of(stmts) +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/BinaryExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/BinaryExpr.kt new file mode 100644 index 0000000000..d500c8b23b --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/BinaryExpr.kt @@ -0,0 +1,65 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.Serializable + +/** + * Base class for expressions with two operands (binary expressions). + * + * @param OpType The type of the operands + * @param ExprType The type of the expression + */ +@Serializable +abstract class BinaryExpr : Expr { + + abstract val leftOp: Expr + abstract val rightOp: Expr + + override val ops: List> + get() = listOf(leftOp, rightOp) + + abstract val operatorLabel: String + + override fun withOps(ops: List>): Expr { + require(ops.size == 2) { "Operands must have size 2 for binary expression" } + val opType = leftOp.type + val newLeftOp = TypeUtils.cast(ops[0], opType) + val newRightOp = TypeUtils.cast(ops[1], opType) + return with(newLeftOp, newRightOp) + } + + open fun with(leftOp: Expr, rightOp: Expr): BinaryExpr = + if (leftOp == this.leftOp && rightOp == this.rightOp) { + this + } else { + new(leftOp, rightOp) + } + + protected abstract fun new( + leftOp: Expr, + rightOp: Expr, + ): BinaryExpr + + open fun withLeftOp(leftOp: Expr): BinaryExpr = with(leftOp, rightOp) + + open fun withRightOp(rightOp: Expr): BinaryExpr = with(leftOp, rightOp) + + override fun toString(): String = + Utils.lispStringBuilder(operatorLabel).add(leftOp).add(rightOp).toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/DomainSize.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/DomainSize.java new file mode 100644 index 0000000000..aff9585e46 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/DomainSize.java @@ -0,0 +1,98 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type; + +import static com.google.common.base.Preconditions.checkArgument; + +import com.google.common.base.Objects; +import java.math.BigInteger; +import java.util.function.BinaryOperator; + +public class DomainSize { + + public static final DomainSize INFINITY = new DomainSize(BigInteger.valueOf(-1)); + public static final DomainSize ZERO = of(0); + public static final DomainSize ONE = of(1); + public static final DomainSize TWO = of(2); + private final BigInteger finiteSize; + + private DomainSize(BigInteger value) { + finiteSize = value; + } + + public static DomainSize of(BigInteger val) { + checkArgument(val.signum() != -1, "DomainSize can't be negative"); + return new DomainSize(val); + } + + public static DomainSize of(long val) { + return of(BigInteger.valueOf(val)); + } + + private static DomainSize infiniteForAnyInfiniteApplyElse( + DomainSize left, DomainSize right, BinaryOperator operator) { + if (left.isInfinite() || right.isInfinite()) return INFINITY; + return of(operator.apply(left.finiteSize, right.finiteSize)); + } + + public static DomainSize add(DomainSize left, DomainSize right) { + return infiniteForAnyInfiniteApplyElse(left, right, BigInteger::add); + } + + public static DomainSize multiply(DomainSize left, DomainSize right) { + return infiniteForAnyInfiniteApplyElse(left, right, BigInteger::multiply); + } + + /** + * Raises a domain size to the power of the other. Returns {@link DomainSize#INFINITY} if either + * parameter is infinite or exponent is too large ( = can't fit into an integer) + */ + public static DomainSize pow(DomainSize base, DomainSize exponent) { + if (base.isInfinite() || exponent.isInfinite()) return INFINITY; + int iExp; + try { + iExp = exponent.finiteSize.intValueExact(); + } catch (ArithmeticException exception) { + return INFINITY; + } + return of(base.finiteSize.pow(iExp)); + } + + public boolean isInfinite() { + return equals(INFINITY); + } + + public boolean isBiggerThan(long limit) { + return this.equals(INFINITY) || finiteSize.compareTo(BigInteger.valueOf(limit)) > 0; + } + + public BigInteger getFiniteSize() { + return finiteSize; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DomainSize that = (DomainSize) o; + return Objects.equal(finiteSize, that.finiteSize); + } + + @Override + public int hashCode() { + return Objects.hashCode(finiteSize); + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/Expr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/Expr.kt new file mode 100644 index 0000000000..75cad6b06d --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/Expr.kt @@ -0,0 +1,70 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type + +import hu.bme.mit.theta.core.model.Valuation +import kotlinx.serialization.Polymorphic + +/** + * Base class for all expressions in the Theta framework. + * + * @param ExprType The type of the expression, must be a subtype of [Type] + */ +@Polymorphic +interface Expr { + + /** Returns the arity (number of operands) of this expression. */ + val arity: Int + get() = ops.size + + /** Returns the type of this expression. */ + val type: ExprType + + /** Returns the list of operands of this expression. */ + val ops: List> + + /** + * Evaluates this expression with the given valuation. + * + * @param val The valuation to use for evaluation + * @return The result of the evaluation as a literal expression + */ + fun eval(`val`: Valuation): LitExpr + + /** + * Checks if this expression is invalid. An expression is invalid if any of its operands are + * invalid. + */ + val isInvalid: Boolean + get() = ops.any { it.isInvalid } + + /** + * Creates a new expression of the same type with the given operands. + * + * @param ops The new operands + * @return A new expression with the given operands + */ + fun withOps(ops: List>): Expr + + /** + * Applies the given function to each operand of this expression and returns a new expression with + * the results. + * + * @param function The function to apply to each operand + * @return A new expression with the transformed operands + */ + fun map(function: (Expr<*>) -> Expr<*>): Expr = withOps(ops.map(function)) +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/LitExpr.kt similarity index 70% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/package-info.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/LitExpr.kt index cec1737dad..eda4e0013a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/package-info.java +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/LitExpr.kt @@ -13,9 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package hu.bme.mit.theta.core.type + +import kotlinx.serialization.Polymorphic + /** - * This package contains statements (e.g., assignment, assume). Constructors of the statements are - * usually package private, use the factory class {@link hu.bme.mit.theta.core.stmt.Stmts} to - * instantiate them. + * Interface for literal expressions (constants). + * + * @param ExprType The type of the literal, must be a subtype of [Type] */ -package hu.bme.mit.theta.core.stmt; +@Polymorphic interface LitExpr : Expr diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/MultiaryExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/MultiaryExpr.kt new file mode 100644 index 0000000000..7df1a2bcee --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/MultiaryExpr.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.Serializable + +/** + * Base class for expressions with multiple operands of the same type. + * + * @param OpType The type of the operands + * @param ExprType The type of the expression + */ +@Serializable +abstract class MultiaryExpr : Expr { + + abstract override val ops: List> + + abstract val operatorLabel: String + + override fun withOps(ops: List>): MultiaryExpr { + if (ops.isEmpty()) { + return with(listOf()) + } else { + val opType: OpType = this.ops[0].type + val newOps: List> = ops.map { op: Expr<*> -> TypeUtils.cast(op, opType) } + return with(newOps) + } + } + + override fun toString(): String = + Utils.lispStringBuilder(operatorLabel).body().addAll(ops).toString() + + open fun with(ops: Iterable>): MultiaryExpr = + if (ops.toList() == this.ops) { + this + } else { + new(ops.toList()) + } + + protected abstract fun new(ops: List>): MultiaryExpr +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/NullaryExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/NullaryExpr.kt new file mode 100644 index 0000000000..4d7a3befa0 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/NullaryExpr.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type + +import kotlinx.serialization.Serializable + +/** + * Base class for expressions with no operands (nullary expressions). + * + * @param ExprType The type of the expression, must be a subtype of [Type] + */ +@Serializable +abstract class NullaryExpr : Expr { + override val arity: Int + get() = 0 + + override val ops: List> + get() = emptyList() + + override fun withOps(ops: List>): Expr { + require(ops.isEmpty()) { "Operands must be empty for nullary expression" } + return this + } +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/BasicConstDecl.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/Type.kt similarity index 64% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/BasicConstDecl.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/Type.kt index af0d3902ab..8a8fe7f70d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/BasicConstDecl.java +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/Type.kt @@ -13,18 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.decl; +package hu.bme.mit.theta.core.type -import hu.bme.mit.theta.core.type.Type; +import kotlinx.serialization.Polymorphic /** - * A basic constant declaration that can be directly passed to the SMT solver. - * - * @param + * Base class for all types in the Theta framework. Represents the type of expressions and + * variables. */ -public final class BasicConstDecl extends ConstDecl { - - BasicConstDecl(final String name, final DeclType type) { - super(name, type); - } +@Polymorphic +interface Type { + /** + * Returns the size of the domain of this type. + * + * @return The domain size of this type + */ + val domainSize: DomainSize } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/UnaryExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/UnaryExpr.kt new file mode 100644 index 0000000000..09e7ebd0ad --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/UnaryExpr.kt @@ -0,0 +1,54 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.Serializable + +/** + * Base class for expressions with a single operand (unary expressions). + * + * @param ExprType The type of the expression, must be a subtype of [Type] + * @param OpType The type of the operand + */ +@Serializable +abstract class UnaryExpr : Expr { + + abstract val op: Expr + + override val arity: Int + get() = 1 + + override val ops: List> + get() = listOf(op) + + override fun withOps(ops: List>): Expr { + require(ops.size == 1) { "Operands must have size 1 for unary expression" } + val opType = op.type + val newOp = TypeUtils.cast(ops[0], opType) + return with(newOp) + } + + override fun toString(): String = Utils.lispStringBuilder(operatorLabel).body().add(op).toString() + + open fun with(op: Expr): UnaryExpr = + if (op == this.op) this else new(op) + + protected abstract fun new(op: Expr): UnaryExpr + + abstract val operatorLabel: String +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt new file mode 100644 index 0000000000..90279182b4 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt @@ -0,0 +1,220 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.common.Try +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.anytype.Exprs +import hu.bme.mit.theta.core.type.anytype.IteExpr +import hu.bme.mit.theta.core.type.booltype.BoolType + +/** Factory and utility methods for abstract expressions over multiple types. */ +@Suppress("FunctionName") +object AbstractExprs { + @JvmStatic + // General + fun Ite(cond: Expr, then: Expr<*>, elze: Expr<*>): IteExpr<*> { + val newOps: Pair, Expr> = unify(then, elze) + val newThen = newOps.first + val newElse = newOps.second + return Exprs.Ite(cond, newThen, newElse) + } + + @JvmStatic + // Additive + fun > Add(ops: Iterable>): AddExpr { + val opList = ops.toList() + require(opList.isNotEmpty()) + val head = Utils.head(opList) + val tail = Utils.tail(opList) + return combineAdd(head, tail) + } + + private fun > combineAdd(head: Expr<*>, tail: List>): AddExpr = + if (tail.isEmpty()) { + val newOp: Expr = bind(head) + val newOps = getAddOps(newOp) + val type = newOp.type + type.Add(newOps) + } else { + val newHead = Utils.head(tail) + val newTail = Utils.tail(tail) + val unifiedOps: Pair, Expr> = unify(head, newHead) + val newLeftOp = unifiedOps.first + val newRightOp = unifiedOps.second + val type = newLeftOp.type + val newLeftOps = getAddOps(newLeftOp) + val newOps = newLeftOps + newRightOp + val newAddExpr = type.Add(newOps) + combineAdd(newAddExpr, newTail) + } + + private fun > getAddOps(expr: Expr): List> = + if (expr is AddExpr<*>) (expr as AddExpr).ops else listOf(expr) + + @JvmStatic + fun > Sub(leftOp: Expr<*>, rightOp: Expr<*>): SubExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Sub(l, r) } + + @JvmStatic + fun > Pos(op: Expr<*>): PosExpr<*> { + val tOp: Expr = bind(op) + return tOp.type.Pos(tOp) + } + + @JvmStatic + fun > Neg(op: Expr<*>): NegExpr<*> { + val tOp: Expr = bind(op) + return tOp.type.Neg(tOp) + } + + // Multiplicative + @JvmStatic + fun > Mul(ops: Iterable>): MulExpr<*> { + val opList = ops.toList() + require(opList.isNotEmpty()) + val head = Utils.head(opList) + val tail = Utils.tail(opList) + return combineMul(head, tail) + } + + private fun > combineMul(head: Expr<*>, tail: List>): MulExpr = + if (tail.isEmpty()) { + val newOp: Expr = bind(head) + val newOps = getMulOps(newOp) + val type = newOp.type + type.Mul(newOps) + } else { + val newHead = Utils.head(tail) + val newTail = Utils.tail(tail) + val unifiedOps: Pair, Expr> = unify(head, newHead) + val newLeftOp = unifiedOps.first + val newRightOp = unifiedOps.second + val type = newLeftOp.type + val newLeftOps = getMulOps(newLeftOp) + val newOps = newLeftOps + newRightOp + val newMulExpr = type.Mul(newOps) + combineMul(newMulExpr, newTail) + } + + private fun > getMulOps(expr: Expr): List> = + if (expr is MulExpr<*>) (expr as MulExpr).ops else listOf(expr) + + @JvmStatic + fun > Div(leftOp: Expr<*>, rightOp: Expr<*>): DivExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Div(l, r) } + + // Divisible + @JvmStatic + fun > Mod(leftOp: Expr<*>, rightOp: Expr<*>): ModExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Mod(l, r) } + + @JvmStatic + fun > Rem(leftOp: Expr<*>, rightOp: Expr<*>): RemExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Rem(l, r) } + + @JvmStatic + // Equational + fun > Eq(leftOp: Expr<*>, rightOp: Expr<*>): EqExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Eq(l, r) } + + @JvmStatic + fun > Neq(leftOp: Expr<*>, rightOp: Expr<*>): NeqExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Neq(l, r) } + + @JvmStatic + // Ordered + fun > Lt(leftOp: Expr<*>, rightOp: Expr<*>): LtExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Lt(l, r) } + + @JvmStatic + fun > Leq(leftOp: Expr<*>, rightOp: Expr<*>): LeqExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Leq(l, r) } + + @JvmStatic + fun > Gt(leftOp: Expr<*>, rightOp: Expr<*>): GtExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Gt(l, r) } + + @JvmStatic + fun > Geq(leftOp: Expr<*>, rightOp: Expr<*>): GeqExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Geq(l, r) } + + // Convenience methods + @JvmStatic + fun > Add(leftOp: Expr<*>, rightOp: Expr<*>): AddExpr<*> = + Add(listOf(leftOp, rightOp)) + + @JvmStatic + fun > Mul(leftOp: Expr<*>, rightOp: Expr<*>): MulExpr<*> = + Mul(listOf(leftOp, rightOp)) + + // Helper methods + + private fun > create( + leftOp: Expr<*>, + rightOp: Expr<*>, + create: (T, Expr, Expr) -> R, + ): R { + val newOps: Pair, Expr> = unify(leftOp, rightOp) + val newLeftOp = newOps.first + val newRightOp = newOps.second + val type = newLeftOp.type + return create(type, newLeftOp, newRightOp) + } + + private fun > unify( + expr1: Expr, + expr2: Expr, + ): Pair, Expr> { + val type1 = expr1.type + val type2 = expr2.type + if (type1 == type2) { + @Suppress("UNCHECKED_CAST") return bind(expr1, expr2 as Expr) + } + if (type1 is Castable<*>) { + @Suppress("UNCHECKED_CAST") val cType1 = type1 as C + + @Suppress("UNCHECKED_CAST") val cExpr1 = expr1 as Expr + val tryToCast = Try.attempt { cType1.Cast(cExpr1, type2) } + if (tryToCast.isSuccess) { + val t2Expr1 = tryToCast.asSuccess().value + return bind(t2Expr1, expr2) + } + } + if (type2 is Castable<*>) { + @Suppress("UNCHECKED_CAST") val cType2 = type2 as C + + @Suppress("UNCHECKED_CAST") val cExpr2 = expr2 as Expr + val tryToCast = Try.attempt { cType2.Cast(cExpr2, type1) } + if (tryToCast.isSuccess) { + val t1Expr2 = tryToCast.asSuccess().value + return bind(expr1, t1Expr2) + } + } + throw ClassCastException("Types $type1 and $type2 can not be unified") + } + + @Suppress("UNCHECKED_CAST") + private fun bind(expr: Expr): Expr = expr as Expr + + @Suppress("UNCHECKED_CAST") + private fun bind( + expr1: Expr, + expr2: Expr, + ): Pair, Expr> = Pair(expr1 as Expr, expr2 as Expr) +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt new file mode 100644 index 0000000000..7eae8be1e6 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.MultiaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable + +/** Abstract class for additive expressions with multiple operands. */ +@Serializable +abstract class AddExpr> : MultiaryExpr() { + + companion object { + + @JvmStatic + fun > create2(ops: List>): AddExpr<*> { + require(ops.isNotEmpty()) + @Suppress("UNCHECKED_CAST") val type = ops[0].type as ExprType + return type.Add(ops.map { cast(it, type) }) + } + } +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Ordered.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Additive.kt similarity index 57% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Ordered.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Additive.kt index a7b92e743d..c42877a8b2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Ordered.java +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Additive.kt @@ -13,18 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.abstracttype; +package hu.bme.mit.theta.core.type.abstracttype -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.Polymorphic -public interface Ordered> extends Type { +@Polymorphic +interface Additive> : Type { - LtExpr Lt(Expr leftOp, Expr rightOp); + fun Add(ops: Iterable>): AddExpr - LeqExpr Leq(Expr leftOp, Expr rightOp); + fun Sub(leftOp: Expr, rightOp: Expr): SubExpr - GtExpr Gt(Expr leftOp, Expr rightOp); + fun Pos(op: Expr): PosExpr - GeqExpr Geq(Expr leftOp, Expr rightOp); + fun Neg(op: Expr): NegExpr } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Castable.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt similarity index 63% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Castable.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt index 73841e3762..cf8c00c411 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Castable.java +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt @@ -13,12 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.abstracttype; +package hu.bme.mit.theta.core.type.abstracttype -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.UnaryExpr +import kotlinx.serialization.Serializable -public interface Castable> extends Type { - - Expr Cast(Expr op, final TargetType type); -} +/** Abstract class for cast expressions with a single operand. */ +@Serializable +abstract class CastExpr, TargetType : Type> : + UnaryExpr() diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Castable.kt similarity index 58% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Castable.kt index 65ec3fb7d7..99cba51bc7 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.java +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Castable.kt @@ -13,16 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.abstracttype; +package hu.bme.mit.theta.core.type.abstracttype -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.UnaryExpr; +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.Polymorphic -public abstract class CastExpr, TargetType extends Type> - extends UnaryExpr { +/** + * Interface for types that support casting operations. + * + * @param SourceType The source type that can be cast from + */ +@Polymorphic +interface Castable> : Type { - public CastExpr(final Expr op) { - super(op); - } + fun Cast(op: Expr, type: TargetType): Expr } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt new file mode 100644 index 0000000000..1f75a4ba21 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable + +/** + * Abstract base class for division expressions over types that support multiplication and division. + * Used to represent division operations in the expression tree. + */ +@Serializable +abstract class DivExpr> : BinaryExpr() { + + companion object { + + @JvmStatic + fun > create2( + leftOp: Expr<*>, + rightOp: Expr<*>, + ): DivExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as ExprType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Div(newLeftOp, newRightOp) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt new file mode 100644 index 0000000000..b3a144b847 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.Polymorphic + +/** + * Represents a type that supports division-related operations. + * + * @param ExprType The type of expressions this type operates on. + */ +@Polymorphic +interface Divisible> : Type { + + fun Mod(leftOp: Expr, rightOp: Expr): ModExpr + + fun Rem(leftOp: Expr, rightOp: Expr): RemExpr +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt new file mode 100644 index 0000000000..993cdd496a --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable + +@Serializable +abstract class EqExpr> : BinaryExpr() { + + companion object { + + private const val OPERATOR_LABEL = "=" + + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): EqExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Eq(newLeftOp, newRightOp) + } + } + + override val type: BoolType = Bool() + + override val operatorLabel: String + get() = OPERATOR_LABEL +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ParamDecl.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Equational.kt similarity index 55% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ParamDecl.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Equational.kt index cfa4c1fd13..3780768a82 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ParamDecl.java +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Equational.kt @@ -13,21 +13,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.decl; +package hu.bme.mit.theta.core.type.abstracttype -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.Type; +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.Polymorphic -public final class ParamDecl extends Decl { - - private static final String DECL_LABEL = "Param"; +/** + * Represents a type that supports equational operations. + * + * @param OpType The type of the operands, which must also be equational. + */ +@Polymorphic +interface Equational> : Type { - ParamDecl(final String name, final DeclType type) { - super(name, type); - } + fun Eq(leftOp: Expr, rightOp: Expr): EqExpr - @Override - public String toString() { - return Utils.lispStringBuilder(DECL_LABEL).add(getName()).add(getType()).toString(); - } + fun Neq(leftOp: Expr, rightOp: Expr): NeqExpr } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt new file mode 100644 index 0000000000..d851d9d068 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable + +/** Abstract base class for greater-or-equal expressions over ordered types. */ +@Serializable +abstract class GeqExpr> : BinaryExpr() { + + companion object { + private const val OPERATOR_LABEL = ">=" + + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): GeqExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Geq(newLeftOp, newRightOp) + } + } + + override val type: BoolType = Bool() + + override val operatorLabel: String + get() = OPERATOR_LABEL +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt new file mode 100644 index 0000000000..51f6354f5d --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable + +/** + * Abstract base class for greater-than (>) expressions over ordered types. Used to represent > + * operations in the expression tree. + */ +@Serializable +abstract class GtExpr> : BinaryExpr() { + + companion object { + private const val OPERATOR_LABEL = ">" + + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): GtExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Gt(newLeftOp, newRightOp) + } + } + + override val type: BoolType = Bool() + + override val operatorLabel: String + get() = OPERATOR_LABEL +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt new file mode 100644 index 0000000000..f4eeed7350 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable + +/** Abstract base class for less-or-equal (≤) expressions over ordered types. */ +@Serializable +abstract class LeqExpr> : BinaryExpr() { + + companion object { + private const val OPERATOR_LABEL = "<=" + + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): LeqExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Leq(newLeftOp, newRightOp) + } + } + + override val type: BoolType = Bool() + + override val operatorLabel: String + get() = OPERATOR_LABEL +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt new file mode 100644 index 0000000000..ecb46c981a --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable + +/** Abstract base class for less-than (<) expressions over ordered types. */ +@Serializable +abstract class LtExpr> : BinaryExpr() { + + companion object { + private const val OPERATOR_LABEL = "<" + + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): LtExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Lt(newLeftOp, newRightOp) + } + } + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override val type: BoolType = Bool() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt new file mode 100644 index 0000000000..0962f9a59d --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable + +/** Abstract base class for modulo (mod) expressions over divisible types. */ +@Serializable +abstract class ModExpr> : BinaryExpr() { + + companion object { + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): ModExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as ExprType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Mod(newLeftOp, newRightOp) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt new file mode 100644 index 0000000000..bae8f2f755 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.MultiaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable + +/** Abstract base class for multiplication expressions over types that support multiplication. */ +@Serializable +abstract class MulExpr> : MultiaryExpr() { + + companion object { + @JvmStatic + fun > create2(ops: List>): MulExpr<*> { + require(ops.isNotEmpty()) + @Suppress("UNCHECKED_CAST") val type = ops[0].type as ExprType + return type.Mul(ops.map { cast(it, type) }) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt new file mode 100644 index 0000000000..56bea7eaac --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.Polymorphic + +/** Represents a type that supports multiplication and division operations. */ +@Polymorphic +interface Multiplicative> : Type { + fun Mul(ops: Iterable>): MulExpr + + fun Div(leftOp: Expr, rightOp: Expr): DivExpr +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt similarity index 50% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt index 46424d44f7..1eb23766a1 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.java +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt @@ -13,16 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.booltype; +package hu.bme.mit.theta.core.type.abstracttype -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable -public abstract class BoolLitExpr extends NullaryExpr implements LitExpr { +/** Abstract base class for negation expressions over additive types. */ +@Serializable +abstract class NegExpr> : UnaryExpr() { - public abstract boolean getValue(); - - public static BoolLitExpr of(final boolean value) { - return value ? TrueExpr.getInstance() : FalseExpr.getInstance(); + companion object { + @JvmStatic + fun > create2(op: Expr<*>): NegExpr<*> { + @Suppress("UNCHECKED_CAST") val type = op.type as ExprType + val newOp = cast(op, type) + return type.Neg(newOp) } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt new file mode 100644 index 0000000000..5398c4b92c --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable + +/** Abstract base class for not-equal (!=) expressions over equational types. */ +@Serializable +abstract class NeqExpr> : BinaryExpr() { + + companion object { + private const val OPERATOR_LABEL = "/=" + + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): NeqExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Neq(newLeftOp, newRightOp) + } + } + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override val type: BoolType = Bool() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt new file mode 100644 index 0000000000..21a38fdc2b --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.Polymorphic + +/** Represents a type that supports ordering and comparison operations. */ +@Polymorphic +interface Ordered> : Type { + fun Lt(leftOp: Expr, rightOp: Expr): LtExpr + + fun Leq(leftOp: Expr, rightOp: Expr): LeqExpr + + fun Gt(leftOp: Expr, rightOp: Expr): GtExpr + + fun Geq(leftOp: Expr, rightOp: Expr): GeqExpr +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt new file mode 100644 index 0000000000..b3dafaf9ce --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable + +/** Abstract base class for positive (unary plus) expressions over additive types. */ +@Serializable +abstract class PosExpr> : UnaryExpr() { + + companion object { + @JvmStatic + fun > create2(op: Expr<*>): PosExpr<*> { + @Suppress("UNCHECKED_CAST") val type = op.type as ExprType + val newOp = cast(op, type) + return type.Pos(newOp) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt new file mode 100644 index 0000000000..d090cd7821 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable + +/** Abstract base class for remainder expressions over divisible types. */ +@Serializable +abstract class RemExpr> : BinaryExpr() { + + companion object { + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): RemExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as ExprType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Rem(newLeftOp, newRightOp) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt new file mode 100644 index 0000000000..f27c206073 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable + +/** Abstract base class for subtraction expressions over additive types. */ +@Serializable +abstract class SubExpr> : BinaryExpr() { + + companion object { + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): SubExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as ExprType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Sub(newLeftOp, newRightOp) + } + } +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/package-info.java similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/package-info.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/package-info.java diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Dereference.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Dereference.kt new file mode 100644 index 0000000000..b1f8785ca7 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Dereference.kt @@ -0,0 +1,150 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.anytype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.inttype.IntType +import kotlinx.serialization.* +import kotlinx.serialization.builtins.nullable +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** + * Represents a dereference expression for array access. + * + * @param A The array type + * @param O The offset type + * @param T The element type + * @property array The array expression + * @property offset The offset expression + * @property type The type of the dereferenced element + * @property uniquenessIdx Optional uniqueness index for SMT encoding + */ +@Serializable(with = Dereference.Serializer::class) +@SerialName("Dereference") +data class Dereference( + val array: Expr, + val offset: Expr, + override val type: T, + val uniquenessIdx: Expr? = null, +) : Expr { + + companion object { + + private const val OPERATOR_LABEL = "deref" + + @JvmStatic + fun of( + array: Expr, + offset: Expr, + type: T, + ): Dereference = Dereference(array, offset, type) + + @JvmStatic + private fun of( + array: Expr, + offset: Expr, + uniqueness: Expr, + type: T, + ): Dereference = Dereference(array, offset, type, uniqueness) + } + + fun withUniquenessExpr(expr: Expr): Dereference = of(array, offset, expr, type) + + override val arity: Int = 3 + + override val ops: List> = + if (uniquenessIdx != null) listOf(array, offset, uniquenessIdx) else listOf(array, offset) + + override fun eval(`val`: Valuation): LitExpr = + throw IllegalStateException("Reference/Dereference expressions are not meant to be evaluated!") + + @Suppress("UNCHECKED_CAST") + override fun withOps(ops: List>): Expr { + require(ops.size == 2 || ops.size == 3) { "Dereference must have 2 or 3 operands" } + return when (ops.size) { + 2 -> of(ops[0] as Expr, ops[1] as Expr, type) + else -> of(ops[0] as Expr, ops[1] as Expr, ops[2] as Expr, type) + } + } + + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().addAll(ops).add(type).toString() + + object Serializer : KSerializer> { + + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("Dereference") { + element>("array") + element>("offset") + element("type") + element?>("uniquenessIdx") + } + + override fun serialize(encoder: Encoder, value: Dereference) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.array) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.offset) + encodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class), value.type) + encodeSerializableElement( + descriptor, + 3, + PolymorphicSerializer(Expr::class).nullable, + value.uniquenessIdx, + ) + } + + override fun deserialize(decoder: Decoder): Dereference = + decoder.decodeStructure(descriptor) { + var array: Expr? = null + var offset: Expr? = null + var type: Type? = null + var uniquenessIdx: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> + array = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + 1 -> + offset = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + 2 -> type = decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class)) + 3 -> + uniquenessIdx = + decodeSerializableElement( + descriptor, + 3, + PolymorphicSerializer(Expr::class).nullable, + ) + as Expr? + + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + Dereference( + array ?: throw SerializationException("Missing array "), + offset ?: throw SerializationException("Missing offset "), + type ?: throw SerializationException("Missing type "), + uniquenessIdx, + ) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Exprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Exprs.kt new file mode 100644 index 0000000000..862be7300b --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Exprs.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.anytype + +import hu.bme.mit.theta.core.decl.Decl +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.booltype.BoolType + +/** Factory and utility methods for any-type expressions. */ +@Suppress("FunctionName") +object Exprs { + @JvmStatic fun Ref(decl: Decl): RefExpr = RefExpr(decl) + + @JvmStatic + fun Ite( + cond: Expr, + then: Expr, + elze: Expr, + ): IteExpr = IteExpr(cond, then, elze) + + @JvmStatic fun Prime(op: Expr): PrimeExpr = PrimeExpr(op) + + @JvmStatic + fun Dereference( + arr: Expr, + offset: Expr, + type: ExprType, + ): Dereference = Dereference.of(arr, offset, type) + + @JvmStatic + fun Reference( + expr: Expr, + type: ArrType, + ): Reference = Reference.of(expr, type) + + // Convenience methods + @JvmStatic + fun Prime(op: Expr, i: Int): Expr { + require(i >= 0) + return when (i) { + 0 -> op + 1 -> Prime(op) + else -> Prime(Prime(op, i - 1)) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt new file mode 100644 index 0000000000..0675d3b287 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt @@ -0,0 +1,64 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.anytype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** + * Represents an invalid literal expression. + * + * @param ExprType The type of the expression + */ +@Serializable(with = InvalidLitExpr.Serializer::class) +@SerialName("InvalidLit") +data class InvalidLitExpr(override val type: ExprType) : + NullaryExpr(), LitExpr { + + override fun eval(`val`: Valuation): LitExpr = this + + override val isInvalid: Boolean = true + + override fun equals(other: Any?): Boolean = false + + object Serializer : KSerializer> { + override val descriptor = buildClassSerialDescriptor("InvalidLit") { element("type") } + + override fun serialize(encoder: Encoder, value: InvalidLitExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class), value.type) + } + + override fun deserialize(decoder: Decoder): InvalidLitExpr = + decoder.decodeStructure(descriptor) { + var type: Type? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> type = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + InvalidLitExpr(type = type ?: throw SerializationException("Missing type ")) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/IteExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/IteExpr.kt new file mode 100644 index 0000000000..66bad09420 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/IteExpr.kt @@ -0,0 +1,151 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.anytype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** + * Represents an if-then-else expression. + * + * @param ExprType The type of the expression + */ +@Serializable(with = IteExpr.Serializer::class) +@SerialName("Ite") +data class IteExpr( + val cond: Expr, + val then: Expr, + val elze: Expr, +) : Expr { + + companion object { + + private const val OPERATOR_LABEL = "ite" + + @JvmStatic + fun of( + cond: Expr, + then: Expr, + elze: Expr, + ): IteExpr = IteExpr(cond, then, elze) + + @JvmStatic + fun create(cond: Expr<*>, then: Expr<*>, elze: Expr<*>): IteExpr { + val newCond = cast(cond, Bool()) + + @Suppress("UNCHECKED_CAST") val newThen = then as Expr + val newElze = cast(elze, newThen.type) + return of(newCond, newThen, newElze) + } + } + + override val type: ExprType = then.type + + override val arity: Int = 3 + + override val ops: List> = listOf(cond, then, elze) + + fun getElse(): Expr = elze + + override fun eval(`val`: Valuation): LitExpr = + if ((cond.eval(`val`) as BoolLitExpr).value) { + then.eval(`val`) + } else { + elze.eval(`val`) + } + + override fun withOps(ops: List>): IteExpr { + require(ops.size == 3) { "Operands must have size 3 for Ite expression" } + val newCond = cast(ops[0], Bool()) + val newThen = cast(ops[1], type) + val newElze = cast(ops[2], type) + return with(newCond, newThen, newElze) + } + + fun with(cond: Expr, then: Expr, elze: Expr): IteExpr = + if (this.cond === cond && this.then === then && this.elze === elze) { + this + } else { + of(cond, then, elze) + } + + fun withCond(cond: Expr): IteExpr = with(cond, then, elze) + + fun withThen(then: Expr): IteExpr = with(cond, then, elze) + + fun withElse(elze: Expr): IteExpr = with(cond, then, elze) + + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).add(cond).add(then).add(elze).toString() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("Ite") { + element>("cond") + element>("then") + element>("elze") + } + + override fun serialize(encoder: Encoder, value: IteExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.cond) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.then) + encodeSerializableElement(descriptor, 2, PolymorphicSerializer(Expr::class), value.elze) + } + + override fun deserialize(decoder: Decoder): IteExpr = + decoder.decodeStructure(descriptor) { + var cond: Expr? = null + var then: Expr? = null + var elze: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> + cond = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + as Expr + 1 -> + then = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr + 2 -> + elze = + decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Expr::class)) + as Expr + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + IteExpr( + cond ?: throw SerializationException("Missing cond "), + then ?: throw SerializationException("Missing then "), + elze ?: throw SerializationException("Missing elze "), + ) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt new file mode 100644 index 0000000000..a92142d5ae --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt @@ -0,0 +1,80 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.anytype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.UnaryExpr +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** + * Represents a prime expression (next state). + * + * @param ExprType The type of the expression + */ +@Serializable(with = PrimeExpr.Serializer::class) +@SerialName("Prime") +data class PrimeExpr(override val op: Expr) : + UnaryExpr() { + + companion object { + + private const val OPERATOR_LABEL = "prime" + + @JvmStatic fun of(op: Expr): PrimeExpr = PrimeExpr(op) + } + + override val type: ExprType = op.type + + override fun eval(`val`: Valuation): LitExpr { + throw UnsupportedOperationException("Prime expressions cannot be evaluated") + } + + override fun new(op: Expr): PrimeExpr = of(op) + + override val operatorLabel: String = OPERATOR_LABEL + + override fun toString(): String = super.toString() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("Prime") { element>("op") } + + override fun serialize(encoder: Encoder, value: PrimeExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.op) + } + + override fun deserialize(decoder: Decoder): PrimeExpr = + decoder.decodeStructure(descriptor) { + var op: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> op = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + PrimeExpr(op = op ?: throw SerializationException("Missing op ")) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/RefExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/RefExpr.kt new file mode 100644 index 0000000000..993c79b750 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/RefExpr.kt @@ -0,0 +1,74 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.anytype + +import hu.bme.mit.theta.core.decl.Decl +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** + * Represents a reference to a declaration. + * + * @param DeclType The type of the declaration + */ +@Serializable(with = RefExpr.Serializer::class) +@SerialName("Ref") +data class RefExpr(val decl: Decl) : NullaryExpr() { + + companion object { + + @JvmStatic fun of(decl: Decl): RefExpr = RefExpr(decl) + } + + override val type: DeclType = decl.type + + override fun eval(`val`: Valuation): LitExpr = + `val`.eval(decl).orElseThrow { + IllegalStateException("No value found for declaration: ${decl.name}") + } + + override fun toString(): String = decl.name + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("Ref") { element>("decl") } + + override fun serialize(encoder: Encoder, value: RefExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Decl::class), value.decl) + } + + override fun deserialize(decoder: Decoder): RefExpr = + decoder.decodeStructure(descriptor) { + var decl: Decl? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> decl = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Decl::class)) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + RefExpr(decl = decl ?: throw SerializationException("Missing decl ")) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Reference.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Reference.kt new file mode 100644 index 0000000000..c2736ed934 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Reference.kt @@ -0,0 +1,93 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.anytype + +import hu.bme.mit.theta.core.decl.VarDecl +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** + * Represents a reference to an expression. + * + * @param A The type of the reference + * @param T The type of the expression + * @property expr The referenced expression + * @property type The type of the reference + */ +@Serializable(with = Reference.Serializer::class) +@SerialName("Reference") +data class Reference(val expr: Expr, override val type: A) : Expr { + + companion object { + + @JvmStatic + fun of(expr: Expr, type: A): Reference = Reference(expr, type) + } + + override val arity: Int = 1 + + override val ops: List> = listOf(expr) + + override fun eval(`val`: Valuation): LitExpr = + throw IllegalStateException("Reference/Dereference expressions are not meant to be evaluated!") + + override fun withOps(ops: List>): Expr { + require(ops.size == 1) { "Reference must have exactly one operand" } + require(ops[0] is RefExpr<*> && (ops[0] as RefExpr<*>).decl is VarDecl<*>) { + "Don't transform references to constants." + } + @Suppress("UNCHECKED_CAST") return Reference(ops[0] as Expr, type) + } + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("Reference") { + element>("expr") + element("type") + } + + override fun serialize(encoder: Encoder, value: Reference) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.expr) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) + } + + override fun deserialize(decoder: Decoder): Reference = + decoder.decodeStructure(descriptor) { + var expr: Expr? = null + var type: Type? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> expr = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + Reference( + expr ?: throw SerializationException("Missing expr "), + type ?: throw SerializationException("Missing type "), + ) + } + } +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/package-info.java similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/package-info.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/package-info.java diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt new file mode 100644 index 0000000000..3454b3d7ff --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt @@ -0,0 +1,105 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.arraytype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** Equality expression for array types. */ +@Serializable(with = ArrayEqExpr.Serializer::class) +@SerialName("ArrayEq") +data class ArrayEqExpr( + override val leftOp: Expr>, + override val rightOp: Expr>, +) : EqExpr>() { + + companion object { + + @JvmStatic + fun of( + leftOp: Expr>, + rightOp: Expr>, + ) = ArrayEqExpr(leftOp, rightOp) + + @JvmStatic + fun create( + leftOp: Expr<*>, + rightOp: Expr<*>, + ): ArrayEqExpr<*, *> { + @Suppress("UNCHECKED_CAST") val arrayType = leftOp.type as ArrayType + val newLeftOp = cast(leftOp, arrayType) + val newRightOp = cast(rightOp, arrayType) + return of(newLeftOp, newRightOp) + } + } + + override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() + + override fun new( + leftOp: Expr>, + rightOp: Expr>, + ): ArrayEqExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("ArrayEq") { + element>("leftOp") + element>("rightOp") + } + + override fun serialize(encoder: Encoder, value: ArrayEqExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.leftOp) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.rightOp) + } + + override fun deserialize(decoder: Decoder): ArrayEqExpr = + decoder.decodeStructure(descriptor) { + var leftOp: Expr>? = null + var rightOp: Expr>? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> + leftOp = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + as Expr> + 1 -> + rightOp = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr> + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + ArrayEqExpr( + leftOp ?: throw SerializationException("Missing leftOp "), + rightOp ?: throw SerializationException("Missing rightOp "), + ) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt new file mode 100644 index 0000000000..495911d555 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt @@ -0,0 +1,68 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.arraytype + +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type + +/** Factory and utility methods for array-type expressions. */ +@Suppress("FunctionName") +object ArrayExprs { + @JvmStatic + fun Array( + indexType: IndexType, + elemType: ElemType, + ): ArrayType = ArrayType(indexType, elemType) + + @JvmStatic + fun Array( + elements: List, Expr>>, + elseElem: Expr, + type: ArrayType, + ): ArrayLitExpr = ArrayLitExpr.of(elements, elseElem, type) + + @JvmStatic + fun ArrayInit( + elements: List, Expr>>, + elseElem: Expr, + type: ArrayType, + ): ArrayInitExpr = ArrayInitExpr(elements, elseElem, type) + + @JvmStatic + fun Read( + array: Expr>, + index: Expr, + ): ArrayReadExpr = ArrayReadExpr(array, index) + + @JvmStatic + fun Write( + array: Expr>, + index: Expr, + elem: Expr, + ): ArrayWriteExpr = ArrayWriteExpr(array, index, elem) + + @JvmStatic + fun Eq( + leftOp: Expr>, + rightOp: Expr>, + ): ArrayEqExpr = ArrayEqExpr(leftOp, rightOp) + + @JvmStatic + fun Neq( + leftOp: Expr>, + rightOp: Expr>, + ): ArrayNeqExpr = ArrayNeqExpr(leftOp, rightOp) +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt new file mode 100644 index 0000000000..fb17eeafcf --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt @@ -0,0 +1,175 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.arraytype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.MultiaryExpr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.* +import kotlinx.serialization.builtins.ListSerializer +import kotlinx.serialization.builtins.PairSerializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** + * ArrayInitExpr is a way to specify arbitrary array 'literals' that may contain non-literal + * elements as well. Note that while this class is a descendant of MultiaryExpr, it is used in a + * non-standard way: - ops is only used as a generic Type type, - ops are solely used for + * inter-object interactions, intra-class the `elems` and `elseElem` are used. - `elems` and + * `elseElem` are mapped to `ops` by first placing the `elseElem`, then all indices, then all + * elements. + */ +@Serializable(with = ArrayInitExpr.Serializer::class) +@SerialName("ArrayInit") +data class ArrayInitExpr( + val elements: List, Expr>>, + val elseElem: Expr, + override val type: ArrayType, +) : MultiaryExpr>() { + + @Suppress("UNCHECKED_CAST") + override val ops: List> = + listOf(elseElem as Expr) + + elements.map { it.first as Expr } + + elements.map { it.second as Expr } + + companion object { + + private const val OPERATOR_LABEL = "arrayinit" + + @JvmStatic + fun of( + elems: List, Expr>>, + elseElem: Expr, + type: ArrayType, + ) = ArrayInitExpr(elems, elseElem, type) + + @JvmStatic + @Suppress("UNCHECKED_CAST") + fun create( + elems: List, Expr>>, + elseElem: Expr<*>, + type: ArrayType<*, *>, + ): ArrayInitExpr = + of( + elems.map { Pair(it.first as Expr, it.second as Expr) }, + elseElem as Expr, + type as ArrayType, + ) + } + + override fun eval(`val`: Valuation): LitExpr> = + ArrayLitExpr.of( + elements.map { Pair(it.first.eval(`val`), it.second.eval(`val`)) }, + elseElem, + type, + ) + + @Suppress("UNCHECKED_CAST") + override fun with(ops: Iterable>): MultiaryExpr> { + val size = ops.count() + require(size % 2 == 1) { "Ops must be odd long!" } + val elseElem: Expr = ops.first() as Expr + val indices = mutableListOf>() + val elems = mutableListOf>() + ops.forEachIndexed { counter, op -> + when { + counter == 0 -> {} + counter <= (size - 1) / 2 -> indices.add(op as Expr) + else -> elems.add(op as Expr) + } + } + val newOps = indices.indices.map { i -> indices[i] to elems[i] } + return of(newOps, elseElem, type) + } + + override fun new(ops: List>): MultiaryExpr> = + with(ops) + + @Suppress("UNCHECKED_CAST") + override fun withOps(ops: List>): MultiaryExpr> = + with(ops.map { it as Expr }) + + override val operatorLabel: String = OPERATOR_LABEL + + override fun toString(): String = "arrayinit($elements, $elseElem, $type)" + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("ArrayInit") { + element, Expr>>>("elements") + element>("elseElem") + element>("type") + } + + override fun serialize(encoder: Encoder, value: ArrayInitExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement( + descriptor, + 0, + ListSerializer( + PairSerializer(PolymorphicSerializer(Expr::class), PolymorphicSerializer(Expr::class)) + ), + value.elements, + ) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.elseElem) + encodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class), value.type) + } + + override fun deserialize(decoder: Decoder): ArrayInitExpr = + decoder.decodeStructure(descriptor) { + var elements: List, Expr>>? = null + var elseElem: Expr? = null + var type: ArrayType? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> + elements = + decodeSerializableElement( + descriptor, + 0, + ListSerializer( + PairSerializer( + PolymorphicSerializer(Expr::class), + PolymorphicSerializer(Expr::class), + ) + ), + ) + as List, Expr>> + 1 -> + elseElem = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr + 2 -> + type = + decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class)) + as ArrayType + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + ArrayInitExpr( + elements ?: throw SerializationException("Missing elements"), + elseElem ?: throw SerializationException("Missing elseElem"), + type ?: throw SerializationException("Missing type"), + ) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt new file mode 100644 index 0000000000..935d7572f7 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt @@ -0,0 +1,142 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.arraytype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.ImmutableValuation +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.ExprSimplifier +import kotlinx.serialization.* +import kotlinx.serialization.builtins.ListSerializer +import kotlinx.serialization.builtins.PairSerializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** Literal array expression for array types, containing only literal values. */ +@Serializable(with = ArrayLitExpr.Serializer::class) +@SerialName("ArrayLit") +data class ArrayLitExpr( + val elements: List, LitExpr>>, + val elseElem: LitExpr, + override val type: ArrayType, +) : NullaryExpr>(), LitExpr> { + + companion object { + + private const val OPERATOR_LABEL = "array" + + @JvmStatic + fun of( + elems: List, Expr>>, + elseElem: Expr, + type: ArrayType, + ): ArrayLitExpr { + val simplifier = ExprSimplifier.create() + val simplifiedElse = simplifier.simplify(elseElem, ImmutableValuation.empty()) + require(simplifiedElse is LitExpr<*>) { "ArrayLitExprs shall only contain literal values!" } + val litElse = simplifiedElse as LitExpr + val litElems = + elems.map { + val idx = simplifier.simplify(it.first, ImmutableValuation.empty()) + val elem = simplifier.simplify(it.second, ImmutableValuation.empty()) + require(idx is LitExpr<*> && elem is LitExpr<*>) { + "ArrayLitExprs shall only contain literal values!" + } + Pair(idx as LitExpr, elem as LitExpr) + } + return ArrayLitExpr(litElems, litElse, type) + } + } + + override fun eval(`val`: Valuation): LitExpr> = this + + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL) + .body() + .addAll(elements.map { "(${it.first} ${it.second})" }) + .add("(default $elseElem)") + .toString() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("ArrayLit") { + element("elements") + element("elseElem") + element("type") + } + + override fun serialize(encoder: Encoder, value: ArrayLitExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement( + descriptor, + 0, + ListSerializer( + PairSerializer(PolymorphicSerializer(Expr::class), PolymorphicSerializer(Expr::class)) + ), + value.elements, + ) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.elseElem) + encodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class), value.type) + } + + override fun deserialize(decoder: Decoder): ArrayLitExpr = + decoder.decodeStructure(descriptor) { + var elements: List, LitExpr>>? = null + var elseElem: LitExpr? = null + var type: ArrayType? = null + + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> + elements = + decodeSerializableElement( + descriptor, + 0, + ListSerializer( + PairSerializer( + PolymorphicSerializer(Expr::class), + PolymorphicSerializer(Expr::class), + ) + ), + ) + as List, LitExpr>> + 1 -> + elseElem = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as LitExpr + 2 -> + type = + decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class)) + as ArrayType + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unexpected index: $index") + } + } + + ArrayLitExpr( + elements = elements ?: throw SerializationException("Missing elements"), + elseElem = elseElem ?: throw SerializationException("Missing elseElem"), + type = type ?: throw SerializationException("Missing type"), + ) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt new file mode 100644 index 0000000000..17e456378d --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt @@ -0,0 +1,104 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.arraytype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** Not-equal expression for array types. */ +@Serializable(with = ArrayNeqExpr.Serializer::class) +@SerialName("ArrayNeq") +data class ArrayNeqExpr( + override val leftOp: Expr>, + override val rightOp: Expr>, +) : NeqExpr>() { + + companion object { + @JvmStatic + fun of( + leftOp: Expr>, + rightOp: Expr>, + ) = ArrayNeqExpr(leftOp, rightOp) + + @JvmStatic + fun create( + leftOp: Expr<*>, + rightOp: Expr<*>, + ): ArrayNeqExpr<*, *> { + @Suppress("UNCHECKED_CAST") val arrayType = leftOp.type as ArrayType + val newLeftOp = cast(leftOp, arrayType) + val newRightOp = cast(rightOp, arrayType) + return of(newLeftOp, newRightOp) + } + } + + override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() + + override fun new( + leftOp: Expr>, + rightOp: Expr>, + ): ArrayNeqExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("ArrayNeq") { + element>("leftOp") + element>("rightOp") + } + + override fun serialize(encoder: Encoder, value: ArrayNeqExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.leftOp) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.rightOp) + } + + override fun deserialize(decoder: Decoder): ArrayNeqExpr = + decoder.decodeStructure(descriptor) { + var leftOp: Expr>? = null + var rightOp: Expr>? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> + leftOp = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + as Expr> + 1 -> + rightOp = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr> + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + ArrayNeqExpr( + leftOp ?: throw SerializationException("Missing leftOp"), + rightOp ?: throw SerializationException("Missing rightOp"), + ) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt new file mode 100644 index 0000000000..2315cdf1d6 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt @@ -0,0 +1,135 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.arraytype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** Read expression for array types. */ +@Serializable(with = ArrayReadExpr.Serializer::class) +@SerialName("ArrayRead") +data class ArrayReadExpr( + val array: Expr>, + val index: Expr, +) : Expr { + + companion object { + + private const val OPERATOR_LABEL = "read" + + @JvmStatic + fun of( + array: Expr>, + index: Expr, + ) = ArrayReadExpr(array, index) + + @JvmStatic + @Suppress("UNCHECKED_CAST") + fun create( + array: Expr<*>, + index: Expr<*>, + ): ArrayReadExpr { + val arrayType = array.type as ArrayType + val newArray = cast(array, arrayType) + val newIndex = cast(index, arrayType.indexType) + return of(newArray, newIndex) + } + } + + override val ops: List> + get() = listOf(array, index) + + override val type: ElemType = array.type.elemType + + override fun eval(`val`: Valuation): LitExpr { + val arrayVal = array.eval(`val`) as ArrayLitExpr + val indexVal = index.eval(`val`) + arrayVal.elements.forEach { elem -> if (elem.first == indexVal) return elem.second } + return arrayVal.elseElem + } + + override fun withOps(ops: List>): Expr { + require(ops.size == 2) + val newArray = cast(ops[0], array.type) + val newIndex = cast(ops[1], index.type) + return with(newArray, newIndex) + } + + fun with( + array: Expr>, + index: Expr, + ): ArrayReadExpr = + if (this.array === array && this.index === index) { + this + } else { + of(array, index) + } + + fun withArray(array: Expr>): ArrayReadExpr = + with(array, index) + + fun withIndex(index: Expr): ArrayReadExpr = with(array, index) + + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().add(array).add(index).toString() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("ArrayRead") { + element>("array") + element>("index") + } + + override fun serialize(encoder: Encoder, value: ArrayReadExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.array) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.index) + } + + override fun deserialize(decoder: Decoder): ArrayReadExpr = + decoder.decodeStructure(descriptor) { + var array: Expr>? = null + var index: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> + array = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + as Expr> + 1 -> + index = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + ArrayReadExpr( + array ?: throw SerializationException("Missing array"), + index ?: throw SerializationException("Missing index"), + ) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt new file mode 100644 index 0000000000..380503eb54 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt @@ -0,0 +1,108 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.arraytype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.DomainSize +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.abstracttype.Equational +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** Represents an array type with a given index and element type. */ +@Serializable(with = ArrayType.Serializer::class) +@SerialName(ArrayType.TYPE_LABEL) +data class ArrayType( + val indexType: IndexType, + val elemType: ElemType, +) : Equational> { + + companion object { + + internal const val TYPE_LABEL = "Array" + + @JvmStatic + fun of( + indexType: IndexType, + elemType: ElemType, + ): ArrayType = ArrayType(indexType, elemType) + } + + override fun Eq( + leftOp: Expr>, + rightOp: Expr>, + ): EqExpr> = ArrayExprs.Eq(leftOp, rightOp) + + override fun Neq( + leftOp: Expr>, + rightOp: Expr>, + ): NeqExpr> = ArrayExprs.Neq(leftOp, rightOp) + + override fun toString(): String = + Utils.lispStringBuilder(TYPE_LABEL).add("([${indexType}] -> $elemType)").toString() + + override val domainSize: DomainSize + get() = DomainSize.pow(elemType.domainSize, indexType.domainSize) + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("ArrayType") { + element("indexType") + element("elemType") + } + + override fun serialize(encoder: Encoder, value: ArrayType) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement( + descriptor, + 0, + PolymorphicSerializer(Type::class), + value.indexType, + ) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.elemType) + } + + override fun deserialize(decoder: Decoder): ArrayType = + decoder.decodeStructure(descriptor) { + var indexType: Type? = null + var elemType: Type? = null + + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> + indexType = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class)) + 1 -> + elemType = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unexpected index: $index") + } + } + + ArrayType( + indexType = indexType ?: throw SerializationException("Missing indexType"), + elemType = elemType ?: throw SerializationException("Missing elemType"), + ) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt new file mode 100644 index 0000000000..89d9420f9a --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt @@ -0,0 +1,149 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.arraytype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** Write expression for array types. */ +@Serializable(with = ArrayWriteExpr.Serializer::class) +@SerialName("ArrayWrite") +data class ArrayWriteExpr( + val array: Expr>, + val index: Expr, + val elem: Expr, +) : Expr> { + + companion object { + + private const val OPERATOR_LABEL = "write" + + @JvmStatic + fun of( + array: Expr>, + index: Expr, + elem: Expr, + ) = ArrayWriteExpr(array, index, elem) + + @JvmStatic + @Suppress("UNCHECKED_CAST") + fun create( + array: Expr<*>, + index: Expr<*>, + elem: Expr<*>, + ): ArrayWriteExpr { + val arrayType = array.type as ArrayType + val newArray = cast(array, arrayType) + val newIndex = cast(index, arrayType.indexType) + val newElem = cast(elem, arrayType.elemType) + return of(newArray, newIndex, newElem) + } + } + + override val ops: List> = listOf(array, index, elem) + + override val type: ArrayType = ArrayType(index.type, elem.type) + + override fun eval(`val`: Valuation): LitExpr> { + val arrayVal = array.eval(`val`) as ArrayLitExpr + val indexVal = index.eval(`val`) + val elemVal = elem.eval(`val`) + val elemList = arrayVal.elements.filter { it.first != indexVal } + Pair(indexVal, elemVal) + return ArrayLitExpr.of(elemList, arrayVal.elseElem, arrayVal.type) + } + + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().add(array).add(index).add(elem).toString() + + override fun withOps(ops: List>): ArrayWriteExpr { + require(ops.size == 3) + val newArray = cast(ops[0], array.type) + val newIndex = cast(ops[1], index.type) + val newElem = cast(ops[2], elem.type) + return with(newArray, newIndex, newElem) + } + + fun with( + array: Expr>, + index: Expr, + elem: Expr, + ): ArrayWriteExpr = + if (this.array === array && this.index === index && this.elem === elem) { + this + } else { + of(array, index, elem) + } + + fun withIndex(index: Expr): ArrayWriteExpr = + with(array, index, elem) + + fun withElem(elem: Expr): ArrayWriteExpr = with(array, index, elem) + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("ArrayWrite") { + element>("array") + element>("index") + element>("elem") + } + + override fun serialize(encoder: Encoder, value: ArrayWriteExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.array) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.index) + encodeSerializableElement(descriptor, 2, PolymorphicSerializer(Expr::class), value.elem) + } + + override fun deserialize(decoder: Decoder): ArrayWriteExpr = + decoder.decodeStructure(descriptor) { + var array: Expr>? = null + var index: Expr? = null + var elem: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> + array = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + as Expr> + 1 -> + index = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr + 2 -> + elem = + decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Expr::class)) + as Expr + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + ArrayWriteExpr( + array ?: throw SerializationException("Missing array"), + index ?: throw SerializationException("Missing index"), + elem ?: throw SerializationException("Missing elem"), + ) + } + } +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/package-info.java similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/package-info.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/package-info.java diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/AndExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/AndExpr.kt new file mode 100644 index 0000000000..050c37e616 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/AndExpr.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.MultiaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** Logical AND expression for boolean type. */ +@Serializable +@SerialName("And") +data class AndExpr(override val ops: List>) : MultiaryExpr() { + + companion object { + + private const val OPERATOR_LABEL = "and" + + @JvmStatic fun of(ops: Iterable>) = AndExpr(ops.toList()) + + @JvmStatic fun create(ops: List>) = AndExpr(ops.map { cast(it, Bool()) }) + } + + override val type: BoolType = Bool() + + override fun eval(`val`: Valuation): BoolLitExpr = + if (ops.any { !(it.eval(`val`) as BoolLitExpr).value }) False() else True() + + override fun new(ops: List>): AndExpr = of(ops) + + override fun toString(): String = super.toString() + + override val operatorLabel: String + get() = OPERATOR_LABEL +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt new file mode 100644 index 0000000000..cae4868e06 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.core.decl.ParamDecl +import hu.bme.mit.theta.core.type.Expr + +/** Factory and utility methods for boolean expressions. */ +@Suppress("FunctionName") +object BoolExprs { + + @JvmStatic fun Bool() = BoolType + + @JvmStatic fun Bool(value: Boolean) = BoolLitExpr.of(value) + + @JvmStatic fun True() = TrueExpr + + @JvmStatic fun False() = FalseExpr + + @JvmStatic fun Not(op: Expr) = NotExpr(op) + + @JvmStatic fun Imply(leftOp: Expr, rightOp: Expr) = ImplyExpr(leftOp, rightOp) + + @JvmStatic fun Iff(leftOp: Expr, rightOp: Expr) = IffExpr(leftOp, rightOp) + + @JvmStatic fun Xor(leftOp: Expr, rightOp: Expr) = XorExpr(leftOp, rightOp) + + @JvmStatic fun And(ops: Iterable>) = AndExpr.of(ops) + + @JvmStatic fun Or(ops: Iterable>) = OrExpr.of(ops) + + @JvmStatic + fun Forall(paramDecls: Iterable>, op: Expr) = ForallExpr.of(paramDecls, op) + + @JvmStatic + fun Exists(paramDecls: Iterable>, op: Expr) = ExistsExpr.of(paramDecls, op) + + // Convenience methods + @JvmStatic @SafeVarargs fun And(vararg ops: Expr) = AndExpr.of(ops.asList()) + + @JvmStatic @SafeVarargs fun Or(vararg ops: Expr) = OrExpr.of(ops.asList()) +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt new file mode 100644 index 0000000000..49b8de9761 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** Abstract base class for boolean literal expressions. */ +@Serializable +sealed class BoolLitExpr : NullaryExpr(), LitExpr { + + abstract val value: Boolean + + override val type: BoolType = Bool() + + override fun eval(`val`: Valuation): BoolLitExpr = this + + companion object { + @JvmStatic fun of(value: Boolean): BoolLitExpr = if (value) TrueExpr else FalseExpr + } +} + +@Serializable +@SerialName("False") +object FalseExpr : BoolLitExpr() { + + @JvmStatic fun getInstance(): FalseExpr = this + + override val value: Boolean = false + + override fun toString(): String = "false" +} + +@Serializable +@SerialName("True") +object TrueExpr : BoolLitExpr() { + + @JvmStatic fun getInstance(): TrueExpr = this + + override val value: Boolean = true + + override fun toString(): String = "true" +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/BoolType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/BoolType.kt new file mode 100644 index 0000000000..8aa20cdb34 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/BoolType.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.core.type.DomainSize +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.Equational +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** Boolean type for expressions. */ +@Serializable +@SerialName(BoolType.TYPE_LABEL) +data object BoolType : Equational { + + internal const val TYPE_LABEL = "Bool" + + @JvmStatic fun getInstance(): BoolType = this + + override fun toString(): String = TYPE_LABEL + + override fun Eq(leftOp: Expr, rightOp: Expr): IffExpr = + BoolExprs.Iff(leftOp, rightOp) + + override fun Neq(leftOp: Expr, rightOp: Expr): NeqExpr = + BoolExprs.Xor(leftOp, rightOp) + + override val domainSize: DomainSize = DomainSize.TWO +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/IffExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/IffExpr.kt new file mode 100644 index 0000000000..a4504ec68a --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/IffExpr.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** Logical IFF (if and only if) expression for boolean type. */ +@Serializable +@SerialName("Iff") +data class IffExpr(override val leftOp: Expr, override val rightOp: Expr) : + EqExpr() { + + companion object { + + private const val OPERATOR_LABEL = "iff" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IffExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IffExpr(cast(leftOp, Bool()), cast(rightOp, Bool())) + } + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun eval(`val`: Valuation): BoolLitExpr = + Bool((leftOp.eval(`val`) as BoolLitExpr).value == (rightOp.eval(`val`) as BoolLitExpr).value) + + override fun new(leftOp: Expr, rightOp: Expr): IffExpr = + IffExpr(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt new file mode 100644 index 0000000000..24e24dd32b --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** Logical implication (=>) expression for boolean type. */ +@Serializable +@SerialName("Imply") +data class ImplyExpr(override val leftOp: Expr, override val rightOp: Expr) : + BinaryExpr() { + companion object { + private const val OPERATOR_LABEL = "=>" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = ImplyExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + ImplyExpr(cast(leftOp, Bool()), cast(rightOp, Bool())) + } + + override val type: BoolType = Bool() + + override fun eval(`val`: Valuation): BoolLitExpr = + Bool(!(leftOp.eval(`val`) as BoolLitExpr).value || (rightOp.eval(`val`) as BoolLitExpr).value) + + override fun new(leftOp: Expr, rightOp: Expr): ImplyExpr = + ImplyExpr(leftOp, rightOp) + + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).add(leftOp).add(rightOp).toString() + + override val operatorLabel: String + get() = OPERATOR_LABEL +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/NotExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/NotExpr.kt new file mode 100644 index 0000000000..e841c2d330 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/NotExpr.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** Logical NOT expression for boolean type. */ +@Serializable +@SerialName("Not") +data class NotExpr(override val op: Expr) : UnaryExpr() { + + companion object { + + private const val OPERATOR_LABEL = "not" + + @JvmStatic fun of(op: Expr) = NotExpr(op) + + @JvmStatic fun create(op: Expr<*>) = NotExpr(cast(op, Bool())) + } + + override val type: BoolType = Bool() + + override fun eval(`val`: Valuation): BoolLitExpr = Bool(!(op.eval(`val`) as BoolLitExpr).value) + + override fun new(op: Expr): NotExpr = NotExpr(op) + + override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(op).toString() + + override val operatorLabel: String = OPERATOR_LABEL +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/OrExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/OrExpr.kt new file mode 100644 index 0000000000..188c78e32f --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/OrExpr.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.MultiaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** Logical OR expression for boolean type. */ +@Serializable +@SerialName("Or") +data class OrExpr(override val ops: List>) : MultiaryExpr() { + + companion object { + + private const val OPERATOR_LABEL = "or" + + @JvmStatic fun of(ops: Iterable>) = OrExpr(ops.toList()) + + @JvmStatic fun create(ops: List>) = OrExpr(ops.map { cast(it, Bool()) }) + } + + override val type: BoolType = Bool() + + override fun eval(`val`: Valuation): BoolLitExpr = + if (ops.any { (it.eval(`val`) as BoolLitExpr).value }) True() else False() + + override fun new(ops: List>): OrExpr = of(ops) + + override fun toString(): String = super.toString() + + override val operatorLabel: String + get() = OPERATOR_LABEL +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt new file mode 100644 index 0000000000..2359afc81c --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt @@ -0,0 +1,113 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.decl.ParamDecl +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** Abstract base class for quantified boolean expressions (forall, exists). */ +@Serializable +sealed class QuantifiedExpr : Expr { + + abstract val paramDecls: List> + abstract val op: Expr + + override val type: BoolType = Bool() + override val ops: List> + get() = listOf(op) + + override fun withOps(ops: List>): Expr { + require(ops.size == 1) { "QuantifiedExpr expects exactly one operand." } + return with(cast(ops[0], Bool())) + } + + override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() + + override fun toString(): String { + val paramString = + paramDecls.joinToString(" ", prefix = "(", postfix = ")") { "(${it.name} ${it.type})" } + return Utils.lispStringBuilder(operatorLabel).body().add(paramString).add(op).toString() + } + + abstract fun with(op: Expr): QuantifiedExpr + + protected abstract val operatorLabel: String +} + +/** Existential quantifier expression for boolean type. */ +@Serializable +@SerialName("Exists") +data class ExistsExpr( + override val paramDecls: List>, + override val op: Expr, +) : QuantifiedExpr() { + + companion object { + + private const val OPERATOR_LABEL = "exists" + + @JvmStatic + fun of(paramDecls: Iterable>, op: Expr) = + ExistsExpr(paramDecls.toList(), op) + + @JvmStatic + fun create(paramDecls: Iterable>, op: Expr<*>) = + ExistsExpr(paramDecls.toList(), cast(op, Bool())) + } + + override fun with(op: Expr): ExistsExpr = + if (op == this.op) this else ExistsExpr(paramDecls, op) + + override val operatorLabel: String = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} + +/** Universal quantifier expression for boolean type. */ +@Serializable +@SerialName("Forall") +data class ForallExpr( + override val paramDecls: List>, + override val op: Expr, +) : QuantifiedExpr() { + + companion object { + + private const val OPERATOR_LABEL = "forall" + + @JvmStatic + fun of(paramDecls: Iterable>, op: Expr) = + ForallExpr(paramDecls.toList(), op) + + @JvmStatic + fun create(paramDecls: Iterable>, op: Expr<*>) = + ForallExpr(paramDecls.toList(), cast(op, Bool())) + } + + override fun with(op: Expr): ForallExpr = + if (op == this.op) this else ForallExpr(paramDecls, op) + + override val operatorLabel: String = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt new file mode 100644 index 0000000000..04bb299520 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt @@ -0,0 +1,71 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.core.type.Expr + +/** Utility methods for smart construction and simplification of boolean expressions. */ +@Suppress("FunctionName") +object SmartBoolExprs { + + @JvmStatic + fun Not(op: Expr): Expr = + when (op) { + BoolExprs.True() -> BoolExprs.False() + BoolExprs.False() -> BoolExprs.True() + is NotExpr -> op.op + else -> BoolExprs.Not(op) + } + + @JvmStatic + fun Imply(leftOp: Expr, rightOp: Expr): Expr = + when { + leftOp == BoolExprs.False() -> BoolExprs.True() + leftOp == BoolExprs.True() -> rightOp + rightOp == BoolExprs.False() -> Not(leftOp) + rightOp == BoolExprs.True() -> BoolExprs.True() + else -> BoolExprs.Imply(leftOp, rightOp) + } + + @JvmStatic + fun And(ops: Collection>): Expr { + if (ops.isEmpty()) return BoolExprs.True() + if (BoolExprs.False() in ops) return BoolExprs.False() + val filteredOps = ops.filter { it != BoolExprs.True() } + return when (filteredOps.size) { + 0 -> BoolExprs.True() + 1 -> filteredOps.single() + else -> BoolExprs.And(filteredOps) + } + } + + @JvmStatic + fun Or(ops: Collection>): Expr { + if (ops.isEmpty()) return BoolExprs.False() + if (BoolExprs.True() in ops) return BoolExprs.True() + val filteredOps = ops.filter { it != BoolExprs.False() } + return when (filteredOps.size) { + 0 -> BoolExprs.False() + 1 -> filteredOps.single() + else -> BoolExprs.Or(filteredOps) + } + } + + // Convenience methods + @JvmStatic @SafeVarargs fun And(vararg ops: Expr) = And(ops.toList()) + + @JvmStatic @SafeVarargs fun Or(vararg ops: Expr) = Or(ops.toList()) +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/XorExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/XorExpr.kt new file mode 100644 index 0000000000..8723fca97f --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/XorExpr.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** Logical XOR expression for boolean type. */ +@Serializable +@SerialName("Xor") +data class XorExpr(override val leftOp: Expr, override val rightOp: Expr) : + NeqExpr() { + + companion object { + + private const val OPERATOR_LABEL = "xor" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = XorExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + XorExpr(cast(leftOp, Bool()), cast(rightOp, Bool())) + } + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun eval(`val`: Valuation): BoolLitExpr = + Bool((leftOp.eval(`val`) as BoolLitExpr).value != (rightOp.eval(`val`) as BoolLitExpr).value) + + override fun new(leftOp: Expr, rightOp: Expr): XorExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/package-info.java similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/package-info.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/package-info.java diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt new file mode 100644 index 0000000000..a2da8229f4 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.AddExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvAdd") +data class BvAddExpr(override val ops: List>) : AddExpr() { + + init { + checkAllTypesEqual(ops) + } + + companion object { + private const val OPERATOR_LABEL = "bvadd" + + @JvmStatic fun of(ops: Iterable>) = BvAddExpr(ops.toList()) + + @JvmStatic fun create(ops: List>) = BvAddExpr(ops.map { TypeUtils.castBv(it) }) + } + + override val type: BvType + get() = ops[0].type + + override fun eval(`val`: Valuation): BvLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> + acc.add(op.eval(`val`) as BvLitExpr) + } + + override fun new(ops: List>): BvAddExpr = of(ops) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt new file mode 100644 index 0000000000..51c47d1b86 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.MultiaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvAnd") +data class BvAndExpr(override val ops: List>) : MultiaryExpr() { + + init { + checkAllTypesEqual(ops) + } + + companion object { + private const val OPERATOR_LABEL = "bvand" + + @JvmStatic fun of(ops: Iterable>) = BvAndExpr(ops.toList()) + + @JvmStatic fun create(ops: List>) = BvAndExpr(ops.map { TypeUtils.castBv(it) }) + } + + override val type: BvType + get() = ops[0].type + + override fun eval(`val`: Valuation): BvLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> + acc.and(op.eval(`val`) as BvLitExpr) + } + + override fun new(ops: List>): BvAndExpr = of(ops) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt new file mode 100644 index 0000000000..26a5a458db --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt @@ -0,0 +1,64 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvArithShiftRight") +data class BvArithShiftRightExpr( + override val leftOp: Expr, + override val rightOp: Expr, +) : BinaryExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + private const val OPERATOR_LABEL = "bvashr" + + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvArithShiftRightExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvArithShiftRightExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BvType + get() = leftOp.type + + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.arithShiftRight(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvArithShiftRightExpr = + of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt new file mode 100644 index 0000000000..6989767503 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvConcat") +data class BvConcatExpr(override val ops: List>) : Expr { + + init { + check(ops.isNotEmpty()) + } + + companion object { + + private const val OPERATOR_LABEL = "++" + + @JvmStatic fun of(ops: Iterable>) = BvConcatExpr(ops.toList()) + + @JvmStatic fun create(ops: List>) = BvConcatExpr(ops.map { TypeUtils.castBv(it) }) + } + + override val type: BvType = BvType.of(ops.sumOf { it.type.size }) + + override fun eval(`val`: Valuation): BvLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> + acc.concat(op.eval(`val`) as BvLitExpr) + } + + override fun withOps(ops: List>): Expr = of(ops.map { TypeUtils.castBv(it) }) + + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().addAll(ops).toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt new file mode 100644 index 0000000000..b729d91947 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt @@ -0,0 +1,63 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvEq") +data class BvEqExpr(override val leftOp: Expr, override val rightOp: Expr) : + EqExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + private const val OPERATOR_LABEL = "=" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvEqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvEqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BoolType + get() = BoolExprs.Bool() + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.eq(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvEqExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt new file mode 100644 index 0000000000..b86579041b --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt @@ -0,0 +1,106 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.inttype.IntLitExpr + +@Suppress("FunctionName") +object BvExprs { + + @JvmStatic fun BvType(size: Int) = BvType.of(size, null) + + @JvmStatic fun BvType(size: Int, signedness: Boolean?) = BvType.of(size, signedness) + + @JvmStatic fun Bv(value: BooleanArray) = BvLitExpr(value, null) + + @JvmStatic fun Bv(value: BooleanArray, signedness: Boolean?) = BvLitExpr(value, signedness) + + @JvmStatic fun Concat(ops: Iterable>) = BvConcatExpr.of(ops) + + @JvmStatic + fun Extract(bitvec: Expr, from: IntLitExpr, until: IntLitExpr) = + BvExtractExpr(bitvec, from, until) + + @JvmStatic fun ZExt(bitvec: Expr, extendType: BvType) = BvZExtExpr(bitvec, extendType) + + @JvmStatic fun SExt(bitvec: Expr, extendType: BvType) = BvSExtExpr(bitvec, extendType) + + @JvmStatic fun Add(ops: Iterable>) = BvAddExpr.of(ops) + + @JvmStatic fun Sub(leftOp: Expr, rightOp: Expr) = BvSubExpr(leftOp, rightOp) + + @JvmStatic fun Pos(op: Expr) = BvPosExpr(op) + + @JvmStatic fun Neg(op: Expr) = BvNegExpr(op) + + @JvmStatic fun Mul(ops: Iterable>) = BvMulExpr.of(ops) + + @JvmStatic fun UDiv(leftOp: Expr, rightOp: Expr) = BvUDivExpr(leftOp, rightOp) + + @JvmStatic fun SDiv(leftOp: Expr, rightOp: Expr) = BvSDivExpr(leftOp, rightOp) + + @JvmStatic fun SMod(leftOp: Expr, rightOp: Expr) = BvSModExpr(leftOp, rightOp) + + @JvmStatic fun URem(leftOp: Expr, rightOp: Expr) = BvURemExpr(leftOp, rightOp) + + @JvmStatic fun SRem(leftOp: Expr, rightOp: Expr) = BvSRemExpr(leftOp, rightOp) + + @JvmStatic fun Or(ops: Iterable>) = BvOrExpr.of(ops) + + @JvmStatic fun And(ops: Iterable>) = BvAndExpr.of(ops) + + @JvmStatic fun Xor(ops: Iterable>) = BvXorExpr.of(ops) + + @JvmStatic fun Not(op: Expr) = BvNotExpr(op) + + @JvmStatic + fun ShiftLeft(leftOp: Expr, rightOp: Expr) = BvShiftLeftExpr(leftOp, rightOp) + + @JvmStatic + fun ArithShiftRight(leftOp: Expr, rightOp: Expr) = + BvArithShiftRightExpr(leftOp, rightOp) + + @JvmStatic + fun LogicShiftRight(leftOp: Expr, rightOp: Expr) = + BvLogicShiftRightExpr(leftOp, rightOp) + + @JvmStatic + fun RotateLeft(leftOp: Expr, rightOp: Expr) = BvRotateLeftExpr(leftOp, rightOp) + + @JvmStatic + fun RotateRight(leftOp: Expr, rightOp: Expr) = BvRotateRightExpr(leftOp, rightOp) + + @JvmStatic fun Eq(leftOp: Expr, rightOp: Expr) = BvEqExpr(leftOp, rightOp) + + @JvmStatic fun Neq(leftOp: Expr, rightOp: Expr) = BvNeqExpr(leftOp, rightOp) + + @JvmStatic fun ULt(leftOp: Expr, rightOp: Expr) = BvULtExpr(leftOp, rightOp) + + @JvmStatic fun ULeq(leftOp: Expr, rightOp: Expr) = BvULeqExpr(leftOp, rightOp) + + @JvmStatic fun UGt(leftOp: Expr, rightOp: Expr) = BvUGtExpr(leftOp, rightOp) + + @JvmStatic fun UGeq(leftOp: Expr, rightOp: Expr) = BvUGeqExpr(leftOp, rightOp) + + @JvmStatic fun SLt(leftOp: Expr, rightOp: Expr) = BvSLtExpr(leftOp, rightOp) + + @JvmStatic fun SLeq(leftOp: Expr, rightOp: Expr) = BvSLeqExpr(leftOp, rightOp) + + @JvmStatic fun SGt(leftOp: Expr, rightOp: Expr) = BvSGtExpr(leftOp, rightOp) + + @JvmStatic fun SGeq(leftOp: Expr, rightOp: Expr) = BvSGeqExpr(leftOp, rightOp) +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt new file mode 100644 index 0000000000..493ebcf32a --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt @@ -0,0 +1,81 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.type.inttype.IntLitExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.castBv +import java.math.BigInteger +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvExtract") +data class BvExtractExpr(val bitvec: Expr, val from: IntLitExpr, val until: IntLitExpr) : + Expr { + + init { + check(from.value >= BigInteger.ZERO) + check(until.value >= BigInteger.ZERO) + check(until.value > from.value) + } + + companion object { + + private const val OPERATOR_LABEL = "extract" + + @JvmStatic + fun of(bitvec: Expr, from: IntLitExpr, until: IntLitExpr) = + BvExtractExpr(bitvec, from, until) + + @JvmStatic + fun create(bitvec: Expr<*>, from: Expr<*>, until: Expr<*>): BvExtractExpr { + val newBitvec = castBv(bitvec) + val newFrom = TypeUtils.cast(from, Int()) as IntLitExpr + val newUntil = TypeUtils.cast(until, Int()) as IntLitExpr + return of(newBitvec, newFrom, newUntil) + } + } + + override val arity: Int = 3 + override val type: BvType = BvType.of(until.value.subtract(from.value).toInt()) + override val ops: List> = listOf(bitvec, from, until) + + override fun eval(`val`: Valuation): BvLitExpr { + val bitvecVal = bitvec.eval(`val`) as BvLitExpr + return bitvecVal.extract(from, until) + } + + override fun withOps(ops: List>): Expr { + require(ops.size == 3) + val newBitvec = castBv(ops[0]) + val newFrom = TypeUtils.cast(ops[1], Int()) as IntLitExpr + val newUntil = TypeUtils.cast(ops[2], Int()) as IntLitExpr + + return if (bitvec == newBitvec && from == newFrom && until == newUntil) { + this + } else { + of(newBitvec, newFrom, newUntil) + } + } + + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().add(bitvec).add(from).add(until).toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt new file mode 100644 index 0000000000..0aecec8c95 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt @@ -0,0 +1,380 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.inttype.IntLitExpr +import hu.bme.mit.theta.core.utils.BvUtils.* +import java.math.BigInteger +import kotlin.concurrent.Volatile +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient + +@Serializable +@SerialName("BvLit") +data class BvLitExpr(val value: BooleanArray, val signed: Boolean? = null) : + NullaryExpr(), LitExpr, Comparable { + + init { + require(value.isNotEmpty()) { "Bitvector must have positive size." } + } + + companion object { + + private const val HASH_SEED: Int = 5624 + + @JvmStatic fun of(value: BooleanArray, signed: Boolean? = null) = BvLitExpr(value, signed) + } + + @Volatile @Transient private var hashCode = 0 + + override val type: BvType + get() = BvType(value.size, signed) + + override fun eval(`val`: Valuation): BvLitExpr = this + + fun concat(that: BvLitExpr): BvLitExpr { + val concatenated = BooleanArray(this.type.size + that.type.size) + for (i in 0 until this.type.size) concatenated[i] = this.value[i] + for (i in 0 until that.type.size) concatenated[this.type.size + i] = that.value[i] + return of(concatenated) + } + + fun extract(from: IntLitExpr, until: IntLitExpr): BvLitExpr { + val fromValue = from.value.toInt() + val untilValue = until.value.toInt() + require(fromValue >= 0 && untilValue >= 0 && untilValue > fromValue) + val extracted = BooleanArray(untilValue - fromValue) + for (i in extracted.indices) { + extracted[extracted.size - i - 1] = this.value[this.value.size - (fromValue + i) - 1] + } + return of(extracted) + } + + fun zext(extendType: BvType): BvLitExpr { + require(extendType.size >= this.type.size) + val extended = BooleanArray(extendType.size) + for (i in this.value.indices) { + extended[extended.size - i - 1] = this.value[this.value.size - i - 1] + } + for (i in 0 until extendType.size - this.type.size) { + extended[i] = false + } + return of(extended) + } + + fun sext(extendType: BvType): BvLitExpr { + require(extendType.size >= this.type.size) + val extended = BooleanArray(extendType.size) + for (i in this.value.indices) { + extended[extended.size - i - 1] = this.value[this.value.size - i - 1] + } + for (i in 0 until extendType.size - this.type.size) { + extended[i] = this.value[0] + } + return of(extended) + } + + fun add(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + var sum = neutralBvLitExprToBigInteger(this).add(neutralBvLitExprToBigInteger(that)) + sum = fitBigIntegerIntoNeutralDomain(sum, type.size) + return bigIntegerToNeutralBvLitExpr(sum, type.size) + } + + fun sub(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + var sub = neutralBvLitExprToBigInteger(this).subtract(neutralBvLitExprToBigInteger(that)) + sub = fitBigIntegerIntoNeutralDomain(sub, type.size) + return bigIntegerToNeutralBvLitExpr(sub, type.size) + } + + fun mul(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + var prod = neutralBvLitExprToBigInteger(this).multiply(neutralBvLitExprToBigInteger(that)) + prod = fitBigIntegerIntoNeutralDomain(prod, type.size) + return bigIntegerToNeutralBvLitExpr(prod, type.size) + } + + fun pos(): BvLitExpr { + var pos = signedBvLitExprToBigInteger(this) + pos = fitBigIntegerIntoSignedDomain(pos, type.size) + return bigIntegerToSignedBvLitExpr(pos, type.size) + } + + fun neg(): BvLitExpr { + var neg = signedBvLitExprToBigInteger(this).negate() + neg = fitBigIntegerIntoSignedDomain(neg, type.size) + return bigIntegerToSignedBvLitExpr(neg, type.size) + } + + fun udiv(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + var div = unsignedBvLitExprToBigInteger(this).divide(unsignedBvLitExprToBigInteger(that)) + div = fitBigIntegerIntoUnsignedDomain(div, type.size) + return bigIntegerToUnsignedBvLitExpr(div, type.size) + } + + fun sdiv(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + var div = signedBvLitExprToBigInteger(this).divide(signedBvLitExprToBigInteger(that)) + div = fitBigIntegerIntoSignedDomain(div, type.size) + return bigIntegerToSignedBvLitExpr(div, type.size) + } + + fun and(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val and = neutralBvLitExprToBigInteger(this).and(neutralBvLitExprToBigInteger(that)) + return bigIntegerToNeutralBvLitExpr(and, type.size) + } + + fun or(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val or = neutralBvLitExprToBigInteger(this).or(neutralBvLitExprToBigInteger(that)) + return bigIntegerToNeutralBvLitExpr(or, type.size) + } + + fun xor(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val xor = neutralBvLitExprToBigInteger(this).xor(neutralBvLitExprToBigInteger(that)) + return bigIntegerToNeutralBvLitExpr(xor, type.size) + } + + fun not(): BvLitExpr { + val not = neutralBvLitExprToBigInteger(this).not() + return bigIntegerToNeutralBvLitExpr(not, type.size) + } + + fun shiftLeft(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val shifted = value.copyOf(value.size) + val shift = neutralBvLitExprToBigInteger(that) + var i = BigInteger.ZERO + while (i < shift) { + for (j in 0 until shifted.size - 1) { + shifted[j] = shifted[j + 1] + } + shifted[shifted.size - 1] = false + i = i.add(BigInteger.ONE) + } + return of(shifted) + } + + fun arithShiftRight(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val shifted = value.copyOf(value.size) + val insert = shifted[0] + val shift = neutralBvLitExprToBigInteger(that) + var i = BigInteger.ZERO + while (i < shift) { + for (j in shifted.size - 1 downTo 1) { + shifted[j] = shifted[j - 1] + } + shifted[0] = insert + i = i.add(BigInteger.ONE) + } + return of(shifted) + } + + fun logicShiftRight(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val shifted = value.copyOf(value.size) + val shift = neutralBvLitExprToBigInteger(that) + var i = BigInteger.ZERO + while (i < shift) { + for (j in shifted.size - 1 downTo 1) { + shifted[j] = shifted[j - 1] + } + shifted[0] = false + i = i.add(BigInteger.ONE) + } + return of(shifted) + } + + fun rotateLeft(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val shifted = value.copyOf(value.size) + val shift = neutralBvLitExprToBigInteger(that) + var i = BigInteger.ZERO + while (i < shift) { + val rotated = shifted[0] + for (j in 0 until shifted.size - 1) { + shifted[j] = shifted[j + 1] + } + shifted[shifted.size - 1] = rotated + i = i.add(BigInteger.ONE) + } + return of(shifted) + } + + fun rotateRight(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val shifted = value.copyOf(value.size) + val shift = neutralBvLitExprToBigInteger(that) + var i = BigInteger.ZERO + while (i < shift) { + val rotated = shifted[shifted.size - 1] + for (j in shifted.size - 1 downTo 1) { + shifted[j] = shifted[j - 1] + } + shifted[0] = rotated + i = i.add(BigInteger.ONE) + } + return of(shifted) + } + + fun smod(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + // Always positive semantics: + // 5 mod 3 = 2 + // 5 mod -3 = 2 + // -5 mod 3 = 1 + // -5 mod -3 = 1 + var result = signedBvLitExprToBigInteger(this).mod(signedBvLitExprToBigInteger(that)) + if (result < BigInteger.ZERO) { + result = result.add(signedBvLitExprToBigInteger(that).abs()) + } + require(result >= BigInteger.ZERO) + return bigIntegerToSignedBvLitExpr(result, type.size) + } + + fun urem(that: BvLitExpr): BvLitExpr { + // Semantics: + // 5 rem 3 = 2 + val thisInt = signedBvLitExprToBigInteger(this) + val thatInt = signedBvLitExprToBigInteger(that) + return bigIntegerToSignedBvLitExpr(thisInt.mod(thatInt), type.size) + } + + fun srem(that: BvLitExpr): BvLitExpr { + // Semantics: + // 5 rem 3 = 2 + // 5 rem -3 = 2 + // -5 rem 3 = -1 + // -5 rem -3 = -1 + val thisInt = signedBvLitExprToBigInteger(this) + val thatInt = signedBvLitExprToBigInteger(that) + val thisAbs = thisInt.abs() + val thatAbs = thatInt.abs() + return when { + thisInt < BigInteger.ZERO && thatInt < BigInteger.ZERO -> { + bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs).negate(), type.size) + } + + thisInt >= BigInteger.ZERO && thatInt < BigInteger.ZERO -> { + bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs), type.size) + } + + thisInt < BigInteger.ZERO && thatInt >= BigInteger.ZERO -> { + bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs).negate(), type.size) + } + + else -> { + bigIntegerToSignedBvLitExpr(thisInt.mod(thatInt), type.size) + } + } + } + + fun eq(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(this.value.contentEquals(that.value)) + } + + fun neq(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(!this.value.contentEquals(that.value)) + } + + fun ult(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(unsignedBvLitExprToBigInteger(this) < unsignedBvLitExprToBigInteger(that)) + } + + fun ule(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(unsignedBvLitExprToBigInteger(this) <= unsignedBvLitExprToBigInteger(that)) + } + + fun ugt(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(unsignedBvLitExprToBigInteger(this) > unsignedBvLitExprToBigInteger(that)) + } + + fun uge(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(unsignedBvLitExprToBigInteger(this) >= unsignedBvLitExprToBigInteger(that)) + } + + fun slt(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(signedBvLitExprToBigInteger(this) < signedBvLitExprToBigInteger(that)) + } + + fun sle(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(signedBvLitExprToBigInteger(this) <= signedBvLitExprToBigInteger(that)) + } + + fun sgt(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(signedBvLitExprToBigInteger(this) > signedBvLitExprToBigInteger(that)) + } + + fun sge(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(signedBvLitExprToBigInteger(this) >= signedBvLitExprToBigInteger(that)) + } + + override fun compareTo(other: BvLitExpr): Int { + // Use unsigned comparison for ordering + return unsignedBvLitExprToBigInteger(this).compareTo(unsignedBvLitExprToBigInteger(other)) + } + + override fun hashCode(): Int { + var result = hashCode + if (result == 0) { + result = HASH_SEED + result = 31 * result + value.contentHashCode() + hashCode = result + } + return result + } + + override fun equals(other: Any?): Boolean = + if (this === other) { + true + } else if (other != null && this.javaClass == other.javaClass) { + val that = other as BvLitExpr + value.contentEquals(that.value) + } else { + false + } + + override fun toString(): String { + val sb = StringBuilder() + // sb.append(getType().getSize()); + sb.append("#b") + for (bit in value) { + sb.append(if (bit) "1" else "0") + } + return sb.toString() + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt new file mode 100644 index 0000000000..218d263092 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt @@ -0,0 +1,64 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvLogicShiftRight") +data class BvLogicShiftRightExpr( + override val leftOp: Expr, + override val rightOp: Expr, +) : BinaryExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + private const val OPERATOR_LABEL = "bvlshr" + + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvLogicShiftRightExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvLogicShiftRightExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BvType + get() = leftOp.type + + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.logicShiftRight(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvLogicShiftRightExpr = + of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt new file mode 100644 index 0000000000..f5f6d7f102 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.MulExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvMul") +data class BvMulExpr(override val ops: List>) : MulExpr() { + + init { + checkAllTypesEqual(ops) + } + + companion object { + private const val OPERATOR_LABEL = "bvmul" + + @JvmStatic fun of(ops: Iterable>) = BvMulExpr(ops.toList()) + + @JvmStatic fun create(ops: List>) = BvMulExpr(ops.map { TypeUtils.castBv(it) }) + } + + override val type: BvType + get() = ops[0].type + + override fun eval(`val`: Valuation): BvLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> + acc.mul(op.eval(`val`) as BvLitExpr) + } + + override fun new(ops: List>): BvMulExpr = of(ops) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt new file mode 100644 index 0000000000..7f85069796 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NegExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvNeg") +data class BvNegExpr(override val op: Expr) : NegExpr() { + + companion object { + private const val OPERATOR_LABEL = "bvneg" + + @JvmStatic fun of(op: Expr) = BvNegExpr(op) + + @JvmStatic fun create(op: Expr<*>) = BvNegExpr(TypeUtils.castBv(op)) + } + + override val type: BvType + get() = op.type + + override fun eval(`val`: Valuation): BvLitExpr { + val opVal = op.eval(`val`) as BvLitExpr + return opVal.neg() + } + + override fun new(op: Expr): BvNegExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt new file mode 100644 index 0000000000..726839dd01 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt @@ -0,0 +1,63 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvNeq") +data class BvNeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + NeqExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + private const val OPERATOR_LABEL = "/=" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvNeqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvNeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BoolType + get() = BoolExprs.Bool() + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.neq(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvNeqExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt new file mode 100644 index 0000000000..91e4630fe6 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvNot") +data class BvNotExpr(override val op: Expr) : UnaryExpr() { + + companion object { + private const val OPERATOR_LABEL = "bvnot" + + @JvmStatic fun of(op: Expr) = BvNotExpr(op) + + @JvmStatic fun create(op: Expr<*>) = BvNotExpr(TypeUtils.castBv(op)) + } + + override val type: BvType + get() = op.type + + override fun eval(`val`: Valuation): BvLitExpr { + val opVal = op.eval(`val`) as BvLitExpr + return opVal.not() + } + + override fun new(op: Expr): BvNotExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt new file mode 100644 index 0000000000..9cf7ab8ab6 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.MultiaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvOr") +data class BvOrExpr(override val ops: List>) : MultiaryExpr() { + + init { + checkAllTypesEqual(ops) + } + + companion object { + private const val OPERATOR_LABEL = "bvor" + + @JvmStatic fun of(ops: Iterable>) = BvOrExpr(ops.toList()) + + @JvmStatic fun create(ops: List>) = BvOrExpr(ops.map { TypeUtils.castBv(it) }) + } + + override val type: BvType + get() = ops[0].type + + override fun eval(`val`: Valuation): BvLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> + acc.or(op.eval(`val`) as BvLitExpr) + } + + override fun new(ops: List>): BvOrExpr = of(ops) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt new file mode 100644 index 0000000000..becdfc31d2 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.PosExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvPos") +data class BvPosExpr(override val op: Expr) : PosExpr() { + + companion object { + private const val OPERATOR_LABEL = "bvpos" + + @JvmStatic fun of(op: Expr) = BvPosExpr(op) + + @JvmStatic fun create(op: Expr<*>) = BvPosExpr(TypeUtils.castBv(op)) + } + + override val type: BvType + get() = op.type + + override fun eval(`val`: Valuation): BvLitExpr { + val opVal = op.eval(`val`) as BvLitExpr + return opVal.pos() + } + + override fun new(op: Expr): BvPosExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt new file mode 100644 index 0000000000..e4cdac74ac --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt @@ -0,0 +1,62 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvRotateLeft") +data class BvRotateLeftExpr(override val leftOp: Expr, override val rightOp: Expr) : + BinaryExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + private const val OPERATOR_LABEL = "bvrol" + + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvRotateLeftExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvRotateLeftExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BvType + get() = leftOp.type + + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.rotateLeft(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvRotateLeftExpr = + of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt new file mode 100644 index 0000000000..25d5e7540b --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt @@ -0,0 +1,64 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvRotateRight") +data class BvRotateRightExpr( + override val leftOp: Expr, + override val rightOp: Expr, +) : BinaryExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + private const val OPERATOR_LABEL = "bvror" + + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvRotateRightExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvRotateRightExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BvType + get() = leftOp.type + + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.rotateRight(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvRotateRightExpr = + of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt new file mode 100644 index 0000000000..1a1399b3c2 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.DivExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvSDiv") +data class BvSDivExpr(override val leftOp: Expr, override val rightOp: Expr) : + DivExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + private const val OPERATOR_LABEL = "bvsdiv" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvSDivExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvSDivExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BvType + get() = leftOp.type + + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.sdiv(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvSDivExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt new file mode 100644 index 0000000000..c678f6adfa --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt @@ -0,0 +1,59 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castBv +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvSExt") +data class BvSExtExpr(val op: Expr, val extendType: BvType) : Expr { + + init { + check(extendType.size >= op.type.size) + } + + companion object { + + private const val OPERATOR_LABEL = "bv_sign_extend" + + @JvmStatic fun of(op: Expr, extendType: BvType) = BvSExtExpr(op, extendType) + + @JvmStatic fun create(op: Expr<*>, extendType: BvType) = BvSExtExpr(castBv(op), extendType) + } + + override val arity: Int = 1 + override val type: BvType = extendType + override val ops: List> = listOf(op) + + override fun eval(`val`: Valuation): LitExpr { + val bvLitExpr = op.eval(`val`) as BvLitExpr + return bvLitExpr.sext(extendType) + } + + override fun withOps(ops: List>): Expr { + require(ops.size == 1) + return of(castBv(ops[0]), extendType) + } + + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().add(op).add(type).toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt new file mode 100644 index 0000000000..64736f6609 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.GeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvSGeq") +data class BvSGeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + GeqExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + private const val OPERATOR_LABEL = "bvsge" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvSGeqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvSGeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.sge(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvSGeqExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt new file mode 100644 index 0000000000..f9f4d6013f --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.GtExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvSGt") +data class BvSGtExpr(override val leftOp: Expr, override val rightOp: Expr) : + GtExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + private const val OPERATOR_LABEL = "bvsgt" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvSGtExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvSGtExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.sgt(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvSGtExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt new file mode 100644 index 0000000000..6be2f6364a --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.LeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvSLeq") +data class BvSLeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + LeqExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + private const val OPERATOR_LABEL = "bvsle" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvSLeqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvSLeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.sle(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvSLeqExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt new file mode 100644 index 0000000000..79b4d6201e --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.LtExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvSLt") +data class BvSLtExpr(override val leftOp: Expr, override val rightOp: Expr) : + LtExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + private const val OPERATOR_LABEL = "bvslt" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvSLtExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvSLtExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.slt(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvSLtExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt new file mode 100644 index 0000000000..cec0b0bdf2 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.ModExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvSMod") +data class BvSModExpr(override val leftOp: Expr, override val rightOp: Expr) : + ModExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + private const val OPERATOR_LABEL = "bvsmod" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvSModExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvSModExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BvType + get() = leftOp.type + + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.smod(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvSModExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt new file mode 100644 index 0000000000..9589c50014 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.RemExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvSRem") +data class BvSRemExpr(override val leftOp: Expr, override val rightOp: Expr) : + RemExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + private const val OPERATOR_LABEL = "bvsrem" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvSRemExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvSRemExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BvType + get() = leftOp.type + + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.srem(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvSRemExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt new file mode 100644 index 0000000000..4ab958671e --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt @@ -0,0 +1,62 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvShiftLeft") +data class BvShiftLeftExpr(override val leftOp: Expr, override val rightOp: Expr) : + BinaryExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + private const val OPERATOR_LABEL = "bvshl" + + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvShiftLeftExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvShiftLeftExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BvType + get() = leftOp.type + + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.shiftLeft(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvShiftLeftExpr = + of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt new file mode 100644 index 0000000000..d425b081ca --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt @@ -0,0 +1,54 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.PosExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvSignChange") +data class BvSignChangeExpr(override val op: Expr, val newType: BvType) : + PosExpr() { + + companion object { + + private const val OPERATOR_LABEL = "bvpos" + + @JvmStatic fun of(op: Expr, newType: BvType) = BvSignChangeExpr(op, newType) + + @JvmStatic + fun create(op: Expr<*>, newType: BvType) = BvSignChangeExpr(TypeUtils.castBv(op), newType) + } + + override val type: BvType + get() = newType + + override fun eval(`val`: Valuation): BvLitExpr { + val opVal = op.eval(`val`) as BvLitExpr + return opVal.pos() + } + + override fun new(op: Expr): BvSignChangeExpr = of(op, newType) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt new file mode 100644 index 0000000000..ed9694ae28 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.SubExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvSub") +data class BvSubExpr(override val leftOp: Expr, override val rightOp: Expr) : + SubExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + private const val OPERATOR_LABEL = "bvsub" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvSubExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvSubExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BvType + get() = leftOp.type + + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.sub(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvSubExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvType.kt new file mode 100644 index 0000000000..1e720d8e14 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvType.kt @@ -0,0 +1,127 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.DomainSize +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.abstracttype.* +import hu.bme.mit.theta.core.type.fptype.FpExprs.FromBv +import hu.bme.mit.theta.core.type.fptype.FpRoundingMode.Companion.defaultRoundingMode +import hu.bme.mit.theta.core.type.fptype.FpType +import java.math.BigInteger +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName(BvType.TYPE_LABEL) +data class BvType(val size: Int, val signed: Boolean?) : + Additive, + Multiplicative, + Divisible, + Equational, + Ordered, + Castable { + + init { + require(size > 0) { "Bitvector size must be positive" } + } + + companion object { + + internal const val TYPE_LABEL = "Bv" + + @JvmStatic fun of(size: Int): BvType = BvType(size, null) + + @JvmStatic fun of(size: Int, signed: Boolean?): BvType = BvType(size, signed) + } + + fun withSize(size: Int): BvType = BvType(size, signed) + + fun isSigned(): Boolean = signed ?: error("Signedness is not specified") + + override fun Eq(leftOp: Expr, rightOp: Expr) = BvEqExpr(leftOp, rightOp) + + override fun Neq(leftOp: Expr, rightOp: Expr) = BvNeqExpr(leftOp, rightOp) + + override fun Add(ops: Iterable>) = BvExprs.Add(ops) + + override fun Sub(leftOp: Expr, rightOp: Expr) = BvExprs.Sub(leftOp, rightOp) + + override fun Pos(op: Expr) = BvExprs.Pos(op) + + override fun Neg(op: Expr) = BvExprs.Neg(op) + + override fun Cast(op: Expr, type: TargetType): Expr { + if (type is FpType && signed != null) { + @Suppress("UNCHECKED_CAST") + return FromBv(defaultRoundingMode, op, type as FpType, signed) as Expr + } + throw ClassCastException("Bv cannot be cast to $type") + } + + override fun Mod(leftOp: Expr, rightOp: Expr): ModExpr { + check(signed != null && signed) { "Signed BvType required for Mod" } + return BvExprs.SMod(leftOp, rightOp) + } + + override fun Rem(leftOp: Expr, rightOp: Expr): RemExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SRem(leftOp, rightOp) else BvExprs.URem(leftOp, rightOp) + } + + override fun Mul(ops: Iterable>) = BvExprs.Mul(ops) + + override fun Div(leftOp: Expr, rightOp: Expr): DivExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SDiv(leftOp, rightOp) else BvExprs.UDiv(leftOp, rightOp) + } + + override fun Lt(leftOp: Expr, rightOp: Expr): LtExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SLt(leftOp, rightOp) else BvExprs.ULt(leftOp, rightOp) + } + + override fun Leq(leftOp: Expr, rightOp: Expr): LeqExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SLeq(leftOp, rightOp) else BvExprs.ULeq(leftOp, rightOp) + } + + override fun Gt(leftOp: Expr, rightOp: Expr): GtExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SGt(leftOp, rightOp) else BvExprs.UGt(leftOp, rightOp) + } + + override fun Geq(leftOp: Expr, rightOp: Expr): GeqExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SGeq(leftOp, rightOp) else BvExprs.UGeq(leftOp, rightOp) + } + + override val domainSize: DomainSize + get() = DomainSize.of(BigInteger.TWO.pow(size)) + + override fun toString(): String = Utils.lispStringBuilder(TYPE_LABEL).add(size).toString() + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is BvType) return false + if (size != other.size) return false + return true + } + + override fun hashCode(): Int = size.hashCode() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt new file mode 100644 index 0000000000..d193ea780e --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.DivExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvUDiv") +data class BvUDivExpr(override val leftOp: Expr, override val rightOp: Expr) : + DivExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + private const val OPERATOR_LABEL = "bvudiv" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvUDivExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvUDivExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BvType + get() = leftOp.type + + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.udiv(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvUDivExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt new file mode 100644 index 0000000000..c94003df4d --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.GeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvUGeq") +data class BvUGeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + GeqExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + private const val OPERATOR_LABEL = "bvuge" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvUGeqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvUGeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.uge(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvUGeqExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt new file mode 100644 index 0000000000..3cdb8dc53d --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.GtExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvUGt") +data class BvUGtExpr(override val leftOp: Expr, override val rightOp: Expr) : + GtExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + private const val OPERATOR_LABEL = "bvugt" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvUGtExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvUGtExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.ugt(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvUGtExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt new file mode 100644 index 0000000000..f08d0d7a44 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.LeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvULeq") +data class BvULeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + LeqExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + private const val OPERATOR_LABEL = "bvule" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvULeqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvULeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.ule(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvULeqExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt new file mode 100644 index 0000000000..51f58e19d3 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.LtExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvULt") +data class BvULtExpr(override val leftOp: Expr, override val rightOp: Expr) : + LtExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + private const val OPERATOR_LABEL = "bvult" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvULtExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvULtExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.ult(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvULtExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt new file mode 100644 index 0000000000..0a5c59f773 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.RemExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvURem") +data class BvURemExpr(override val leftOp: Expr, override val rightOp: Expr) : + RemExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + private const val OPERATOR_LABEL = "bvurem" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvURemExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvURemExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BvType + get() = leftOp.type + + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.urem(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvURemExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt new file mode 100644 index 0000000000..39363a6dcc --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.MultiaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvXor") +data class BvXorExpr(override val ops: List>) : MultiaryExpr() { + + init { + checkAllTypesEqual(ops) + } + + companion object { + private const val OPERATOR_LABEL = "bvxor" + + @JvmStatic fun of(ops: Iterable>) = BvXorExpr(ops.toList()) + + @JvmStatic fun create(ops: List>) = BvXorExpr(ops.map { TypeUtils.castBv(it) }) + } + + override val type: BvType + get() = ops[0].type + + override fun eval(`val`: Valuation): BvLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> + acc.xor(op.eval(`val`) as BvLitExpr) + } + + override fun new(ops: List>): BvXorExpr = of(ops) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt new file mode 100644 index 0000000000..bcdd09783c --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvZExt") +data class BvZExtExpr(val op: Expr, val extendType: BvType) : Expr { + + init { + check(extendType.size >= op.type.size) + } + + companion object { + + private const val OPERATOR_LABEL = "bv_zero_extend" + + @JvmStatic fun of(op: Expr, extendType: BvType) = BvZExtExpr(op, extendType) + + @JvmStatic + fun create(op: Expr<*>, extendType: BvType) = BvZExtExpr(TypeUtils.castBv(op), extendType) + } + + override val arity: Int = 1 + override val type: BvType = extendType + override val ops: List> = listOf(op) + + override fun eval(`val`: Valuation): LitExpr { + val bvLitExpr = op.eval(`val`) as BvLitExpr + return bvLitExpr.zext(extendType) + } + + override fun withOps(ops: List>): Expr { + require(ops.size == 1) + return of(TypeUtils.castBv(ops[0]), extendType) + } + + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().add(op).add(type).toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/package-info.java similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/package-info.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/package-info.java diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt new file mode 100644 index 0000000000..ad296756c6 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.enumtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("EnumEq") +data class EnumEqExpr(override val leftOp: Expr, override val rightOp: Expr) : + EqExpr() { + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = EnumEqExpr(leftOp, rightOp) + } + + override fun eval(`val`: Valuation): LitExpr = + EnumLitExpr.eq(leftOp.eval(`val`) as EnumLitExpr, rightOp.eval(`val`) as EnumLitExpr) + + override fun new(leftOp: Expr, rightOp: Expr): EnumEqExpr = + of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt new file mode 100644 index 0000000000..643a46d5f0 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.enumtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("EnumLit") +data class EnumLitExpr(override val type: EnumType, val value: String) : + NullaryExpr(), LitExpr { + + init { + require(value in type.values) { "Invalid value $value for type ${type.name}" } + } + + companion object { + + @JvmStatic + fun of(type: EnumType, literalName: String): EnumLitExpr { + val value = EnumType.getShortName(literalName) + return EnumLitExpr(type, value) + } + + @JvmStatic + fun eq(l: EnumLitExpr, r: EnumLitExpr): BoolLitExpr = + Bool(l.type == r.type && l.value == r.value) + + @JvmStatic + fun neq(l: EnumLitExpr, r: EnumLitExpr): BoolLitExpr = + Bool(l.type != r.type || l.value != r.value) + } + + override fun eval(`val`: Valuation): LitExpr = this + + override fun toString(): String = EnumType.makeLongName(type, value) +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt new file mode 100644 index 0000000000..8dab066929 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.enumtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("EnumNeq") +data class EnumNeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + NeqExpr() { + + companion object { + + private const val OPERATOR_LABEL = "!=" + + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = EnumNeqExpr(leftOp, rightOp) + } + + override val operatorLabel: String = OPERATOR_LABEL + + override fun eval(`val`: Valuation): LitExpr = + EnumLitExpr.neq(leftOp.eval(`val`) as EnumLitExpr, rightOp.eval(`val`) as EnumLitExpr) + + override fun new(leftOp: Expr, rightOp: Expr): EnumNeqExpr = + of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumType.kt new file mode 100644 index 0000000000..ba0433c99b --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumType.kt @@ -0,0 +1,100 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.enumtype + +import hu.bme.mit.theta.core.type.DomainSize +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.abstracttype.Equational +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.anytype.InvalidLitExpr +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName(EnumType.TYPE_LABEL) +data class EnumType(val name: String, private val literals: Map) : + Equational, Type { + + companion object { + + internal const val TYPE_LABEL = "Enum" + const val FULLY_QUALIFIED_NAME_SEPARATOR = "." + + @JvmStatic + fun of(name: String, values: Collection) = + EnumType(name, values.withIndex().associate { it.value to it.index }.toMap(LinkedHashMap())) + + @JvmStatic + fun makeLongName(typeName: String, literal: String) = + "$typeName$FULLY_QUALIFIED_NAME_SEPARATOR$literal" + + @JvmStatic fun makeLongName(type: EnumType, literal: String) = makeLongName(type.name, literal) + + @JvmStatic + fun getShortName(longName: String): String = + if (FULLY_QUALIFIED_NAME_SEPARATOR !in longName) longName + else + longName.substring( + longName.indexOf(FULLY_QUALIFIED_NAME_SEPARATOR) + FULLY_QUALIFIED_NAME_SEPARATOR.length + ) + } + + override val domainSize: DomainSize + get() = DomainSize.of(literals.size.toLong()) + + override fun Eq(leftOp: Expr, rightOp: Expr): EqExpr = + EnumEqExpr.of(leftOp, rightOp) + + override fun Neq(leftOp: Expr, rightOp: Expr): NeqExpr = + EnumNeqExpr.of(leftOp, rightOp) + + val values: Set + get() = literals.keys + + val longValues: Set + get() = literals.keys.map { makeLongName(this, it) }.toSet() + + fun getIntValue(literal: EnumLitExpr): Int = getIntValue(literal.value) + + fun getIntValue(literal: String): Int = + literals[literal] + ?: throw IllegalArgumentException("Enum type $name does not contain literal '$literal'") + + fun litFromShortName(shortName: String): LitExpr = + try { + EnumLitExpr.of(this, shortName) + } catch (e: Exception) { + throw RuntimeException("$shortName is not valid for type $name", e) + } + + fun litFromLongName(longName: String): LitExpr { + if (FULLY_QUALIFIED_NAME_SEPARATOR !in longName) + throw RuntimeException("$longName is an invalid enum longname") + val parts = longName.split(FULLY_QUALIFIED_NAME_SEPARATOR) + val type = parts[0] + require(name == type) { "$type does not belong to type $name" } + return litFromShortName(parts[1]) + } + + fun litFromIntValue(value: Int): LitExpr = + literals.entries.find { it.value == value }?.let { EnumLitExpr.of(this, it.key) } + ?: InvalidLitExpr(this) + + override fun toString(): String = "EnumType{$name}" +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt new file mode 100644 index 0000000000..1e2831ef52 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpAbs") +data class FpAbsExpr(override val op: Expr) : UnaryExpr() { + + companion object { + private const val OPERATOR_LABEL = "fpabs" + + @JvmStatic fun of(op: Expr) = FpAbsExpr(op) + + @JvmStatic fun create(op: Expr<*>) = FpAbsExpr(castFp(op)) + } + + override val type: FpType + get() = op.type + + override fun eval(`val`: Valuation): FpLitExpr { + val opVal = op.eval(`val`) as FpLitExpr + return if (opVal.hidden) { + opVal.neg() + } else { + opVal + } + } + + override fun new(op: Expr): FpAbsExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt new file mode 100644 index 0000000000..5ec84ef1e0 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt @@ -0,0 +1,61 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.AddExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpAdd") +data class FpAddExpr(val roundingMode: FpRoundingMode, override val ops: List>) : + AddExpr() { + + init { + checkAllTypesEqual(ops) + } + + companion object { + private const val OPERATOR_LABEL = "fpadd" + + @JvmStatic + fun of(roundingMode: FpRoundingMode, ops: Iterable>) = + FpAddExpr(roundingMode, ops.toList()) + + @JvmStatic + fun create(roundingMode: FpRoundingMode, ops: List>) = + FpAddExpr(roundingMode, ops.map { castFp(it) }) + } + + override val type: FpType + get() = ops[0].type + + override fun eval(`val`: Valuation): FpLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as FpLitExpr) { acc, op -> + acc.add(roundingMode, op.eval(`val`) as FpLitExpr) + } + + override fun new(ops: List>): FpAddExpr = of(roundingMode, ops) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt new file mode 100644 index 0000000000..654d772b09 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpAssign") +data class FpAssignExpr(override val leftOp: Expr, override val rightOp: Expr) : + EqExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpAssignExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpAssignExpr(castFp(leftOp), castFp(rightOp)) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.assign(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): FpAssignExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt new file mode 100644 index 0000000000..42f3a9913a --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt @@ -0,0 +1,66 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.DivExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpDiv") +data class FpDivExpr( + val roundingMode: FpRoundingMode, + override val leftOp: Expr, + override val rightOp: Expr, +) : DivExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + private const val OPERATOR_LABEL = "fpdiv" + + @JvmStatic + fun of(roundingMode: FpRoundingMode, leftOp: Expr, rightOp: Expr) = + FpDivExpr(roundingMode, leftOp, rightOp) + + @JvmStatic + fun create(roundingMode: FpRoundingMode, leftOp: Expr<*>, rightOp: Expr<*>) = + FpDivExpr(roundingMode, castFp(leftOp), castFp(rightOp)) + } + + override val type: FpType + get() = leftOp.type + + override fun eval(`val`: Valuation): FpLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.div(roundingMode, rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): FpDivExpr = + of(roundingMode, leftOp, rightOp) + + override val operatorLabel: String + get() = "$OPERATOR_LABEL[${roundingMode.name.lowercase()}]" + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt new file mode 100644 index 0000000000..fc3c34d24c --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpEq") +data class FpEqExpr(override val leftOp: Expr, override val rightOp: Expr) : + EqExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpEqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpEqExpr(castFp(leftOp), castFp(rightOp)) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.eq(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): FpEqExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpExprs.kt new file mode 100644 index 0000000000..04cf731962 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpExprs.kt @@ -0,0 +1,130 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.bvtype.BvLitExpr +import hu.bme.mit.theta.core.type.bvtype.BvType + +@Suppress("FunctionName") +object FpExprs { + + @JvmStatic fun FpType(exponent: Int, significand: Int) = FpType.of(exponent, significand) + + @JvmStatic + fun Fp(hidden: Boolean, exponent: BvLitExpr, significand: BvLitExpr) = + FpLitExpr(hidden, exponent, significand) + + @JvmStatic + fun NaN(fpType: FpType): FpLitExpr { + val exponent = BooleanArray(fpType.exponent) { true } + val significand = BooleanArray(fpType.significand - 1) { true } + return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)) + } + + @JvmStatic + fun PositiveInfinity(fpType: FpType): FpLitExpr { + val exponent = BooleanArray(fpType.exponent) { true } + val significand = BooleanArray(fpType.significand - 1) { false } + return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)) + } + + @JvmStatic + fun NegativeInfinity(fpType: FpType): FpLitExpr { + val exponent = BooleanArray(fpType.exponent) { true } + val significand = BooleanArray(fpType.significand - 1) { false } + return Fp(true, BvLitExpr.of(exponent), BvLitExpr.of(significand)) + } + + @JvmStatic + fun PositiveZero(fpType: FpType): FpLitExpr { + val exponent = BooleanArray(fpType.exponent) { false } + val significand = BooleanArray(fpType.significand - 1) { false } + return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)) + } + + @JvmStatic + fun NegativeZero(fpType: FpType): FpLitExpr { + val exponent = BooleanArray(fpType.exponent) { false } + val significand = BooleanArray(fpType.significand - 1) { false } + return Fp(true, BvLitExpr.of(exponent), BvLitExpr.of(significand)) + } + + @JvmStatic + fun Add(roundingMode: FpRoundingMode, ops: Iterable>) = + FpAddExpr.of(roundingMode, ops) + + @JvmStatic + fun Sub(roundingMode: FpRoundingMode, leftOp: Expr, rightOp: Expr) = + FpSubExpr(roundingMode, leftOp, rightOp) + + @JvmStatic fun Pos(op: Expr) = FpPosExpr(op) + + @JvmStatic fun Neg(op: Expr) = FpNegExpr(op) + + @JvmStatic + fun Mul(roundingMode: FpRoundingMode, ops: Iterable>) = + FpMulExpr.of(roundingMode, ops) + + @JvmStatic + fun Div(roundingMode: FpRoundingMode, leftOp: Expr, rightOp: Expr) = + FpDivExpr(roundingMode, leftOp, rightOp) + + @JvmStatic fun Rem(leftOp: Expr, rightOp: Expr) = FpRemExpr(leftOp, rightOp) + + @JvmStatic fun Abs(op: Expr) = FpAbsExpr(op) + + @JvmStatic + fun FromBv(roundingMode: FpRoundingMode, op: Expr, fpType: FpType, signed: Boolean) = + FpFromBvExpr(roundingMode, op, fpType, signed) + + @JvmStatic fun Eq(leftOp: Expr, rightOp: Expr) = FpEqExpr(leftOp, rightOp) + + @JvmStatic + fun FpAssign(leftOp: Expr, rightOp: Expr) = FpAssignExpr(leftOp, rightOp) + + @JvmStatic fun Neq(leftOp: Expr, rightOp: Expr) = FpNeqExpr(leftOp, rightOp) + + @JvmStatic fun Gt(leftOp: Expr, rightOp: Expr) = FpGtExpr(leftOp, rightOp) + + @JvmStatic fun Geq(leftOp: Expr, rightOp: Expr) = FpGeqExpr(leftOp, rightOp) + + @JvmStatic fun Lt(leftOp: Expr, rightOp: Expr) = FpLtExpr(leftOp, rightOp) + + @JvmStatic fun Leq(leftOp: Expr, rightOp: Expr) = FpLeqExpr(leftOp, rightOp) + + @JvmStatic fun IsNan(op: Expr) = FpIsNanExpr(op) + + @JvmStatic fun IsInfinite(op: Expr) = FpIsInfiniteExpr(op) + + @JvmStatic + fun RoundToIntegral(roundingMode: FpRoundingMode, op: Expr) = + FpRoundToIntegralExpr(roundingMode, op) + + @JvmStatic fun Sqrt(roundingMode: FpRoundingMode, op: Expr) = FpSqrtExpr(roundingMode, op) + + @JvmStatic fun Max(leftOp: Expr, rightOp: Expr) = FpMaxExpr(leftOp, rightOp) + + @JvmStatic fun Min(leftOp: Expr, rightOp: Expr) = FpMinExpr(leftOp, rightOp) + + @JvmStatic + fun ToBv(roundingMode: FpRoundingMode, op: Expr, size: Int, sgn: Boolean) = + FpToBvExpr(roundingMode, op, size, sgn) + + @JvmStatic + fun ToFp(roundingMode: FpRoundingMode, op: Expr, exp: Int, sig: Int) = + FpToFpExpr(roundingMode, op, exp, sig) +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt new file mode 100644 index 0000000000..8a2495b45d --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt @@ -0,0 +1,110 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.type.bvtype.BvLitExpr +import hu.bme.mit.theta.core.type.bvtype.BvType +import hu.bme.mit.theta.core.utils.BvUtils +import hu.bme.mit.theta.core.utils.FpUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import org.kframework.mpfr.BigFloat + +@Serializable +@SerialName("FpFromBv") +data class FpFromBvExpr( + val roundingMode: FpRoundingMode, + override val op: Expr, + val fpType: FpType, + val signed: Boolean, +) : UnaryExpr() { + + companion object { + + private const val OPERATOR_LABEL = "fpfrombv" + + @JvmStatic + fun of(roundingMode: FpRoundingMode, op: Expr, fpType: FpType, signed: Boolean) = + FpFromBvExpr(roundingMode, op, fpType, signed) + + @JvmStatic + fun create( + roundingMode: FpRoundingMode, + op: Expr, + fpType: FpType, + signed: Boolean, + ): FpFromBvExpr = of(roundingMode, op, fpType, signed) + } + + @Volatile @Transient private var hashCode = 0 + + override val type: FpType + get() = fpType + + fun isSigned(): Boolean = signed + + override fun eval(`val`: Valuation): FpLitExpr { + val mathContext = FpUtils.getMathContext(fpType, roundingMode) + val eval = op.eval(`val`) as BvLitExpr + return FpUtils.bigFloatToFpLitExpr( + BigFloat( + if (signed) BvUtils.signedBvLitExprToBigInteger(eval) + else BvUtils.unsignedBvLitExprToBigInteger(eval), + mathContext, + ), + fpType, + ) + } + + override fun new(op: Expr): FpFromBvExpr = of(roundingMode, op, fpType, signed) + + override val operatorLabel: String = + (OPERATOR_LABEL + + "[" + + fpType.exponent + + "," + + fpType.significand + + "][" + + (if (signed) "s" else "u") + + "]") + + override fun toString(): String = super.toString() + + override fun hashCode(): Int { + var result = hashCode + if (result == 0) { + result = op.hashCode() + result = 31 * result + roundingMode.hashCode() + result = 31 * result + fpType.hashCode() + hashCode = result + } + return result + } + + override fun equals(other: Any?): Boolean = + if (this === other) { + true + } else if (other != null && this.javaClass == other.javaClass) { + val that = other as FpFromBvExpr + op == that.op && roundingMode == that.roundingMode && fpType == that.fpType + } else { + false + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt new file mode 100644 index 0000000000..005f5a1d51 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.GeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpGeq") +data class FpGeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + GeqExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpGeqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpGeqExpr(castFp(leftOp), castFp(rightOp)) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.geq(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): FpGeqExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt new file mode 100644 index 0000000000..179f9c4e79 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.GtExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpGt") +data class FpGtExpr(override val leftOp: Expr, override val rightOp: Expr) : + GtExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpGtExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpGtExpr(castFp(leftOp), castFp(rightOp)) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.gt(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): FpGtExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt new file mode 100644 index 0000000000..9e7f2d4d37 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt @@ -0,0 +1,61 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpIsInfinite") +data class FpIsInfiniteExpr(override val op: Expr) : UnaryExpr() { + + init { + checkAllTypesEqual(op) + } + + companion object { + private const val OPERATOR_LABEL = "isinfinite" + + @JvmStatic fun of(op: Expr) = FpIsInfiniteExpr(op) + + @JvmStatic fun create(op: Expr<*>) = FpIsInfiniteExpr(castFp(op)) + } + + override val type: BoolType + get() = Bool() + + override fun eval(`val`: Valuation): BoolLitExpr { + val opVal = op.eval(`val`) as FpLitExpr + val or = Or(Bool(opVal.isNegativeInfinity()), Bool(opVal.isPositiveInfinity())) + return or.eval(`val`) + } + + override fun new(op: Expr): FpIsInfiniteExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt new file mode 100644 index 0000000000..b96dc841c5 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpIsNan") +data class FpIsNanExpr(override val op: Expr) : UnaryExpr() { + + init { + checkAllTypesEqual(op) + } + + companion object { + private const val OPERATOR_LABEL = "fpisnan" + + @JvmStatic fun of(op: Expr) = FpIsNanExpr(op) + + @JvmStatic fun create(op: Expr<*>) = FpIsNanExpr(castFp(op)) + } + + override val type: BoolType + get() = Bool() + + override fun eval(`val`: Valuation): BoolLitExpr = Bool((op.eval(`val`) as FpLitExpr).isNaN()) + + override fun new(op: Expr): FpIsNanExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt new file mode 100644 index 0000000000..a71aa005a0 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.LeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpLeq") +data class FpLeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + LeqExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpLeqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpLeqExpr(castFp(leftOp), castFp(rightOp)) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.leq(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): FpLeqExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt new file mode 100644 index 0000000000..f9d3b1dc90 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt @@ -0,0 +1,259 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.bvtype.BvLitExpr +import hu.bme.mit.theta.core.utils.FpUtils.* +import java.util.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpLit") +data class FpLitExpr(val hidden: Boolean, val exponent: BvLitExpr, val significand: BvLitExpr) : + NullaryExpr(), LitExpr, Comparable { + + companion object { + + @JvmStatic + fun of(hidden: Boolean, exponent: BvLitExpr, significand: BvLitExpr) = + FpLitExpr(hidden, exponent, significand) + + @JvmStatic + fun of(value: BvLitExpr, fpType: FpType): FpLitExpr { + val literal = value.value + require(fpType.exponent + fpType.significand + 1 == literal.size) + return FpLitExpr( + literal[0], + BvLitExpr.of(Arrays.copyOfRange(literal, 1, fpType.exponent + 1)), + BvLitExpr.of( + Arrays.copyOfRange(literal, fpType.exponent + 1, fpType.exponent + fpType.significand + 1) + ), + ) + } + + @JvmStatic + fun of(hidden: BvLitExpr, exponent: BvLitExpr, significand: BvLitExpr): FpLitExpr { + val hiddenLit = hidden.value + return FpLitExpr(hiddenLit[0], exponent, significand) + } + } + + override val type: FpType + get() = FpType(exponent.type.size, significand.type.size + 1) + + override fun eval(`val`: Valuation): FpLitExpr = this + + fun isNaN(): Boolean { + var isNaN = true + for (i in exponent.value) { + isNaN = isNaN && i + } + var atLeastOne = false + for (i in significand.value) { + atLeastOne = atLeastOne || i + } + return isNaN && atLeastOne + } + + fun isPositiveInfinity(): Boolean { + var isNaN = !hidden + for (i in exponent.value) { + isNaN = isNaN && i + } + for (i in significand.value) { + isNaN = isNaN && !i + } + return isNaN + } + + fun isNegativeInfinity(): Boolean { + var isNaN = hidden + for (i in exponent.value) { + isNaN = isNaN && i + } + for (i in significand.value) { + isNaN = isNaN && !i + } + return isNaN + } + + fun isNegativeZero(): Boolean { + var isNaN = !hidden + for (i in exponent.value) { + isNaN = isNaN && !i + } + for (i in significand.value) { + isNaN = isNaN && !i + } + return isNaN + } + + fun isPositiveZero(): Boolean { + var isNaN = hidden + for (i in exponent.value) { + isNaN = isNaN && !i + } + for (i in significand.value) { + isNaN = isNaN && !i + } + return isNaN + } + + fun add(roundingMode: FpRoundingMode, that: FpLitExpr): FpLitExpr { + require(this.type == that.type) + val sum = + fpLitExprToBigFloat(roundingMode, this) + .add(fpLitExprToBigFloat(roundingMode, that), getMathContext(this.type, roundingMode)) + return bigFloatToFpLitExpr(sum, type) + } + + fun sub(roundingMode: FpRoundingMode, that: FpLitExpr): FpLitExpr { + require(this.type == that.type) + val sub = + fpLitExprToBigFloat(roundingMode, this) + .subtract(fpLitExprToBigFloat(roundingMode, that), getMathContext(this.type, roundingMode)) + return bigFloatToFpLitExpr(sub, type) + } + + fun pos(): FpLitExpr = this + + fun neg(): FpLitExpr { + val neg = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this).negate() + return bigFloatToFpLitExpr(neg, type) + } + + fun mul(roundingMode: FpRoundingMode, that: FpLitExpr): FpLitExpr { + require(this.type == that.type) + val sub = + fpLitExprToBigFloat(roundingMode, this) + .multiply(fpLitExprToBigFloat(roundingMode, that), getMathContext(this.type, roundingMode)) + return bigFloatToFpLitExpr(sub, type) + } + + fun div(roundingMode: FpRoundingMode, that: FpLitExpr): FpLitExpr { + require(this.type == that.type) + val sub = + fpLitExprToBigFloat(roundingMode, this) + .divide(fpLitExprToBigFloat(roundingMode, that), getMathContext(this.type, roundingMode)) + return bigFloatToFpLitExpr(sub, type) + } + + fun eq(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() + } + return Bool( + this.hidden == that.hidden && exponent == that.exponent && significand == that.significand + ) + } + + fun assign(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + return Bool( + this.hidden == that.hidden && exponent == that.exponent && significand == that.significand + ) + } + + fun gt(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() + } + return if (left.greaterThan(right)) { + True() + } else { + False() + } + } + + fun lt(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() + } + return if (left.lessThan(right)) { + True() + } else { + False() + } + } + + fun geq(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() + } + return if (left.greaterThanOrEqualTo(right)) { + True() + } else { + False() + } + } + + fun leq(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() + } + return if (left.lessThanOrEqualTo(right)) { + True() + } else { + False() + } + } + + fun neq(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() + } + return Bool( + !(this.hidden == that.hidden && exponent == that.exponent && significand == that.significand) + ) + } + + override fun toString(): String = + Utils.lispStringBuilder(if (hidden) "#b1" else "#b0") + .add(exponent.toString()) + .add(significand.toString()) + .toString() + + override fun compareTo(other: FpType): Int = 0 +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt new file mode 100644 index 0000000000..9ded53dc51 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.LtExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpLt") +data class FpLtExpr(override val leftOp: Expr, override val rightOp: Expr) : + LtExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpLtExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpLtExpr(castFp(leftOp), castFp(rightOp)) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.lt(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): FpLtExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt new file mode 100644 index 0000000000..6ea023abd5 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt @@ -0,0 +1,69 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.utils.FpUtils +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpMax") +data class FpMaxExpr(override val leftOp: Expr, override val rightOp: Expr) : + BinaryExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + private const val OPERATOR_LABEL = "fpmax" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpMaxExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpMaxExpr(castFp(leftOp), castFp(rightOp)) + } + + override val type: FpType + get() = leftOp.type + + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return if ( + FpUtils.fpLitExprToBigFloat(null, leftOpVal) + .greaterThan(FpUtils.fpLitExprToBigFloat(null, rightOpVal)) + ) { + leftOpVal + } else { + rightOpVal + } + } + + override fun new(leftOp: Expr, rightOp: Expr): FpMaxExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt new file mode 100644 index 0000000000..f1a9d4b0a8 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt @@ -0,0 +1,69 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.utils.FpUtils +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpMin") +data class FpMinExpr(override val leftOp: Expr, override val rightOp: Expr) : + BinaryExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + private const val OPERATOR_LABEL = "fpmin" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpMinExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpMinExpr(castFp(leftOp), castFp(rightOp)) + } + + override val type: FpType + get() = leftOp.type + + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return if ( + FpUtils.fpLitExprToBigFloat(null, leftOpVal) + .lessThan(FpUtils.fpLitExprToBigFloat(null, rightOpVal)) + ) { + leftOpVal + } else { + rightOpVal + } + } + + override fun new(leftOp: Expr, rightOp: Expr): FpMinExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt new file mode 100644 index 0000000000..049d26da12 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt @@ -0,0 +1,62 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.MulExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpMul") +data class FpMulExpr(val roundingMode: FpRoundingMode, override val ops: List>) : + MulExpr() { + + init { + checkAllTypesEqual(ops) + } + + companion object { + + private const val OPERATOR_LABEL = "fpmul" + + @JvmStatic + fun of(roundingMode: FpRoundingMode, ops: Iterable>) = + FpMulExpr(roundingMode, ops.toList()) + + @JvmStatic + fun create(roundingMode: FpRoundingMode, ops: List>) = + FpMulExpr(roundingMode, ops.map { castFp(it) }) + } + + override val type: FpType + get() = ops[0].type + + override fun eval(`val`: Valuation): FpLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as FpLitExpr) { acc, op -> + acc.mul(roundingMode, op.eval(`val`) as FpLitExpr) + } + + override fun new(ops: List>): FpMulExpr = of(roundingMode, ops) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt new file mode 100644 index 0000000000..32908073d2 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt @@ -0,0 +1,49 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NegExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpNeg") +data class FpNegExpr(override val op: Expr) : NegExpr() { + + companion object { + + private const val OPERATOR_LABEL = "fpneg" + + @JvmStatic fun of(op: Expr) = FpNegExpr(op) + + @JvmStatic fun create(op: Expr<*>) = FpNegExpr(castFp(op)) + } + + override val type: FpType + get() = op.type + + override fun eval(`val`: Valuation): FpLitExpr = (op.eval(`val`) as FpLitExpr).neg() + + override fun new(op: Expr): FpNegExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt new file mode 100644 index 0000000000..34717b75ac --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpNeq") +data class FpNeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + NeqExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpNeqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpNeqExpr(castFp(leftOp), castFp(rightOp)) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.neq(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): FpNeqExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt new file mode 100644 index 0000000000..8d16749af3 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.PosExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpPos") +data class FpPosExpr(override val op: Expr) : PosExpr() { + + companion object { + private const val OPERATOR_LABEL = "fppos" + + @JvmStatic fun of(op: Expr) = FpPosExpr(op) + + @JvmStatic fun create(op: Expr<*>) = FpPosExpr(castFp(op)) + } + + override val type: FpType + get() = op.type + + override fun eval(`val`: Valuation): FpLitExpr = (op.eval(`val`) as FpLitExpr).pos() + + override fun new(op: Expr): FpPosExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt new file mode 100644 index 0000000000..f46957afc8 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt @@ -0,0 +1,64 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.FpUtils.* +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpRem") +data class FpRemExpr(override val leftOp: Expr, override val rightOp: Expr) : + BinaryExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + private const val OPERATOR_LABEL = "fprem" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpRemExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpRemExpr(castFp(leftOp), castFp(rightOp)) + } + + override val type: FpType + get() = leftOp.type + + override fun eval(`val`: Valuation): FpLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + val leftFloat = fpLitExprToBigFloat(null, leftOpVal) + val rightFloat = fpLitExprToBigFloat(null, rightOpVal) + val remainder = leftFloat.remainder(rightFloat, getMathContext(this.type, null)) + return bigFloatToFpLitExpr(remainder, this.type) + } + + override fun new(leftOp: Expr, rightOp: Expr): FpRemExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt new file mode 100644 index 0000000000..3fb7673637 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt @@ -0,0 +1,69 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.utils.FpUtils +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import org.kframework.mpfr.BinaryMathContext + +@Serializable +@SerialName("FpRoundToIntegral") +data class FpRoundToIntegralExpr(val roundingMode: FpRoundingMode, override val op: Expr) : + UnaryExpr() { + + companion object { + private const val OPERATOR_LABEL = "fproundtoint" + + @JvmStatic + fun of(roundingMode: FpRoundingMode, op: Expr) = FpRoundToIntegralExpr(roundingMode, op) + + @JvmStatic + fun create(roundingMode: FpRoundingMode, op: Expr<*>) = + FpRoundToIntegralExpr(roundingMode, castFp(op)) + } + + override val type: FpType + get() = op.type + + override fun eval(`val`: Valuation): FpLitExpr { + val opVal = op.eval(`val`) as FpLitExpr + val value = FpUtils.fpLitExprToBigFloat(roundingMode, opVal) + val bigInteger = value.toBigInteger() + var round = + value.round( + BinaryMathContext( + bigInteger.bitLength(), + opVal.type.exponent, + FpUtils.getMathContextRoundingMode(roundingMode), + ) + ) + round = round.round(FpUtils.getMathContext(type, roundingMode)) + val fpLitExpr = FpUtils.bigFloatToFpLitExpr(round, this.type) + return fpLitExpr + } + + override fun new(op: Expr): FpRoundToIntegralExpr = of(roundingMode, op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt similarity index 59% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt index 0035f620f7..c2820e25c6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.java +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt @@ -13,18 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.abstracttype; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public interface Additive> extends Type { +@Serializable +@SerialName("FpRoundingMode") +enum class FpRoundingMode { - AddExpr Add(Iterable> ops); + RNE, // Round nearest ties to even + RNA, // Round nearest ties to away + RTP, // Round toward positive + RTN, // Round toward negative + RTZ; // Round toward zero - SubExpr Sub(Expr leftOp, Expr rightOp); + companion object { - PosExpr Pos(Expr op); - - NegExpr Neg(Expr op); + @JvmStatic val defaultRoundingMode: FpRoundingMode = RNE + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt new file mode 100644 index 0000000000..386bbcceff --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.utils.FpUtils.* +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpSqrt") +data class FpSqrtExpr(val roundingMode: FpRoundingMode, override val op: Expr) : + UnaryExpr() { + + companion object { + + private const val OPERATOR_LABEL = "fpsqrt" + + @JvmStatic fun of(roundingMode: FpRoundingMode, op: Expr) = FpSqrtExpr(roundingMode, op) + + @JvmStatic + fun create(roundingMode: FpRoundingMode, op: Expr<*>) = FpSqrtExpr(roundingMode, castFp(op)) + } + + override val type: FpType + get() = op.type + + override fun eval(`val`: Valuation): LitExpr { + val opVal = op.eval(`val`) as FpLitExpr + val sqrt = fpLitExprToBigFloat(roundingMode, opVal).sqrt(getMathContext(type, roundingMode)) + return bigFloatToFpLitExpr(sqrt, type) + } + + override fun new(op: Expr): FpSqrtExpr = of(roundingMode, op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt new file mode 100644 index 0000000000..4fee702789 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt @@ -0,0 +1,67 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.SubExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpSub") +data class FpSubExpr( + val roundingMode: FpRoundingMode, + override val leftOp: Expr, + override val rightOp: Expr, +) : SubExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + private const val OPERATOR_LABEL = "fpsub" + + @JvmStatic + fun of(roundingMode: FpRoundingMode, leftOp: Expr, rightOp: Expr) = + FpSubExpr(roundingMode, leftOp, rightOp) + + @JvmStatic + fun create(roundingMode: FpRoundingMode, leftOp: Expr<*>, rightOp: Expr<*>) = + FpSubExpr(roundingMode, castFp(leftOp), castFp(rightOp)) + } + + override val type: FpType + get() = leftOp.type + + override fun eval(`val`: Valuation): FpLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.sub(roundingMode, rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): FpSubExpr = + of(roundingMode, leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt new file mode 100644 index 0000000000..cb770558d5 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt @@ -0,0 +1,79 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.type.bvtype.BvLitExpr +import hu.bme.mit.theta.core.type.bvtype.BvType +import hu.bme.mit.theta.core.utils.BvUtils.bigIntegerToSignedBvLitExpr +import hu.bme.mit.theta.core.utils.BvUtils.bigIntegerToUnsignedBvLitExpr +import hu.bme.mit.theta.core.utils.FpUtils.fpLitExprToBigFloat +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpToBv") +data class FpToBvExpr( + val roundingMode: FpRoundingMode, + override val op: Expr, + val size: Int, + val sgn: Boolean, +) : UnaryExpr() { + + companion object { + + private const val OPERATOR_LABEL = "fptobv" + + @JvmStatic + fun of(roundingMode: FpRoundingMode, op: Expr, size: Int, sgn: Boolean) = + FpToBvExpr(roundingMode, op, size, sgn) + + @JvmStatic + fun create(roundingMode: FpRoundingMode, op: Expr<*>, size: Int, sgn: Boolean) = + FpToBvExpr(roundingMode, castFp(op), size, sgn) + } + + override val type: BvType + get() = BvType.of(size) + + override fun eval(`val`: Valuation): BvLitExpr { + val op = op.eval(`val`) as FpLitExpr + val bigIntegerValue = fpLitExprToBigFloat(roundingMode, op).toBigInteger() + return if (sgn) { + bigIntegerToSignedBvLitExpr(bigIntegerValue, size) + } else { + bigIntegerToUnsignedBvLitExpr(bigIntegerValue, size) + } + } + + override fun new(op: Expr): FpToBvExpr = of(roundingMode, op, size, sgn) + + override val operatorLabel: String = + (OPERATOR_LABEL + + "[" + + "[" + + size + + "'" + + (if (sgn) "s" else "u") + + "][" + + roundingMode.name + + "]") + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt new file mode 100644 index 0000000000..4e3fa15e94 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt @@ -0,0 +1,62 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.utils.FpUtils.bigFloatToFpLitExpr +import hu.bme.mit.theta.core.utils.FpUtils.fpLitExprToBigFloat +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpToFp") +data class FpToFpExpr( + val roundingMode: FpRoundingMode, + override val op: Expr, + val expBits: Int, + val signBits: Int, +) : UnaryExpr() { + + companion object { + private const val OPERATOR_LABEL = "fptofp" + + @JvmStatic + fun of(roundingMode: FpRoundingMode, op: Expr, expBits: Int, signBits: Int) = + FpToFpExpr(roundingMode, op, expBits, signBits) + + @JvmStatic + fun create(roundingMode: FpRoundingMode, op: Expr<*>, expBits: Int, signBits: Int) = + FpToFpExpr(roundingMode, castFp(op), expBits, signBits) + } + + override val type: FpType + get() = FpType(expBits, signBits) + + override fun eval(`val`: Valuation): FpLitExpr { + val op = op.eval(`val`) as FpLitExpr + val value = fpLitExprToBigFloat(roundingMode, op) + return bigFloatToFpLitExpr(value, type) + } + + override fun new(op: Expr): FpToFpExpr = of(roundingMode, op, expBits, signBits) + + override val operatorLabel: String = "$OPERATOR_LABEL[$expBits,$signBits]" + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpType.kt new file mode 100644 index 0000000000..808af12422 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpType.kt @@ -0,0 +1,81 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.* +import hu.bme.mit.theta.core.type.abstracttype.* +import java.math.BigInteger +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName(FpType.TYPE_LABEL) +data class FpType(val exponent: Int, val significand: Int) : + Equational, Additive, Multiplicative, Ordered { + + init { + require(exponent > 1) { "Exponent must be greater than 1" } + require(significand > 1) { "Significand must be greater than 1" } + } + + companion object { + + internal const val TYPE_LABEL = "Fp" + + @JvmStatic fun of(exponent: Int, significand: Int): FpType = FpType(exponent, significand) + } + + override fun Eq(leftOp: Expr, rightOp: Expr): EqExpr = + FpEqExpr(leftOp, rightOp) + + override fun Neq(leftOp: Expr, rightOp: Expr): NeqExpr = + FpNeqExpr(leftOp, rightOp) + + override fun Add(ops: Iterable>): AddExpr = + FpExprs.Add(FpRoundingMode.defaultRoundingMode, ops) + + override fun Sub(leftOp: Expr, rightOp: Expr): SubExpr = + FpExprs.Sub(FpRoundingMode.defaultRoundingMode, leftOp, rightOp) + + override fun Pos(op: Expr): PosExpr = FpExprs.Pos(op) + + override fun Neg(op: Expr): NegExpr = FpExprs.Neg(op) + + override fun Mul(ops: Iterable>): MulExpr = + FpExprs.Mul(FpRoundingMode.defaultRoundingMode, ops) + + override fun Div(leftOp: Expr, rightOp: Expr): DivExpr = + FpExprs.Div(FpRoundingMode.defaultRoundingMode, leftOp, rightOp) + + override fun Lt(leftOp: Expr, rightOp: Expr): LtExpr = + FpExprs.Lt(leftOp, rightOp) + + override fun Leq(leftOp: Expr, rightOp: Expr): LeqExpr = + FpExprs.Leq(leftOp, rightOp) + + override fun Gt(leftOp: Expr, rightOp: Expr): GtExpr = + FpExprs.Gt(leftOp, rightOp) + + override fun Geq(leftOp: Expr, rightOp: Expr): GeqExpr = + FpExprs.Geq(leftOp, rightOp) + + override val domainSize: DomainSize + get() = DomainSize.of(BigInteger.TWO.pow(significand).multiply(BigInteger.TWO.pow(exponent))) + + override fun toString(): String = + Utils.lispStringBuilder(TYPE_LABEL).add(exponent).add(significand).toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt new file mode 100644 index 0000000000..02310e4436 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt @@ -0,0 +1,120 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.functype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** Function application expression for function types. */ +@Serializable(with = FuncAppExpr.Serializer::class) +@SerialName("FuncApp") +data class FuncAppExpr( + val func: Expr>, + val param: Expr, +) : Expr { + + companion object { + + @JvmStatic + fun of( + func: Expr>, + param: Expr, + ) = FuncAppExpr(func, param) + + @Suppress("UNCHECKED_CAST") + @JvmStatic + fun create( + func: Expr<*>, + param: Expr<*>, + ): FuncAppExpr { + val funcType = func.type as FuncType + val newFunc = cast(func, funcType) + val newParam = cast(param, funcType.paramType) + return of(newFunc, newParam) + } + } + + override val type: ResultType = func.type.resultType + + override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() + + override val ops: List> = listOf(func, param) + + override fun withOps(ops: List>): Expr { + require(ops.size == 2) + return cast(create(ops[0], ops[1]), type) + } + + fun with( + func: Expr>, + param: Expr, + ): FuncAppExpr = + if (this.func == func && this.param == param) this else of(func, param) + + fun withFunc(func: Expr>): FuncAppExpr = + with(func, param) + + fun withParam(param: Expr): FuncAppExpr = with(func, param) + + override fun toString(): String = Utils.lispStringBuilder().add(func).body().add(param).toString() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("FuncApp") { + element>("func") + element>("param") + } + + override fun serialize(encoder: Encoder, value: FuncAppExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.func) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.param) + } + + override fun deserialize(decoder: Decoder): FuncAppExpr = + decoder.decodeStructure(descriptor) { + var func: Expr>? = null + var param: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> + func = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + as Expr> + 1 -> + param = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + FuncAppExpr( + func ?: throw SerializationException("Missing func"), + param ?: throw SerializationException("Missing param"), + ) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt new file mode 100644 index 0000000000..8715a03d54 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt @@ -0,0 +1,105 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.functype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.decl.Decl +import hu.bme.mit.theta.core.decl.ParamDecl +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** Function literal expression (lambda abstraction) for function types. */ +@Serializable(with = FuncLitExpr.Serializer::class) +@SerialName("FuncLit") +data class FuncLitExpr( + val param: ParamDecl, + val result: Expr, +) : LitExpr> { + + companion object { + + private const val OPERATOR_LABEL = "func" + + @JvmStatic + fun of( + param: ParamDecl, + result: Expr, + ) = FuncLitExpr(param, result) + } + + override val type: FuncType = FuncType.of(param.type, result.type) + + override fun eval(`val`: Valuation): LitExpr> = this + + override val ops: List> = listOf(result) + + override fun withOps(ops: List>): FuncLitExpr { + require(ops.size == 1) + return with(cast(ops[0], result.type)) + } + + fun with(result: Expr): FuncLitExpr = + if (this.result == result) this else of(param, result) + + override fun toString(): String { + val paramString = "(${param.name} ${param.type})" + return Utils.lispStringBuilder(OPERATOR_LABEL).body().add(paramString).add(result).toString() + } + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("FuncLit") { + element>("param") + element>("result") + } + + override fun serialize(encoder: Encoder, value: FuncLitExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Decl::class), value.param) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.result) + } + + override fun deserialize(decoder: Decoder): FuncLitExpr = + decoder.decodeStructure(descriptor) { + var param: ParamDecl? = null + var result: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> + param = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Decl::class)) + as ParamDecl + 1 -> + result = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + FuncLitExpr( + param ?: throw SerializationException("Missing param"), + result ?: throw SerializationException("Missing result"), + ) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncType.kt new file mode 100644 index 0000000000..4373e2f25b --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncType.kt @@ -0,0 +1,97 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.functype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.DomainSize +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** Represents a function type from ParamType to ResultType. */ +@Serializable(with = FuncType.Serializer::class) +@SerialName(FuncType.TYPE_LABEL) +data class FuncType( + val paramType: ParamType, + val resultType: ResultType, +) : Type { + + companion object { + + internal const val TYPE_LABEL = "Func" + + @JvmStatic + fun of(paramType: ParamType, resultType: ResultType) = + FuncType(paramType, resultType) + } + + override fun toString(): String = + Utils.lispStringBuilder(TYPE_LABEL).add(paramType).add(resultType).toString() + + override val domainSize: DomainSize + get() = throw UnsupportedOperationException() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("FuncType") { + element("paramType") + element("resultType") + } + + override fun serialize(encoder: Encoder, value: FuncType) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement( + descriptor, + 0, + PolymorphicSerializer(Type::class), + value.paramType, + ) + encodeSerializableElement( + descriptor, + 1, + PolymorphicSerializer(Type::class), + value.resultType, + ) + } + + override fun deserialize(decoder: Decoder): FuncType = + decoder.decodeStructure(descriptor) { + var paramType: Type? = null + var resultType: Type? = null + + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> + paramType = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class)) + 1 -> + resultType = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unexpected index: $index") + } + } + + FuncType( + paramType = paramType ?: throw SerializationException("Missing paramType"), + resultType = resultType ?: throw SerializationException("Missing resultType"), + ) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt new file mode 100644 index 0000000000..97cf59d8f0 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.AddExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import java.math.BigInteger +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("IntAdd") +data class IntAddExpr(override val ops: List>) : AddExpr() { + + companion object { + + private const val OPERATOR_LABEL = "+" + + @JvmStatic fun of(ops: Iterable>) = IntAddExpr(ops.toList()) + + @JvmStatic fun create(ops: List>) = IntAddExpr(ops.map { cast(it, Int()) }) + } + + override val type: IntType = Int() + + override fun eval(`val`: Valuation): IntLitExpr { + var sum = BigInteger.ZERO + ops.forEach { op -> + val opVal = op.eval(`val`) as IntLitExpr + sum = sum.add(opVal.value) + } + return Int(sum) + } + + override fun new(ops: List>): IntAddExpr = of(ops) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt new file mode 100644 index 0000000000..8affa3e82c --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.DivExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("IntDiv") +data class IntDivExpr(override val leftOp: Expr, override val rightOp: Expr) : + DivExpr() { + + companion object { + + private const val OPERATOR_LABEL = "div" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntDivExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntDivExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } + + override val type: IntType = Int() + + override fun eval(`val`: Valuation): IntLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.div(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): IntDivExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt new file mode 100644 index 0000000000..766318db5c --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("IntEq") +data class IntEqExpr(override val leftOp: Expr, override val rightOp: Expr) : + EqExpr() { + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntEqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntEqExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.eq(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): IntEqExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntExprs.kt new file mode 100644 index 0000000000..cae694e32b --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntExprs.kt @@ -0,0 +1,65 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.type.Expr +import java.math.BigInteger + +/** Factory and utility methods for integer expressions. */ +@Suppress("FunctionName") +object IntExprs { + @JvmStatic fun Int() = IntType + + @JvmStatic fun Int(value: Int) = IntLitExpr(BigInteger.valueOf(value.toLong())) + + @JvmStatic fun Int(value: String) = IntLitExpr(BigInteger(value)) + + @JvmStatic fun Int(value: BigInteger) = IntLitExpr(value) + + @JvmStatic fun ToRat(op: Expr) = IntToRatExpr(op) + + @JvmStatic fun Add(ops: Iterable>) = IntAddExpr.of(ops) + + @JvmStatic @SafeVarargs fun Add(vararg ops: Expr) = IntAddExpr(ops.asList()) + + @JvmStatic fun Sub(leftOp: Expr, rightOp: Expr) = IntSubExpr(leftOp, rightOp) + + @JvmStatic fun Pos(op: Expr) = IntPosExpr(op) + + @JvmStatic fun Neg(op: Expr) = IntNegExpr(op) + + @JvmStatic fun Mul(ops: Iterable>) = IntMulExpr.of(ops) + + @JvmStatic @SafeVarargs fun Mul(vararg ops: Expr) = IntMulExpr(ops.asList()) + + @JvmStatic fun Div(leftOp: Expr, rightOp: Expr) = IntDivExpr(leftOp, rightOp) + + @JvmStatic fun Mod(leftOp: Expr, rightOp: Expr) = IntModExpr(leftOp, rightOp) + + @JvmStatic fun Rem(leftOp: Expr, rightOp: Expr) = IntRemExpr(leftOp, rightOp) + + @JvmStatic fun Eq(leftOp: Expr, rightOp: Expr) = IntEqExpr(leftOp, rightOp) + + @JvmStatic fun Neq(leftOp: Expr, rightOp: Expr) = IntNeqExpr(leftOp, rightOp) + + @JvmStatic fun Lt(leftOp: Expr, rightOp: Expr) = IntLtExpr(leftOp, rightOp) + + @JvmStatic fun Leq(leftOp: Expr, rightOp: Expr) = IntLeqExpr(leftOp, rightOp) + + @JvmStatic fun Gt(leftOp: Expr, rightOp: Expr) = IntGtExpr(leftOp, rightOp) + + @JvmStatic fun Geq(leftOp: Expr, rightOp: Expr) = IntGeqExpr(leftOp, rightOp) +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt new file mode 100644 index 0000000000..0a1e56ca8f --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.GeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("IntGeq") +data class IntGeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + GeqExpr() { + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntGeqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntGeqExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.geq(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): IntGeqExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt new file mode 100644 index 0000000000..f35e06ef21 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.GtExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("IntGt") +data class IntGtExpr(override val leftOp: Expr, override val rightOp: Expr) : + GtExpr() { + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntGtExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntGtExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.gt(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): IntGtExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt new file mode 100644 index 0000000000..597f4aa9e1 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.LeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("IntLeq") +data class IntLeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + LeqExpr() { + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntLeqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntLeqExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.leq(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): IntLeqExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt new file mode 100644 index 0000000000..3bbb62a0ec --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt @@ -0,0 +1,123 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.serialization.BigIntegerSerializer +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.type.rattype.RatLitExpr +import java.math.BigInteger +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("IntLit") +data class IntLitExpr(@Serializable(with = BigIntegerSerializer::class) val value: BigInteger) : + NullaryExpr(), LitExpr, Comparable { + + companion object { + + @JvmStatic fun of(value: BigInteger) = IntLitExpr(value) + } + + override val type: IntType = Int() + + override fun eval(`val`: Valuation): IntLitExpr = this + + fun toRat(): RatLitExpr = Rat(this.value, 1) + + fun add(that: IntLitExpr) = IntLitExpr(this.value.add(that.value)) + + fun sub(that: IntLitExpr) = IntLitExpr(this.value.subtract(that.value)) + + fun neg() = IntLitExpr(this.value.negate()) + + fun pos() = IntLitExpr(this.value) + + fun div(that: IntLitExpr): IntLitExpr { + // Semantics: + // 5 div 3 = 1 + // 5 div -3 = -1 + // -5 div 3 = -2 + // -5 div -3 = 2 + var result = this.value.divide(that.value) + if (this.value < BigInteger.ZERO && this.value.mod(that.value.abs()) != BigInteger.ZERO) { + result = result.subtract(BigInteger.valueOf(that.value.signum().toLong())) + } + return IntLitExpr(result) + } + + fun mod(that: IntLitExpr): IntLitExpr { + // Always positive semantics: + // 5 mod 3 = 2 + // 5 mod -3 = 2 + // -5 mod 3 = 1 + // -5 mod -3 = 1 + var result = this.value.mod(that.value.abs()) + if (result < BigInteger.ZERO) { + result = result.add(that.value.abs()) + } + require(result >= BigInteger.ZERO) + return IntLitExpr(result) + } + + fun rem(that: IntLitExpr): IntLitExpr { + // Semantics: + // 5 rem 3 = 2 + // 5 rem -3 = -2 + // -5 rem 3 = 1 + // -5 rem -3 = -1 + val thisAbs = this.value.abs() + val thatAbs = that.value.abs() + return when { + this.value < BigInteger.ZERO && that.value < BigInteger.ZERO -> { + var result = thisAbs.mod(thatAbs) + if (result != BigInteger.ZERO) result = result.subtract(thatAbs) + IntLitExpr(result) + } + + this.value >= BigInteger.ZERO && that.value < BigInteger.ZERO -> + IntLitExpr(thisAbs.mod(thatAbs).negate()) + this.value < BigInteger.ZERO && that.value >= BigInteger.ZERO -> { + var result = thisAbs.mod(thatAbs) + if (result != BigInteger.ZERO) result = thatAbs.subtract(result) + IntLitExpr(result) + } + + else -> IntLitExpr(this.value.mod(that.value)) + } + } + + fun eq(that: IntLitExpr) = Bool(this.value == that.value) + + fun neq(that: IntLitExpr) = Bool(this.value != that.value) + + fun lt(that: IntLitExpr) = Bool(this.value < that.value) + + fun leq(that: IntLitExpr) = Bool(this.value <= that.value) + + fun gt(that: IntLitExpr) = Bool(this.value > that.value) + + fun geq(that: IntLitExpr) = Bool(this.value >= that.value) + + override fun compareTo(other: IntLitExpr): Int = this.value.compareTo(other.value) + + override fun toString(): String = value.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt new file mode 100644 index 0000000000..4ad63f6e47 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.LtExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("IntLt") +data class IntLtExpr(override val leftOp: Expr, override val rightOp: Expr) : + LtExpr() { + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntLtExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntLtExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.lt(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): IntLtExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt new file mode 100644 index 0000000000..f2b3f7d04a --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.ModExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("IntMod") +data class IntModExpr(override val leftOp: Expr, override val rightOp: Expr) : + ModExpr() { + + companion object { + + private const val OPERATOR_LABEL = "mod" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntModExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntModExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } + + override val type: IntType = Int() + + override fun eval(`val`: Valuation): IntLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.mod(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): IntModExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt new file mode 100644 index 0000000000..bf4a548801 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.MulExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import java.math.BigInteger +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("IntMul") +data class IntMulExpr(override val ops: List>) : MulExpr() { + + companion object { + + private const val OPERATOR_LABEL = "*" + + @JvmStatic fun of(ops: Iterable>) = IntMulExpr(ops.toList()) + + @JvmStatic fun create(ops: List>) = IntMulExpr(ops.map { cast(it, Int()) }) + } + + override val type: IntType = Int() + + override fun eval(`val`: Valuation): IntLitExpr { + var prod = BigInteger.ONE + for (op in ops) { + val opVal = op.eval(`val`) as IntLitExpr + prod = prod.multiply(opVal.value) + } + return Int(prod) + } + + override fun new(ops: List>): IntMulExpr = of(ops) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt new file mode 100644 index 0000000000..bd709c8d03 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NegExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("IntNeg") +data class IntNegExpr(override val op: Expr) : NegExpr() { + + companion object { + + private const val OPERATOR_LABEL = "-" + + @JvmStatic fun of(op: Expr) = IntNegExpr(op) + + @JvmStatic fun create(op: Expr<*>) = IntNegExpr(cast(op, Int())) + } + + override val type: IntType = Int() + + override fun eval(`val`: Valuation): IntLitExpr { + val opVal = op.eval(`val`) as IntLitExpr + return opVal.neg() + } + + override fun new(op: Expr): IntNegExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt new file mode 100644 index 0000000000..b1c55d2d5e --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("IntNeq") +data class IntNeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + NeqExpr() { + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntNeqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntNeqExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.neq(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): IntNeqExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt new file mode 100644 index 0000000000..7f374f14a5 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.PosExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("IntPos") +data class IntPosExpr(override val op: Expr) : PosExpr() { + + companion object { + + private const val OPERATOR_LABEL = "+" + + @JvmStatic fun of(op: Expr) = IntPosExpr(op) + + @JvmStatic fun create(op: Expr<*>) = IntPosExpr(cast(op, Int())) + } + + override val type: IntType = Int() + + override fun eval(`val`: Valuation): IntLitExpr { + val opVal = op.eval(`val`) as IntLitExpr + return opVal.pos() + } + + override fun new(op: Expr): IntPosExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt new file mode 100644 index 0000000000..d2de066908 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.RemExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("IntRem") +data class IntRemExpr(override val leftOp: Expr, override val rightOp: Expr) : + RemExpr() { + + companion object { + + private const val OPERATOR_LABEL = "rem" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntRemExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntRemExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } + + override val type: IntType = Int() + + override fun eval(`val`: Valuation): IntLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.rem(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): IntRemExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt new file mode 100644 index 0000000000..0882522888 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.SubExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("IntSub") +data class IntSubExpr(override val leftOp: Expr, override val rightOp: Expr) : + SubExpr() { + + companion object { + + private const val OPERATOR_LABEL = "-" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntSubExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntSubExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } + + override val type: IntType = Int() + + override fun eval(`val`: Valuation): IntLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.sub(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): IntSubExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt new file mode 100644 index 0000000000..e08537bfa6 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.CastExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.type.rattype.RatLitExpr +import hu.bme.mit.theta.core.type.rattype.RatType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("IntToRat") +data class IntToRatExpr(override val op: Expr) : CastExpr() { + + companion object { + + private const val OPERATOR_LABEL = "to_rat" + + @JvmStatic fun of(op: Expr) = IntToRatExpr(op) + + @JvmStatic fun create(op: Expr<*>) = IntToRatExpr(cast(op, Int())) + } + + override val type: RatType = Rat() + + override fun eval(`val`: Valuation): RatLitExpr { + val opVal = op.eval(`val`) as IntLitExpr + return opVal.toRat() + } + + override fun new(op: Expr): IntToRatExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntType.kt new file mode 100644 index 0000000000..85a85e16ff --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntType.kt @@ -0,0 +1,76 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.type.DomainSize +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.abstracttype.* +import hu.bme.mit.theta.core.type.rattype.RatType +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName(IntType.TYPE_LABEL) +object IntType : + Additive, + Multiplicative, + Divisible, + Equational, + Ordered, + Castable { + + internal const val TYPE_LABEL = "Int" + + @JvmStatic fun getInstance(): IntType = this + + override fun toString(): String = TYPE_LABEL + + override fun Add(ops: Iterable>) = IntExprs.Add(ops) + + override fun Sub(leftOp: Expr, rightOp: Expr) = IntExprs.Sub(leftOp, rightOp) + + override fun Pos(op: Expr) = IntExprs.Pos(op) + + override fun Neg(op: Expr) = IntExprs.Neg(op) + + override fun Mul(ops: Iterable>) = IntExprs.Mul(ops) + + override fun Div(leftOp: Expr, rightOp: Expr) = IntExprs.Div(leftOp, rightOp) + + override fun Mod(leftOp: Expr, rightOp: Expr) = IntExprs.Mod(leftOp, rightOp) + + override fun Rem(leftOp: Expr, rightOp: Expr) = IntExprs.Rem(leftOp, rightOp) + + override fun Eq(leftOp: Expr, rightOp: Expr) = IntExprs.Eq(leftOp, rightOp) + + override fun Neq(leftOp: Expr, rightOp: Expr) = IntExprs.Neq(leftOp, rightOp) + + override fun Lt(leftOp: Expr, rightOp: Expr) = IntExprs.Lt(leftOp, rightOp) + + override fun Leq(leftOp: Expr, rightOp: Expr) = IntExprs.Leq(leftOp, rightOp) + + override fun Gt(leftOp: Expr, rightOp: Expr) = IntExprs.Gt(leftOp, rightOp) + + override fun Geq(leftOp: Expr, rightOp: Expr) = IntExprs.Geq(leftOp, rightOp) + + @Suppress("UNCHECKED_CAST") + override fun Cast(op: Expr, type: TargetType): Expr = + if (type is RatType) IntExprs.ToRat(op) as Expr + else throw ClassCastException("Int cannot be cast to $type") + + override val domainSize: DomainSize = DomainSize.INFINITY +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/package-info.java similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/package-info.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/package-info.java diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/package-info.java new file mode 100644 index 0000000000..c6dd8f7007 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/package-info.java @@ -0,0 +1,34 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * This package contains types (e.g., Boolean, integer) and expressions operating over them (e.g., + * Boolean connectives, arithmetic operations), grouped into subpackages. Constructors of the types + * and expressions are usually package private. Use the factory classes instead. + * + *

- {@link hu.bme.mit.theta.core.type.Expr} is the main interface for expressions. + * + *

- {@link hu.bme.mit.theta.core.type.anytype} and {@link + * hu.bme.mit.theta.core.type.abstracttype} are expressions for multiple types (e.g., conditional). + * - {@link hu.bme.mit.theta.core.type.booltype} contains the Boolean type and expressions (e.g., + * and, or). - {@link hu.bme.mit.theta.core.type.bvtype} contains the (SMT) bitvector type and + * expressions (e.g., bitwise and, shifts). - {@link hu.bme.mit.theta.core.type.inttype} contains + * the mathematical (SMT) integer type and expressions (e.g., add, multiply). - {@link + * hu.bme.mit.theta.core.type.rattype} contains the rational type and expression (e.g., division). - + * {@link hu.bme.mit.theta.core.type.arraytype} contains the SMT array type (associative mapping + * from a key type to a value type) and expressions (e.g., read, write). - {@link + * hu.bme.mit.theta.core.type.functype} contains the function type and expressions. + */ +package hu.bme.mit.theta.core.type; diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt new file mode 100644 index 0000000000..54427d9548 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt @@ -0,0 +1,63 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.AddExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import java.math.BigInteger +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("RatAdd") +data class RatAddExpr(override val ops: List>) : AddExpr() { + + companion object { + + private const val OPERATOR_LABEL = "+" + + @JvmStatic fun of(ops: Iterable>): RatAddExpr = RatAddExpr(ops.toList()) + + @Suppress("UNCHECKED_CAST") + @JvmStatic + fun create(ops: Iterable>): RatAddExpr = RatAddExpr(ops.map { it as Expr }) + } + + override val type: RatType = Rat() + + override fun eval(`val`: Valuation): RatLitExpr { + var sumNum = BigInteger.ZERO + var sumDenom = BigInteger.ONE + ops.forEach { op -> + val opLit = op.eval(`val`) as RatLitExpr + val leftNum = sumNum + val leftDenom = sumDenom + val rightNum = opLit.num + val rightDenom = opLit.denom + sumNum = leftNum.multiply(rightDenom).add(leftDenom.multiply(rightNum)) + sumDenom = leftDenom.multiply(rightDenom) + } + return Rat(sumNum, sumDenom) + } + + override fun new(ops: List>): RatAddExpr = of(ops) + + override val operatorLabel: String = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt new file mode 100644 index 0000000000..d7d7368812 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt @@ -0,0 +1,70 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.DivExpr +import hu.bme.mit.theta.core.type.inttype.IntToRatExpr +import hu.bme.mit.theta.core.type.inttype.IntType +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("RatDiv") +data class RatDivExpr(override val leftOp: Expr, override val rightOp: Expr) : + DivExpr() { + + companion object { + private const val OPERATOR_LABEL = "/" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatDivExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>): RatDivExpr { + val newLeftOp = + when (leftOp.type) { + is RatType -> cast(leftOp, Rat()) + is IntType -> IntToRatExpr.create(leftOp) + else -> throw IllegalArgumentException("Unsupported type for RatDiv: ${leftOp.type}") + } + val newRightOp = + when (rightOp.type) { + is RatType -> cast(rightOp, Rat()) + is IntType -> IntToRatExpr.create(rightOp) + else -> throw IllegalArgumentException("Unsupported type for RatDiv: ${rightOp.type}") + } + return RatDivExpr(newLeftOp, newRightOp) + } + } + + override val type: RatType = Rat() + + override fun eval(`val`: Valuation): RatLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.div(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): RatDivExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt new file mode 100644 index 0000000000..334c585fcd --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("RatEq") +data class RatEqExpr(override val leftOp: Expr, override val rightOp: Expr) : + EqExpr() { + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatEqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + RatEqExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.eq(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): RatEqExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatExprs.kt new file mode 100644 index 0000000000..22f8922585 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatExprs.kt @@ -0,0 +1,81 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.type.Expr +import java.math.BigInteger + +/** Factory for rational expressions. */ +@Suppress("FunctionName") +object RatExprs { + @JvmStatic fun Rat() = RatType + + @JvmStatic + fun Rat(num: Int, denom: Int) = + RatLitExpr.of(BigInteger.valueOf(num.toLong()), BigInteger.valueOf(denom.toLong())) + + @JvmStatic + fun Rat(num: Int, denom: String) = + RatLitExpr.of(BigInteger.valueOf(num.toLong()), BigInteger(denom)) + + @JvmStatic + fun Rat(num: Int, denom: BigInteger) = RatLitExpr.of(BigInteger.valueOf(num.toLong()), denom) + + @JvmStatic + fun Rat(num: String, denom: Int) = + RatLitExpr.of(BigInteger(num), BigInteger.valueOf(denom.toLong())) + + @JvmStatic fun Rat(num: String, denom: String) = RatLitExpr.of(BigInteger(num), BigInteger(denom)) + + @JvmStatic fun Rat(num: String, denom: BigInteger) = RatLitExpr.of(BigInteger(num), denom) + + @JvmStatic + fun Rat(num: BigInteger, denom: Int) = RatLitExpr.of(num, BigInteger.valueOf(denom.toLong())) + + @JvmStatic fun Rat(num: BigInteger, denom: String) = RatLitExpr.of(num, BigInteger(denom)) + + @JvmStatic fun Rat(num: BigInteger, denom: BigInteger) = RatLitExpr.of(num, denom) + + @JvmStatic fun Add(ops: Iterable>) = RatAddExpr.of(ops) + + @JvmStatic fun Sub(leftOp: Expr, rightOp: Expr) = RatSubExpr(leftOp, rightOp) + + @JvmStatic fun Pos(op: Expr) = RatPosExpr(op) + + @JvmStatic fun Neg(op: Expr) = RatNegExpr(op) + + @JvmStatic fun Mul(ops: Iterable>) = RatMulExpr.of(ops) + + @JvmStatic fun Div(leftOp: Expr, rightOp: Expr) = RatDivExpr(leftOp, rightOp) + + @JvmStatic fun Eq(leftOp: Expr, rightOp: Expr) = RatEqExpr(leftOp, rightOp) + + @JvmStatic fun Neq(leftOp: Expr, rightOp: Expr) = RatNeqExpr(leftOp, rightOp) + + @JvmStatic fun Lt(leftOp: Expr, rightOp: Expr) = RatLtExpr(leftOp, rightOp) + + @JvmStatic fun Leq(leftOp: Expr, rightOp: Expr) = RatLeqExpr(leftOp, rightOp) + + @JvmStatic fun Gt(leftOp: Expr, rightOp: Expr) = RatGtExpr(leftOp, rightOp) + + @JvmStatic fun Geq(leftOp: Expr, rightOp: Expr) = RatGeqExpr(leftOp, rightOp) + + @JvmStatic @SafeVarargs fun Add(vararg ops: Expr) = RatAddExpr(ops.asList()) + + @JvmStatic @SafeVarargs fun Mul(vararg ops: Expr) = RatMulExpr(ops.asList()) + + @JvmStatic fun ToInt(op: Expr) = RatToIntExpr.of(op) +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt new file mode 100644 index 0000000000..76bdc78491 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.GeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("RatGeq") +data class RatGeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + GeqExpr() { + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatGeqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + RatGeqExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.geq(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): RatGeqExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt new file mode 100644 index 0000000000..6954cd8391 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.GtExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("RatGt") +data class RatGtExpr(override val leftOp: Expr, override val rightOp: Expr) : + GtExpr() { + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatGtExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + RatGtExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.gt(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): RatGtExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt new file mode 100644 index 0000000000..f3123b3efb --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt @@ -0,0 +1,49 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.LeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("RatLeq") +data class RatLeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + LeqExpr() { + + companion object { + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatLeqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + RatLeqExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.leq(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): RatLeqExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt new file mode 100644 index 0000000000..74a3c5ee2c --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt @@ -0,0 +1,110 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.serialization.BigIntegerSerializer +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.inttype.IntLitExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import java.math.BigInteger +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("RatLit") +data class RatLitExpr( + @Serializable(with = BigIntegerSerializer::class) val num: BigInteger, + @Serializable(with = BigIntegerSerializer::class) val denom: BigInteger, +) : NullaryExpr(), LitExpr, Comparable { + + init { + require(denom != BigInteger.ZERO) + require(num.abs().gcd(denom.abs()) == BigInteger.ONE) { + "Numerator and denominator must be coprime. Use the factory method RatLitExpr.of() to ensure this." + } + } + + companion object { + + @JvmStatic + fun of(num: BigInteger, denom: BigInteger): RatLitExpr { + require(denom != BigInteger.ZERO) { "Denominator cannot be zero" } + + val gcd = num.abs().gcd(denom.abs()) + val (simplifiedNum, simplifiedDenom) = + if (denom >= BigInteger.ZERO) { + num.divide(gcd) to denom.divide(gcd) + } else { + num.divide(gcd).negate() to denom.divide(gcd).negate() + } + return RatLitExpr(simplifiedNum, simplifiedDenom) + } + } + + override val type: RatType = Rat() + + override fun eval(`val`: Valuation): RatLitExpr = this + + fun sign(): Int = num.signum() + + fun floor(): BigInteger = + if (num >= BigInteger.ZERO || num.mod(denom) == BigInteger.ZERO) num / denom + else num / denom - BigInteger.ONE + + fun ceil(): BigInteger = + if (num <= BigInteger.ZERO || num.mod(denom) == BigInteger.ZERO) num / denom + else num / denom + BigInteger.ONE + + fun add(that: RatLitExpr) = + of(this.num * that.denom + this.denom * that.num, this.denom * that.denom) + + fun sub(that: RatLitExpr) = + of(this.num * that.denom - this.denom * that.num, this.denom * that.denom) + + fun pos() = of(this.num, this.denom) + + fun neg() = of(this.num.negate(), this.denom) + + fun mul(that: RatLitExpr) = of(this.num * that.num, this.denom * that.denom) + + fun div(that: RatLitExpr) = of(this.num * that.denom, this.denom * that.num) + + fun eq(that: RatLitExpr) = Bool(this.num == that.num && this.denom == that.denom) + + fun neq(that: RatLitExpr) = Bool(this.num != that.num || this.denom != that.denom) + + fun lt(that: RatLitExpr) = Bool(this.num * that.denom < this.denom * that.num) + + fun leq(that: RatLitExpr) = Bool(this.num * that.denom <= this.denom * that.num) + + fun gt(that: RatLitExpr) = Bool(this.num * that.denom > this.denom * that.num) + + fun geq(that: RatLitExpr) = Bool(this.num * that.denom >= this.denom * that.num) + + fun abs(): RatLitExpr = of(num.abs(), denom) + + fun frac(): RatLitExpr = sub(of(floor(), BigInteger.ONE)) + + override fun compareTo(other: RatLitExpr): Int = + (this.num * other.denom).compareTo(this.denom * other.num) + + fun toInt(): IntLitExpr = IntLitExpr(num.divide(denom)) + + override fun toString(): String = "$num%$denom" +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt new file mode 100644 index 0000000000..fcdea03c30 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.LtExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("RatLt") +data class RatLtExpr(override val leftOp: Expr, override val rightOp: Expr) : + LtExpr() { + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatLtExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + RatLtExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.lt(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): RatLtExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt new file mode 100644 index 0000000000..571c10bf8c --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt @@ -0,0 +1,59 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.MulExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import java.math.BigInteger +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("RatMul") +data class RatMulExpr(override val ops: List>) : MulExpr() { + + companion object { + + private const val OPERATOR_LABEL = "*" + + @JvmStatic fun of(ops: Iterable>) = RatMulExpr(ops.toList()) + + @JvmStatic fun create(ops: List>) = RatMulExpr(ops.map { cast(it, Rat()) }) + } + + override val type: RatType = Rat() + + override fun eval(`val`: Valuation): RatLitExpr { + var prodNum = BigInteger.ONE + var prodDenom = BigInteger.ONE + ops.forEach { op -> + val opVal = op.eval(`val`) as RatLitExpr + prodNum *= opVal.num + prodDenom *= opVal.denom + } + return Rat(prodNum, prodDenom) + } + + override fun new(ops: List>): RatMulExpr = of(ops) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt new file mode 100644 index 0000000000..302231f422 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NegExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("RatNeg") +data class RatNegExpr(override val op: Expr) : NegExpr() { + + companion object { + private const val OPERATOR_LABEL = "-" + + @JvmStatic fun of(op: Expr) = RatNegExpr(op) + + @JvmStatic fun create(op: Expr<*>) = RatNegExpr(cast(op, Rat())) + } + + override val type: RatType = Rat() + + override fun eval(`val`: Valuation): RatLitExpr { + val opVal = op.eval(`val`) as RatLitExpr + return opVal.neg() + } + + override fun new(op: Expr): RatNegExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt new file mode 100644 index 0000000000..14a348220f --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("RatNeq") +data class RatNeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + NeqExpr() { + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatNeqExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + RatNeqExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.neq(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): RatNeqExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt new file mode 100644 index 0000000000..f7464b0b44 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.PosExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("RatPos") +data class RatPosExpr(override val op: Expr) : PosExpr() { + + companion object { + private const val OPERATOR_LABEL = "+" + + @JvmStatic fun of(op: Expr) = RatPosExpr(op) + + @JvmStatic fun create(op: Expr<*>) = RatPosExpr(cast(op, Rat())) + } + + override val type: RatType = Rat() + + override fun eval(`val`: Valuation): RatLitExpr { + val opVal = op.eval(`val`) as RatLitExpr + return opVal.pos() + } + + override fun new(op: Expr): RatPosExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt new file mode 100644 index 0000000000..695686b34e --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.SubExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("RatSub") +data class RatSubExpr(override val leftOp: Expr, override val rightOp: Expr) : + SubExpr() { + + companion object { + private const val OPERATOR_LABEL = "-" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatSubExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + RatSubExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) + } + + override val type: RatType = Rat() + + override fun eval(`val`: Valuation): RatLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.sub(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): RatSubExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt new file mode 100644 index 0000000000..9994306a49 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt @@ -0,0 +1,54 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.type.inttype.IntLitExpr +import hu.bme.mit.theta.core.type.inttype.IntType +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("RatToInt") +data class RatToIntExpr(override val op: Expr) : UnaryExpr() { + + companion object { + + private const val OPERATOR_LABEL = "to_int" + + @JvmStatic fun of(op: Expr) = RatToIntExpr(op) + + @JvmStatic fun create(op: Expr<*>) = RatToIntExpr(cast(op, Rat())) + } + + override val type: IntType = Int() + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun eval(`val`: Valuation): IntLitExpr { + val opVal = op.eval(`val`) as RatLitExpr + return opVal.toInt() + } + + override fun new(op: Expr): RatToIntExpr = of(op) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatType.kt new file mode 100644 index 0000000000..c0b146951b --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatType.kt @@ -0,0 +1,63 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.type.DomainSize +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.abstracttype.Additive +import hu.bme.mit.theta.core.type.abstracttype.Equational +import hu.bme.mit.theta.core.type.abstracttype.Multiplicative +import hu.bme.mit.theta.core.type.abstracttype.Ordered +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName(RatType.TYPE_LABEL) +object RatType : + Additive, Multiplicative, Equational, Ordered, Type { + internal const val TYPE_LABEL = "Rat" + + @JvmStatic fun getInstance(): RatType = this + + override fun toString(): String = TYPE_LABEL + + override fun Add(ops: Iterable>) = RatAddExpr.of(ops) + + override fun Sub(leftOp: Expr, rightOp: Expr) = RatSubExpr(leftOp, rightOp) + + override fun Pos(op: Expr) = RatPosExpr(op) + + override fun Neg(op: Expr) = RatNegExpr(op) + + override fun Mul(ops: Iterable>) = RatMulExpr.of(ops) + + override fun Div(leftOp: Expr, rightOp: Expr) = RatDivExpr(leftOp, rightOp) + + override fun Eq(leftOp: Expr, rightOp: Expr) = RatEqExpr(leftOp, rightOp) + + override fun Neq(leftOp: Expr, rightOp: Expr) = RatNeqExpr(leftOp, rightOp) + + override fun Lt(leftOp: Expr, rightOp: Expr) = RatLtExpr(leftOp, rightOp) + + override fun Leq(leftOp: Expr, rightOp: Expr) = RatLeqExpr(leftOp, rightOp) + + override fun Gt(leftOp: Expr, rightOp: Expr) = RatGtExpr(leftOp, rightOp) + + override fun Geq(leftOp: Expr, rightOp: Expr) = RatGeqExpr(leftOp, rightOp) + + override val domainSize: DomainSize = DomainSize.INFINITY +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/package-info.java similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/package-info.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/package-info.java diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmt.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/utils/UniqueIdProvider.kt similarity index 75% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmt.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/utils/UniqueIdProvider.kt index 3c396ebd1b..9931791000 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmt.java +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/utils/UniqueIdProvider.kt @@ -13,9 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.stmt; +package hu.bme.mit.theta.core.utils -public interface Stmt { +class UniqueIdProvider { + private var currentId = 0 - R accept(StmtVisitor visitor, P param); + /** + * Returns a unique identifier. + * + * @return A unique integer identifier + */ + fun get(): Int = currentId++ } diff --git a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/expr/EvaluationTest.java b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/expr/EvaluationTest.java index eaa8a331bb..8bd1ba4794 100644 --- a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/expr/EvaluationTest.java +++ b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/expr/EvaluationTest.java @@ -18,33 +18,21 @@ import static hu.bme.mit.theta.core.decl.Decls.Const; import static hu.bme.mit.theta.core.decl.Decls.Var; import static hu.bme.mit.theta.core.type.anytype.Exprs.Ite; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.ArrayInit; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Write; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.And; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.False; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Iff; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Not; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Or; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Xor; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Add; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Div; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Geq; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Gt; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Leq; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Lt; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Mod; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Mul; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Neg; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Neq; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Rem; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Sub; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.ToRat; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.*; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Add; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Div; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Eq; @@ -55,12 +43,9 @@ import static hu.bme.mit.theta.core.type.rattype.RatExprs.Mul; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Neg; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Neq; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Sub; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.ToInt; import static org.junit.Assert.assertEquals; -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.core.decl.ConstDecl; import hu.bme.mit.theta.core.decl.VarDecl; import hu.bme.mit.theta.core.model.ImmutableValuation; @@ -70,6 +55,7 @@ import hu.bme.mit.theta.core.type.Type; import hu.bme.mit.theta.core.type.inttype.IntType; import java.util.ArrayList; +import kotlin.Pair; import org.junit.Test; public class EvaluationTest { @@ -369,9 +355,9 @@ public void testRatSub() { @Test public void testRead() { - var elems = new ArrayList, ? extends Expr>>(); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Int(2))); + var elems = new ArrayList, ? extends Expr>>(); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Int(2))); var arr = Array(elems, Int(100), Array(Int(), Int())); assertEquals(Int(1), evaluate(Read(arr, Int(0)))); assertEquals(Int(2), evaluate(Read(arr, Int(1)))); @@ -380,9 +366,9 @@ public void testRead() { @Test public void testWrite() { - var elems = new ArrayList, ? extends Expr>>(); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Int(2))); + var elems = new ArrayList, ? extends Expr>>(); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Int(2))); var arr = Array(elems, Int(100), Array(Int(), Int())); var arr1 = Write(arr, Int(0), Int(34)); @@ -399,11 +385,11 @@ public void testWrite() { @Test public void testArrayInit() { - var elems = new ArrayList, Expr>>(); + var elems = new ArrayList, Expr>>(); VarDecl noname = Var("noname", Int()); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Int(2))); - elems.add(Tuple2.of(Int(2), Add(noname.getRef(), Int(3)))); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Int(2))); + elems.add(new Pair<>(Int(2), Add(noname.getRef(), Int(3)))); var arr = ArrayInit(elems, Int(100), Array(Int(), Int())); ImmutableValuation val = ImmutableValuation.builder().put(noname, Int(1)).build(); diff --git a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprCanonizerTest.java b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprCanonizerTest.java index bd55c851aa..3c28d3721a 100644 --- a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprCanonizerTest.java +++ b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprCanonizerTest.java @@ -18,14 +18,21 @@ import static hu.bme.mit.theta.core.decl.Decls.Const; import static hu.bme.mit.theta.core.type.anytype.Exprs.Ite; import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read; import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Div; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Geq; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Gt; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Leq; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Lt; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Sub; import static hu.bme.mit.theta.core.type.rattype.RatExprs.*; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.Div; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.Neg; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.Sub; import static hu.bme.mit.theta.core.utils.ExprCanonizer.canonize; import static org.junit.Assert.assertEquals; -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.core.decl.ConstDecl; import hu.bme.mit.theta.core.type.Expr; import hu.bme.mit.theta.core.type.booltype.BoolType; @@ -36,6 +43,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import kotlin.Pair; import org.junit.Test; import org.junit.experimental.runners.Enclosed; import org.junit.runner.RunWith; @@ -475,9 +483,9 @@ public void testIte() { // Array @Test public void testArrayRead() { - var elems = new ArrayList, ? extends Expr>>(); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Int(2))); + var elems = new ArrayList, ? extends Expr>>(); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Int(2))); var arr = Array(elems, Int(100), Array(Int(), Int())); assertEquals(Read(arr, Int(0)), canonize(Read(arr, Int(0)))); assertEquals(Read(arr, a), canonize(Read(arr, a))); @@ -485,8 +493,8 @@ public void testArrayRead() { @Test public void testArrayWrite() { - var elems = new ArrayList, ? extends Expr>>(); - elems.add(Tuple2.of(Int(0), Int(1))); + var elems = new ArrayList, ? extends Expr>>(); + elems.add(new Pair<>(Int(0), Int(1))); var arr = Array(elems, Int(100), Array(Int(), Int())); assertEquals(Write(arr, Int(5), Int(6)), canonize(Write(arr, Int(5), Int(6)))); assertEquals(Write(arr, b, a), canonize(Write(arr, b, a))); diff --git a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprSimplifierTest.java b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprSimplifierTest.java index 45b9f1792f..4309a2f479 100644 --- a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprSimplifierTest.java +++ b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprSimplifierTest.java @@ -18,35 +18,23 @@ import static hu.bme.mit.theta.core.decl.Decls.Const; import static hu.bme.mit.theta.core.decl.Decls.Var; import static hu.bme.mit.theta.core.type.anytype.Exprs.Ite; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.ArrayInit; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Write; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.And; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.False; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Iff; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Not; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Or; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Xor; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Add; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Div; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Geq; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Gt; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Leq; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Lt; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Mod; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Mul; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Neg; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Neq; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Sub; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.ToRat; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.*; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Add; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Div; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Eq; @@ -57,15 +45,10 @@ import static hu.bme.mit.theta.core.type.rattype.RatExprs.Mul; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Neg; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Neq; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Sub; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.ToInt; import static hu.bme.mit.theta.core.utils.ExprUtils.simplify; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.core.decl.ConstDecl; import hu.bme.mit.theta.core.decl.VarDecl; import hu.bme.mit.theta.core.model.ImmutableValuation; @@ -82,6 +65,7 @@ import hu.bme.mit.theta.core.type.rattype.RatType; import java.util.ArrayList; import java.util.List; +import kotlin.Pair; import org.junit.Test; public class ExprSimplifierTest { @@ -679,9 +663,9 @@ public void testIte() { // Array @Test public void testArrayRead() { - var elems = new ArrayList, ? extends Expr>>(); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Int(2))); + var elems = new ArrayList, ? extends Expr>>(); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Int(2))); var arr = Array(elems, Int(100), Array(Int(), Int())); assertEquals(Int(1), simplify(Read(arr, Int(0)))); assertEquals(Int(2), simplify(Read(arr, Int(1)))); @@ -690,8 +674,8 @@ public void testArrayRead() { @Test public void testArrayWrite() { - var elems = new ArrayList, ? extends Expr>>(); - elems.add(Tuple2.of(Int(0), Int(1))); + var elems = new ArrayList, ? extends Expr>>(); + elems.add(new Pair<>(Int(0), Int(1))); var arr = Array(elems, Int(100), Array(Int(), Int())); var newArr = simplify(Write(arr, Int(5), Int(6))); assertTrue(newArr instanceof ArrayLitExpr); @@ -702,15 +686,15 @@ public void testArrayWrite() { @Test public void testArrayInit() { - var elems = new ArrayList, Expr>>(); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Add(Int(1), Int(2)))); + var elems = new ArrayList, Expr>>(); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Add(Int(1), Int(2)))); var initArr = ArrayInit(elems, Int(100), Array(Int(), Int())); var litArr = simplify(initArr); assertTrue(litArr instanceof ArrayLitExpr); VarDecl noname = Var("noname", Int()); - elems.add(Tuple2.of(Int(2), Add(noname.getRef(), Int(1)))); + elems.add(new Pair<>(Int(2), Add(noname.getRef(), Int(1)))); var arr = ArrayInit(elems, Int(100), Array(Int(), Int())); var newArr = simplify(arr); assertTrue(newArr instanceof ArrayInitExpr); diff --git a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/StmtToExprTransformerTest.java b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/StmtToExprTransformerTest.java index b5bb7885a4..74f2461803 100644 --- a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/StmtToExprTransformerTest.java +++ b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/StmtToExprTransformerTest.java @@ -60,11 +60,11 @@ public static Collection data() { {Stmts.Havoc(VX), ImmutableList.of(True())}, {Stmts.Assign(VX, Int(2)), ImmutableList.of(Eq(Prime(VX.getRef()), Int(2)))}, { - Stmts.SequenceStmt(ImmutableList.of(Stmts.Assume(And(True(), False())))), + Stmts.Sequence(ImmutableList.of(Stmts.Assume(And(True(), False())))), ImmutableList.of(And(ImmutableList.of(And(True(), False())))) }, { - Stmts.SequenceStmt( + Stmts.Sequence( ImmutableList.of( Stmts.Assign(VX, Int(2)), Stmts.Assign(VX, Int(2)))), ImmutableList.of( diff --git a/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/ExprSerializationTest.kt b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/ExprSerializationTest.kt new file mode 100644 index 0000000000..1a92ef58c2 --- /dev/null +++ b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/ExprSerializationTest.kt @@ -0,0 +1,1127 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.serialization + +import hu.bme.mit.theta.core.decl.Decls +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.anytype.* +import hu.bme.mit.theta.core.type.arraytype.* +import hu.bme.mit.theta.core.type.booltype.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True +import hu.bme.mit.theta.core.type.bvtype.* +import hu.bme.mit.theta.core.type.enumtype.EnumEqExpr +import hu.bme.mit.theta.core.type.enumtype.EnumLitExpr +import hu.bme.mit.theta.core.type.enumtype.EnumNeqExpr +import hu.bme.mit.theta.core.type.enumtype.EnumType +import hu.bme.mit.theta.core.type.fptype.* +import hu.bme.mit.theta.core.type.fptype.FpRoundingMode.* +import hu.bme.mit.theta.core.type.functype.FuncAppExpr +import hu.bme.mit.theta.core.type.functype.FuncLitExpr +import hu.bme.mit.theta.core.type.inttype.* +import hu.bme.mit.theta.core.type.inttype.IntExprs.Eq +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.type.rattype.* +import java.math.BigInteger +import kotlinx.serialization.encodeToString +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Test + +@Suppress("UNCHECKED_CAST") +class ExprSerializationTest { + + companion object { + + private val json = coreJson + + private val bv1 = BvLitExpr(booleanArrayOf(true, false), true) + private val bv2 = BvLitExpr(booleanArrayOf(false, true)) + + private val fp1 = FpLitExpr(false, bv1, bv2) + private val fp2 = FpLitExpr(false, bv2, bv1) + + private val rat1 = RatLitExpr(BigInteger.valueOf(1), BigInteger.valueOf(2)) + private val rat2 = RatLitExpr(BigInteger.valueOf(3), BigInteger.valueOf(4)) + + private val enumType = EnumType("Color", mapOf("Red" to 0, "Green" to 1, "Blue" to 2)) + + private val func = FuncLitExpr(Decls.Param("x", Int()), False()) + } + + @Test + fun `test Dereference serialization`() { + val expr = Dereference(Int(0), True(), Int()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as Dereference).array.type } + } + + @Test + fun `test InvalidLitExpr serialization`() { + val expr = InvalidLitExpr(Int()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertNotEquals(expr, deserialized) // special case, never equal + assertDoesNotThrow { (deserialized as InvalidLitExpr).type } + } + + @Test + fun `test IteExpr serialization`() { + val expr = IteExpr(Eq(Int(0), Int(1)), Int(2), Int(3)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IteExpr).then } + } + + @Test + fun `test PrimeExpr serialization`() { + val expr = PrimeExpr(Int(0)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as PrimeExpr).op } + } + + @Test + fun `test RefExpr serialization`() { + val expr = RefExpr(Decls.Var("x", Int())) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RefExpr).decl } + } + + @Test + fun `test Reference serialization`() { + val expr = Reference(Int(0), Bool()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as Reference).expr } + } + + @Test + fun `test ArrayEqExpr serialization`() { + val expr = + ArrayEqExpr( + ArrayLitExpr(listOf(), Int(0), ArrayType(Bool(), Int())), + ArrayLitExpr(listOf(), Int(1), ArrayType(Bool(), Int())), + ) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ArrayEqExpr).leftOp } + } + + @Test + fun `test ArrayInitExpr serialization`() { + val expr = ArrayInitExpr(listOf(Int(0) to Int(1)), Int(2), ArrayType(Int(), Int())) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ArrayInitExpr).elements } + } + + @Test + fun `test ArrayLitExpr serialization`() { + val expr = ArrayLitExpr(listOf(Int(0) to Int(1)), Int(2), ArrayType(Int(), Int())) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ArrayLitExpr).elements } + } + + @Test + fun `test ArrayNeqExpr serialization`() { + val expr = + ArrayNeqExpr( + ArrayLitExpr(listOf(), Int(0), ArrayType(Bool(), Int())), + ArrayLitExpr(listOf(), Int(1), ArrayType(Bool(), Int())), + ) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ArrayNeqExpr).leftOp } + } + + @Test + fun `test ArrayReadExpr serialization`() { + val expr = ArrayReadExpr(ArrayLitExpr(listOf(), Int(0), ArrayType(Int(), Int())), Int(1)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ArrayReadExpr).array } + } + + @Test + fun `test ArrayWriteExpr serialization`() { + val expr = + ArrayWriteExpr(ArrayLitExpr(listOf(), Int(0), ArrayType(Int(), Int())), Int(1), Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ArrayWriteExpr).array } + } + + @Test + fun `test AndExpr serialization`() { + val expr = AndExpr(listOf(True(), False())) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as AndExpr).ops } + } + + @Test + fun `test FalseExpr serialization`() { + val expr = False() + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { deserialized as FalseExpr } + } + + @Test + fun `test TrueExpr serialization`() { + val expr = True() + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { deserialized as TrueExpr } + } + + @Test + fun `test IffExpr serialization`() { + val expr = IffExpr(True(), False()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IffExpr).leftOp } + } + + @Test + fun `test ImplyExpr serialization`() { + val expr = ImplyExpr(True(), False()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ImplyExpr).leftOp } + } + + @Test + fun `test NotExpr serialization`() { + val expr = NotExpr(True()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as NotExpr).op } + } + + @Test + fun `test OrExpr serialization`() { + val expr = OrExpr(listOf(True(), False())) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as OrExpr).ops } + } + + @Test + fun `test ExistsExpr serialization`() { + val expr = ExistsExpr(listOf(Decls.Param("x", Int())), True()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ExistsExpr).paramDecls } + } + + @Test + fun `test ForallExpr serialization`() { + val expr = ForallExpr(listOf(Decls.Param("x", Int())), True()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ForallExpr).paramDecls } + } + + @Test + fun `test XorExpr serialization`() { + val expr = XorExpr(True(), False()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as XorExpr).leftOp } + } + + @Test + fun `test BvAddExpr serialization`() { + val expr = BvAddExpr(listOf(bv1, bv2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvAddExpr).ops } + } + + @Test + fun `test BvAndExpr serialization`() { + val expr = BvAndExpr(listOf(bv1, bv2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvAndExpr).ops } + } + + @Test + fun `test BvArithShiftRightExpr serialization`() { + val expr = BvArithShiftRightExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvArithShiftRightExpr).leftOp } + } + + @Test + fun `test BvConcatExpr serialization`() { + val expr = BvConcatExpr(listOf(bv1, bv2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvConcatExpr).ops } + } + + @Test + fun `test BvEqExpr serialization`() { + val expr = BvEqExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvEqExpr).leftOp } + } + + @Test + fun `test BvExtractExpr serialization`() { + val expr = BvExtractExpr(BvLitExpr(booleanArrayOf(true, false), true), Int(0), Int(1)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvExtractExpr).from } + } + + @Test + fun `test BvLitExpr serialization`() { + val expr = BvLitExpr(booleanArrayOf(true, false), true) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvLitExpr).value } + } + + @Test + fun `test BvLogicShiftRightExpr serialization`() { + val expr = BvLogicShiftRightExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvLogicShiftRightExpr).leftOp } + } + + @Test + fun `test BvMulExpr serialization`() { + val expr = BvMulExpr(listOf(bv1, bv2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvMulExpr).ops } + } + + @Test + fun `test BvNegExpr serialization`() { + val expr = BvNegExpr(BvLitExpr(booleanArrayOf(true, false), true)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvNegExpr).op } + } + + @Test + fun `test BvNeqExpr serialization`() { + val expr = BvNeqExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvNeqExpr).leftOp } + } + + @Test + fun `test BvNotExpr serialization`() { + val expr = BvNotExpr(BvLitExpr(booleanArrayOf(true, false), true)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvNotExpr).op } + } + + @Test + fun `test BvOrExpr serialization`() { + val expr = BvOrExpr(listOf(bv1, bv2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvOrExpr).ops } + } + + @Test + fun `test BvPosExpr serialization`() { + val expr = BvPosExpr(BvLitExpr(booleanArrayOf(true, false), true)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvPosExpr).op } + } + + @Test + fun `test BvRotateLeftExpr serialization`() { + val expr = BvRotateLeftExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvRotateLeftExpr).leftOp } + } + + @Test + fun `test BvRotateRightExpr serialization`() { + val expr = BvRotateRightExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvRotateRightExpr).leftOp } + } + + @Test + fun `test BvSDivExpr serialization`() { + val expr = BvSDivExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSDivExpr).leftOp } + } + + @Test + fun `test BvSExtExpr serialization`() { + val expr = BvSExtExpr(bv1, BvType(16, null)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSExtExpr).op } + } + + @Test + fun `test BvSGeqExpr serialization`() { + val expr = BvSGeqExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSGeqExpr).leftOp } + } + + @Test + fun `test BvSGtExpr serialization`() { + val expr = BvSGtExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSGtExpr).leftOp } + } + + @Test + fun `test BvSLeqExpr serialization`() { + val expr = BvSLeqExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSLeqExpr).leftOp } + } + + @Test + fun `test BvSLtExpr serialization`() { + val expr = BvSLtExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSLtExpr).leftOp } + } + + @Test + fun `test BvSModExpr serialization`() { + val expr = BvSModExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSModExpr).leftOp } + } + + @Test + fun `test BvSRemExpr serialization`() { + val expr = BvSRemExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSRemExpr).leftOp } + } + + @Test + fun `test BvShiftLeftExpr serialization`() { + val expr = BvShiftLeftExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvShiftLeftExpr).leftOp } + } + + @Test + fun `test BvSignChangeExpr serialization`() { + val expr = BvSignChangeExpr(bv1, BvType(2, false)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSignChangeExpr).op } + } + + @Test + fun `test BvSubExpr serialization`() { + val expr = BvSubExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSubExpr).leftOp } + } + + @Test + fun `test BvUDivExpr serialization`() { + val expr = BvUDivExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvUDivExpr).leftOp } + } + + @Test + fun `test BvUGeqExpr serialization`() { + val expr = BvUGeqExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvUGeqExpr).leftOp } + } + + @Test + fun `test BvUGtExpr serialization`() { + val expr = BvUGtExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvUGtExpr).leftOp } + } + + @Test + fun `test BvULeqExpr serialization`() { + val expr = BvULeqExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvULeqExpr).leftOp } + } + + @Test + fun `test BvULtExpr serialization`() { + val expr = BvULtExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvULtExpr).leftOp } + } + + @Test + fun `test BvURemExpr serialization`() { + val expr = BvURemExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvURemExpr).leftOp } + } + + @Test + fun `test BvXorExpr serialization`() { + val expr = BvXorExpr(listOf(bv1, bv2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvXorExpr).ops } + } + + @Test + fun `test BvZExtExpr serialization`() { + val expr = BvZExtExpr(bv1, BvType(4, true)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvZExtExpr).op } + } + + @Test + fun `test EnumEqExpr serialization`() { + val expr = EnumEqExpr(EnumLitExpr(enumType, "Red"), EnumLitExpr(enumType, "Green")) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as EnumEqExpr).leftOp } + } + + @Test + fun `test EnumLitExpr serialization`() { + val expr = EnumLitExpr(enumType, "Red") + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as EnumLitExpr).value } + } + + @Test + fun `test EnumNeqExpr serialization`() { + val expr = EnumNeqExpr(EnumLitExpr(enumType, "Red"), EnumLitExpr(enumType, "Green")) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as EnumNeqExpr).leftOp } + } + + @Test + fun `test FpAbsExpr serialization`() { + val expr = FpAbsExpr(fp1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpAbsExpr).op } + } + + @Test + fun `test FpAddExpr serialization`() { + val expr = FpAddExpr(RNA, listOf(fp1, fp2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpAddExpr).roundingMode } + } + + @Test + fun `test FpAssignExpr serialization`() { + val expr = FpAssignExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpAssignExpr).leftOp } + } + + @Test + fun `test FpDivExpr serialization`() { + val expr = FpDivExpr(RNE, fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpDivExpr).leftOp } + } + + @Test + fun `test FpEqExpr serialization`() { + val expr = FpEqExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpEqExpr).leftOp } + } + + @Test + fun `test FpFromBvExpr serialization`() { + val expr = FpFromBvExpr(RTN, bv1, FpType(2, 2), false) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpFromBvExpr).op } + } + + @Test + fun `test FpGeqExpr serialization`() { + val expr = FpGeqExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpGeqExpr).leftOp } + } + + @Test + fun `test FpGtExpr serialization`() { + val expr = FpGtExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpGtExpr).leftOp } + } + + @Test + fun `test FpIsInfiniteExpr serialization`() { + val expr = FpIsInfiniteExpr(fp1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpIsInfiniteExpr).op } + } + + @Test + fun `test FpIsNanExpr serialization`() { + val expr = FpIsNanExpr(fp1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpIsNanExpr).op } + } + + @Test + fun `test FpLeqExpr serialization`() { + val expr = FpLeqExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpLeqExpr).leftOp } + } + + @Test + fun `test FpLitExpr serialization`() { + val expr = fp1 + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpLitExpr).exponent } + } + + @Test + fun `test FpLtExpr serialization`() { + val expr = FpLtExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpLtExpr).leftOp } + } + + @Test + fun `test FpMaxExpr serialization`() { + val expr = FpMaxExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpMaxExpr).leftOp } + } + + @Test + fun `test FpMinExpr serialization`() { + val expr = FpMinExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpMinExpr).leftOp } + } + + @Test + fun `test FpMulExpr serialization`() { + val expr = FpMulExpr(RTP, listOf(fp1, fp2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpMulExpr).ops } + } + + @Test + fun `test FpNegExpr serialization`() { + val expr = FpNegExpr(fp1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpNegExpr).op } + } + + @Test + fun `test FpNeqExpr serialization`() { + val expr = FpNeqExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpNeqExpr).leftOp } + } + + @Test + fun `test FpPosExpr serialization`() { + val expr = FpPosExpr(fp1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpPosExpr).op } + } + + @Test + fun `test FpRemExpr serialization`() { + val expr = FpRemExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpRemExpr).leftOp } + } + + @Test + fun `test FpRoundToIntegralExpr serialization`() { + val expr = FpRoundToIntegralExpr(RTZ, fp1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpRoundToIntegralExpr).op } + } + + @Test + fun `test FpSqrtExpr serialization`() { + val expr = FpSqrtExpr(RNE, fp1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpSqrtExpr).op } + } + + @Test + fun `test FpSubExpr serialization`() { + val expr = FpSubExpr(RNE, fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpSubExpr).leftOp } + } + + @Test + fun `test FpToBvExpr serialization`() { + val expr = FpToBvExpr(RNE, fp1, 8, true) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpToBvExpr).op } + } + + @Test + fun `test FpToFpExpr serialization`() { + val expr = FpToFpExpr(RNE, fp1, 8, 24) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpToFpExpr).op } + } + + @Test + fun `test FuncAppExpr serialization`() { + val expr = FuncAppExpr(func, Int(1)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FuncAppExpr).func } + } + + @Test + fun `test FuncLitExpr serialization`() { + val expr = func + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FuncLitExpr).result } + } + + @Test + fun `test IntAddExpr serialization`() { + val expr = IntAddExpr(listOf(Int(1), Int(2))) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntAddExpr).ops } + } + + @Test + fun `test IntDivExpr serialization`() { + val expr = IntDivExpr(Int(4), Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntDivExpr).leftOp } + } + + @Test + fun `test IntEqExpr serialization`() { + val expr = IntEqExpr(Int(1), Int(1)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntEqExpr).leftOp } + } + + @Test + fun `test IntGeqExpr serialization`() { + val expr = IntGeqExpr(Int(2), Int(1)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntGeqExpr).leftOp } + } + + @Test + fun `test IntGtExpr serialization`() { + val expr = IntGtExpr(Int(2), Int(1)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntGtExpr).leftOp } + } + + @Test + fun `test IntLeqExpr serialization`() { + val expr = IntLeqExpr(Int(1), Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntLeqExpr).leftOp } + } + + @Test + fun `test IntLitExpr serialization`() { + val expr = Int(42) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntLitExpr).value } + } + + @Test + fun `test IntLtExpr serialization`() { + val expr = IntLtExpr(Int(1), Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntLtExpr).leftOp } + } + + @Test + fun `test IntModExpr serialization`() { + val expr = IntModExpr(Int(5), Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntModExpr).leftOp } + } + + @Test + fun `test IntMulExpr serialization`() { + val expr = IntMulExpr(listOf(Int(2), Int(3))) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntMulExpr).ops } + } + + @Test + fun `test IntNegExpr serialization`() { + val expr = IntNegExpr(Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntNegExpr).op } + } + + @Test + fun `test IntNeqExpr serialization`() { + val expr = IntNeqExpr(Int(1), Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntNeqExpr).leftOp } + } + + @Test + fun `test IntPosExpr serialization`() { + val expr = IntPosExpr(Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntPosExpr).op } + } + + @Test + fun `test IntRemExpr serialization`() { + val expr = IntRemExpr(Int(5), Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntRemExpr).leftOp } + } + + @Test + fun `test IntSubExpr serialization`() { + val expr = IntSubExpr(Int(5), Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntSubExpr).leftOp } + } + + @Test + fun `test IntToRatExpr serialization`() { + val expr = IntToRatExpr(Int(5)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntToRatExpr).op } + } + + @Test + fun `test RatAddExpr serialization`() { + val expr = RatAddExpr(listOf(rat1, rat2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatAddExpr).ops } + } + + @Test + fun `test RatDivExpr serialization`() { + val expr = RatDivExpr(rat1, rat2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatDivExpr).leftOp } + } + + @Test + fun `test RatEqExpr serialization`() { + val expr = RatEqExpr(rat1, rat1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatEqExpr).leftOp } + } + + @Test + fun `test RatGeqExpr serialization`() { + val expr = RatGeqExpr(rat2, rat1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatGeqExpr).leftOp } + } + + @Test + fun `test RatGtExpr serialization`() { + val expr = RatGtExpr(rat2, rat1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatGtExpr).leftOp } + } + + @Test + fun `test RatLeqExpr serialization`() { + val expr = RatLeqExpr(rat1, rat2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatLeqExpr).leftOp } + } + + @Test + fun `test RatLitExpr serialization`() { + val expr = rat1 + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatLitExpr).denom } + } + + @Test + fun `test RatLtExpr serialization`() { + val expr = RatLtExpr(rat1, rat2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatLtExpr).leftOp } + } + + @Test + fun `test RatMulExpr serialization`() { + val expr = RatMulExpr(listOf(rat1, rat2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatMulExpr).ops } + } + + @Test + fun `test RatNegExpr serialization`() { + val expr = RatNegExpr(rat2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatNegExpr).op } + } + + @Test + fun `test RatNeqExpr serialization`() { + val expr = RatNeqExpr(rat1, rat2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatNeqExpr).leftOp } + } + + @Test + fun `test RatPosExpr serialization`() { + val expr = RatPosExpr(rat2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatPosExpr).op } + } + + @Test + fun `test RatSubExpr serialization`() { + val expr = RatSubExpr(rat2, rat1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatSubExpr).leftOp } + } + + @Test + fun `test RatToIntExpr serialization`() { + val expr = RatToIntExpr(rat2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatToIntExpr).op } + } +} diff --git a/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt new file mode 100644 index 0000000000..8be059c288 --- /dev/null +++ b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt @@ -0,0 +1,139 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.serialization + +import hu.bme.mit.theta.core.decl.Decls +import hu.bme.mit.theta.core.stmt.* +import hu.bme.mit.theta.core.stmt.Stmts.NonDet +import hu.bme.mit.theta.core.stmt.Stmts.Sequence +import hu.bme.mit.theta.core.type.anytype.Dereference +import hu.bme.mit.theta.core.type.inttype.IntExprs.Eq +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import kotlinx.serialization.encodeToString +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +class StmtSerializationTest { + + companion object { + + private val json = coreJson + } + + @Test + fun `test AssignStmt serialization`() { + val x = Decls.Var("x", Int()) + val original: Stmt = AssignStmt(x, Int(42)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + assertEquals("x", (deserialized as AssignStmt<*>).varDecl.name) + } + + @Test + fun `test AssumeStmt serialization`() { + val x = Decls.Var("x", Int()) + val cond = Eq(x.ref, Int(42)) + val original: Stmt = AssumeStmt(cond) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + assertEquals("(= x 42)", (deserialized as AssumeStmt).cond.toString()) + } + + @Test + fun `test HavocStmt serialization`() { + val x = Decls.Var("x", Int()) + val original: Stmt = HavocStmt(x) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + assertEquals("x", (deserialized as HavocStmt<*>).varDecl.name) + } + + @Test + fun `test IfStmt serialization`() { + val x = Decls.Var("x", Int()) + val cond = Eq(x.ref, Int(42)) + val thenStmt: Stmt = AssignStmt(x, Int(1)) + val elseStmt: Stmt = AssignStmt(x, Int(0)) + val original: Stmt = IfStmt(cond, thenStmt, elseStmt) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test LoopStmt serialization`() { + val i = Decls.Var("i", Int()) + val x = Decls.Var("x", Int()) + val stmt: Stmt = AssignStmt(x, Int(1)) + val original: Stmt = LoopStmt(stmt, i, Int(0), Int(42)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test MemoryAssignStmt serialization`() { + val dereference = Dereference(Decls.Var("ptr", Int()).ref, Int(0), Int()) + val original: Stmt = MemoryAssignStmt(dereference, Int(42)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test NonDetStmt serialization`() { + val s1 = AssignStmt(Decls.Var("x", Int()), Int(1)) + val s2 = AssignStmt(Decls.Var("y", Int()), Int(2)) + val s3 = SkipStmt + val original: Stmt = NonDet(listOf(s1, s2, s3)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test OrtStmt serialization`() { + val s1 = AssignStmt(Decls.Var("x", Int()), Int(1)) + val s2 = AssignStmt(Decls.Var("y", Int()), Int(2)) + val s3 = SkipStmt + val original: Stmt = OrtStmt(listOf(s1, s2, s3)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test SequenceStmt serialization`() { + val s1 = AssignStmt(Decls.Var("x", Int()), Int(1)) + val s2 = AssignStmt(Decls.Var("y", Int()), Int(2)) + val s3 = SkipStmt + val original: Stmt = Sequence(listOf(s1, s2, s3)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test SkipStmt serialization`() { + val original: Stmt = SkipStmt + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } +} diff --git a/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializationTest.kt b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializationTest.kt new file mode 100644 index 0000000000..d83c2b61e5 --- /dev/null +++ b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializationTest.kt @@ -0,0 +1,163 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.serialization + +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.arraytype.ArrayType +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.type.bvtype.BvType +import hu.bme.mit.theta.core.type.enumtype.EnumType +import hu.bme.mit.theta.core.type.fptype.FpType +import hu.bme.mit.theta.core.type.functype.FuncType +import hu.bme.mit.theta.core.type.inttype.IntType +import hu.bme.mit.theta.core.type.rattype.RatType +import kotlinx.serialization.SerializationException +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertDoesNotThrow +import org.junit.jupiter.api.assertThrows +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.Arguments +import org.junit.jupiter.params.provider.MethodSource + +class TypeSerializationTest { + + companion object { + + private val json = coreJson + + @JvmStatic + val bvTypeTestData: List = + listOf(Arguments.of(42, true), Arguments.of(1, false), Arguments.of(8, null)) + } + + @Test + fun `test BoolType serialization`() { + val original: Type = BoolType + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test IntType serialization`() { + val original: Type = IntType + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @ParameterizedTest + @MethodSource("getBvTypeTestData") + fun `test BvType serialization`(size: Int, signed: Boolean?) { + val original: Type = BvType(size, signed) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + val deserializedBvType = deserialized as BvType + assertEquals(size, deserializedBvType.size) + } + + @Test + fun `test ArrayType serialization`() { + val original: Type = ArrayType(BoolType, IntType) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + + val complex: Type = + ArrayType( + indexType = BvType(8, false), + elemType = ArrayType(indexType = ArrayType(IntType, RatType), elemType = BoolType), + ) + val complexSerialized = json.encodeToString(complex) + val complexDeserialized = json.decodeFromString(complexSerialized) + assertEquals(complex, complexDeserialized) + assertDoesNotThrow { + complexDeserialized as ArrayType, BoolType>> + } + assertThrows { + (complexDeserialized as ArrayType).elemType.size + } + } + + @Test + fun `test FuncType serialization`() { + val original: Type = FuncType(IntType, BoolType) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test FpType serialization`() { + val original: Type = FpType(8, 24) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test RatType serialization`() { + val original: Type = RatType + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test EnumType serialization`() { + val original: Type = EnumType.of("Color", listOf("Red", "Green", "Blue")) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test heterogeneous Type collection serialization`() { + val original: List = + listOf( + BoolType, + IntType, + BvType(8, true), + ArrayType(BoolType, IntType), + FuncType(IntType, BoolType), + FpType(8, 24), + RatType, + EnumType.of("Color", listOf("Red", "Green", "Blue")), + ) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString>(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test specific serializer must ignore type field`() { + val original: Type = BvType(8, true) + val serialized = json.encodeToString(original) + assertDoesNotThrow { (json.decodeFromString(serialized) as BvType).size } + assertThrows { json.decodeFromString(serialized).size } + + val jsonIgnoreUnknownKey = Json { + serializersModule = coreSerializerModule + classDiscriminator = "class" + ignoreUnknownKeys = true + } + assertDoesNotThrow { jsonIgnoreUnknownKey.decodeFromString(serialized).size } + } +} diff --git a/subprojects/common/core/src/testFixtures/java/hu/bme/mit/theta/core/utils/ArrayTestUtils.java b/subprojects/common/core/src/testFixtures/java/hu/bme/mit/theta/core/utils/ArrayTestUtils.java index 23ce8f0103..c80c6db5d9 100644 --- a/subprojects/common/core/src/testFixtures/java/hu/bme/mit/theta/core/utils/ArrayTestUtils.java +++ b/subprojects/common/core/src/testFixtures/java/hu/bme/mit/theta/core/utils/ArrayTestUtils.java @@ -20,17 +20,11 @@ import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import hu.bme.mit.theta.common.Tuple2; -import hu.bme.mit.theta.core.type.arraytype.ArrayEqExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayInitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayLitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayNeqExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayType; -import hu.bme.mit.theta.core.type.arraytype.ArrayWriteExpr; +import hu.bme.mit.theta.core.type.arraytype.*; import java.util.Arrays; import java.util.Collection; import java.util.List; +import kotlin.Pair; public class ArrayTestUtils { @@ -68,7 +62,7 @@ public static Collection BasicOperations() { Int(3), ArrayReadExpr.of( ArrayLitExpr.of( - List.of(Tuple2.of(Int(42), Int(3))), + List.of(new Pair<>(Int(42), Int(3))), Int(5), ArrayType.of(Int(), Int())), Int(42)) @@ -78,7 +72,7 @@ public static Collection BasicOperations() { Int(3), ArrayReadExpr.of( ArrayInitExpr.of( - List.of(Tuple2.of(Int(42), Int(3))), + List.of(new Pair<>(Int(42), Int(3))), Int(5), ArrayType.of(Int(), Int())), Int(42)) diff --git a/subprojects/common/grammar/src/main/java/hu/bme/mit/theta/grammar/dsl/expr/ExprParser.kt b/subprojects/common/grammar/src/main/java/hu/bme/mit/theta/grammar/dsl/expr/ExprParser.kt index 1f63f99b35..ef5364b5e8 100644 --- a/subprojects/common/grammar/src/main/java/hu/bme/mit/theta/grammar/dsl/expr/ExprParser.kt +++ b/subprojects/common/grammar/src/main/java/hu/bme/mit/theta/grammar/dsl/expr/ExprParser.kt @@ -17,7 +17,6 @@ package hu.bme.mit.theta.grammar.dsl.expr import com.google.common.base.Preconditions import com.google.common.collect.ImmutableList -import hu.bme.mit.theta.common.Tuple2 import hu.bme.mit.theta.common.dsl.BasicScope import hu.bme.mit.theta.common.dsl.Env import hu.bme.mit.theta.common.dsl.Scope @@ -49,7 +48,6 @@ import hu.bme.mit.theta.core.type.fptype.FpLitExpr import hu.bme.mit.theta.core.type.fptype.FpRoundingMode import hu.bme.mit.theta.core.type.fptype.FpType import hu.bme.mit.theta.core.type.functype.FuncExprs -import hu.bme.mit.theta.core.type.inttype.IntExprs import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.type.inttype.IntLitExpr import hu.bme.mit.theta.core.type.rattype.RatExprs @@ -147,7 +145,7 @@ class ExpressionWrapper(scope: Scope, content: String) { ctx.decls .stream() .map { d: DeclContext -> - Decls.Param(d.name.getText(), TypeWrapper(d.ttype.textWithWS()).instantiate()) + Decls.Param(d.name.text, TypeWrapper(d.ttype.textWithWS()).instantiate()) } .collect(Collectors.toList()) } @@ -156,7 +154,7 @@ class ExpressionWrapper(scope: Scope, content: String) { //// override fun visitIteExpr(ctx: IteExprContext): Expr { return if (ctx.cond != null) { - val cond: Expr = TypeUtils.cast(ctx.cond.accept>(this), BoolExprs.Bool()) + val cond: Expr = cast(ctx.cond.accept>(this), BoolExprs.Bool()) val then: Expr<*> = ctx.then.accept>(this) val elze: Expr<*> = ctx.elze.accept>(this) AbstractExprs.Ite(cond, then, elze) @@ -167,10 +165,8 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitIffExpr(ctx: IffExprContext): Expr { return if (ctx.rightOp != null) { - val leftOp: Expr = - TypeUtils.cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) - val rightOp: Expr = - TypeUtils.cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) + val leftOp: Expr = cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) + val rightOp: Expr = cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) BoolExprs.Iff(leftOp, rightOp) } else { visitChildren(ctx) @@ -179,10 +175,8 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitImplyExpr(ctx: ImplyExprContext): Expr { return if (ctx.rightOp != null) { - val leftOp: Expr = - TypeUtils.cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) - val rightOp: Expr = - TypeUtils.cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) + val leftOp: Expr = cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) + val rightOp: Expr = cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) BoolExprs.Imply(leftOp, rightOp) } else { visitChildren(ctx) @@ -193,7 +187,7 @@ class ExpressionWrapper(scope: Scope, content: String) { return if (ctx.paramDecls != null) { val paramDecls = createParamList(ctx.paramDecls) push(paramDecls) - val op: Expr = TypeUtils.cast(ctx.op.accept>(this), BoolExprs.Bool()) + val op: Expr = cast(ctx.op.accept>(this), BoolExprs.Bool()) pop() BoolExprs.Forall(paramDecls, op) } else { @@ -205,7 +199,7 @@ class ExpressionWrapper(scope: Scope, content: String) { return if (ctx.paramDecls != null) { val paramDecls = createParamList(ctx.paramDecls) push(paramDecls) - val op: Expr = TypeUtils.cast(ctx.op.accept>(this), BoolExprs.Bool()) + val op: Expr = cast(ctx.op.accept>(this), BoolExprs.Bool()) pop() BoolExprs.Exists(paramDecls, op) } else { @@ -216,9 +210,9 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitOrExpr(ctx: OrExprContext): Expr { return if (ctx.ops.size >= 1) { val opStream: Stream> = - ctx.ops - .stream() - .map({ op: ExprContext -> TypeUtils.cast(op.accept>(this), BoolExprs.Bool()) }) + ctx.ops.stream().map { op: ExprContext -> + cast(op.accept>(this), BoolExprs.Bool()) + } val ops: Collection> = opStream.collect(Collectors.toList()) BoolExprs.Or(ops) } else { @@ -228,10 +222,8 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitXorExpr(ctx: XorExprContext): Expr { return if (ctx.rightOp != null) { - val leftOp: Expr = - TypeUtils.cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) - val rightOp: Expr = - TypeUtils.cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) + val leftOp: Expr = cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) + val rightOp: Expr = cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) BoolExprs.Xor(leftOp, rightOp) } else { visitChildren(ctx) @@ -241,9 +233,9 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitAndExpr(ctx: AndExprContext): Expr { return if (ctx.ops.size >= 1) { val opStream: Stream> = - ctx.ops - .stream() - .map({ op: ExprContext -> TypeUtils.cast(op.accept>(this), BoolExprs.Bool()) }) + ctx.ops.stream().map { op: ExprContext -> + cast(op.accept>(this), BoolExprs.Bool()) + } val ops: Collection> = opStream.collect(Collectors.toList()) BoolExprs.And(ops) } else { @@ -253,7 +245,7 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitNotExpr(ctx: NotExprContext): Expr { return if (ctx.op != null) { - val op: Expr = TypeUtils.cast(ctx.op.accept>(this), BoolExprs.Bool()) + val op: Expr = cast(ctx.op.accept>(this), BoolExprs.Bool()) BoolExprs.Not(op) } else { visitChildren(ctx) @@ -264,7 +256,7 @@ class ExpressionWrapper(scope: Scope, content: String) { return if (ctx.rightOp != null) { val leftOp: Expr<*> = ctx.leftOp.accept>(this) val rightOp: Expr<*> = ctx.rightOp.accept>(this) - when (ctx.oper.getType()) { + when (ctx.oper.type) { EQ -> AbstractExprs.Eq(leftOp, rightOp) NEQ -> AbstractExprs.Neq(leftOp, rightOp) else -> throw ParseException(ctx, "Unknown operator") @@ -278,7 +270,7 @@ class ExpressionWrapper(scope: Scope, content: String) { return if (ctx.rightOp != null) { val leftOp: Expr<*> = ctx.leftOp.accept>(this) val rightOp: Expr<*> = ctx.rightOp.accept>(this) - when (ctx.oper.getType()) { + when (ctx.oper.type) { LT -> AbstractExprs.Lt(leftOp, rightOp) LEQ -> AbstractExprs.Leq(leftOp, rightOp) GT -> AbstractExprs.Gt(leftOp, rightOp) @@ -302,7 +294,7 @@ class ExpressionWrapper(scope: Scope, content: String) { return if (ctx.rightOp != null) { val leftOp = ctx.leftOp.accept>(this) as Expr val rightOp = ctx.rightOp.accept>(this) as Expr - when (ctx.oper.getType()) { + when (ctx.oper.type) { FPMAX -> FpExprs.Max(leftOp, rightOp) FPMIN -> FpExprs.Min(leftOp, rightOp) else -> throw ParseException(ctx, "Unknown operator") @@ -331,8 +323,8 @@ class ExpressionWrapper(scope: Scope, content: String) { return if (ctx.rightOp != null) { val leftOp = TypeUtils.castBv(ctx.leftOp.accept>(this)) val rightOp = TypeUtils.castBv(ctx.rightOp.accept>(this)) - when (ctx.oper.getType()) { - BV_XOR -> BvExprs.Xor(java.util.List.of(leftOp, rightOp)) + when (ctx.oper.type) { + BV_XOR -> BvExprs.Xor(listOf(leftOp, rightOp)) else -> throw ParseException(ctx, "Unknown operator") } } else { @@ -358,7 +350,7 @@ class ExpressionWrapper(scope: Scope, content: String) { return if (ctx.rightOp != null) { val leftOp = TypeUtils.castBv(ctx.leftOp.accept>(this)) val rightOp = TypeUtils.castBv(ctx.rightOp.accept>(this)) - when (ctx.oper.getType()) { + when (ctx.oper.type) { BV_SHL -> BvExprs.ShiftLeft(leftOp, rightOp) BV_ASHR -> BvExprs.ArithShiftRight(leftOp, rightOp) BV_LSHR -> BvExprs.LogicShiftRight(leftOp, rightOp) @@ -415,7 +407,7 @@ class ExpressionWrapper(scope: Scope, content: String) { FPADD -> FpExprs.Add( getRoundingMode(ctx.oper.text), - java.util.List.of(TypeUtils.castFp(leftOp), TypeUtils.castFp(rightOp)), + listOf(TypeUtils.castFp(leftOp), TypeUtils.castFp(rightOp)), ) FPSUB -> @@ -449,7 +441,7 @@ class ExpressionWrapper(scope: Scope, content: String) { ImmutableList.builder>().addAll(leftOp.ops).add(rightOp).build() BvExprs.Add(ops) } else { - BvExprs.Add(Arrays.asList(leftOp, rightOp)) + BvExprs.Add(listOf(leftOp, rightOp)) } } @@ -504,18 +496,18 @@ class ExpressionWrapper(scope: Scope, content: String) { REM -> createRemExpr(leftOp, rightOp) BV_UREM -> createBvURemExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) BV_SREM -> createBvSRemExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - FPREM -> FpExprs.Rem(leftOp as Expr, rightOp as Expr) + FPREM -> FpExprs.Rem(leftOp as Expr, rightOp as Expr) FPMUL -> FpExprs.Mul( getRoundingMode(ctx.oper.text), - java.util.List.of(leftOp as Expr, rightOp as Expr), + listOf(leftOp as Expr, rightOp as Expr), ) FPDIV -> FpExprs.Div( getRoundingMode(ctx.oper.text), - leftOp as Expr, - rightOp as Expr, + leftOp as Expr, + rightOp as Expr, ) else -> throw ParseException(ctx, "Unknown operator '" + oper.text + "'") @@ -538,7 +530,7 @@ class ExpressionWrapper(scope: Scope, content: String) { ImmutableList.builder>().addAll(leftOp.ops).add(rightOp).build() BvExprs.Mul(ops) } else { - BvExprs.Mul(Arrays.asList(leftOp, rightOp)) + BvExprs.Mul(listOf(leftOp, rightOp)) } } @@ -620,14 +612,14 @@ class ExpressionWrapper(scope: Scope, content: String) { ImmutableList.builder>().addAll(leftOp.ops).add(rightOp).build() BvExprs.Concat(ops) } else { - BvExprs.Concat(Arrays.asList(leftOp, rightOp)) + BvExprs.Concat(listOf(leftOp, rightOp)) } } override fun visitBvExtendExpr(ctx: BvExtendExprContext): Expr { return if (ctx.rightOp != null) { - val extendType = BvExprs.BvType(ctx.rightOp.size.getText().toInt()) - when (ctx.oper.getType()) { + val extendType = BvExprs.BvType(ctx.rightOp.size.text.toInt()) + when (ctx.oper.type) { BV_ZERO_EXTEND -> BvExprs.ZExt(TypeUtils.castBv(ctx.leftOp.accept>(this)), extendType) @@ -645,42 +637,42 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitUnaryExpr(ctx: UnaryExprContext): Expr { return if (ctx.op != null) { val op: Expr<*> = ctx.op.accept>(this) - when (ctx.oper.getType()) { + when (ctx.oper.type) { PLUS -> AbstractExprs.Pos(op) MINUS -> AbstractExprs.Neg(op) - FP_ABS -> FpExprs.Abs(op as Expr) - FP_IS_INF -> FpExprs.IsInfinite(op as Expr) - FP_IS_NAN -> FpExprs.IsNan(op as Expr) + FP_ABS -> FpExprs.Abs(op as Expr) + FP_IS_INF -> FpExprs.IsInfinite(op as Expr) + FP_IS_NAN -> FpExprs.IsNan(op as Expr) FPROUNDTOINT -> - FpExprs.RoundToIntegral(getRoundingMode(ctx.oper.text), op as Expr) + FpExprs.RoundToIntegral(getRoundingMode(ctx.oper.text), op as Expr) - FPSQRT -> FpExprs.Sqrt(getRoundingMode(ctx.oper.text), op as Expr) + FPSQRT -> FpExprs.Sqrt(getRoundingMode(ctx.oper.text), op as Expr) FPTOFP -> FpExprs.ToFp( getRoundingMode(ctx.oper.text), - op as Expr, - getExp(ctx.oper.getText()), - getSignificand(ctx.oper.getText()), + op as Expr, + getExp(ctx.oper.text), + getSignificand(ctx.oper.text), ) FPTOBV -> FpExprs.ToBv( getRoundingMode(ctx.oper.text), - op as Expr, - getBvSize(ctx.oper.getText()), - isSignedBv(ctx.oper.getText()), + op as Expr, + getBvSize(ctx.oper.text), + isSignedBv(ctx.oper.text), ) FP_FROM_BV -> FpExprs.FromBv( getRoundingMode(ctx.oper.text), - op as Expr, - FpType.of(getExp(ctx.oper.getText()), getSignificand(ctx.oper.getText())), - isSignedFp(ctx.oper.getText()), + op as Expr, + FpType.of(getExp(ctx.oper.text), getSignificand(ctx.oper.text)), + isSignedFp(ctx.oper.text), ) - FPNEG -> FpExprs.Neg(op as Expr) - FPPOS -> FpExprs.Pos(op as Expr) + FPNEG -> FpExprs.Neg(op as Expr) + FPPOS -> FpExprs.Pos(op as Expr) BV_POS -> BvExprs.Pos(op as Expr) BV_NEG -> BvExprs.Neg(op as Expr) else -> throw ParseException(ctx, "Unknown operator") @@ -736,7 +728,7 @@ class ExpressionWrapper(scope: Scope, content: String) { if (matcher.find()) { return FpRoundingMode.valueOf(matcher.group(1).uppercase()) } - return FpRoundingMode.getDefaultRoundingMode() + return FpRoundingMode.defaultRoundingMode } override fun visitBitwiseNotExpr(ctx: BitwiseNotExprContext): Expr { @@ -788,7 +780,7 @@ class ExpressionWrapper(scope: Scope, content: String) { return if (ctx.op != null) { val op = ctx.op.accept(this) val bitvec = TypeUtils.castBv(op) - return BvExprs.Extract(bitvec, Int(ctx.from.getText()), IntExprs.Int(ctx.until.getText())) + return BvExprs.Extract(bitvec, Int(ctx.from.text), Int(ctx.until.text)) } else { visitChildren(ctx) } @@ -825,13 +817,13 @@ class ExpressionWrapper(scope: Scope, content: String) { } override fun visitIntLitExpr(ctx: IntLitExprContext): IntLitExpr { - val value: BigInteger = BigInteger(ctx.text) - return IntExprs.Int(value) + val value = BigInteger(ctx.text) + return Int(value) } override fun visitRatLitExpr(ctx: RatLitExprContext): RatLitExpr { val num = BigInteger(ctx.num.text) - val denom = BigInteger(ctx.denom.getText()) + val denom = BigInteger(ctx.denom.text) return RatExprs.Rat(num, denom) } @@ -849,7 +841,7 @@ class ExpressionWrapper(scope: Scope, content: String) { val valueType = elseElem.type val elems = ctx.indexExpr.mapIndexed { idx, it -> - Tuple2.of(it.accept(this), ctx.valueExpr[idx].accept(this)) + Pair(it.accept(this), ctx.valueExpr[idx].accept(this)) } return ExprUtils.simplify( ArrayInitExpr.create(elems, elseElem, ArrayType.of(indexType, valueType)) @@ -858,7 +850,7 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitBvLitExpr(ctx: BvLitExprContext): Expr { val sizeAndContent: Array = - ctx.bv.getText().split("['#]".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() + ctx.bv.text.split("['#]".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() val content = if (sizeAndContent.size == 2) sizeAndContent[1] else sizeAndContent[0] val value: BooleanArray = if (content.startsWith("b")) { @@ -875,12 +867,12 @@ class ExpressionWrapper(scope: Scope, content: String) { for (i in value.indices) { bvValue[value.size - 1 - i] = value[value.size - 1 - i] } - return BvExprs.Bv(bvValue) + return Bv(bvValue) } private fun decodeBinaryBvContent(lit: String): BooleanArray { val value = BooleanArray(lit.length) - for (i in 0 until lit.length) { + for (i in lit.indices) { when (lit.toCharArray()[i]) { '0' -> value[i] = false '1' -> value[i] = true @@ -893,11 +885,11 @@ class ExpressionWrapper(scope: Scope, content: String) { private fun decodeDecimalBvContent(lit: String, size: Int): BooleanArray { var value = BigInteger(lit) Preconditions.checkArgument( - value.compareTo(BigInteger.TWO.pow(size - 1).multiply(BigInteger.valueOf(-1))) >= 0 && - value.compareTo(BigInteger.TWO.pow(size)) < 0, + value >= BigInteger.TWO.pow(size - 1).multiply(BigInteger.valueOf(-1)) && + value < BigInteger.TWO.pow(size), "Decimal literal is not in range", ) - if (value.compareTo(BigInteger.ZERO) < 0) { + if (value < BigInteger.ZERO) { value = value.add(BigInteger.TWO.pow(size)) } return decodeBinaryBvContent(value.toString(2)) @@ -905,7 +897,7 @@ class ExpressionWrapper(scope: Scope, content: String) { private fun decodeHexadecimalBvContent(lit: String): BooleanArray { val builder = StringBuilder() - for (i in 0 until lit.length) { + for (i in lit.indices) { when (lit.toCharArray()[i].lowercaseChar()) { '0' -> builder.append("0000") '1' -> builder.append("0001") @@ -930,9 +922,9 @@ class ExpressionWrapper(scope: Scope, content: String) { } override fun visitIdExpr(ctx: IdExprContext): RefExpr<*> { - val optSymbol = currentScope.resolve(ctx.id.getText()) + val optSymbol = currentScope.resolve(ctx.id.text) if (optSymbol.isEmpty) { - throw ParseException(ctx, "Identifier '" + ctx.id.getText() + "' cannot be resolved") + throw ParseException(ctx, "Identifier '" + ctx.id.text + "' cannot be resolved") } val symbol = optSymbol.get() val decl = env.eval(symbol) as Decl<*> diff --git a/subprojects/common/grammar/src/test/java/hu/bme/mit/theta/grammar/dsl/ExprTest.kt b/subprojects/common/grammar/src/test/java/hu/bme/mit/theta/grammar/dsl/ExprTest.kt index 9dca4e8338..212fa20dec 100644 --- a/subprojects/common/grammar/src/test/java/hu/bme/mit/theta/grammar/dsl/ExprTest.kt +++ b/subprojects/common/grammar/src/test/java/hu/bme/mit/theta/grammar/dsl/ExprTest.kt @@ -15,7 +15,6 @@ */ package hu.bme.mit.theta.grammar.dsl -import hu.bme.mit.theta.common.Tuple2 import hu.bme.mit.theta.common.dsl.Env import hu.bme.mit.theta.common.dsl.Symbol import hu.bme.mit.theta.common.dsl.SymbolTable @@ -24,16 +23,46 @@ import hu.bme.mit.theta.core.decl.Decls.Param import hu.bme.mit.theta.core.decl.Decls.Var import hu.bme.mit.theta.core.decl.ParamDecl import hu.bme.mit.theta.core.type.Expr -import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.* -import hu.bme.mit.theta.core.type.anytype.Exprs.* +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Add +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Div +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Geq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Gt +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Ite +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Leq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Lt +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Mod +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Mul +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neg +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Pos +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Rem +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Sub +import hu.bme.mit.theta.core.type.anytype.Exprs.Dereference +import hu.bme.mit.theta.core.type.anytype.Exprs.Prime import hu.bme.mit.theta.core.type.anytype.RefExpr import hu.bme.mit.theta.core.type.arraytype.ArrayLitExpr import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr import hu.bme.mit.theta.core.type.arraytype.ArrayType import hu.bme.mit.theta.core.type.arraytype.ArrayWriteExpr -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Exists +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Forall +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Iff +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Not +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Xor import hu.bme.mit.theta.core.type.bvtype.BvExprs -import hu.bme.mit.theta.core.type.bvtype.BvExprs.* +import hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv +import hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType +import hu.bme.mit.theta.core.type.bvtype.BvExprs.Concat +import hu.bme.mit.theta.core.type.bvtype.BvExprs.Extract +import hu.bme.mit.theta.core.type.bvtype.BvExprs.Not +import hu.bme.mit.theta.core.type.bvtype.BvExprs.SExt +import hu.bme.mit.theta.core.type.bvtype.BvExprs.UDiv +import hu.bme.mit.theta.core.type.bvtype.BvExprs.ZExt import hu.bme.mit.theta.core.type.fptype.FpExprs import hu.bme.mit.theta.core.type.fptype.FpExprs.Max import hu.bme.mit.theta.core.type.fptype.FpExprs.Min @@ -90,13 +119,13 @@ class ExprTest { emptyMap>(), ), arrayOf( - ArrayLitExpr.of(listOf(Tuple2.of(Int(0), Int(1))), Int(2), ArrayType.of(Int(), Int())), + ArrayLitExpr.of(listOf(Pair(Int(0), Int(1))), Int(2), ArrayType.of(Int(), Int())), "(array (0 1) (default 2))", emptyMap>(), ), arrayOf( ArrayLitExpr.of( - listOf(Tuple2.of(Int(0), Int(1)), Tuple2.of(Int(1), Int(2))), + listOf(Pair(Int(0), Int(1)), Pair(Int(1), Int(2))), Int(3), ArrayType.of(Int(), Int()), ), diff --git a/subprojects/common/grammar/src/test/java/hu/bme/mit/theta/grammar/dsl/StmtTest.kt b/subprojects/common/grammar/src/test/java/hu/bme/mit/theta/grammar/dsl/StmtTest.kt index 2d3b5fdc23..cdae5b3097 100644 --- a/subprojects/common/grammar/src/test/java/hu/bme/mit/theta/grammar/dsl/StmtTest.kt +++ b/subprojects/common/grammar/src/test/java/hu/bme/mit/theta/grammar/dsl/StmtTest.kt @@ -22,7 +22,10 @@ import hu.bme.mit.theta.core.decl.Decl import hu.bme.mit.theta.core.decl.Decls.Var import hu.bme.mit.theta.core.decl.ParamDecl import hu.bme.mit.theta.core.stmt.Stmt -import hu.bme.mit.theta.core.stmt.Stmts.* +import hu.bme.mit.theta.core.stmt.Stmts.Assign +import hu.bme.mit.theta.core.stmt.Stmts.Assume +import hu.bme.mit.theta.core.stmt.Stmts.Havoc +import hu.bme.mit.theta.core.stmt.Stmts.MemoryAssign import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq import hu.bme.mit.theta.core.type.anytype.Exprs.Dereference import hu.bme.mit.theta.core.type.inttype.IntExprs.Int @@ -92,11 +95,4 @@ class StmtTest { val stmt = StatementWrapper(memory.toString(), SimpleScope(symbolTable)).instantiate(env) Assert.assertEquals(memory, stmt) } - - data class NamedSymbol(val _name: String) : Symbol { - - override fun getName(): String { - return _name - } - } } diff --git a/subprojects/common/ksp-processor/README.md b/subprojects/common/ksp-processor/README.md new file mode 100644 index 0000000000..f5b8f87759 --- /dev/null +++ b/subprojects/common/ksp-processor/README.md @@ -0,0 +1 @@ +KSP processor module \ No newline at end of file diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Type.java b/subprojects/common/ksp-processor/build.gradle.kts similarity index 83% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Type.java rename to subprojects/common/ksp-processor/build.gradle.kts index b3b5934fd8..3e46a5b11d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Type.java +++ b/subprojects/common/ksp-processor/build.gradle.kts @@ -13,8 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type; +plugins { + kotlin("jvm") +} -public interface Type { - DomainSize getDomainSize(); +dependencies { + implementation("com.google.devtools.ksp:symbol-processing-api:1.9.25-1.0.20") } diff --git a/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt new file mode 100644 index 0000000000..c21ffaa0c1 --- /dev/null +++ b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt @@ -0,0 +1,101 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.ksp + +import com.google.devtools.ksp.getAllSuperTypes +import com.google.devtools.ksp.isAbstract +import com.google.devtools.ksp.processing.* +import com.google.devtools.ksp.symbol.* + +class PolymorphicModuleProcessor( + private val codeGenerator: CodeGenerator, + private val pack: String, + private val baseClass: String, +) : SymbolProcessor { + + override fun process(resolver: Resolver): List { + val topLevelClassFqn = "$pack.$baseClass" + val generatedPack = "$pack.generated" + + val subclasses = resolver.getAllFiles().flatMap { file -> + file.declarations + .filterIsInstance() + .filter { !it.isAbstract() && it.getSealedSubclasses().toList().isEmpty() } + .filter { clazz -> + clazz.annotations.any { + it.annotationType.resolve().declaration.qualifiedName?.asString() == "kotlinx.serialization.Serializable" + } + } + .filter { + val allSuperTypes = it.getAllSuperTypes() + allSuperTypes.any { superType -> + superType.declaration.qualifiedName?.asString() == topLevelClassFqn + } + } + }.toList() + + if (subclasses.isEmpty()) return emptyList() + + val inputFiles = subclasses.mapNotNull { it.containingFile }.distinct() + val file = try { + codeGenerator.createNewFile( + Dependencies(false, *inputFiles.toTypedArray()), + generatedPack, + "${baseClass}Serializer" + ) + } catch (e: FileAlreadyExistsException) { + return emptyList() + } + + file.bufferedWriter().use { writer -> + writer.write("package $generatedPack\n\n") + writer.write("import kotlinx.serialization.modules.SerializersModule\n") + writer.write("import kotlinx.serialization.modules.polymorphic\n") + writer.write("import kotlinx.serialization.modules.subclass\n") + writer.write("import $topLevelClassFqn\n") + + subclasses.forEach { subclass -> + writer.write("import ${subclass.qualifiedName?.asString()}\n") + } + + writer.write( + "\nval ${baseClass.replaceFirstChar { it.lowercase() }}SerializerModule = SerializersModule {\n" + ) + writer.write(" polymorphic($baseClass::class) {\n") + + subclasses.forEach { subclass -> + val serializer = subclass.annotations.firstOrNull { + it.shortName.getShortName() == "Serializable" + }?.arguments?.find { it.name?.asString() == "with" }?.let { with -> + (with.value as? KSType)?.declaration?.qualifiedName?.asString()?.let { + if (it == "kotlinx.serialization.KSerializer") null else it + } + } + + val name = subclass.simpleName.asString() + if (serializer == null) { + writer.write(" subclass($name::class)\n") + } else { + writer.write(" subclass($name::class, $serializer)\n") + } + } + writer.write(" }\n") + writer.write("}\n") + } + + return emptyList() + } +} \ No newline at end of file diff --git a/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt new file mode 100644 index 0000000000..a4f8ff5399 --- /dev/null +++ b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.ksp + +import com.google.devtools.ksp.processing.* + +sealed class PolymorphicModuleProcessorProvider( + private val pack: String, + private val baseClass: String, +) : SymbolProcessorProvider { + override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor = + PolymorphicModuleProcessor(environment.codeGenerator, pack, baseClass) +} + +class TypeSerializerProcessorProvider : + PolymorphicModuleProcessorProvider("hu.bme.mit.theta.core.type", "Type") + +class DeclSerializerProcessorProvider : + PolymorphicModuleProcessorProvider("hu.bme.mit.theta.core.decl", "Decl") + +class StmtSerializerProcessorProvider : + PolymorphicModuleProcessorProvider("hu.bme.mit.theta.core.stmt", "Stmt") + +class ExprSerializerProcessorProvider : + PolymorphicModuleProcessorProvider("hu.bme.mit.theta.core.type", "Expr") diff --git a/subprojects/common/ksp-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider b/subprojects/common/ksp-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider new file mode 100644 index 0000000000..13272e6dd1 --- /dev/null +++ b/subprojects/common/ksp-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider @@ -0,0 +1,4 @@ +hu.bme.mit.theta.ksp.TypeSerializerProcessorProvider +hu.bme.mit.theta.ksp.DeclSerializerProcessorProvider +hu.bme.mit.theta.ksp.StmtSerializerProcessorProvider +hu.bme.mit.theta.ksp.ExprSerializerProcessorProvider \ No newline at end of file diff --git a/subprojects/common/ltl/src/main/kotlin/hu/bme/mit/theta/common/cfa/buchi/hoa/APGeneratorVisitor.kt b/subprojects/common/ltl/src/main/kotlin/hu/bme/mit/theta/common/cfa/buchi/hoa/APGeneratorVisitor.kt index bf6f705c92..da6e125dd0 100644 --- a/subprojects/common/ltl/src/main/kotlin/hu/bme/mit/theta/common/cfa/buchi/hoa/APGeneratorVisitor.kt +++ b/subprojects/common/ltl/src/main/kotlin/hu/bme/mit/theta/common/cfa/buchi/hoa/APGeneratorVisitor.kt @@ -179,7 +179,7 @@ class APGeneratorVisitor( } override fun visitEnumLitExpr(ctx: EnumLitExprContext): Expr<*> { - return EnumLitExpr.of(enumTypes[ctx.type.text], ctx.lit.text) + return EnumLitExpr.of(enumTypes[ctx.type.text]!!, ctx.lit.text) } override fun visitVariable(ctx: LTLGrammarParser.VariableContext): Expr<*> { diff --git a/subprojects/common/multi-tests/src/test/kotlin/multi/MultiNondetDiningPhilosophersTest.kt b/subprojects/common/multi-tests/src/test/kotlin/multi/MultiNondetDiningPhilosophersTest.kt index a3b44a187f..2bd5cb6730 100644 --- a/subprojects/common/multi-tests/src/test/kotlin/multi/MultiNondetDiningPhilosophersTest.kt +++ b/subprojects/common/multi-tests/src/test/kotlin/multi/MultiNondetDiningPhilosophersTest.kt @@ -36,7 +36,9 @@ import hu.bme.mit.theta.common.logging.ConsoleLogger import hu.bme.mit.theta.common.logging.Logger import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.solver.Solver import hu.bme.mit.theta.solver.z3legacy.Z3LegacySolverFactory diff --git a/subprojects/frontends/c-frontend/build.gradle.kts b/subprojects/frontends/c-frontend/build.gradle.kts index 1f8376de5f..603f5d73aa 100644 --- a/subprojects/frontends/c-frontend/build.gradle.kts +++ b/subprojects/frontends/c-frontend/build.gradle.kts @@ -16,9 +16,11 @@ plugins { id("kotlin-common") id("antlr-grammar") + id("kotlinx-serialization") } dependencies { implementation(project(":theta-core")) implementation(project(":theta-common")) implementation(project(":theta-grammar")) + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") } diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/ExpressionVisitor.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/ExpressionVisitor.java index d2d966a8b2..0359a853c3 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/ExpressionVisitor.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/ExpressionVisitor.java @@ -376,7 +376,7 @@ public Expr visitShiftExpression(CParser.ShiftExpressionContext ctx) { (BvType) smallestCommonType.getSmtType()); if (ctx.signs.get(i - 1).getText().equals(">>")) { // TODO: is this sound? - if (leftExpr.getType().getSigned()) { + if (leftExpr.getType().isSigned()) { expr = BvExprs.ArithShiftRight(leftExpr, rightExpr); } else { expr = BvExprs.LogicShiftRight(leftExpr, rightExpr); diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/SerializerModule.kt b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/SerializerModule.kt new file mode 100644 index 0000000000..25b521fe54 --- /dev/null +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/SerializerModule.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.frontend.transformation.grammar.expression + +import hu.bme.mit.theta.core.serialization.coreSerializerModule +import hu.bme.mit.theta.core.type.Expr +import kotlinx.serialization.json.Json +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass + +val frontendSerializerModule = SerializersModule { + include(coreSerializerModule) + polymorphic(Expr::class) { subclass(UnsupportedInitializerExpr::class) } +} + +val frontendJson = Json { + serializersModule = frontendSerializerModule + classDiscriminator = "class" +} diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializer.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializer.java deleted file mode 100644 index b623c4f9d4..0000000000 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializer.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.frontend.transformation.grammar.expression; - -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.inttype.IntType; -import hu.bme.mit.theta.frontend.UnsupportedFrontendElementException; - -public class UnsupportedInitializer extends NullaryExpr { - - @Override - public IntType getType() { - return Int(); - } - - @Override - public LitExpr eval(Valuation val) { - throw new UnsupportedFrontendElementException( - "UnsupportedInitializer expressions are not supported."); - } - - @Override - public String toString() { - return "UnsupportedInitializer"; - } -} diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializerExpr.kt b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializerExpr.kt new file mode 100644 index 0000000000..61d6289072 --- /dev/null +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializerExpr.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.frontend.transformation.grammar.expression + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.type.inttype.IntType +import hu.bme.mit.theta.frontend.UnsupportedFrontendElementException +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("UnsupportedInitializer") +data object UnsupportedInitializerExpr : NullaryExpr() { + + override val type: IntType + get() = Int() + + override fun eval(`val`: Valuation): LitExpr = + throw UnsupportedFrontendElementException( + "UnsupportedInitializer expressions are not supported." + ) + + override fun toString(): String = "UnsupportedInitializer" + + @JvmStatic fun getInstance(): UnsupportedInitializerExpr = this +} diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/type/DeclarationVisitor.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/type/DeclarationVisitor.java index f9286e488e..d41863fbe6 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/type/DeclarationVisitor.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/type/DeclarationVisitor.java @@ -24,7 +24,7 @@ import hu.bme.mit.theta.core.type.Expr; import hu.bme.mit.theta.frontend.ParseContext; import hu.bme.mit.theta.frontend.UnsupportedFrontendElementException; -import hu.bme.mit.theta.frontend.transformation.grammar.expression.UnsupportedInitializer; +import hu.bme.mit.theta.frontend.transformation.grammar.expression.UnsupportedInitializerExpr; import hu.bme.mit.theta.frontend.transformation.grammar.function.FunctionVisitor; import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.TypedefVisitor; import hu.bme.mit.theta.frontend.transformation.model.declaration.CDeclaration; @@ -117,7 +117,8 @@ public List getDeclarations( initializerExpression = cInitializerList; } catch (NullPointerException e) { initializerExpression = - new CExpr(new UnsupportedInitializer(), parseContext); + new CExpr( + UnsupportedInitializerExpr.getInstance(), parseContext); parseContext .getMetadata() .create( diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/CComplexType.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/CComplexType.java index 4314f23788..b574811452 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/CComplexType.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/CComplexType.java @@ -214,23 +214,23 @@ private static CComplexType getType(Type type, ParseContext parseContext) { case "bool": return new CBool(null, parseContext); case "short": - return ((BvType) type).getSigned() + return ((BvType) type).isSigned() ? new CSignedShort(null, parseContext) : new CUnsignedShort(null, parseContext); case "int": - return ((BvType) type).getSigned() + return ((BvType) type).isSigned() ? new CSignedInt(null, parseContext) : new CUnsignedInt(null, parseContext); case "long": - return ((BvType) type).getSigned() + return ((BvType) type).isSigned() ? new CSignedLong(null, parseContext) : new CUnsignedLong(null, parseContext); case "longlong": - return ((BvType) type).getSigned() + return ((BvType) type).isSigned() ? new CSignedLongLong(null, parseContext) : new CUnsignedLongLong(null, parseContext); case "__int128": - return ((BvType) type).getSigned() + return ((BvType) type).isSigned() ? new CSigned128(null, parseContext) : new CUnsigned128(null, parseContext); } diff --git a/subprojects/solver/graph-solver/src/main/java/hu/bme/mit/theta/graphsolver/compilers/pattern2expr/Pattern2ExprCompiler.kt b/subprojects/solver/graph-solver/src/main/java/hu/bme/mit/theta/graphsolver/compilers/pattern2expr/Pattern2ExprCompiler.kt index a01e511885..c9d66f3d64 100644 --- a/subprojects/solver/graph-solver/src/main/java/hu/bme/mit/theta/graphsolver/compilers/pattern2expr/Pattern2ExprCompiler.kt +++ b/subprojects/solver/graph-solver/src/main/java/hu/bme/mit/theta/graphsolver/compilers/pattern2expr/Pattern2ExprCompiler.kt @@ -22,7 +22,13 @@ import hu.bme.mit.theta.core.decl.ConstDecl import hu.bme.mit.theta.core.decl.Decls.Const import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Iff +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Not +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.graphsolver.ThreeVL import hu.bme.mit.theta.graphsolver.compilers.GraphPatternCompiler @@ -47,7 +53,6 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map, model: Valuation, @@ -103,14 +108,14 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map { val compiled = reflexive.constrainedRule.accept(this) - val ret = And(Or(events.map { compiled[Tuple2.of(it, it)] }), And(transitiveConstraints)) + val ret = And(Or(events.map { compiled[Tuple2.of(it, it)]!! }), And(transitiveConstraints)) transitiveConstraints.clear() return ret } override fun compile(irreflexive: Irreflexive): Expr { val compiled = irreflexive.constrainedRule.accept(this) - val ret = And(Not(Or(events.map { compiled[Tuple2.of(it, it)] })), And(transitiveConstraints)) + val ret = And(Not(Or(events.map { compiled[Tuple2.of(it, it)]!! })), And(transitiveConstraints)) transitiveConstraints.clear() return ret } @@ -122,7 +127,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map events.map { b -> - Pair(Tuple2.of(a, b), And(op1Compiled[Tuple1.of(a)], op2Compiled[Tuple1.of(b)])) + Pair(Tuple2.of(a, b), And(op1Compiled[Tuple1.of(a)]!!, op2Compiled[Tuple1.of(b)]!!)) } } return ret.flatten().toMap() @@ -143,7 +148,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map Pair( Tuple2.of(a, b), - And(op1Compiled[Tuple2.of(a, b)], Not(op2Compiled[Tuple2.of(a, b)])), + And(op1Compiled[Tuple2.of(a, b)]!!, Not(op2Compiled[Tuple2.of(a, b)]!!)), ) } } @@ -156,7 +161,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map - Pair(Tuple1.of(a), And(op1Compiled[Tuple1.of(a)], Not(op2Compiled[Tuple1.of(a)]))) + Pair(Tuple1.of(a), And(op1Compiled[Tuple1.of(a)]!!, Not(op2Compiled[Tuple1.of(a)]!!))) } return ret.toMap() } @@ -165,7 +170,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map Pair(Tuple1.of(a), Or(events.map { b -> opCompiled[Tuple2.of(a, b)] })) } + events.map { a -> Pair(Tuple1.of(a), Or(events.map { b -> opCompiled[Tuple2.of(a, b)]!! })) } return ret.toMap() } @@ -182,7 +187,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map events.map { b -> - Pair(Tuple2.of(a, b), if (a == b) True() else checkNotNull(opCompiled[Tuple2.of(a, b)])) + Pair(Tuple2.of(a, b), if (a == b) True() else opCompiled[Tuple2.of(a, b)]!!) } } .flatten() @@ -196,7 +201,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map events.map { b -> - Pair(Tuple2.of(a, b), And(op1Compiled[Tuple2.of(a, b)], op2Compiled[Tuple2.of(a, b)])) + Pair(Tuple2.of(a, b), And(op1Compiled[Tuple2.of(a, b)]!!, op2Compiled[Tuple2.of(a, b)]!!)) } } return ret.flatten().toMap() @@ -208,7 +213,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map - Pair(Tuple1.of(a), And(op1Compiled[Tuple1.of(a)], op2Compiled[Tuple1.of(a)])) + Pair(Tuple1.of(a), And(op1Compiled[Tuple1.of(a)]!!, op2Compiled[Tuple1.of(a)]!!)) } return ret.toMap() } @@ -216,9 +221,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map> { val opCompiled = pattern.op.accept(this) return events - .map { a -> - events.map { b -> Pair(Tuple2.of(a, b), checkNotNull(opCompiled[Tuple2.of(b, a)])) } - } + .map { a -> events.map { b -> Pair(Tuple2.of(a, b), opCompiled[Tuple2.of(b, a)]!!) } } .flatten() .toMap() } @@ -227,7 +230,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map Pair(Tuple1.of(a), Or(events.map { b -> opCompiled[Tuple2.of(a, b)] })) } + events.map { a -> Pair(Tuple1.of(a), Or(events.map { b -> opCompiled[Tuple2.of(a, b)]!! })) } return ret.toMap() } @@ -261,17 +264,17 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map Iff( Or( - opCompiled[Tuple2.of(a, b)], + opCompiled[Tuple2.of(a, b)]!!, Or( events.map { c -> Or( - And(opCompiled[Tuple2.of(a, c)], checkNotNull(consts[Tuple2.of(c, b)]).ref), - And(checkNotNull(consts[Tuple2.of(a, c)]).ref, opCompiled[Tuple2.of(c, b)]), + And(opCompiled[Tuple2.of(a, c)]!!, consts[Tuple2.of(c, b)]!!.ref), + And(consts[Tuple2.of(a, c)]!!.ref, opCompiled[Tuple2.of(c, b)]!!), ) } ), ), - checkNotNull(consts[Tuple2.of(a, b)]).ref, + consts[Tuple2.of(a, b)]!!.ref, ) } } @@ -281,7 +284,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map events.map { b -> - Pair(Tuple2.of(a, b), if (a == b) True() else checkNotNull(consts[Tuple2.of(a, b)]).ref) + Pair(Tuple2.of(a, b), if (a == b) True() else consts[Tuple2.of(a, b)]!!.ref) } } return ret.flatten().toMap() @@ -301,7 +304,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map a != c && b != c } - .map { c -> And(op1Compiled[Tuple2.of(a, c)], op2Compiled[Tuple2.of(c, b)]) } + .map { c -> And(op1Compiled[Tuple2.of(a, c)]!!, op2Compiled[Tuple2.of(c, b)]!!) } ), ) } @@ -314,7 +317,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map events.map { b -> - Pair(Tuple2.of(a, b), if (a == b) checkNotNull(opCompiled[Tuple1.of(a)]) else False()) + Pair(Tuple2.of(a, b), if (a == b) opCompiled[Tuple1.of(a)]!! else False()) } } return ret.flatten().toMap() @@ -350,25 +353,19 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map Iff( Or( - opCompiled[Tuple2.of(a, b)], + opCompiled[Tuple2.of(a, b)]!!, Or( events .filter { c -> a != c && b != c } .map { c -> Or( - And( - opCompiled[Tuple2.of(a, c)], - checkNotNull(consts[Tuple2.of(c, b)]).ref, - ), - And( - checkNotNull(consts[Tuple2.of(a, c)]).ref, - opCompiled[Tuple2.of(c, b)], - ), + And(opCompiled[Tuple2.of(a, c)]!!, consts[Tuple2.of(c, b)]!!.ref), + And(consts[Tuple2.of(a, c)]!!.ref, opCompiled[Tuple2.of(c, b)]!!), ) } ), ), - checkNotNull(consts[Tuple2.of(a, b)]).ref, + consts[Tuple2.of(a, b)]!!.ref, ) } } @@ -376,9 +373,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map - events.map { b -> Pair(Tuple2.of(a, b), checkNotNull(consts[Tuple2.of(a, b)]).ref) } - } + events.map { a -> events.map { b -> Pair(Tuple2.of(a, b), consts[Tuple2.of(a, b)]!!.ref) } } return ret.flatten().toMap() } @@ -389,7 +384,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map events.map { b -> - Pair(Tuple2.of(a, b), Or(op1Compiled[Tuple2.of(a, b)], op2Compiled[Tuple2.of(a, b)])) + Pair(Tuple2.of(a, b), Or(op1Compiled[Tuple2.of(a, b)]!!, op2Compiled[Tuple2.of(a, b)]!!)) } } return ret.flatten().toMap() @@ -401,7 +396,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map - Pair(Tuple1.of(a), And(op1Compiled[Tuple1.of(a)], op2Compiled[Tuple1.of(a)])) + Pair(Tuple1.of(a), And(op1Compiled[Tuple1.of(a)]!!, op2Compiled[Tuple1.of(a)]!!)) } return ret.toMap() } diff --git a/subprojects/solver/solver-javasmt/src/main/java/hu/bme/mit/theta/solver/javasmt/JavaSMTExprTransformer.java b/subprojects/solver/solver-javasmt/src/main/java/hu/bme/mit/theta/solver/javasmt/JavaSMTExprTransformer.java index 2fb06b2417..65e8b1adc3 100644 --- a/subprojects/solver/solver-javasmt/src/main/java/hu/bme/mit/theta/solver/javasmt/JavaSMTExprTransformer.java +++ b/subprojects/solver/solver-javasmt/src/main/java/hu/bme/mit/theta/solver/javasmt/JavaSMTExprTransformer.java @@ -15,7 +15,7 @@ */ package hu.bme.mit.theta.solver.javasmt; -import static com.google.common.base.Preconditions.checkState; +import static com.google.common.base.Preconditions.checkNotNull; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; @@ -34,119 +34,18 @@ import hu.bme.mit.theta.core.type.anytype.Dereference; import hu.bme.mit.theta.core.type.anytype.IteExpr; import hu.bme.mit.theta.core.type.anytype.RefExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayEqExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayInitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayLitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayNeqExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayWriteExpr; -import hu.bme.mit.theta.core.type.booltype.AndExpr; -import hu.bme.mit.theta.core.type.booltype.ExistsExpr; -import hu.bme.mit.theta.core.type.booltype.FalseExpr; -import hu.bme.mit.theta.core.type.booltype.ForallExpr; -import hu.bme.mit.theta.core.type.booltype.IffExpr; -import hu.bme.mit.theta.core.type.booltype.ImplyExpr; -import hu.bme.mit.theta.core.type.booltype.NotExpr; -import hu.bme.mit.theta.core.type.booltype.OrExpr; -import hu.bme.mit.theta.core.type.booltype.TrueExpr; -import hu.bme.mit.theta.core.type.booltype.XorExpr; -import hu.bme.mit.theta.core.type.bvtype.BvAddExpr; -import hu.bme.mit.theta.core.type.bvtype.BvAndExpr; -import hu.bme.mit.theta.core.type.bvtype.BvArithShiftRightExpr; -import hu.bme.mit.theta.core.type.bvtype.BvConcatExpr; -import hu.bme.mit.theta.core.type.bvtype.BvEqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvExtractExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLitExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLogicShiftRightExpr; -import hu.bme.mit.theta.core.type.bvtype.BvMulExpr; -import hu.bme.mit.theta.core.type.bvtype.BvNegExpr; -import hu.bme.mit.theta.core.type.bvtype.BvNeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvNotExpr; -import hu.bme.mit.theta.core.type.bvtype.BvOrExpr; -import hu.bme.mit.theta.core.type.bvtype.BvPosExpr; -import hu.bme.mit.theta.core.type.bvtype.BvRotateLeftExpr; -import hu.bme.mit.theta.core.type.bvtype.BvRotateRightExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSDivExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSExtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSGeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSGtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSLeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSLtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSModExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSRemExpr; -import hu.bme.mit.theta.core.type.bvtype.BvShiftLeftExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSignChangeExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSubExpr; -import hu.bme.mit.theta.core.type.bvtype.BvUDivExpr; -import hu.bme.mit.theta.core.type.bvtype.BvUGeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvUGtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvULeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvULtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvURemExpr; -import hu.bme.mit.theta.core.type.bvtype.BvXorExpr; -import hu.bme.mit.theta.core.type.bvtype.BvZExtExpr; +import hu.bme.mit.theta.core.type.arraytype.*; +import hu.bme.mit.theta.core.type.booltype.*; +import hu.bme.mit.theta.core.type.bvtype.*; import hu.bme.mit.theta.core.type.enumtype.EnumEqExpr; import hu.bme.mit.theta.core.type.enumtype.EnumLitExpr; import hu.bme.mit.theta.core.type.enumtype.EnumNeqExpr; import hu.bme.mit.theta.core.type.enumtype.EnumType; -import hu.bme.mit.theta.core.type.fptype.FpAbsExpr; -import hu.bme.mit.theta.core.type.fptype.FpAddExpr; -import hu.bme.mit.theta.core.type.fptype.FpAssignExpr; -import hu.bme.mit.theta.core.type.fptype.FpDivExpr; -import hu.bme.mit.theta.core.type.fptype.FpEqExpr; -import hu.bme.mit.theta.core.type.fptype.FpFromBvExpr; -import hu.bme.mit.theta.core.type.fptype.FpGeqExpr; -import hu.bme.mit.theta.core.type.fptype.FpGtExpr; -import hu.bme.mit.theta.core.type.fptype.FpIsInfiniteExpr; -import hu.bme.mit.theta.core.type.fptype.FpIsNanExpr; -import hu.bme.mit.theta.core.type.fptype.FpLeqExpr; -import hu.bme.mit.theta.core.type.fptype.FpLitExpr; -import hu.bme.mit.theta.core.type.fptype.FpLtExpr; -import hu.bme.mit.theta.core.type.fptype.FpMaxExpr; -import hu.bme.mit.theta.core.type.fptype.FpMinExpr; -import hu.bme.mit.theta.core.type.fptype.FpMulExpr; -import hu.bme.mit.theta.core.type.fptype.FpNegExpr; -import hu.bme.mit.theta.core.type.fptype.FpNeqExpr; -import hu.bme.mit.theta.core.type.fptype.FpPosExpr; -import hu.bme.mit.theta.core.type.fptype.FpRemExpr; -import hu.bme.mit.theta.core.type.fptype.FpRoundToIntegralExpr; -import hu.bme.mit.theta.core.type.fptype.FpRoundingMode; -import hu.bme.mit.theta.core.type.fptype.FpSqrtExpr; -import hu.bme.mit.theta.core.type.fptype.FpSubExpr; -import hu.bme.mit.theta.core.type.fptype.FpToBvExpr; -import hu.bme.mit.theta.core.type.fptype.FpToFpExpr; +import hu.bme.mit.theta.core.type.fptype.*; import hu.bme.mit.theta.core.type.functype.FuncAppExpr; import hu.bme.mit.theta.core.type.functype.FuncType; -import hu.bme.mit.theta.core.type.inttype.IntAddExpr; -import hu.bme.mit.theta.core.type.inttype.IntDivExpr; -import hu.bme.mit.theta.core.type.inttype.IntEqExpr; -import hu.bme.mit.theta.core.type.inttype.IntGeqExpr; -import hu.bme.mit.theta.core.type.inttype.IntGtExpr; -import hu.bme.mit.theta.core.type.inttype.IntLeqExpr; -import hu.bme.mit.theta.core.type.inttype.IntLitExpr; -import hu.bme.mit.theta.core.type.inttype.IntLtExpr; -import hu.bme.mit.theta.core.type.inttype.IntModExpr; -import hu.bme.mit.theta.core.type.inttype.IntMulExpr; -import hu.bme.mit.theta.core.type.inttype.IntNegExpr; -import hu.bme.mit.theta.core.type.inttype.IntNeqExpr; -import hu.bme.mit.theta.core.type.inttype.IntPosExpr; -import hu.bme.mit.theta.core.type.inttype.IntRemExpr; -import hu.bme.mit.theta.core.type.inttype.IntSubExpr; -import hu.bme.mit.theta.core.type.inttype.IntToRatExpr; -import hu.bme.mit.theta.core.type.rattype.RatAddExpr; -import hu.bme.mit.theta.core.type.rattype.RatDivExpr; -import hu.bme.mit.theta.core.type.rattype.RatEqExpr; -import hu.bme.mit.theta.core.type.rattype.RatGeqExpr; -import hu.bme.mit.theta.core.type.rattype.RatGtExpr; -import hu.bme.mit.theta.core.type.rattype.RatLeqExpr; -import hu.bme.mit.theta.core.type.rattype.RatLitExpr; -import hu.bme.mit.theta.core.type.rattype.RatLtExpr; -import hu.bme.mit.theta.core.type.rattype.RatMulExpr; -import hu.bme.mit.theta.core.type.rattype.RatNegExpr; -import hu.bme.mit.theta.core.type.rattype.RatNeqExpr; -import hu.bme.mit.theta.core.type.rattype.RatPosExpr; -import hu.bme.mit.theta.core.type.rattype.RatSubExpr; -import hu.bme.mit.theta.core.type.rattype.RatToIntExpr; +import hu.bme.mit.theta.core.type.inttype.*; +import hu.bme.mit.theta.core.type.rattype.*; import hu.bme.mit.theta.core.utils.BvUtils; import java.util.ArrayList; import java.util.List; @@ -154,28 +53,11 @@ import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.sosy_lab.java_smt.api.ArrayFormula; -import org.sosy_lab.java_smt.api.ArrayFormulaManager; -import org.sosy_lab.java_smt.api.BitvectorFormula; -import org.sosy_lab.java_smt.api.BitvectorFormulaManager; -import org.sosy_lab.java_smt.api.BooleanFormula; -import org.sosy_lab.java_smt.api.BooleanFormulaManager; -import org.sosy_lab.java_smt.api.EnumerationFormula; -import org.sosy_lab.java_smt.api.EnumerationFormulaManager; -import org.sosy_lab.java_smt.api.FloatingPointFormula; -import org.sosy_lab.java_smt.api.FloatingPointFormulaManager; -import org.sosy_lab.java_smt.api.FloatingPointRoundingMode; -import org.sosy_lab.java_smt.api.Formula; -import org.sosy_lab.java_smt.api.FormulaType; +import kotlin.Pair; +import org.sosy_lab.java_smt.api.*; import org.sosy_lab.java_smt.api.FormulaType.FloatingPointType; -import org.sosy_lab.java_smt.api.FunctionDeclaration; -import org.sosy_lab.java_smt.api.IntegerFormulaManager; -import org.sosy_lab.java_smt.api.NumeralFormula; import org.sosy_lab.java_smt.api.NumeralFormula.IntegerFormula; import org.sosy_lab.java_smt.api.NumeralFormula.RationalFormula; -import org.sosy_lab.java_smt.api.QuantifiedFormulaManager; -import org.sosy_lab.java_smt.api.RationalFormulaManager; -import org.sosy_lab.java_smt.api.SolverContext; final class JavaSMTExprTransformer { @@ -389,12 +271,11 @@ private static FloatingPointRoundingMode transformRoundingMode( }; } - //// + /// / /* * General */ - public Formula toTerm(final Expr expr) { try { return exprToTerm.get(expr, () -> table.dispatch(expr)); @@ -1176,9 +1057,9 @@ private Formula transformArrayLit( final FormulaType indexType = (FormulaType) transformer.toSort(expr.getType().getIndexType()); var arr = arrayFormulaManager.makeArray(elseElem, indexType, elemType); - for (Tuple2, ? extends LitExpr> element : expr.getElements()) { - final TI index = (TI) toTerm(element.get1()); - final TE elem = (TE) toTerm(element.get2()); + for (Pair, ? extends LitExpr> element : expr.getElements()) { + final TI index = (TI) toTerm(element.getFirst()); + final TE elem = (TE) toTerm(element.getSecond()); arr = arrayFormulaManager.store(arr, index, elem); } return arr; @@ -1196,9 +1077,9 @@ private Formula transformArrayInit( final FormulaType indexType = (FormulaType) transformer.toSort(expr.getType().getIndexType()); var arr = arrayFormulaManager.makeArray(elseElem, indexType, elemType); - for (Tuple2, ? extends Expr> element : expr.getElements()) { - final TI index = (TI) toTerm(element.get1()); - final TE elem = (TE) toTerm(element.get2()); + for (Pair, ? extends Expr> element : expr.getElements()) { + final TI index = (TI) toTerm(element.getFirst()); + final TE elem = (TE) toTerm(element.getSecond()); arr = arrayFormulaManager.store(arr, index, elem); } return arr; @@ -1240,8 +1121,8 @@ private Formula transformFuncApp(final FuncAppExpr expr) { } private Formula transformDereference(final Dereference expr) { - checkState( - expr.getUniquenessIdx().isPresent(), + checkNotNull( + expr.getUniquenessIdx(), "Incomplete dereferences (missing uniquenessIdx) are not handled properly."); final var sort = transformer.toSort(expr.getArray().getType()); final var sortName = expr.getArray().getType().toString() + "-" + expr.getType().toString(); @@ -1261,7 +1142,7 @@ private Formula transformDereference(final Dereference expr) { funcDecl, toTerm(expr.getArray()), toTerm(expr.getOffset()), - toTerm(expr.getUniquenessIdx().get())); + toTerm(expr.getUniquenessIdx())); return func; } diff --git a/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTSolverTest.java b/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTSolverTest.java index e74c79f064..889bcc3932 100644 --- a/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTSolverTest.java +++ b/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTSolverTest.java @@ -18,25 +18,18 @@ import static com.google.common.collect.ImmutableList.of; import static hu.bme.mit.theta.core.decl.Decls.Const; import static hu.bme.mit.theta.core.decl.Decls.Param; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.ArrayInit; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Write; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; import static hu.bme.mit.theta.core.type.functype.FuncExprs.App; import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Add; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import hu.bme.mit.theta.common.OsHelper; import hu.bme.mit.theta.common.OsHelper.OperatingSystem; -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.core.decl.ConstDecl; import hu.bme.mit.theta.core.decl.ParamDecl; import hu.bme.mit.theta.core.model.ImmutableValuation; @@ -57,11 +50,8 @@ import hu.bme.mit.theta.solver.Solver; import hu.bme.mit.theta.solver.SolverStatus; import hu.bme.mit.theta.solver.UCSolver; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Optional; +import java.util.*; +import kotlin.Pair; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -205,11 +195,11 @@ public void testArray() { // @Test public void testArrayInit() { final ConstDecl> arr = Const("arr", Array(Int(), Int())); - var elems = new ArrayList, Expr>>(); + var elems = new ArrayList, Expr>>(); ConstDecl noname = Const("noname", Int()); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Int(2))); - elems.add(Tuple2.of(Int(2), Add(noname.getRef(), Int(3)))); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Int(2))); + elems.add(new Pair<>(Int(2), Add(noname.getRef(), Int(3)))); var initarr = ArrayInit(elems, Int(100), Array(Int(), Int())); solver.add(ArrayExprs.Eq(arr.getRef(), initarr)); diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibExprTransformer.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibExprTransformer.java index 9fbd60ceea..9bad932709 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibExprTransformer.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibExprTransformer.java @@ -15,7 +15,7 @@ */ package hu.bme.mit.theta.solver.smtlib.impl.generic; -import static com.google.common.base.Preconditions.checkState; +import static com.google.common.base.Preconditions.checkNotNull; import static hu.bme.mit.theta.core.decl.Decls.Param; import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; import static hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibSymbolTable.encodeSymbol; @@ -34,120 +34,19 @@ import hu.bme.mit.theta.core.type.anytype.Dereference; import hu.bme.mit.theta.core.type.anytype.IteExpr; import hu.bme.mit.theta.core.type.anytype.RefExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayEqExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayInitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayLitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayNeqExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayWriteExpr; -import hu.bme.mit.theta.core.type.booltype.AndExpr; -import hu.bme.mit.theta.core.type.booltype.ExistsExpr; -import hu.bme.mit.theta.core.type.booltype.FalseExpr; -import hu.bme.mit.theta.core.type.booltype.ForallExpr; -import hu.bme.mit.theta.core.type.booltype.IffExpr; -import hu.bme.mit.theta.core.type.booltype.ImplyExpr; -import hu.bme.mit.theta.core.type.booltype.NotExpr; -import hu.bme.mit.theta.core.type.booltype.OrExpr; -import hu.bme.mit.theta.core.type.booltype.TrueExpr; -import hu.bme.mit.theta.core.type.booltype.XorExpr; -import hu.bme.mit.theta.core.type.bvtype.BvAddExpr; -import hu.bme.mit.theta.core.type.bvtype.BvAndExpr; -import hu.bme.mit.theta.core.type.bvtype.BvArithShiftRightExpr; -import hu.bme.mit.theta.core.type.bvtype.BvConcatExpr; -import hu.bme.mit.theta.core.type.bvtype.BvEqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvExtractExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLitExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLogicShiftRightExpr; -import hu.bme.mit.theta.core.type.bvtype.BvMulExpr; -import hu.bme.mit.theta.core.type.bvtype.BvNegExpr; -import hu.bme.mit.theta.core.type.bvtype.BvNeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvNotExpr; -import hu.bme.mit.theta.core.type.bvtype.BvOrExpr; -import hu.bme.mit.theta.core.type.bvtype.BvPosExpr; -import hu.bme.mit.theta.core.type.bvtype.BvRotateLeftExpr; -import hu.bme.mit.theta.core.type.bvtype.BvRotateRightExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSDivExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSExtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSGeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSGtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSLeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSLtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSModExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSRemExpr; -import hu.bme.mit.theta.core.type.bvtype.BvShiftLeftExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSignChangeExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSubExpr; -import hu.bme.mit.theta.core.type.bvtype.BvUDivExpr; -import hu.bme.mit.theta.core.type.bvtype.BvUGeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvUGtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvULeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvULtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvURemExpr; -import hu.bme.mit.theta.core.type.bvtype.BvXorExpr; -import hu.bme.mit.theta.core.type.bvtype.BvZExtExpr; +import hu.bme.mit.theta.core.type.arraytype.*; +import hu.bme.mit.theta.core.type.booltype.*; +import hu.bme.mit.theta.core.type.bvtype.*; import hu.bme.mit.theta.core.type.enumtype.EnumEqExpr; import hu.bme.mit.theta.core.type.enumtype.EnumLitExpr; import hu.bme.mit.theta.core.type.enumtype.EnumNeqExpr; import hu.bme.mit.theta.core.type.enumtype.EnumType; -import hu.bme.mit.theta.core.type.fptype.FpAbsExpr; -import hu.bme.mit.theta.core.type.fptype.FpAddExpr; -import hu.bme.mit.theta.core.type.fptype.FpAssignExpr; -import hu.bme.mit.theta.core.type.fptype.FpDivExpr; -import hu.bme.mit.theta.core.type.fptype.FpEqExpr; -import hu.bme.mit.theta.core.type.fptype.FpFromBvExpr; -import hu.bme.mit.theta.core.type.fptype.FpGeqExpr; -import hu.bme.mit.theta.core.type.fptype.FpGtExpr; -import hu.bme.mit.theta.core.type.fptype.FpIsInfiniteExpr; -import hu.bme.mit.theta.core.type.fptype.FpIsNanExpr; -import hu.bme.mit.theta.core.type.fptype.FpLeqExpr; -import hu.bme.mit.theta.core.type.fptype.FpLitExpr; -import hu.bme.mit.theta.core.type.fptype.FpLtExpr; -import hu.bme.mit.theta.core.type.fptype.FpMaxExpr; -import hu.bme.mit.theta.core.type.fptype.FpMinExpr; -import hu.bme.mit.theta.core.type.fptype.FpMulExpr; -import hu.bme.mit.theta.core.type.fptype.FpNegExpr; -import hu.bme.mit.theta.core.type.fptype.FpNeqExpr; -import hu.bme.mit.theta.core.type.fptype.FpPosExpr; -import hu.bme.mit.theta.core.type.fptype.FpRemExpr; -import hu.bme.mit.theta.core.type.fptype.FpRoundToIntegralExpr; -import hu.bme.mit.theta.core.type.fptype.FpRoundingMode; -import hu.bme.mit.theta.core.type.fptype.FpSqrtExpr; -import hu.bme.mit.theta.core.type.fptype.FpSubExpr; -import hu.bme.mit.theta.core.type.fptype.FpToBvExpr; -import hu.bme.mit.theta.core.type.fptype.FpToFpExpr; +import hu.bme.mit.theta.core.type.fptype.*; import hu.bme.mit.theta.core.type.functype.FuncAppExpr; import hu.bme.mit.theta.core.type.functype.FuncLitExpr; import hu.bme.mit.theta.core.type.functype.FuncType; -import hu.bme.mit.theta.core.type.inttype.IntAddExpr; -import hu.bme.mit.theta.core.type.inttype.IntDivExpr; -import hu.bme.mit.theta.core.type.inttype.IntEqExpr; -import hu.bme.mit.theta.core.type.inttype.IntGeqExpr; -import hu.bme.mit.theta.core.type.inttype.IntGtExpr; -import hu.bme.mit.theta.core.type.inttype.IntLeqExpr; -import hu.bme.mit.theta.core.type.inttype.IntLitExpr; -import hu.bme.mit.theta.core.type.inttype.IntLtExpr; -import hu.bme.mit.theta.core.type.inttype.IntModExpr; -import hu.bme.mit.theta.core.type.inttype.IntMulExpr; -import hu.bme.mit.theta.core.type.inttype.IntNegExpr; -import hu.bme.mit.theta.core.type.inttype.IntNeqExpr; -import hu.bme.mit.theta.core.type.inttype.IntPosExpr; -import hu.bme.mit.theta.core.type.inttype.IntRemExpr; -import hu.bme.mit.theta.core.type.inttype.IntSubExpr; -import hu.bme.mit.theta.core.type.inttype.IntToRatExpr; -import hu.bme.mit.theta.core.type.rattype.RatAddExpr; -import hu.bme.mit.theta.core.type.rattype.RatDivExpr; -import hu.bme.mit.theta.core.type.rattype.RatEqExpr; -import hu.bme.mit.theta.core.type.rattype.RatGeqExpr; -import hu.bme.mit.theta.core.type.rattype.RatGtExpr; -import hu.bme.mit.theta.core.type.rattype.RatLeqExpr; -import hu.bme.mit.theta.core.type.rattype.RatLitExpr; -import hu.bme.mit.theta.core.type.rattype.RatLtExpr; -import hu.bme.mit.theta.core.type.rattype.RatMulExpr; -import hu.bme.mit.theta.core.type.rattype.RatNegExpr; -import hu.bme.mit.theta.core.type.rattype.RatNeqExpr; -import hu.bme.mit.theta.core.type.rattype.RatPosExpr; -import hu.bme.mit.theta.core.type.rattype.RatSubExpr; -import hu.bme.mit.theta.core.type.rattype.RatToIntExpr; +import hu.bme.mit.theta.core.type.inttype.*; +import hu.bme.mit.theta.core.type.rattype.*; import hu.bme.mit.theta.core.utils.BvUtils; import hu.bme.mit.theta.core.utils.ExprUtils; import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibExprTransformer; @@ -159,6 +58,7 @@ import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; +import kotlin.Pair; import org.jetbrains.annotations.NotNull; public class GenericSmtLibExprTransformer implements SmtLibExprTransformer { @@ -1192,10 +1092,11 @@ protected String transformArrayLit(final ArrayLitExpr expr) { String.format( "((as const %s) %s)", transformer.toSort(expr.getType()), toTerm(expr.getElseElem())); - for (Tuple2, ? extends Expr> elem : expr.getElements()) { + for (Pair, ? extends Expr> elem : expr.getElements()) { running = String.format( - "(store %s %s %s)", running, toTerm(elem.get1()), toTerm(elem.get2())); + "(store %s %s %s)", + running, toTerm(elem.getFirst()), toTerm(elem.getSecond())); } return running; } @@ -1205,22 +1106,23 @@ protected String transformArrayInit(final ArrayInitExpr expr) { String.format( "((as const %s) %s)", transformer.toSort(expr.getType()), toTerm(expr.getElseElem())); - for (Tuple2, ? extends Expr> elem : expr.getElements()) { + for (Pair, ? extends Expr> elem : expr.getElements()) { running = String.format( - "(store %s %s %s)", running, toTerm(elem.get1()), toTerm(elem.get2())); + "(store %s %s %s)", + running, toTerm(elem.getFirst()), toTerm(elem.getSecond())); } return running; } private String transformDereference(final Dereference expr) { - checkState( - expr.getUniquenessIdx().isPresent(), + checkNotNull( + expr.getUniquenessIdx(), "Incomplete dereferences (missing uniquenessIdx) are not handled properly."); return "(deref %s %s %s)" .formatted( toTerm(expr.getArray()), toTerm(expr.getOffset()), - toTerm(expr.getUniquenessIdx().get())); + toTerm(expr.getUniquenessIdx())); } } diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibTermTransformer.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibTermTransformer.java index 519373b107..bf24ade586 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibTermTransformer.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibTermTransformer.java @@ -20,6 +20,7 @@ import static hu.bme.mit.theta.core.decl.Decls.Const; import static hu.bme.mit.theta.core.decl.Decls.Param; import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Exists; import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Forall; @@ -29,6 +30,7 @@ import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; import static hu.bme.mit.theta.core.utils.TypeUtils.cast; import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; +import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.*; import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.BinaryContext; import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.DecimalContext; import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.Exists_termContext; @@ -52,84 +54,20 @@ import hu.bme.mit.theta.common.QuadFunction; import hu.bme.mit.theta.common.TernaryOperator; import hu.bme.mit.theta.common.TriFunction; -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.core.decl.ParamDecl; import hu.bme.mit.theta.core.model.BasicSubstitution; import hu.bme.mit.theta.core.type.Expr; import hu.bme.mit.theta.core.type.LitExpr; import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.abstracttype.AddExpr; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.abstracttype.GeqExpr; -import hu.bme.mit.theta.core.type.abstracttype.GtExpr; -import hu.bme.mit.theta.core.type.abstracttype.LeqExpr; -import hu.bme.mit.theta.core.type.abstracttype.LtExpr; -import hu.bme.mit.theta.core.type.abstracttype.ModExpr; -import hu.bme.mit.theta.core.type.abstracttype.MulExpr; -import hu.bme.mit.theta.core.type.abstracttype.NegExpr; -import hu.bme.mit.theta.core.type.abstracttype.RemExpr; -import hu.bme.mit.theta.core.type.abstracttype.SubExpr; +import hu.bme.mit.theta.core.type.abstracttype.*; import hu.bme.mit.theta.core.type.anytype.IteExpr; import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr; import hu.bme.mit.theta.core.type.arraytype.ArrayType; import hu.bme.mit.theta.core.type.arraytype.ArrayWriteExpr; -import hu.bme.mit.theta.core.type.booltype.AndExpr; -import hu.bme.mit.theta.core.type.booltype.BoolExprs; -import hu.bme.mit.theta.core.type.booltype.IffExpr; -import hu.bme.mit.theta.core.type.booltype.ImplyExpr; -import hu.bme.mit.theta.core.type.booltype.NotExpr; -import hu.bme.mit.theta.core.type.booltype.OrExpr; -import hu.bme.mit.theta.core.type.booltype.XorExpr; -import hu.bme.mit.theta.core.type.bvtype.BvAddExpr; -import hu.bme.mit.theta.core.type.bvtype.BvAndExpr; -import hu.bme.mit.theta.core.type.bvtype.BvArithShiftRightExpr; -import hu.bme.mit.theta.core.type.bvtype.BvConcatExpr; -import hu.bme.mit.theta.core.type.bvtype.BvExprs; -import hu.bme.mit.theta.core.type.bvtype.BvExtractExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLitExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLogicShiftRightExpr; -import hu.bme.mit.theta.core.type.bvtype.BvNegExpr; -import hu.bme.mit.theta.core.type.bvtype.BvNotExpr; -import hu.bme.mit.theta.core.type.bvtype.BvOrExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSDivExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSExtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSGeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSGtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSLeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSLtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSModExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSRemExpr; -import hu.bme.mit.theta.core.type.bvtype.BvShiftLeftExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSubExpr; -import hu.bme.mit.theta.core.type.bvtype.BvType; -import hu.bme.mit.theta.core.type.bvtype.BvUDivExpr; -import hu.bme.mit.theta.core.type.bvtype.BvUGeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvUGtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvULeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvULtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvURemExpr; -import hu.bme.mit.theta.core.type.bvtype.BvXorExpr; -import hu.bme.mit.theta.core.type.bvtype.BvZExtExpr; +import hu.bme.mit.theta.core.type.booltype.*; +import hu.bme.mit.theta.core.type.bvtype.*; import hu.bme.mit.theta.core.type.enumtype.EnumType; -import hu.bme.mit.theta.core.type.fptype.FpAbsExpr; -import hu.bme.mit.theta.core.type.fptype.FpAddExpr; -import hu.bme.mit.theta.core.type.fptype.FpDivExpr; -import hu.bme.mit.theta.core.type.fptype.FpEqExpr; -import hu.bme.mit.theta.core.type.fptype.FpExprs; -import hu.bme.mit.theta.core.type.fptype.FpGeqExpr; -import hu.bme.mit.theta.core.type.fptype.FpGtExpr; -import hu.bme.mit.theta.core.type.fptype.FpIsNanExpr; -import hu.bme.mit.theta.core.type.fptype.FpLeqExpr; -import hu.bme.mit.theta.core.type.fptype.FpLtExpr; -import hu.bme.mit.theta.core.type.fptype.FpMaxExpr; -import hu.bme.mit.theta.core.type.fptype.FpMinExpr; -import hu.bme.mit.theta.core.type.fptype.FpMulExpr; -import hu.bme.mit.theta.core.type.fptype.FpNegExpr; -import hu.bme.mit.theta.core.type.fptype.FpRemExpr; -import hu.bme.mit.theta.core.type.fptype.FpRoundToIntegralExpr; -import hu.bme.mit.theta.core.type.fptype.FpRoundingMode; -import hu.bme.mit.theta.core.type.fptype.FpSqrtExpr; -import hu.bme.mit.theta.core.type.fptype.FpSubExpr; +import hu.bme.mit.theta.core.type.fptype.*; import hu.bme.mit.theta.core.type.functype.FuncLitExpr; import hu.bme.mit.theta.core.type.functype.FuncType; import hu.bme.mit.theta.core.type.inttype.IntDivExpr; @@ -150,17 +88,10 @@ import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibTermTransformer; import java.math.BigDecimal; import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.BiFunction; -import java.util.function.BinaryOperator; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.function.UnaryOperator; +import java.util.*; +import java.util.function.*; import java.util.stream.Collectors; +import kotlin.Pair; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; @@ -382,11 +313,11 @@ public LitExpr> toArrayLitExpr( return null; } else if (arrayLitExpr instanceof IteExpr) { final var entryExprsBuilder = - new ImmutableList.Builder, ? extends Expr>>(); + new ImmutableList.Builder, ? extends Expr>>(); var iteExpr = (IteExpr) arrayLitExpr; while (true) { entryExprsBuilder.add( - Tuple2.of((Expr) iteExpr.getCond().getOps().get(1), iteExpr.getThen())); + new Pair<>((Expr) iteExpr.getCond().getOps().get(1), iteExpr.getThen())); if (iteExpr.getElse() instanceof IteExpr) { iteExpr = (IteExpr) iteExpr.getElse(); } else { diff --git a/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/GenericSmtLibHornSolverTest.kt b/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/GenericSmtLibHornSolverTest.kt index 120e8874d5..d08084e441 100644 --- a/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/GenericSmtLibHornSolverTest.kt +++ b/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/GenericSmtLibHornSolverTest.kt @@ -21,7 +21,11 @@ import hu.bme.mit.theta.core.ParamHolder import hu.bme.mit.theta.core.Relation import hu.bme.mit.theta.core.decl.Decls.Const import hu.bme.mit.theta.core.plus -import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.* +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Add +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Gt +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Leq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Lt import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.functype.FuncExprs.App import hu.bme.mit.theta.core.type.functype.FuncLitExpr @@ -69,10 +73,7 @@ class GenericSmtLibHornSolverTest { e.printStackTrace() } - solverFactories.put( - Pair(solver, version), - solverManager!!.getSolverFactory(solver, version), - ) + solverFactories[Pair(solver, version)] = solverManager!!.getSolverFactory(solver, version) } } } @@ -122,16 +123,13 @@ class GenericSmtLibHornSolverTest { Assertions.assertTrue(model.containsKey(init.constDecl)) val checkerSolver = - solverFactories.filter { it.key.first.equals("z3") }.values.first().createSolver() + solverFactories.filter { it.key.first == "z3" }.values.first().createSolver() checkerSolver.use { val p0 = Const("p0", Int()) val p1 = Const("p1", Int()) checkerSolver.add( App( - App( - model.get(init.constDecl) as FuncLitExpr>, - p0.ref, - ), + App(model[init.constDecl] as FuncLitExpr>, p0.ref), p1.ref, ) ) diff --git a/subprojects/solver/solver-z3-legacy/src/main/java/hu/bme/mit/theta/solver/z3legacy/Z3ExprTransformer.java b/subprojects/solver/solver-z3-legacy/src/main/java/hu/bme/mit/theta/solver/z3legacy/Z3ExprTransformer.java index f9841fda37..a2e1912984 100644 --- a/subprojects/solver/solver-z3-legacy/src/main/java/hu/bme/mit/theta/solver/z3legacy/Z3ExprTransformer.java +++ b/subprojects/solver/solver-z3-legacy/src/main/java/hu/bme/mit/theta/solver/z3legacy/Z3ExprTransformer.java @@ -15,7 +15,7 @@ */ package hu.bme.mit.theta.solver.z3legacy; -import static com.google.common.base.Preconditions.checkState; +import static com.google.common.base.Preconditions.checkNotNull; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; @@ -50,6 +50,7 @@ import java.util.List; import java.util.concurrent.ExecutionException; import java.util.stream.Stream; +import kotlin.Pair; final class Z3ExprTransformer { @@ -1030,8 +1031,8 @@ private com.microsoft.z3legacy.Expr transformArrayLit(final ArrayLitExpr e context.mkConstArray( transformer.toSort(expr.getType().getIndexType()), toTerm(expr.getElseElem())); - for (Tuple2, ? extends Expr> elem : expr.getElements()) { - running = context.mkStore(running, toTerm(elem.get1()), toTerm(elem.get2())); + for (Pair, ? extends Expr> elem : expr.getElements()) { + running = context.mkStore(running, toTerm(elem.getFirst()), toTerm(elem.getSecond())); } return running; } @@ -1041,8 +1042,8 @@ private com.microsoft.z3legacy.Expr transformArrayInit(final ArrayInitExpr context.mkConstArray( transformer.toSort(expr.getType().getIndexType()), toTerm(expr.getElseElem())); - for (Tuple2, ? extends Expr> elem : expr.getElements()) { - running = context.mkStore(running, toTerm(elem.get1()), toTerm(elem.get2())); + for (Pair, ? extends Expr> elem : expr.getElements()) { + running = context.mkStore(running, toTerm(elem.getFirst()), toTerm(elem.getSecond())); } return running; } @@ -1065,8 +1066,8 @@ private com.microsoft.z3legacy.Expr transformFuncApp(final FuncAppExpr exp } private com.microsoft.z3legacy.Expr transformDereference(final Dereference expr) { - checkState( - expr.getUniquenessIdx().isPresent(), + checkNotNull( + expr.getUniquenessIdx(), "Incomplete dereferences (missing uniquenessIdx) are not handled properly."); final var sort = transformer.toSort(expr.getArray().getType()); final var constSort = transformer.toSort(Int()); @@ -1079,7 +1080,7 @@ private com.microsoft.z3legacy.Expr transformDereference(final Dereference Expr createIndexValueArrayLitExpr( .map( entry -> { checkState(entry.get1().size() == 1); - return Tuple2.of( + return new Pair<>( (Expr) entry.get1().get(0), (Expr) entry.get2()); }) .collect(Collectors.toUnmodifiableList()), diff --git a/subprojects/solver/solver-z3-legacy/src/test/java/hu/bme/mit/theta/solver/z3legacy/Z3SolverTest.java b/subprojects/solver/solver-z3-legacy/src/test/java/hu/bme/mit/theta/solver/z3legacy/Z3SolverTest.java index 7e79e8a914..3602229265 100644 --- a/subprojects/solver/solver-z3-legacy/src/test/java/hu/bme/mit/theta/solver/z3legacy/Z3SolverTest.java +++ b/subprojects/solver/solver-z3-legacy/src/test/java/hu/bme/mit/theta/solver/z3legacy/Z3SolverTest.java @@ -18,23 +18,16 @@ import static com.google.common.collect.ImmutableList.of; import static hu.bme.mit.theta.core.decl.Decls.Const; import static hu.bme.mit.theta.core.decl.Decls.Param; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.ArrayInit; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Write; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; import static hu.bme.mit.theta.core.type.functype.FuncExprs.App; import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Add; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.core.decl.ConstDecl; import hu.bme.mit.theta.core.decl.ParamDecl; import hu.bme.mit.theta.core.model.ImmutableValuation; @@ -58,6 +51,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import kotlin.Pair; import org.junit.Before; import org.junit.Test; @@ -161,11 +155,11 @@ public void testArray() { @Test public void testArrayInit() { final ConstDecl> arr = Const("arr", Array(Int(), Int())); - var elems = new ArrayList, Expr>>(); + var elems = new ArrayList, Expr>>(); ConstDecl noname = Const("noname", Int()); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Int(2))); - elems.add(Tuple2.of(Int(2), Add(noname.getRef(), Int(3)))); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Int(2))); + elems.add(new Pair<>(Int(2), Add(noname.getRef(), Int(3)))); var initarr = ArrayInit(elems, Int(100), Array(Int(), Int())); solver.add(ArrayExprs.Eq(arr.getRef(), initarr)); diff --git a/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3ExprTransformer.java b/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3ExprTransformer.java index ef8497d332..6d3eb6de79 100644 --- a/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3ExprTransformer.java +++ b/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3ExprTransformer.java @@ -20,11 +20,6 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.microsoft.z3.*; -import com.microsoft.z3.BitVecExpr; -import com.microsoft.z3.BoolExpr; -import com.microsoft.z3.Context; -import com.microsoft.z3.FPExpr; -import com.microsoft.z3.FPSort; import hu.bme.mit.theta.common.DispatchTable; import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.common.dsl.Env; @@ -55,6 +50,7 @@ import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.stream.Stream; +import kotlin.Pair; final class Z3ExprTransformer { @@ -1022,8 +1018,8 @@ private com.microsoft.z3.Expr transformArrayLit(final ArrayLitExpr expr) { context.mkConstArray( transformer.toSort(expr.getType().getIndexType()), toTerm(expr.getElseElem())); - for (Tuple2, ? extends Expr> elem : expr.getElements()) { - running = context.mkStore(running, toTerm(elem.get1()), toTerm(elem.get2())); + for (Pair, ? extends Expr> elem : expr.getElements()) { + running = context.mkStore(running, toTerm(elem.getFirst()), toTerm(elem.getSecond())); } return running; } @@ -1033,8 +1029,8 @@ private com.microsoft.z3.Expr transformArrayInit(final ArrayInitExpr expr) context.mkConstArray( transformer.toSort(expr.getType().getIndexType()), toTerm(expr.getElseElem())); - for (Tuple2, ? extends Expr> elem : expr.getElements()) { - running = context.mkStore(running, toTerm(elem.get1()), toTerm(elem.get2())); + for (Pair, ? extends Expr> elem : expr.getElements()) { + running = context.mkStore(running, toTerm(elem.getFirst()), toTerm(elem.getSecond())); } return running; } diff --git a/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3TermTransformer.java b/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3TermTransformer.java index 843cb91f22..9abf1827be 100644 --- a/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3TermTransformer.java +++ b/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3TermTransformer.java @@ -15,18 +15,13 @@ */ package hu.bme.mit.theta.solver.z3; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; +import static com.google.common.base.Preconditions.*; import static com.google.common.collect.ImmutableList.toImmutableList; import static hu.bme.mit.theta.common.Utils.head; import static hu.bme.mit.theta.common.Utils.tail; import static hu.bme.mit.theta.core.decl.Decls.Param; import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.And; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Exists; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Forall; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; import static hu.bme.mit.theta.core.type.functype.FuncExprs.UnsafeApp; @@ -36,13 +31,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import com.microsoft.z3.ArrayExpr; -import com.microsoft.z3.ArraySort; -import com.microsoft.z3.FPNum; -import com.microsoft.z3.FuncDecl; -import com.microsoft.z3.Model; -import com.microsoft.z3.Sort; -import com.microsoft.z3.Z3Exception; +import com.microsoft.z3.*; import com.microsoft.z3.enumerations.Z3_decl_kind; import com.microsoft.z3.enumerations.Z3_sort_kind; import hu.bme.mit.theta.common.TernaryOperator; @@ -80,6 +69,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; +import kotlin.Pair; import org.kframework.mpfr.BigFloat; final class Z3TermTransformer { @@ -388,7 +378,7 @@ private Expr createIndexValueArrayLitExpr( .map( entry -> { checkState(entry.get1().size() == 1); - return Tuple2.of( + return new Pair<>( (Expr) entry.get1().get(0), (Expr) entry.get2()); }) .collect(Collectors.toUnmodifiableList()), diff --git a/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3HornSolverTest.kt b/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3HornSolverTest.kt index fa4bd1bcfd..5832f75866 100644 --- a/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3HornSolverTest.kt +++ b/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3HornSolverTest.kt @@ -20,7 +20,11 @@ import hu.bme.mit.theta.core.ParamHolder import hu.bme.mit.theta.core.Relation import hu.bme.mit.theta.core.decl.Decls.Const import hu.bme.mit.theta.core.plus -import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.* +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Add +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Gt +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Leq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Lt import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.functype.FuncExprs.App import hu.bme.mit.theta.core.type.functype.FuncLitExpr @@ -80,10 +84,7 @@ class Z3HornSolverTest { val p1 = Const("p1", Int()) checkerSolver.add( App( - App( - model.get(init.constDecl) as FuncLitExpr>, - p0.ref, - ), + App(model[init.constDecl] as FuncLitExpr>, p0.ref), p1.ref, ) ) diff --git a/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3SolverTest.java b/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3SolverTest.java index 023e958ab6..170a80a846 100644 --- a/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3SolverTest.java +++ b/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3SolverTest.java @@ -18,23 +18,16 @@ import static com.google.common.collect.ImmutableList.of; import static hu.bme.mit.theta.core.decl.Decls.Const; import static hu.bme.mit.theta.core.decl.Decls.Param; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.ArrayInit; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Write; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; import static hu.bme.mit.theta.core.type.functype.FuncExprs.App; import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Add; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.core.decl.ConstDecl; import hu.bme.mit.theta.core.decl.ParamDecl; import hu.bme.mit.theta.core.model.ImmutableValuation; @@ -58,6 +51,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import kotlin.Pair; import org.junit.Before; import org.junit.Test; @@ -161,11 +155,11 @@ public void testArray() { // @Test public void testArrayInit() { final ConstDecl> arr = Const("arr", Array(Int(), Int())); - var elems = new ArrayList, Expr>>(); + var elems = new ArrayList, Expr>>(); ConstDecl noname = Const("noname", Int()); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Int(2))); - elems.add(Tuple2.of(Int(2), Add(noname.getRef(), Int(3)))); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Int(2))); + elems.add(new Pair<>(Int(2), Add(noname.getRef(), Int(3)))); var initarr = ArrayInit(elems, Int(100), Array(Int(), Int())); solver.add(ArrayExprs.Eq(arr.getRef(), initarr)); diff --git a/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt b/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt index 66fbc3b254..29d818fa8a 100644 --- a/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt +++ b/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt @@ -17,7 +17,6 @@ package hu.bme.mit.theta.c2xcfa -import com.google.common.base.Preconditions import com.google.common.base.Preconditions.checkState import hu.bme.mit.theta.common.logging.Logger import hu.bme.mit.theta.core.decl.Decls @@ -29,18 +28,16 @@ import hu.bme.mit.theta.core.stmt.Stmts import hu.bme.mit.theta.core.stmt.Stmts.Assume import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.Type -import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs -import hu.bme.mit.theta.core.type.abstracttype.AddExpr -import hu.bme.mit.theta.core.type.abstracttype.DivExpr -import hu.bme.mit.theta.core.type.abstracttype.MulExpr -import hu.bme.mit.theta.core.type.abstracttype.SubExpr +import hu.bme.mit.theta.core.type.abstracttype.* import hu.bme.mit.theta.core.type.anytype.Dereference import hu.bme.mit.theta.core.type.anytype.Exprs.Dereference import hu.bme.mit.theta.core.type.anytype.RefExpr import hu.bme.mit.theta.core.type.arraytype.ArrayLitExpr import hu.bme.mit.theta.core.type.arraytype.ArrayType import hu.bme.mit.theta.core.type.booltype.BoolExprs -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Not +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.bvtype.BvLitExpr import hu.bme.mit.theta.core.type.inttype.IntLitExpr @@ -49,7 +46,7 @@ import hu.bme.mit.theta.core.utils.ExprUtils import hu.bme.mit.theta.core.utils.TypeUtils.cast import hu.bme.mit.theta.frontend.ParseContext import hu.bme.mit.theta.frontend.UnsupportedFrontendElementException -import hu.bme.mit.theta.frontend.transformation.grammar.expression.UnsupportedInitializer +import hu.bme.mit.theta.frontend.transformation.grammar.expression.UnsupportedInitializerExpr import hu.bme.mit.theta.frontend.transformation.model.statements.* import hu.bme.mit.theta.frontend.transformation.model.types.complex.CComplexType import hu.bme.mit.theta.frontend.transformation.model.types.complex.CVoid @@ -169,7 +166,7 @@ class FrontendXcfaBuilder( } else { if ( globalDeclaration.get1().initExpr != null && - globalDeclaration.get1().initExpr.expression !is UnsupportedInitializer + globalDeclaration.get1().initExpr.expression !is UnsupportedInitializerExpr ) { initStmtList.add( StmtLabel( @@ -241,7 +238,7 @@ class FrontendXcfaBuilder( } for (function in cProgram.functions) { val toAdd: XcfaProcedureBuilder = handleFunction(function, initStmtList, builder) - if (toAdd.name.equals("main")) builder.addEntryPoint(toAdd, listOf()) + if (toAdd.name == "main") builder.addEntryPoint(toAdd, listOf()) } return builder } @@ -260,7 +257,7 @@ class FrontendXcfaBuilder( XcfaProcedureBuilder(funcDecl.name, CPasses(checkOverflow, parseContext, uniqueWarningLogger)) xcfaBuilder.addProcedure(builder) val initStmtList = ArrayList() - if (param.size > 0 && builder.name.equals("main")) { + if (param.isNotEmpty() && builder.name == "main") { initStmtList.addAll(param) } // builder.setRetType(if (funcDecl.actualType is CVoid) null else @@ -278,7 +275,7 @@ class FrontendXcfaBuilder( builder.addParam(toAdd, ParamDirection.OUT) } for (functionParam in funcDecl.functionParams) { - Preconditions.checkState( + checkState( functionParam.actualType is CVoid || functionParam.varDecls.size > 0, "Function param should have an associated variable!", ) @@ -596,7 +593,7 @@ class FrontendXcfaBuilder( buildWithoutPostStatement(guard, ParamPack(builder, innerEndLoc, null, null, returnLoc)) val assume = StmtLabel( - Stmts.Assume( + Assume( AbstractExprs.Neq( guard.expression, CComplexType.getType(guard.expression, parseContext).nullValue, @@ -609,7 +606,7 @@ class FrontendXcfaBuilder( builder.addEdge(xcfaEdge) val assume1 = StmtLabel( - Stmts.Assume( + Assume( AbstractExprs.Eq( guard.expression, CComplexType.getType(guard.expression, parseContext).nullValue, @@ -660,7 +657,7 @@ class FrontendXcfaBuilder( builder.addLoc(endInit) builder.addLoc(initLoc) builder.addLoc(startIncrement) - var xcfaEdge: XcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) + var xcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) builder.addEdge(xcfaEdge) val lastInit = if (init == null) initLoc @@ -670,7 +667,7 @@ class FrontendXcfaBuilder( else buildWithoutPostStatement(guard, ParamPack(builder, lastInit!!, null, null, returnLoc)) val assume = StmtLabel( - Stmts.Assume( + Assume( if (guard == null) True() else AbstractExprs.Neq( @@ -686,7 +683,7 @@ class FrontendXcfaBuilder( builder.addEdge(xcfaEdge) val assume1 = StmtLabel( - Stmts.Assume( + Assume( if (guard == null) False() else AbstractExprs.Eq( @@ -736,7 +733,7 @@ class FrontendXcfaBuilder( val returnLoc = param.returnLoc val initLoc = getLoc(builder, statement.id, metadata = getMetadata(statement)) builder.addLoc(initLoc) - var edge: XcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) + var edge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) builder.addEdge(edge) edge = XcfaEdge( @@ -745,7 +742,7 @@ class FrontendXcfaBuilder( metadata = getMetadata(statement), ) builder.addLoc(getLoc(builder, statement.label, metadata = getMetadata(statement))) - val unreachableLoc: XcfaLocation = + val unreachableLoc = XcfaLocation("Unreachable" + XcfaLocation.uniqueCounter(), metadata = getMetadata(statement)) builder.addLoc(unreachableLoc) builder.addEdge(edge) @@ -769,7 +766,7 @@ class FrontendXcfaBuilder( builder.addLoc(mainBranch) builder.addLoc(elseBranch) builder.addLoc(initLoc) - var xcfaEdge: XcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) + var xcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) builder.addEdge(xcfaEdge) val endGuard = buildWithoutPostStatement( @@ -778,7 +775,7 @@ class FrontendXcfaBuilder( ) val assume = StmtLabel( - Stmts.Assume( + Assume( AbstractExprs.Neq( guard.expression, CComplexType.getType(guard.expression, parseContext).nullValue, @@ -791,7 +788,7 @@ class FrontendXcfaBuilder( builder.addEdge(xcfaEdge) val assume1 = StmtLabel( - Stmts.Assume( + Assume( AbstractExprs.Eq( guard.expression, CComplexType.getType(guard.expression, parseContext).nullValue, @@ -889,15 +886,15 @@ class FrontendXcfaBuilder( builder.addLoc(initLoc) val endLoc = getAnonymousLoc(builder, metadata = getMetadata(statement)) builder.addLoc(endLoc) - val edge: XcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) + val edge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) builder.addEdge(edge) val endInit = buildWithoutPostStatement( testValue, ParamPack(builder, initLoc, breakLoc, continueLoc, returnLoc), ) - Preconditions.checkState(body is CCompound, "Switch body has to be a CompoundStatement!") - var defaultExpr: Expr? = True() + checkState(body is CCompound, "Switch body has to be a CompoundStatement!") + var defaultExpr: Expr = True() for (cStatement in (body as CCompound).getcStatementList()) { if (cStatement is CCase) { defaultExpr = @@ -924,7 +921,7 @@ class FrontendXcfaBuilder( ) val assume = StmtLabel( - Stmts.Assume(AbstractExprs.Eq(testValue.expression, cStatement.expr.expression)), + Assume(AbstractExprs.Eq(testValue.expression, cStatement.expr.expression)), choiceType = ChoiceType.MAIN_PATH, metadata = getMetadata(cStatement), ) @@ -938,7 +935,7 @@ class FrontendXcfaBuilder( ) val assume = StmtLabel( - Stmts.Assume(defaultExpr), + Assume(defaultExpr), choiceType = ChoiceType.MAIN_PATH, // TODO: is this what validators expect? metadata = getMetadata(cStatement), ) @@ -966,7 +963,7 @@ class FrontendXcfaBuilder( val body = statement.body var initLoc = getLoc(builder, statement.id, metadata = getMetadata(statement)) builder.addLoc(initLoc) - var xcfaEdge: XcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) + var xcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) builder.addEdge(xcfaEdge) val endLoc = getAnonymousLoc(builder, metadata = getMetadata(statement)) builder.addLoc(endLoc) @@ -983,7 +980,7 @@ class FrontendXcfaBuilder( } val assume = StmtLabel( - Stmts.Assume( + Assume( AbstractExprs.Neq( guard.expression, CComplexType.getType(guard.expression, parseContext).nullValue, @@ -996,7 +993,7 @@ class FrontendXcfaBuilder( builder.addEdge(xcfaEdge) val assume1 = StmtLabel( - Stmts.Assume( + Assume( AbstractExprs.Eq( guard.expression, CComplexType.getType(guard.expression, parseContext).nullValue, @@ -1021,10 +1018,7 @@ class FrontendXcfaBuilder( } private fun buildWithoutPostStatement(cStatement: CStatement, param: ParamPack): XcfaLocation { - Preconditions.checkState( - cStatement is CCompound, - "Currently only CCompounds have pre- and post statements!", - ) + checkState(cStatement is CCompound, "Currently only CCompounds have pre- and post statements!") val statement = cStatement as CCompound val builder: XcfaProcedureBuilder = param.builder var lastLoc = param.lastLoc @@ -1062,10 +1056,7 @@ class FrontendXcfaBuilder( } private fun buildPostStatement(cStatement: CStatement, param: ParamPack): XcfaLocation { - Preconditions.checkState( - cStatement is CCompound, - "Currently only CCompounds have pre- and post statements!", - ) + checkState(cStatement is CCompound, "Currently only CCompounds have pre- and post statements!") val statement = cStatement as CCompound val builder: XcfaProcedureBuilder = param.builder var lastLoc = param.lastLoc diff --git a/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/Utils.kt b/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/Utils.kt index 2a2a18cb7a..7336c726d0 100644 --- a/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/Utils.kt +++ b/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/Utils.kt @@ -125,7 +125,7 @@ fun getExpressionFromC( check(expr is Expr<*>) val signedType = CComplexType.getSignedInt(parseContext) if ( - expr is IteExpr<*> && expr.then == signedType.unitValue && expr.`else` == signedType.nullValue + expr is IteExpr<*> && expr.then == signedType.unitValue && expr.elze == signedType.nullValue ) { return expr.cond } else { diff --git a/subprojects/xcfa/llvm2xcfa/src/main/java/hu/bme/mit/theta/llvm2xcfa/Utils.java b/subprojects/xcfa/llvm2xcfa/src/main/java/hu/bme/mit/theta/llvm2xcfa/Utils.java index 22c61a3691..130cbdcaf9 100644 --- a/subprojects/xcfa/llvm2xcfa/src/main/java/hu/bme/mit/theta/llvm2xcfa/Utils.java +++ b/subprojects/xcfa/llvm2xcfa/src/main/java/hu/bme/mit/theta/llvm2xcfa/Utils.java @@ -43,15 +43,12 @@ import hu.bme.mit.theta.llvm2xcfa.handlers.arguments.RegArgument; import hu.bme.mit.theta.llvm2xcfa.handlers.states.BlockState; import hu.bme.mit.theta.llvm2xcfa.handlers.states.FunctionState; -import hu.bme.mit.theta.xcfa.model.EmptyMetaData; -import hu.bme.mit.theta.xcfa.model.NopLabel; -import hu.bme.mit.theta.xcfa.model.StmtLabel; -import hu.bme.mit.theta.xcfa.model.XcfaEdge; -import hu.bme.mit.theta.xcfa.model.XcfaLocation; +import hu.bme.mit.theta.xcfa.model.*; import java.math.BigInteger; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import kotlin.Pair; public class Utils { private static final int doublePrecision = 1 << 8; @@ -158,7 +155,7 @@ else if (type instanceof BvType) else if (type instanceof ArrayType) return ArrayLitExpr.of( List.of( - Tuple2.of( + new Pair<>( IntLitExpr.of(BigInteger.ZERO), cast( getDefaultValue(((ArrayType) type).getElemType()), diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaToMonolithicExpr.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaToMonolithicExpr.kt index 508ea52024..b0663220c7 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaToMonolithicExpr.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaToMonolithicExpr.kt @@ -31,7 +31,9 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neq -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.bvtype.BvLitExpr import hu.bme.mit.theta.core.type.bvtype.BvType @@ -50,9 +52,11 @@ import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory import hu.bme.mit.theta.frontend.ParseContext import hu.bme.mit.theta.frontend.transformation.model.types.complex.integer.cint.CInt import hu.bme.mit.theta.xcfa.getFlatLabels -import hu.bme.mit.theta.xcfa.model.* +import hu.bme.mit.theta.xcfa.model.StmtLabel +import hu.bme.mit.theta.xcfa.model.XCFA +import hu.bme.mit.theta.xcfa.model.XcfaEdge +import hu.bme.mit.theta.xcfa.model.XcfaLocation import java.math.BigInteger -import java.util.* import org.kframework.mpfr.BigFloat private val LitExpr<*>.value: Int diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcChecker.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcChecker.kt index df885ac2f1..b690645615 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcChecker.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcChecker.kt @@ -40,7 +40,11 @@ import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq import hu.bme.mit.theta.core.type.anytype.Dereference import hu.bme.mit.theta.core.type.anytype.RefExpr -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Not +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.utils.ExprUtils @@ -52,7 +56,7 @@ import hu.bme.mit.theta.xcfa.* import hu.bme.mit.theta.xcfa.analysis.XcfaPrec import hu.bme.mit.theta.xcfa.analysis.oc.XcfaOcMemoryConsistencyModel.SC import hu.bme.mit.theta.xcfa.model.* -import hu.bme.mit.theta.xcfa.passes.* +import hu.bme.mit.theta.xcfa.passes.OcExtraPasses import kotlin.time.measureTime private val Expr<*>.vars @@ -471,7 +475,7 @@ class XcfaOcChecker( .filter { it.assignment != null } .forEach { event -> if (event.guard.isEmpty()) solver.add(event.assignment) - else solver.add(Imply(event.guardExpr, event.assignment)) + else solver.add(Imply(event.guardExpr, event.assignment!!)) } // Branching conditions @@ -490,7 +494,11 @@ class XcfaOcChecker( And(rel.from.guardExpr, rel.to.guardExpr, Eq(rel.from.const.ref, rel.to.const.ref)) if (v == memoryDecl) { conseq = - And(conseq, Eq(rel.from.array, rel.to.array), Eq(rel.from.offset, rel.to.offset)) + And( + conseq, + Eq(rel.from.array!!, rel.to.array!!), + Eq(rel.from.offset!!, rel.to.offset!!), + ) } solver.add(Imply(rel.declRef, conseq)) // RF-Val } diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcTypes.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcTypes.kt index 335ab942dc..a39ffd8c90 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcTypes.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcTypes.kt @@ -163,7 +163,7 @@ internal class XcfaEvent( arrayEq = null } - var offsetEq: Expr? = Eq(offset, other.offset) + var offsetEq: Expr? = Eq(offset!!, other.offset!!) if (offsetStatic != null && other.offsetStatic != null) { if (offsetStatic != other.offsetStatic) return null offsetEq = null diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaSporLts.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaSporLts.kt index 49bf538422..010dc6af8e 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaSporLts.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaSporLts.kt @@ -24,7 +24,9 @@ import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.ExprUtils import hu.bme.mit.theta.core.utils.PathUtils diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/checkers/ConfigToLassoValidationChecker.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/checkers/ConfigToLassoValidationChecker.kt index 18d63ddc15..cc27bf527c 100644 --- a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/checkers/ConfigToLassoValidationChecker.kt +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/checkers/ConfigToLassoValidationChecker.kt @@ -29,7 +29,9 @@ import hu.bme.mit.theta.core.stmt.NonDetStmt import hu.bme.mit.theta.core.stmt.SequenceStmt import hu.bme.mit.theta.core.stmt.Stmt import hu.bme.mit.theta.core.stmt.Stmts.Assume -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Forall +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply import hu.bme.mit.theta.core.utils.ExprUtils import hu.bme.mit.theta.core.utils.PathUtils import hu.bme.mit.theta.core.utils.StmtUtils @@ -40,7 +42,9 @@ import hu.bme.mit.theta.graphsolver.patterns.constraints.MCM import hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibSymbolTable import hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibTransformationManager import hu.bme.mit.theta.solver.utils.WithPushPop -import hu.bme.mit.theta.xcfa.analysis.* +import hu.bme.mit.theta.xcfa.analysis.XcfaAction +import hu.bme.mit.theta.xcfa.analysis.XcfaPrec +import hu.bme.mit.theta.xcfa.analysis.XcfaState import hu.bme.mit.theta.xcfa.cli.params.LassoValidationConfig import hu.bme.mit.theta.xcfa.cli.params.XcfaConfig import hu.bme.mit.theta.xcfa.cli.utils.getSolver diff --git a/subprojects/xcfa/xcfa/build.gradle.kts b/subprojects/xcfa/xcfa/build.gradle.kts index bec2ccd84a..ea2e8d65e5 100644 --- a/subprojects/xcfa/xcfa/build.gradle.kts +++ b/subprojects/xcfa/xcfa/build.gradle.kts @@ -16,9 +16,11 @@ plugins { id("kotlin-common") id("kaml-serialization") + id("kotlinx-serialization") } dependencies { + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") implementation(project(":theta-common")) implementation(project(":theta-core")) implementation(project(":theta-grammar")) diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/MallocLitExpr.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/MallocLitExpr.kt new file mode 100644 index 0000000000..17d408cae1 --- /dev/null +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/MallocLitExpr.kt @@ -0,0 +1,63 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.xcfa + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +@Serializable(with = MallocLitExpr.Serializer::class) +@SerialName("MallocLit") +data class MallocLitExpr(val kType: T) : NullaryExpr(), LitExpr { + + override val type: T + get() = kType + + override fun eval(`val`: Valuation): LitExpr = this + + object Serializer : KSerializer> { + + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("MallocLit") { element("kType") } + + override fun serialize(encoder: Encoder, value: MallocLitExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class), value.kType) + } + + override fun deserialize(decoder: Decoder): MallocLitExpr = + decoder.decodeStructure(descriptor) { + var kType: Type? = null + + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> + kType = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class)) + + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + MallocLitExpr(kType = kType ?: throw SerializationException("Missing kType")) + } + } +} diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/SerializerModule.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/SerializerModule.kt new file mode 100644 index 0000000000..4c8e2a963f --- /dev/null +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/SerializerModule.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.xcfa + +import hu.bme.mit.theta.core.serialization.coreSerializerModule +import hu.bme.mit.theta.core.type.Expr +import kotlinx.serialization.json.Json +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.polymorphic + +val xcfaSerializerModule = SerializersModule { + include(coreSerializerModule) + polymorphic(Expr::class) { subclass(MallocLitExpr::class, MallocLitExpr.Serializer) } +} + +val xcfaJson = Json { + serializersModule = xcfaSerializerModule + classDiscriminator = "class" +} diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/Utils.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/Utils.kt index 2008a20f79..18ab59e0ce 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/Utils.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/Utils.kt @@ -22,12 +22,10 @@ import hu.bme.mit.theta.common.dsl.Symbol import hu.bme.mit.theta.common.dsl.SymbolTable import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.model.MutableValuation -import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.stmt.* import hu.bme.mit.theta.core.stmt.Stmts.Assign import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr -import hu.bme.mit.theta.core.type.NullaryExpr import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.type.abstracttype.ModExpr import hu.bme.mit.theta.core.type.abstracttype.NeqExpr @@ -550,13 +548,6 @@ fun XcfaLabel.simplify(valuation: MutableValuation, parseContext: ParseContext): } } else this -data class MallocLitExpr(val kType: T) : NullaryExpr(), LitExpr { - - override fun getType(): T = kType - - override fun eval(valuation: Valuation): LitExpr = this -} - val XCFA.lazyPointsToGraph: Lazy, Set>>> get() = lazy { val attempt = diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/XcfaToC.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/XcfaToC.kt index afac78324c..c6640e4d64 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/XcfaToC.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/XcfaToC.kt @@ -334,7 +334,7 @@ fun ArrayReadExpr<*, *>.toC(parseContext: ParseContext): String = "array_read(${this.array.toC(parseContext)}, ${this.index.toC(parseContext)})" fun IteExpr<*>.toC(parseContext: ParseContext): String = - "(${this.cond.toC(parseContext)} ? ${this.then.toC(parseContext)} : ${this.`else`.toC(parseContext)})" + "(${this.cond.toC(parseContext)} ? ${this.then.toC(parseContext)} : ${this.elze.toC(parseContext)})" // nullary: ref + lit fun NullaryExpr<*>.toC(parseContext: ParseContext): String = diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/Dsl.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/Dsl.kt index c05e3ee07d..03d90d8a22 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/Dsl.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/Dsl.kt @@ -20,7 +20,9 @@ import hu.bme.mit.theta.common.dsl.Symbol import hu.bme.mit.theta.common.dsl.SymbolTable import hu.bme.mit.theta.core.decl.Decls.Var import hu.bme.mit.theta.core.decl.VarDecl -import hu.bme.mit.theta.core.stmt.Stmts.* +import hu.bme.mit.theta.core.stmt.Stmts.Assign +import hu.bme.mit.theta.core.stmt.Stmts.Assume +import hu.bme.mit.theta.core.stmt.Stmts.Havoc import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.Type diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XcfaLabel.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XcfaLabel.kt index 8f6d29cb47..a8d8ed1ab4 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XcfaLabel.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XcfaLabel.kt @@ -21,7 +21,9 @@ import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.stmt.NonDetStmt import hu.bme.mit.theta.core.stmt.SequenceStmt import hu.bme.mit.theta.core.stmt.Stmt -import hu.bme.mit.theta.core.stmt.Stmts.* +import hu.bme.mit.theta.core.stmt.Stmts.NonDet +import hu.bme.mit.theta.core.stmt.Stmts.Sequence +import hu.bme.mit.theta.core.stmt.Stmts.Skip import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.grammar.dsl.expr.ExpressionWrapper import hu.bme.mit.theta.grammar.dsl.stmt.StatementWrapper @@ -216,7 +218,7 @@ constructor(val labels: List, override val metadata: MetaData = Empty XcfaLabel(metadata = metadata) { override fun toStmt(): Stmt { - return SequenceStmt(labels.map { it.toStmt() }) + return Sequence(labels.map { it.toStmt() }) } override fun toString(): String { @@ -232,7 +234,7 @@ constructor(val labels: Set, override val metadata: MetaData = EmptyM XcfaLabel(metadata = metadata) { override fun toStmt(): Stmt { - return NonDetStmt(labels.map { it.toStmt() }) + return NonDet(labels.map { it.toStmt() }) } override fun toString(): String { diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/FpFunctionsToExprsPass.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/FpFunctionsToExprsPass.kt index 8f2fb3452c..601a6000b9 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/FpFunctionsToExprsPass.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/FpFunctionsToExprsPass.kt @@ -165,7 +165,7 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, ), ) if (parseContext.metadata.getMetadataValue(expr, "cType").isPresent) { @@ -186,7 +186,7 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, ), ) if (parseContext.metadata.getMetadataValue(expr, "cType").isPresent) { @@ -205,7 +205,7 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast((expr as RefExpr<*>).decl as VarDecl<*>, type.smtType), TypeUtils.cast( AbstractExprs.Ite( - FpIsInfiniteExpr.of(callStmt.params[1] as Expr), + FpIsInfiniteExpr.of(callStmt.params[1] as Expr), type.unitValue, type.nullValue, ), @@ -227,8 +227,8 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( AbstractExprs.Ite( Or( - FpIsInfiniteExpr.of(callStmt.params[1] as Expr), - FpIsNanExpr.of(callStmt.params[1] as Expr), + FpIsInfiniteExpr.of(callStmt.params[1] as Expr), + FpIsNanExpr.of(callStmt.params[1] as Expr), ), type.nullValue, type.unitValue, @@ -259,7 +259,7 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast((expr as RefExpr<*>).decl as VarDecl<*>, type.smtType), TypeUtils.cast( AbstractExprs.Ite( - FpIsNanExpr.of(callStmt.params[1] as Expr), + FpIsNanExpr.of(callStmt.params[1] as Expr), type.unitValue, type.nullValue, ), @@ -285,7 +285,7 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, ), ) if (parseContext.metadata.getMetadataValue(expr, "cType").isPresent) { @@ -306,7 +306,7 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, ), ) if (parseContext.metadata.getMetadataValue(expr, "cType").isPresent) { @@ -330,11 +330,11 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[2]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, ), ) if (parseContext.metadata.getMetadataValue(expr, "cType").isPresent) { @@ -354,11 +354,11 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[2]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, ), ) if (parseContext.metadata.getMetadataValue(expr, "cType").isPresent) { @@ -379,7 +379,7 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, ), ) if (parseContext.metadata.getMetadataValue(expr, "cType").isPresent) { @@ -399,7 +399,7 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr + ) as Expr ), ) if (parseContext.metadata.getMetadataValue(expr, "cType").isPresent) { diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/MemsafetyPass.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/MemsafetyPass.kt index 5d5fbdc361..e2e4e54202 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/MemsafetyPass.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/MemsafetyPass.kt @@ -18,7 +18,10 @@ package hu.bme.mit.theta.xcfa.passes import hu.bme.mit.theta.core.decl.Decls.Var import hu.bme.mit.theta.core.stmt.Stmts.Assume import hu.bme.mit.theta.core.type.Type -import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.* +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Gt +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Leq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Lt +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Mul import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or import hu.bme.mit.theta.frontend.ParseContext diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/MutexToVarPass.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/MutexToVarPass.kt index 7c9970555f..d1278cd811 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/MutexToVarPass.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/MutexToVarPass.kt @@ -19,10 +19,15 @@ import hu.bme.mit.theta.core.decl.Decls import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.stmt.AssignStmt import hu.bme.mit.theta.core.stmt.AssumeStmt -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Not +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType -import hu.bme.mit.theta.xcfa.* +import hu.bme.mit.theta.xcfa.acquiredMutex +import hu.bme.mit.theta.xcfa.getFlatLabels import hu.bme.mit.theta.xcfa.model.* +import hu.bme.mit.theta.xcfa.releasedMutex /** * Replaces mutexes (except the atomic block mutexes) with boolean variables. mutex_lock(mutex_var) diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/SsaPass.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/SsaPass.kt deleted file mode 100644 index 92aaa7eba7..0000000000 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/SsaPass.kt +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.xcfa.passes - -import hu.bme.mit.theta.core.decl.IndexedVarDecl -import hu.bme.mit.theta.core.decl.VarDecl -import hu.bme.mit.theta.core.stmt.AssignStmt -import hu.bme.mit.theta.core.stmt.AssumeStmt -import hu.bme.mit.theta.core.stmt.HavocStmt -import hu.bme.mit.theta.core.type.Expr -import hu.bme.mit.theta.core.type.Type -import hu.bme.mit.theta.core.type.anytype.RefExpr -import hu.bme.mit.theta.core.utils.ExprUtils -import hu.bme.mit.theta.core.utils.indexings.VarIndexing -import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory -import hu.bme.mit.theta.xcfa.model.* - -/** Transform the procedure to Static Single Assignment (SSA) form. */ -class SSAPass : ProcedurePass { - - private val ssaUtils = SSAUtils() - - override fun run(builder: XcfaProcedureBuilder): XcfaProcedureBuilder { - builder.getEdges().toSet().forEach { edge -> - builder.removeEdge(edge) - builder.addEdge(edge.withLabel(ssaUtils.toSSA(edge))) - } - return builder - } -} - -internal class SSAUtils { - - private var indexing: VarIndexing = VarIndexingFactory.indexing(0) - - private val indexedVars = mutableSetOf>() - - fun toSSA(edge: XcfaEdge) = edge.label.toSSA() - - fun removeSSA(edge: XcfaEdge) = edge.withLabel(edge.label.removeSSA()) - - // Convert to SSA - - private fun XcfaLabel.toSSA(): XcfaLabel { - return when (this) { - is StmtLabel -> { - when (val stmt = this.stmt) { - is AssignStmt<*> -> StmtLabel(stmt.toSSA(), choiceType, metadata) - is AssumeStmt -> StmtLabel(stmt.toSSA(), choiceType, metadata) - is HavocStmt<*> -> StmtLabel(stmt.toSSA(), choiceType, metadata) - else -> error("Unsupported statement at SSA conversion: $stmt") - } - } - - is StartLabel -> - StartLabel(name, params.map { it.toSSA() }, pidVar.getIndexed(), metadata, tempLookup) - is JoinLabel -> JoinLabel(pidVar.getIndexed(), metadata) - is SequenceLabel -> SequenceLabel(labels.map { it.toSSA() }, metadata) - is NopLabel, - is FenceLabel -> this - else -> error("Unsupported label at SSA conversion: $this") - } - } - - private fun Expr.toSSA(): Expr { - val unfolded = toSSAAtomic() - ExprUtils.getVars(this).forEach { indexing = indexing.inc(it) } - return unfolded - } - - private fun Expr.toSSAAtomic(): Expr = - if (this is RefExpr) { - (decl as? VarDecl)?.getIndexed(false)?.ref ?: this - } else { - map { it.toSSAAtomic() } - } - - private fun VarDecl.getIndexed(increment: Boolean = true): VarDecl { - val newName = this.name + "#" + indexing[this] - indexedVars - .find { it.name == newName } - ?.let { - return it as VarDecl - } - val newVar = IndexedVarDecl.of(newName, this) - indexedVars.add(newVar) - if (increment) indexing = indexing.inc(this) - return newVar - } - - private fun AssignStmt.toSSA() = AssignStmt.of(varDecl.getIndexed(), expr.toSSA()) - - private fun AssumeStmt.toSSA() = AssumeStmt.of(cond.toSSA()) - - private fun HavocStmt.toSSA() = HavocStmt.of(varDecl.getIndexed()) - - // Remove SSA - - private fun XcfaLabel.removeSSA(): XcfaLabel { - return when (this) { - is StmtLabel -> { - when (val stmt = this.stmt) { - is AssignStmt<*> -> StmtLabel(stmt.removeSSA(), choiceType, metadata) - is AssumeStmt -> StmtLabel(stmt.removeSSA(), choiceType, metadata) - is HavocStmt<*> -> StmtLabel(stmt.removeSSA(), choiceType, metadata) - else -> this - } - } - - is StartLabel -> - StartLabel(name, params.map { it.removeSSA() }, pidVar.noindex, metadata, tempLookup) - is JoinLabel -> JoinLabel(pidVar.noindex, metadata) - is SequenceLabel -> SequenceLabel(labels.map { it.removeSSA() }, metadata) - else -> this - } - } - - private fun Expr.removeSSA(): Expr = - if (this is RefExpr) { - ((decl as? IndexedVarDecl)?.original ?: decl).ref - } else { - map { it.removeSSA() } - } - - private val VarDecl.noindex - get() = (this as? IndexedVarDecl)?.original ?: this - - private fun AssignStmt.removeSSA() = - AssignStmt.of(varDecl.noindex, expr.removeSSA()) - - private fun AssumeStmt.removeSSA() = AssumeStmt.of(cond.removeSSA()) - - private fun HavocStmt.removeSSA() = HavocStmt.of(varDecl.noindex) -} diff --git a/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/MallocLitExprTest.kt b/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/MallocLitExprTest.kt new file mode 100644 index 0000000000..169495315c --- /dev/null +++ b/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/MallocLitExprTest.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.xcfa + +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import kotlinx.serialization.encodeToString +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.jupiter.api.assertDoesNotThrow + +class MallocLitExprTest { + + @Test + fun `test malloc literal expression serialization`() { + val mallocLitExpr = MallocLitExpr(Int()) + val serialized = xcfaJson.encodeToString>(mallocLitExpr) + val deserialized = xcfaJson.decodeFromString>(serialized) + assertEquals(mallocLitExpr, deserialized) + assertDoesNotThrow { (deserialized as MallocLitExpr<*>).kType } + } +} diff --git a/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/model/XcfaDslTest.kt b/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/model/XcfaDslTest.kt index 600ac4a4a4..dce195bde3 100644 --- a/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/model/XcfaDslTest.kt +++ b/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/model/XcfaDslTest.kt @@ -17,7 +17,8 @@ package hu.bme.mit.theta.xcfa.model import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.type.anytype.RefExpr -import hu.bme.mit.theta.core.type.inttype.IntExprs.* +import hu.bme.mit.theta.core.type.inttype.IntExprs.Eq +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.type.inttype.IntType import hu.bme.mit.theta.xcfa.model.ParamDirection.* import org.junit.Test diff --git a/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/passes/UtilsTest.kt b/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/passes/UtilsTest.kt index 9926a27c3e..9ae201c78c 100644 --- a/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/passes/UtilsTest.kt +++ b/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/passes/UtilsTest.kt @@ -18,7 +18,10 @@ package hu.bme.mit.theta.xcfa.passes import hu.bme.mit.theta.core.decl.Decl import hu.bme.mit.theta.core.decl.Decls.Var import hu.bme.mit.theta.core.decl.VarDecl -import hu.bme.mit.theta.core.stmt.Stmts.* +import hu.bme.mit.theta.core.stmt.Stmts.Assign +import hu.bme.mit.theta.core.stmt.Stmts.Assume +import hu.bme.mit.theta.core.stmt.Stmts.Havoc +import hu.bme.mit.theta.core.stmt.Stmts.Skip import hu.bme.mit.theta.core.type.inttype.IntExprs.Eq import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.xcfa.model.* diff --git a/subprojects/xcfa/xcfa2chc/src/main/java/hu/bme/mit/theta/xcfa2chc/Xcfa2Chc.kt b/subprojects/xcfa/xcfa2chc/src/main/java/hu/bme/mit/theta/xcfa2chc/Xcfa2Chc.kt index 26c52f6553..ff25f77473 100644 --- a/subprojects/xcfa/xcfa2chc/src/main/java/hu/bme/mit/theta/xcfa2chc/Xcfa2Chc.kt +++ b/subprojects/xcfa/xcfa2chc/src/main/java/hu/bme/mit/theta/xcfa2chc/Xcfa2Chc.kt @@ -23,10 +23,12 @@ import hu.bme.mit.theta.core.plus import hu.bme.mit.theta.core.stmt.HavocStmt import hu.bme.mit.theta.core.stmt.SequenceStmt import hu.bme.mit.theta.core.type.Expr -import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.* +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neq import hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read import hu.bme.mit.theta.core.type.arraytype.ArrayType -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.inttype.IntExprs.Add import hu.bme.mit.theta.core.type.inttype.IntExprs.Int diff --git a/subprojects/xcfa/xcfa2chc/src/test/java/hu/bme/mit/theta/xcfa2chc/TestChcUtils.kt b/subprojects/xcfa/xcfa2chc/src/test/java/hu/bme/mit/theta/xcfa2chc/TestChcUtils.kt index 3bb0e2fbc9..e40cfa5f96 100644 --- a/subprojects/xcfa/xcfa2chc/src/test/java/hu/bme/mit/theta/xcfa2chc/TestChcUtils.kt +++ b/subprojects/xcfa/xcfa2chc/src/test/java/hu/bme/mit/theta/xcfa2chc/TestChcUtils.kt @@ -22,10 +22,16 @@ import hu.bme.mit.theta.core.Relation import hu.bme.mit.theta.core.decl.Decls import hu.bme.mit.theta.core.decl.ParamDecl import hu.bme.mit.theta.core.plus -import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.* +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Add +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Lt import hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read import hu.bme.mit.theta.core.type.arraytype.ArrayType -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Not +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.inttype.IntExprs import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.type.inttype.IntType diff --git a/subprojects/xsts/xsts-analysis/src/main/kotlin/hu/bme/mit/theta/xsts/analysis/util/RandomXsts.kt b/subprojects/xsts/xsts-analysis/src/main/kotlin/hu/bme/mit/theta/xsts/analysis/util/RandomXsts.kt index 49bb325fe1..1eaeaceb88 100644 --- a/subprojects/xsts/xsts-analysis/src/main/kotlin/hu/bme/mit/theta/xsts/analysis/util/RandomXsts.kt +++ b/subprojects/xsts/xsts-analysis/src/main/kotlin/hu/bme/mit/theta/xsts/analysis/util/RandomXsts.kt @@ -38,22 +38,22 @@ fun generateXsts( ): XSTS { val writtenVars = object : StmtVisitor>, Set>> { - override fun visit(stmt: SkipStmt?, param: Set>): Set> { + override fun visit(stmt: SkipStmt, param: Set>): Set> { return param } - override fun visit(stmt: AssumeStmt?, param: Set>): Set> { + override fun visit(stmt: AssumeStmt, param: Set>): Set> { return param } - override fun visit( + override fun visit( stmt: AssignStmt, param: Set>, ): Set> { return setOf(stmt.varDecl) + param } - override fun visit( + override fun visit( stmt: HavocStmt, param: Set>, ): Set> { @@ -76,7 +76,7 @@ fun generateXsts( return res } - override fun visit(stmt: OrtStmt?, param: Set>?): Set> { + override fun visit(stmt: OrtStmt, param: Set>): Set> { TODO("Not yet implemented") } @@ -88,9 +88,9 @@ fun generateXsts( return stmt.then.accept(this, stmt.elze.accept(this, param)) } - override fun visit( - stmt: MemoryAssignStmt?, - param: Set>?, + override fun visit( + stmt: MemoryAssignStmt, + param: Set>, ): Set> { TODO("Not yet implemented") } @@ -129,8 +129,8 @@ class RandomXsts(seed: Int, val exprMaxDepth: Int) { var xsts: XSTS do { val trans = generateRandomStmt(depth, numCtrl, numClock, numOther) - val env = Stmts.NonDetStmt(listOf(Stmts.Skip())) - val init = Stmts.NonDetStmt(listOf(Stmts.Skip())) + val env = Stmts.NonDet(listOf(Stmts.Skip())) + val init = Stmts.NonDet(listOf(Stmts.Skip())) val initExpr = BoolExprs.And( ctrlVars.map { IntExprs.Eq(it.ref, IntExprs.Int(0)) } + @@ -193,7 +193,7 @@ class RandomXsts(seed: Int, val exprMaxDepth: Int) { } fun randomSeq(currDepth: Int, maxDepth: Int): Stmt { - return Stmts.SequenceStmt( + return Stmts.Sequence( listOf( randomIntermediate(currDepth + 1, maxDepth), randomIntermediate(currDepth + 1, maxDepth), @@ -202,7 +202,7 @@ class RandomXsts(seed: Int, val exprMaxDepth: Int) { } fun randomNonDet(currDepth: Int, maxDepth: Int): Stmt { - return Stmts.NonDetStmt( + return Stmts.NonDet( listOf( randomIntermediate(currDepth + 1, maxDepth), randomIntermediate(currDepth + 1, maxDepth), diff --git a/subprojects/xsts/xsts-analysis/src/main/kotlin/hu/bme/mit/theta/xsts/analysis/util/XstsSerializer.kt b/subprojects/xsts/xsts-analysis/src/main/kotlin/hu/bme/mit/theta/xsts/analysis/util/XstsSerializer.kt index 5841e305be..3c0cafb547 100644 --- a/subprojects/xsts/xsts-analysis/src/main/kotlin/hu/bme/mit/theta/xsts/analysis/util/XstsSerializer.kt +++ b/subprojects/xsts/xsts-analysis/src/main/kotlin/hu/bme/mit/theta/xsts/analysis/util/XstsSerializer.kt @@ -67,7 +67,7 @@ object XstsSerializer : StmtVisitor { return ExprWriter.instance().write(expr) } - override fun visit(stmt: SkipStmt?, param: Void?): String { + override fun visit(stmt: SkipStmt, param: Void?): String { return "" } @@ -75,11 +75,11 @@ object XstsSerializer : StmtVisitor { return "assume (${serializeExpr(stmt.cond)});" } - override fun visit(stmt: AssignStmt, param: Void?): String { + override fun visit(stmt: AssignStmt, param: Void?): String { return "${stmt.varDecl.name} := (${serializeExpr(stmt.expr)});" } - override fun visit(stmt: HavocStmt, param: Void?): String { + override fun visit(stmt: HavocStmt, param: Void?): String { return "havoc ${stmt.varDecl.name};" } @@ -91,7 +91,7 @@ object XstsSerializer : StmtVisitor { return "choice ${stmt.stmts.joinToString(" or ") { "{\n${it.accept(this, null)}\n}" }}" } - override fun visit(stmt: OrtStmt?, param: Void?): String { + override fun visit(stmt: OrtStmt, param: Void?): String { TODO("Not yet implemented") } @@ -119,8 +119,8 @@ object XstsSerializer : StmtVisitor { .trimIndent() } - override fun visit( - stmt: MemoryAssignStmt?, + override fun visit( + stmt: MemoryAssignStmt, param: Void?, ): String { TODO("Not yet implemented") diff --git a/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsExpression.java b/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsExpression.java index a804006127..ca511cc7f9 100644 --- a/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsExpression.java +++ b/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsExpression.java @@ -31,7 +31,6 @@ import static java.util.stream.Collectors.toList; import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.common.dsl.DynamicScope; import hu.bme.mit.theta.common.dsl.Env; import hu.bme.mit.theta.common.dsl.Symbol; @@ -56,6 +55,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; +import kotlin.Pair; import org.antlr.v4.runtime.Token; final class XstsExpression { @@ -497,11 +497,11 @@ private Expr createArrayLitExpr( } valueType = (T2) ctx.elseExpr.accept(this).getType(); - final List, Expr>> elems = + final List, Expr>> elems = IntStream.range(0, ctx.indexExpr.size()) .mapToObj( i -> - Tuple2.of( + new Pair<>( cast( ctx.indexExpr.get(i).accept(this), indexType), diff --git a/subprojects/xsts/xsts/src/test/kotlin/hu/bme/mit/theta/xsts/utils/XSTSVarChangerUnitTest.kt b/subprojects/xsts/xsts/src/test/kotlin/hu/bme/mit/theta/xsts/utils/XSTSVarChangerUnitTest.kt index 5adfecb178..11e2ec5ce8 100644 --- a/subprojects/xsts/xsts/src/test/kotlin/hu/bme/mit/theta/xsts/utils/XSTSVarChangerUnitTest.kt +++ b/subprojects/xsts/xsts/src/test/kotlin/hu/bme/mit/theta/xsts/utils/XSTSVarChangerUnitTest.kt @@ -48,6 +48,6 @@ class XSTSVarChangerUnitTest { StmtUtils.getVars(newXsts.env), ) - assert(!newVars.any { origVars.contains(it) }) + assert(!newVars.any { it in origVars }) } }