Skip to content

Commit bb8f016

Browse files
authored
Allow true in more JML expressions (#3664)
2 parents 5aa36a1 + 28d4dec commit bb8f016

File tree

3 files changed

+30
-13
lines changed

3 files changed

+30
-13
lines changed

key.core/src/main/java/de/uka/ilkd/key/speclang/njml/JmlTermFactory.java

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,21 @@ public SpecMathMode replaceSpecMathMode(SpecMathMode specMathMode) {
9090
return overloadedFunctionHandler.replaceSpecMathMode(specMathMode);
9191
}
9292

93+
/**
94+
* Ensure that <code>term</code> is a boolean term. If it is a formula, convert it to a boolean
95+
* term.
96+
*/
97+
public JTerm ensureTerm(JTerm term) {
98+
if (term.sort() == JavaDLTheory.FORMULA) {
99+
// bugfix (CS): t.getTerm() delivers a formula instead of a
100+
// boolean term; obviously the original boolean terms are
101+
// converted to formulas somewhere else; however, we need
102+
// boolean terms instead of formulas here
103+
return tb.convertToBoolean(term);
104+
}
105+
return term;
106+
}
107+
93108
// region reach
94109
public SLExpression reach(JTerm t, SLExpression e1, SLExpression e2, SLExpression e3) {
95110
final LogicVariable stepsLV = e3 == null
@@ -860,14 +875,7 @@ public SLExpression createSeqDef(SLExpression a, SLExpression b, SLExpression t,
860875
}
861876
QuantifiableVariable qv = declVars.head();
862877
JTerm tt = t.getTerm();
863-
if (tt.sort() == JavaDLTheory.FORMULA) {
864-
// bugfix (CS): t.getTerm() delivers a formula instead of a
865-
// boolean term; obviously the original boolean terms are
866-
// converted to formulas somewhere else; however, we need
867-
// boolean terms instead of formulas here
868-
tt = tb.convertToBoolean(t.getTerm());
869-
}
870-
JTerm resultTerm = tb.seqDef(qv, a.getTerm(), b.getTerm(), tt);
878+
JTerm resultTerm = tb.seqDef(qv, a.getTerm(), b.getTerm(), ensureTerm(tt));
871879
final KeYJavaType seqtype = services.getJavaInfo().getPrimitiveKeYJavaType("\\seq");
872880
return new SLExpression(resultTerm, seqtype);
873881
}
@@ -973,7 +981,7 @@ public SLExpression seqConst(ImmutableList<SLExpression> exprList) {
973981
ImmutableList<JTerm> terms = ImmutableSLList.nil();
974982
for (SLExpression expr : exprList) {
975983
if (expr.isTerm()) {
976-
JTerm t = expr.getTerm();
984+
JTerm t = ensureTerm(expr.getTerm());
977985
terms = terms.append(t);
978986
} else {
979987
throw exc.createException0("Not a term: " + expr);
@@ -983,10 +991,14 @@ public SLExpression seqConst(ImmutableList<SLExpression> exprList) {
983991
return new SLExpression(tb.seq(terms), seqtype);
984992
}
985993

994+
public SLExpression seqUpd(JTerm seq, JTerm index, JTerm value) {
995+
return new SLExpression(tb.seqUpd(seq, index, ensureTerm(value)));
996+
}
997+
986998
public SLExpression createIndexOf(JTerm seq, JTerm elem) {
987999
final KeYJavaType inttype =
9881000
services.getJavaInfo().getPrimitiveKeYJavaType(PrimitiveType.JAVA_BIGINT);
989-
return new SLExpression(tb.indexOf(seq, elem), inttype);
1001+
return new SLExpression(tb.indexOf(seq, ensureTerm(elem)), inttype);
9901002
}
9911003

9921004
public @NonNull JTerm createReturns(@Nullable JTerm term) {

key.core/src/main/java/de/uka/ilkd/key/speclang/njml/Translator.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1662,11 +1662,9 @@ public Object visitSequenceReplace(JmlParser.SequenceReplaceContext ctx) {
16621662
SLExpression e2 = accept(ctx.expression(1));
16631663
SLExpression e3 = accept(ctx.expression(2));
16641664
// short for "e1[0..e2-1]+e3+e1[e2+1..e1.length-1]"
1665-
final JTerm minusOne = tb.zTerm("-1");
16661665
assert e2 != null;
16671666
assert e1 != null;
1668-
JTerm updated = tb.seqUpd(e1.getTerm(), e2.getTerm(), e3.getTerm());
1669-
return new SLExpression(updated);
1667+
return termFactory.seqUpd(e1.getTerm(), e2.getTerm(), e3.getTerm());
16701668
}
16711669

16721670
@Override

key.core/src/test/resources/de/uka/ilkd/key/speclang/njml/exprs.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,10 @@ this
1414
1.f + 2.d
1515
\seq()
1616
\locset()
17+
\seq_upd(\seq(), 2, true) // There were issues with true in expressions ... #3660
18+
\seq(true)
19+
\seq(true, true)
20+
(\seq_def int i; 0; 10; true)
21+
\seq_indexOf(\seq(true), true)
22+
true == true
23+
(\exists int i; true)

0 commit comments

Comments
 (0)