Skip to content

Commit 9e1e1ec

Browse files
committed
Filter Assignments by Variable Names & Use Pair in Counterexample
1 parent d329663 commit 9e1e1ec

File tree

3 files changed

+15
-20
lines changed

3 files changed

+15
-20
lines changed

liquidjava-verifier/src/main/java/liquidjava/diagnostics/errors/RefinementError.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package liquidjava.diagnostics.errors;
22

3-
import java.util.Arrays;
3+
import java.util.ArrayList;
44
import java.util.List;
55
import java.util.stream.Collectors;
66

@@ -41,22 +41,14 @@ public String getCounterExampleString() {
4141
if (counterexample == null || counterexample.assignments().isEmpty())
4242
return null;
4343

44-
// filter out assignments of variables that do not appear in the found value
45-
String foundValue = found.getValue().toString();
46-
List<String> foundTokens = Arrays.asList(foundValue.split("[^a-zA-Z0-9_#]+"));
47-
List<String> relevantAssignments = counterexample.assignments().stream().filter(a -> {
48-
String varName = a.contains(" == ") ? a.substring(0, a.indexOf(" == ")).trim() : a;
49-
return foundTokens.contains(varName);
50-
}).collect(Collectors.toList());
44+
List<String> foundVarNames = new ArrayList<>();
45+
found.getValue().getVariableNames(foundVarNames);
46+
String counterexampleExp = counterexample.assignments().stream()
47+
.filter(a -> foundVarNames.contains(a.first())) // only include variables that appear in the found value
48+
.map(a -> a.first() + " == " + a.second()) // format as "var == value"
49+
.collect(Collectors.joining(" && ")); // join with "&&"
5150

52-
if (relevantAssignments.isEmpty())
53-
return null;
54-
55-
// join assignements with &&
56-
String counterexampleExp = String.join(" && ", relevantAssignments);
57-
58-
// check if counterexample is trivial (same as the found value)
59-
if (counterexampleExp.equals(foundValue))
51+
if (counterexampleExp.isEmpty() || counterexampleExp.equals(found.getValue().toString()))
6052
return null;
6153

6254
return counterexampleExp;

liquidjava-verifier/src/main/java/liquidjava/smt/Counterexample.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,7 @@
22

33
import java.util.List;
44

5-
public record Counterexample(List<String> assignments) {
5+
import liquidjava.utils.Pair;
6+
7+
public record Counterexample(List<Pair<String, String>> assignments) {
68
}

liquidjava-verifier/src/main/java/liquidjava/smt/TranslatorToZ3.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import liquidjava.diagnostics.errors.LJError;
2525
import liquidjava.diagnostics.errors.NotFoundError;
2626
import liquidjava.processor.context.AliasWrapper;
27+
import liquidjava.utils.Pair;
2728
import liquidjava.utils.Utils;
2829
import liquidjava.utils.constants.Keys;
2930
import com.microsoft.z3.enumerations.Z3_sort_kind;
@@ -59,13 +60,13 @@ public Solver makeSolverForExpression(Expr<?> e) {
5960
* Extracts the counterexample from the Z3 model
6061
*/
6162
public Counterexample getCounterexample(Model model) {
62-
List<String> assignments = new ArrayList<>();
63+
List<Pair<String, String>> assignments = new ArrayList<>();
6364
// Extract constant variable assignments
6465
for (FuncDecl<?> decl : model.getDecls()) {
6566
if (decl.getArity() == 0) {
6667
Symbol name = decl.getName();
6768
Expr<?> value = model.getConstInterp(decl);
68-
String assignment = name + " == " + value;
69+
Pair<String, String> assignment = new Pair<>(name.toString(), value.toString());
6970
// Skip values of uninterpreted sorts
7071
if (value.getSort().getSortKind() != Z3_sort_kind.Z3_UNINTERPRETED_SORT)
7172
assignments.add(assignment);
@@ -76,7 +77,7 @@ public Counterexample getCounterexample(Model model) {
7677
String name = entry.getKey();
7778
Expr<?> application = entry.getValue();
7879
Expr<?> value = model.eval(application, true);
79-
String assignment = name + " == " + value;
80+
Pair<String, String> assignment = new Pair<>(name, value.toString());
8081
assignments.add(assignment);
8182
}
8283
return new Counterexample(assignments);

0 commit comments

Comments
 (0)