-
Notifications
You must be signed in to change notification settings - Fork 50
/
Copy pathCVC4SolverContext.java
175 lines (151 loc) · 6.01 KB
/
CVC4SolverContext.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
// This file is part of JavaSMT,
// an API wrapper for a collection of SMT solvers:
// https://github.com/sosy-lab/java-smt
//
// SPDX-FileCopyrightText: 2020 Dirk Beyer <https://www.sosy-lab.org>
//
// SPDX-License-Identifier: Apache-2.0
package org.sosy_lab.java_smt.solvers.cvc4;
import edu.stanford.CVC4.CVC4JNI;
import edu.stanford.CVC4.Configuration;
import edu.stanford.CVC4.ExprManager;
import edu.stanford.CVC4.SExpr;
import edu.stanford.CVC4.SmtEngine;
import java.util.Set;
import java.util.function.Consumer;
import java.util.logging.Level;
import org.sosy_lab.common.ShutdownNotifier;
import org.sosy_lab.common.log.LogManager;
import org.sosy_lab.java_smt.SolverContextFactory.Solvers;
import org.sosy_lab.java_smt.api.FloatingPointRoundingMode;
import org.sosy_lab.java_smt.api.InterpolatingProverEnvironment;
import org.sosy_lab.java_smt.api.OptimizationProverEnvironment;
import org.sosy_lab.java_smt.api.ProverEnvironment;
import org.sosy_lab.java_smt.api.SolverContext;
import org.sosy_lab.java_smt.basicimpl.AbstractNumeralFormulaManager.NonLinearArithmetic;
import org.sosy_lab.java_smt.basicimpl.AbstractSolverContext;
public final class CVC4SolverContext extends AbstractSolverContext {
// creator is final, except after closing, then null.
private CVC4FormulaCreator creator;
private final ShutdownNotifier shutdownNotifier;
private final int randomSeed;
private CVC4SolverContext(
CVC4FormulaCreator creator,
CVC4FormulaManager manager,
ShutdownNotifier pShutdownNotifier,
int pRandomSeed) {
super(manager);
this.creator = creator;
shutdownNotifier = pShutdownNotifier;
randomSeed = pRandomSeed;
}
public static SolverContext create(
LogManager pLogger,
ShutdownNotifier pShutdownNotifier,
int randomSeed,
NonLinearArithmetic pNonLinearArithmetic,
FloatingPointRoundingMode pFloatingPointRoundingMode,
Consumer<String> pLoader) {
pLoader.accept("cvc4jni");
// ExprManager is the central class for creating expressions/terms/formulae.
ExprManager exprManager = new ExprManager();
CVC4FormulaCreator creator = new CVC4FormulaCreator(exprManager);
// set common options.
// temporary SmtEngine instance, until ExprManager.getOptions() works without SegFault.
SmtEngine smtEngine = new SmtEngine(exprManager);
smtEngine.setOption("output-language", new SExpr("smt2"));
smtEngine.setOption("random-seed", new SExpr(randomSeed));
// Set Strings option to enable all String features (such as lessOrEquals)
smtEngine.setOption("strings-exp", new SExpr(true));
// smtEngine.delete();
// Create managers
CVC4UFManager functionTheory = new CVC4UFManager(creator);
CVC4BooleanFormulaManager booleanTheory = new CVC4BooleanFormulaManager(creator);
CVC4IntegerFormulaManager integerTheory =
new CVC4IntegerFormulaManager(creator, pNonLinearArithmetic);
CVC4RationalFormulaManager rationalTheory =
new CVC4RationalFormulaManager(creator, pNonLinearArithmetic);
CVC4BitvectorFormulaManager bitvectorTheory =
new CVC4BitvectorFormulaManager(creator, booleanTheory);
CVC4FloatingPointFormulaManager fpTheory;
if (Configuration.isBuiltWithSymFPU()) {
fpTheory = new CVC4FloatingPointFormulaManager(creator, pFloatingPointRoundingMode);
} else {
fpTheory = null;
pLogger.log(Level.INFO, "CVC4 was built without support for FloatingPoint theory");
// throw new AssertionError("CVC4 was built without support for FloatingPoint theory");
}
CVC4QuantifiedFormulaManager qfTheory = new CVC4QuantifiedFormulaManager(creator);
CVC4ArrayFormulaManager arrayTheory = new CVC4ArrayFormulaManager(creator);
CVC4SLFormulaManager slTheory = new CVC4SLFormulaManager(creator);
CVC4StringFormulaManager strTheory = new CVC4StringFormulaManager(creator);
CVC4FormulaManager manager =
new CVC4FormulaManager(
creator,
functionTheory,
booleanTheory,
integerTheory,
rationalTheory,
bitvectorTheory,
fpTheory,
qfTheory,
arrayTheory,
slTheory,
strTheory);
return new CVC4SolverContext(creator, manager, pShutdownNotifier, randomSeed);
}
@Override
public String getVersion() {
return "CVC4 " + CVC4JNI.Configuration_getVersionString();
}
@Override
public void close() {
if (creator != null) {
creator.getEnv().delete();
creator = null;
}
}
@Override
public Solvers getSolverName() {
return Solvers.CVC4;
}
@Override
public ProverEnvironment newProverEnvironment0(Set<ProverOptions> pOptions) {
return new CVC4TheoremProver(
creator,
shutdownNotifier,
randomSeed,
pOptions,
getFormulaManager().getBooleanFormulaManager());
}
@Override
protected ProverEnvironment copyProverEnvironment0(ProverEnvironment proverToCopy) {
throw new UnsupportedOperationException(
"CVC4 does not support the copying of " + "ProverEnvironments");
}
@Override
protected boolean supportsAssumptionSolving() {
return false;
}
@Override
protected InterpolatingProverEnvironment<?> newProverEnvironmentWithInterpolation0(
Set<ProverOptions> pSet) {
throw new UnsupportedOperationException("CVC4 does not support interpolation");
}
@Override
protected InterpolatingProverEnvironment<?> copyProverEnvironmentWithInterpolation0(
InterpolatingProverEnvironment<?> proverToCopy) {
throw new UnsupportedOperationException(
"CVC4 does not support the copying of " + "ProverEnvironments");
}
@Override
protected OptimizationProverEnvironment newOptimizationProverEnvironment0(
Set<ProverOptions> pSet) {
throw new UnsupportedOperationException("CVC4 does not support optimization");
}
@Override
public OptimizationProverEnvironment copyOptimizationProverEnvironment(
OptimizationProverEnvironment proverToCopy) {
throw new UnsupportedOperationException("CVC4 does not support optimization");
}
}