@@ -97,8 +97,40 @@ object SolverFactory {
97
97
val targetProgram : Program { val trees : inox.trees.type }
98
98
})(implicit sem : p.Semantics ): SolverFactory { val program : p.type ; type S <: TimeoutSolver { val program : p.type } } = {
99
99
100
+ val nonIncremental = ctx.options.findOptionOrDefault(optNonIncremental)
101
+ def nonIncrementalWrap [T , M ](targetProgram : Program )(
102
+ nme : String ,
103
+ targetSem : targetProgram.Semantics ,
104
+ underlyingSolver : () => AbstractSolver {
105
+ val program : targetProgram.type
106
+ type Trees = T
107
+ type Model = M
108
+ }):
109
+ AbstractSolver {
110
+ val program : targetProgram.type
111
+ type Trees = T
112
+ type Model = M
113
+ } = {
114
+
115
+ if (nonIncremental) {
116
+ new {
117
+ val program : targetProgram.type = targetProgram
118
+ val context = ctx
119
+ } with NonIncrementalSolver {
120
+ type Trees = T
121
+ type Model = M
122
+ val semantics : targetProgram.Semantics = targetSem
123
+ def name = s " no-inc: $nme"
124
+
125
+ def underlying () = underlyingSolver()
126
+ }
127
+ } else {
128
+ underlyingSolver()
129
+ }
130
+ }
131
+
100
132
val finalName = if (force) {
101
- name
133
+ name
102
134
} else {
103
135
fallbacks.get(name) match {
104
136
case Some ((guard, names, requirement)) if ! guard() =>
@@ -129,6 +161,15 @@ object SolverFactory {
129
161
}
130
162
}
131
163
164
+ if (
165
+ nonIncremental &&
166
+ finalName != " smt-cvc4" &&
167
+ finalName != " unrollz3" &&
168
+ finalName != " smt-z3" &&
169
+ ! finalName.startsWith(" smt-z3:" )
170
+ )
171
+ throw FatalError (s " Option --no-incremental is not compatible with solver $finalName" )
172
+
132
173
finalName match {
133
174
case " nativez3" => create(p)(finalName, {
134
175
val chooseEnc = ChooseEncoder (p)(enc)
@@ -195,12 +236,12 @@ object SolverFactory {
195
236
override protected lazy val targetProgram : targetProg.type = targetProg
196
237
override protected val targetSemantics = targetSem
197
238
198
- protected val underlying = new {
239
+ protected val underlying = nonIncrementalWrap(progEnc.targetProgram)(finalName, targetSem, () => new {
199
240
val program : progEnc.targetProgram.type = progEnc.targetProgram
200
241
val context = ctx
201
242
} with z3.UninterpretedZ3Solver {
202
243
val semantics : program.Semantics = targetSem
203
- }
244
+ })
204
245
}
205
246
})
206
247
@@ -256,13 +297,13 @@ object SolverFactory {
256
297
override protected lazy val targetProgram : targetProg.type = targetProg
257
298
override protected val targetSemantics = targetSem
258
299
259
- protected val underlying = new {
300
+ protected val underlying = nonIncrementalWrap(progEnc.targetProgram)(finalName, targetSem, () => new {
260
301
val program : progEnc.targetProgram.type = progEnc.targetProgram
261
302
val context = ctx
262
303
} with smtlib.Z3Solver {
263
304
val semantics : program.Semantics = targetSem
264
305
override def targetName = executableName
265
- }
306
+ })
266
307
}
267
308
})
268
309
@@ -288,12 +329,12 @@ object SolverFactory {
288
329
override protected lazy val targetProgram : targetProg.type = targetProg
289
330
override protected val targetSemantics = targetSem
290
331
291
- protected val underlying = new {
332
+ protected val underlying = nonIncrementalWrap(progEnc.targetProgram)(finalName, targetSem, () => new {
292
333
val program : progEnc.targetProgram.type = progEnc.targetProgram
293
334
val context = ctx
294
335
} with smtlib.CVC4Solver {
295
336
val semantics : program.Semantics = targetSem
296
- }
337
+ })
297
338
}
298
339
})
299
340
0 commit comments