Skip to content

Commit 8b4e625

Browse files
authored
Merge pull request #629 from sosy-lab/feat/smaller-improvements-on-several-solvers
Smaller improvements on several solvers
2 parents ba08f43 + 3224efa commit 8b4e625

15 files changed

Lines changed: 113 additions & 31 deletions

src/org/sosy_lab/java_smt/api/FunctionDeclarationKind.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,8 @@ public enum FunctionDeclarationKind {
298298
STR_TO_CODE,
299299
STR_LT,
300300
STR_LE,
301+
302+
RE_NONE,
301303
RE_PLUS,
302304
RE_STAR,
303305
RE_OPTIONAL,
@@ -308,6 +310,13 @@ public enum FunctionDeclarationKind {
308310
RE_COMPLEMENT,
309311
RE_DIFFERENCE,
310312

313+
// Separation logic
314+
SEP_EMP,
315+
SEP_NIL,
316+
SEP_PTO,
317+
SEP_STAR,
318+
SEP_WAND,
319+
311320
// default case
312321

313322
/**

src/org/sosy_lab/java_smt/api/SLFormulaManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ public interface SLFormulaManager {
8080
*
8181
* @param <AF> the type of the address formula.
8282
* @param <AT> the type of the address formula type.
83-
* @param pAdressType the type of the address formula.
83+
* @param pAddressType the type of the address formula.
8484
* @return a formula representing the "nil" element for the given address type.
8585
*/
86-
<AF extends Formula, AT extends FormulaType<AF>> AF makeNilElement(AT pAdressType);
86+
<AF extends Formula, AT extends FormulaType<AF>> AF makeNilElement(AT pAddressType);
8787
}

src/org/sosy_lab/java_smt/basicimpl/AbstractNumeralFormulaManager.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,11 +207,15 @@ public ResultFormulaType sum(List<ParamFormulaType> operands) {
207207
}
208208

209209
protected TFormulaInfo sumImpl(List<TFormulaInfo> operands) {
210-
TFormulaInfo result = makeNumberImpl(0);
211-
for (TFormulaInfo operand : operands) {
212-
result = add(result, operand);
210+
if (operands.isEmpty()) {
211+
return makeNumberImpl(0);
212+
} else {
213+
TFormulaInfo result = operands.get(0);
214+
for (TFormulaInfo operand : operands.subList(1, operands.size())) {
215+
result = add(result, operand);
216+
}
217+
return result;
213218
}
214-
return result;
215219
}
216220

217221
@Override

src/org/sosy_lab/java_smt/solvers/cvc4/CVC4FormulaCreator.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ public <R> R visit(FormulaVisitor<R> visitor, Formula formula, final Expr f) {
336336
} else if (type.isRoundingMode()) {
337337
return visitor.visitConstant(formula, getRoundingMode(f));
338338
} else if (type.isString()) {
339-
return visitor.visitConstant(formula, f.getConstString());
339+
return visitor.visitConstant(formula, f.getConstString().toString());
340340
} else if (type.isArray()) {
341341
ArrayStoreAll storeAll = f.getConstArrayStoreAll();
342342
Expr constant = storeAll.getExpr();
@@ -481,6 +481,7 @@ private Expr normalize(Expr operator) {
481481
.put(Kind.BITVECTOR_NEG, FunctionDeclarationKind.BV_NEG)
482482
.put(Kind.BITVECTOR_EXTRACT, FunctionDeclarationKind.BV_EXTRACT)
483483
.put(Kind.BITVECTOR_CONCAT, FunctionDeclarationKind.BV_CONCAT)
484+
.put(Kind.BITVECTOR_TO_NAT, FunctionDeclarationKind.UBV_TO_INT)
484485
.put(Kind.BITVECTOR_SIGN_EXTEND, FunctionDeclarationKind.BV_SIGN_EXTENSION)
485486
.put(Kind.BITVECTOR_ZERO_EXTEND, FunctionDeclarationKind.BV_ZERO_EXTENSION)
486487
// Floating-point theory
@@ -544,6 +545,12 @@ private Expr normalize(Expr operator) {
544545
.put(Kind.SELECT, FunctionDeclarationKind.SELECT)
545546
.put(Kind.STORE, FunctionDeclarationKind.STORE)
546547
.put(Kind.STORE_ALL, FunctionDeclarationKind.CONST)
548+
// Separation logic
549+
.put(Kind.SEP_EMP, FunctionDeclarationKind.SEP_EMP)
550+
.put(Kind.SEP_NIL, FunctionDeclarationKind.SEP_NIL)
551+
.put(Kind.SEP_PTO, FunctionDeclarationKind.SEP_PTO)
552+
.put(Kind.SEP_STAR, FunctionDeclarationKind.SEP_STAR)
553+
.put(Kind.SEP_WAND, FunctionDeclarationKind.SEP_WAND)
547554
.buildOrThrow();
548555

549556
private FunctionDeclarationKind getDeclarationKind(Expr f) {

src/org/sosy_lab/java_smt/solvers/cvc5/CVC5FormulaCreator.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,7 @@ private Term normalize(Term operator) {
648648
.put(Kind.STRING_FROM_CODE, FunctionDeclarationKind.STR_FROM_CODE)
649649
.put(Kind.STRING_LT, FunctionDeclarationKind.STR_LT)
650650
.put(Kind.STRING_LEQ, FunctionDeclarationKind.STR_LE)
651+
.put(Kind.REGEXP_NONE, FunctionDeclarationKind.RE_NONE)
651652
.put(Kind.REGEXP_PLUS, FunctionDeclarationKind.RE_PLUS)
652653
.put(Kind.REGEXP_STAR, FunctionDeclarationKind.RE_STAR)
653654
.put(Kind.REGEXP_OPT, FunctionDeclarationKind.RE_OPTIONAL)
@@ -660,6 +661,12 @@ private Term normalize(Term operator) {
660661
.put(Kind.SELECT, FunctionDeclarationKind.SELECT)
661662
.put(Kind.STORE, FunctionDeclarationKind.STORE)
662663
.put(Kind.CONST_ARRAY, FunctionDeclarationKind.CONST)
664+
// Separation logic
665+
.put(Kind.SEP_EMP, FunctionDeclarationKind.SEP_EMP)
666+
.put(Kind.SEP_NIL, FunctionDeclarationKind.SEP_NIL)
667+
.put(Kind.SEP_PTO, FunctionDeclarationKind.SEP_PTO)
668+
.put(Kind.SEP_STAR, FunctionDeclarationKind.SEP_STAR)
669+
.put(Kind.SEP_WAND, FunctionDeclarationKind.SEP_WAND)
663670
.build();
664671

665672
private FunctionDeclarationKind getDeclarationKind(Term f) {

src/org/sosy_lab/java_smt/solvers/cvc5/CVC5FormulaManager.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,11 @@ StringBuilder getSMTLIB2DeclarationsFor(ImmutableMap<String, Term> varsAndUFs) {
158158
return declarations;
159159
}
160160

161+
@Override
162+
protected Term simplify(Term f) throws InterruptedException {
163+
return creator.getSolver().simplify(f);
164+
}
165+
161166
@Override
162167
public <T extends Formula> T substitute(
163168
final T f, final Map<? extends Formula, ? extends Formula> fromToMapping) {

src/org/sosy_lab/java_smt/solvers/cvc5/CVC5InterpolatingProver.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,8 @@ private Term getCVC5Interpolation(Collection<Term> formulasA, Collection<Term> f
181181
Term interpolant;
182182
try {
183183
itpSolver.assertFormula(phiPlus);
184-
interpolant = itpSolver.getInterpolant(termManager.mkTerm(Kind.NOT, phiMinus));
184+
interpolant =
185+
itpSolver.simplify(itpSolver.getInterpolant(termManager.mkTerm(Kind.NOT, phiMinus)));
185186
} finally {
186187
itpSolver.deletePointer();
187188
}

src/org/sosy_lab/java_smt/solvers/cvc5/CVC5StringFormulaManager.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -140,17 +140,7 @@ protected Term allCharImpl() {
140140

141141
@Override
142142
protected Term range(Term start, Term end) {
143-
// Precondition: Both bounds must be single character Strings
144-
// CVC5 already checks that the lower bound is smaller than the upper bound and returns the
145-
// empty language otherwise.
146-
Term one = termManager.mkInteger(1);
147-
Term cond =
148-
termManager.mkTerm(
149-
Kind.AND,
150-
termManager.mkTerm(Kind.EQUAL, length(start), one),
151-
termManager.mkTerm(Kind.EQUAL, length(end), one));
152-
return termManager.mkTerm(
153-
Kind.ITE, cond, termManager.mkTerm(Kind.REGEXP_RANGE, start, end), noneImpl());
143+
return termManager.mkTerm(Kind.REGEXP_RANGE, start, end);
154144
}
155145

156146
@Override

src/org/sosy_lab/java_smt/solvers/princess/PrincessFormulaCreator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,8 @@ private FunctionDeclarationKind getDeclarationKind(IExpression input) {
602602
return FunctionDeclarationKind.OTHER;
603603
} else if (fun == ModuloArithmetic.int_cast()) {
604604
return FunctionDeclarationKind.OTHER;
605+
} else if (fun == PrincessEnvironment.stringTheory.re_none()) {
606+
return FunctionDeclarationKind.RE_NONE;
605607
} else {
606608
return FunctionDeclarationKind.UF;
607609
}

src/org/sosy_lab/java_smt/solvers/smtinterpol/SmtInterpolNumeralFormulaManager.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import de.uni_freiburg.informatik.ultimate.logic.Script;
1717
import de.uni_freiburg.informatik.ultimate.logic.Sort;
1818
import de.uni_freiburg.informatik.ultimate.logic.Term;
19+
import java.math.BigInteger;
1920
import java.util.ArrayDeque;
2021
import java.util.Arrays;
2122
import java.util.Deque;
@@ -174,4 +175,16 @@ public Term lessThan(Term pNumber1, Term pNumber2) {
174175
public Term lessOrEquals(Term pNumber1, Term pNumber2) {
175176
return env.term("<=", pNumber1, pNumber2);
176177
}
178+
179+
@Override
180+
protected Term sumImpl(List<Term> operands) {
181+
switch (operands.size()) {
182+
case 0:
183+
return env.numeral(BigInteger.ZERO);
184+
case 1:
185+
return operands.get(0);
186+
default:
187+
return env.term("+", operands.toArray(new Term[0]));
188+
}
189+
}
177190
}

0 commit comments

Comments
 (0)