Skip to content

Commit 18ccf11

Browse files
committed
Add SMTResult
1 parent cb9a1b5 commit 18ccf11

File tree

8 files changed

+51
-42
lines changed

8 files changed

+51
-42
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package liquidjava.diagnostics.errors;
22

3-
import liquidjava.diagnostics.Counterexample;
43
import liquidjava.diagnostics.TranslationTable;
54
import liquidjava.rj_language.opt.derivation_node.ValDerivationNode;
5+
import liquidjava.smt.Counterexample;
66
import spoon.reflect.cu.SourcePosition;
77

88
/**

liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/TypeChecker.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import java.util.Map;
77
import java.util.Optional;
88

9-
import liquidjava.diagnostics.Counterexample;
109
import liquidjava.diagnostics.errors.*;
1110
import liquidjava.processor.context.AliasWrapper;
1211
import liquidjava.processor.context.Context;
@@ -17,6 +16,8 @@
1716
import liquidjava.processor.facade.GhostDTO;
1817
import liquidjava.rj_language.Predicate;
1918
import liquidjava.rj_language.parsing.RefinementsParser;
19+
import liquidjava.smt.Counterexample;
20+
import liquidjava.smt.SMTResult;
2021
import liquidjava.utils.Utils;
2122
import liquidjava.utils.constants.Formats;
2223
import liquidjava.utils.constants.Keys;
@@ -314,9 +315,8 @@ public void checkStateSMT(Predicate prevState, Predicate expectedState, CtElemen
314315
}
315316

316317
public boolean checkStateSMT(Predicate prevState, Predicate expectedState, SourcePosition p) throws LJError {
317-
Counterexample counterexample = vcChecker.canProcessSubtyping(prevState, expectedState, context.getGhostState(),
318-
p, factory);
319-
return counterexample == null;
318+
SMTResult result = vcChecker.canProcessSubtyping(prevState, expectedState, context.getGhostState(), p, factory);
319+
return result.isOk();
320320
}
321321

322322
public void throwRefinementError(SourcePosition position, Predicate expectedType, Predicate foundType,

liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/VCChecker.java

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
import java.util.stream.Collectors;
99

1010
import liquidjava.diagnostics.errors.*;
11-
import liquidjava.diagnostics.Counterexample;
1211
import liquidjava.diagnostics.TranslationTable;
1312
import liquidjava.processor.VCImplication;
1413
import liquidjava.processor.context.*;
1514
import liquidjava.rj_language.Predicate;
15+
import liquidjava.smt.Counterexample;
1616
import liquidjava.smt.SMTEvaluator;
17-
import liquidjava.smt.TypeCheckError;
17+
import liquidjava.smt.SMTResult;
1818
import liquidjava.utils.constants.Keys;
1919
import spoon.reflect.cu.SourcePosition;
2020
import spoon.reflect.declaration.CtElement;
@@ -56,10 +56,11 @@ public void processSubtyping(Predicate expectedType, List<GhostState> list, CtEl
5656
e.setPosition(element.getPosition());
5757
throw e;
5858
}
59-
Counterexample counterexample = smtChecks(expected, premises, element.getPosition());
60-
if (counterexample != null)
59+
SMTResult result = smtChecks(expected, premises, element.getPosition());
60+
if (result.isError()) {
6161
throw new RefinementError(element.getPosition(), expectedType.simplify(), premisesBeforeChange.simplify(),
62-
map, counterexample, customMessage);
62+
map, result.getCounterexample(), customMessage);
63+
}
6364
}
6465

6566
/**
@@ -75,9 +76,9 @@ public void processSubtyping(Predicate expectedType, List<GhostState> list, CtEl
7576
*/
7677
public void processSubtyping(Predicate type, Predicate expectedType, List<GhostState> list, CtElement element,
7778
Factory f) throws LJError {
78-
Counterexample counterexample = canProcessSubtyping(type, expectedType, list, element.getPosition(), f);
79-
if (counterexample != null)
80-
throwRefinementError(element.getPosition(), expectedType, type, counterexample, null);
79+
SMTResult result = canProcessSubtyping(type, expectedType, list, element.getPosition(), f);
80+
if (result.isError())
81+
throwRefinementError(element.getPosition(), expectedType, type, result.getCounterexample(), null);
8182
}
8283

8384
/**
@@ -91,12 +92,9 @@ public void processSubtyping(Predicate type, Predicate expectedType, List<GhostS
9192
*
9293
* @throws LJError
9394
*/
94-
public Counterexample smtChecks(Predicate expected, Predicate found, SourcePosition position) throws LJError {
95+
public SMTResult smtChecks(Predicate expected, Predicate found, SourcePosition position) throws LJError {
9596
try {
96-
new SMTEvaluator().verifySubtype(found, expected, context);
97-
return null;
98-
} catch (TypeCheckError e) {
99-
return e.getCounterexample();
97+
return new SMTEvaluator().verifySubtype(found, expected, context);
10098
} catch (LJError e) {
10199
e.setPosition(position);
102100
throw e;
@@ -105,13 +103,13 @@ public Counterexample smtChecks(Predicate expected, Predicate found, SourcePosit
105103
}
106104
}
107105

108-
public Counterexample canProcessSubtyping(Predicate type, Predicate expectedType, List<GhostState> list,
106+
public SMTResult canProcessSubtyping(Predicate type, Predicate expectedType, List<GhostState> list,
109107
SourcePosition position, Factory f) throws LJError {
110108
List<RefinedVariable> lrv = new ArrayList<>(), mainVars = new ArrayList<>();
111109
gatherVariables(expectedType, lrv, mainVars);
112110
gatherVariables(type, lrv, mainVars);
113111
if (expectedType.isBooleanTrue() && type.isBooleanTrue())
114-
return null;
112+
return SMTResult.ok();
115113

116114
TranslationTable map = new TranslationTable();
117115
String[] s = { Keys.WILDCARD, Keys.THIS };

liquidjava-verifier/src/main/java/liquidjava/diagnostics/Counterexample.java renamed to liquidjava-verifier/src/main/java/liquidjava/smt/Counterexample.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package liquidjava.diagnostics;
1+
package liquidjava.smt;
22

33
import java.util.List;
44

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,13 @@
77
import com.microsoft.z3.Status;
88
import com.microsoft.z3.Z3Exception;
99

10-
import liquidjava.diagnostics.Counterexample;
1110
import liquidjava.processor.context.Context;
1211
import liquidjava.rj_language.Predicate;
1312
import liquidjava.rj_language.ast.Expression;
1413

1514
public class SMTEvaluator {
1615

17-
public void verifySubtype(Predicate subRef, Predicate supRef, Context c) throws Exception {
16+
public SMTResult verifySubtype(Predicate subRef, Predicate supRef, Context c) throws Exception {
1817
// Creates a parser for our SMT-ready refinement language
1918
// Discharges the verification to z3
2019
Predicate toVerify = Predicate.createConjunction(subRef, supRef.negate());
@@ -28,7 +27,7 @@ public void verifySubtype(Predicate subRef, Predicate supRef, Context c) throws
2827
if (result.equals(Status.SATISFIABLE)) {
2928
Model model = solver.getModel();
3029
Counterexample counterexample = tz3.getCounterexample(model);
31-
throw new TypeCheckError(counterexample);
30+
return SMTResult.error(counterexample);
3231
}
3332
}
3433
} catch (SyntaxException e1) {
@@ -37,5 +36,6 @@ public void verifySubtype(Predicate subRef, Predicate supRef, Context c) throws
3736
} catch (Z3Exception e) {
3837
throw new Z3Exception(e.getLocalizedMessage());
3938
}
39+
return SMTResult.ok();
4040
}
4141
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package liquidjava.smt;
2+
3+
public class SMTResult {
4+
private final Counterexample counterexample;
5+
6+
private SMTResult(Counterexample counterexample) {
7+
this.counterexample = counterexample;
8+
}
9+
10+
public static SMTResult ok() {
11+
return new SMTResult(null);
12+
}
13+
14+
public static SMTResult error(Counterexample counterexample) {
15+
return new SMTResult(counterexample);
16+
}
17+
18+
public boolean isOk() {
19+
return counterexample == null;
20+
}
21+
22+
public boolean isError() {
23+
return !isOk();
24+
}
25+
26+
public Counterexample getCounterexample() {
27+
return counterexample;
28+
}
29+
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import java.util.Map;
2323
import java.util.stream.Collectors;
2424

25-
import liquidjava.diagnostics.Counterexample;
2625
import liquidjava.diagnostics.errors.LJError;
2726
import liquidjava.diagnostics.errors.NotFoundError;
2827
import liquidjava.processor.context.AliasWrapper;

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

Lines changed: 0 additions & 17 deletions
This file was deleted.

0 commit comments

Comments
 (0)