@@ -90,17 +90,32 @@ object SolverFactory {
90
90
// extract <exec> in "smt-z3:<exec>"
91
91
private def getZ3Executable (name : String ): String = name.drop(7 )
92
92
93
+ // extract solver in "no-inc:solver"
94
+ private def removeNoInc (name : String ): String = name.drop(7 )
95
+
93
96
def getFromName (name : String , force : Boolean = false )
94
97
(p : Program , ctx : Context )
95
98
(enc : ProgramTransformer {
96
99
val sourceProgram : p.type
97
100
val targetProgram : Program { val trees : inox.trees.type }
98
101
})(implicit sem : p.Semantics ): SolverFactory { val program : p.type ; type S <: TimeoutSolver { val program : p.type } } = {
99
102
103
+ val nonIncremental = name.startsWith(" no-inc:" )
104
+ val noPrefixName = if (nonIncremental) removeNoInc(name) else name
105
+
106
+ if (
107
+ nonIncremental &&
108
+ noPrefixName != " smt-cvc4" &&
109
+ noPrefixName != " unrollz3" &&
110
+ noPrefixName != " smt-z3" &&
111
+ ! noPrefixName.startsWith(" smt-z3:" )
112
+ )
113
+ throw FatalError (s " Non incremental mode is not available for solver $name" )
114
+
100
115
val finalName = if (force) {
101
- name
116
+ noPrefixName
102
117
} else {
103
- fallbacks.get(name ) match {
118
+ fallbacks.get(noPrefixName ) match {
104
119
case Some ((guard, names, requirement)) if ! guard() =>
105
120
val replacement = names.collectFirst {
106
121
case name if fallbacks(name)._1() => name
@@ -112,23 +127,54 @@ object SolverFactory {
112
127
}
113
128
replacement
114
129
115
- case Some (_) => name
116
- case None if name .startsWith(" smt-z3:" ) =>
117
- val z3Exec = getZ3Executable(name )
130
+ case Some (_) => noPrefixName
131
+ case None if noPrefixName .startsWith(" smt-z3:" ) =>
132
+ val z3Exec = getZ3Executable(noPrefixName )
118
133
val hasZ3Exec = try {
119
134
new Z3Interpreter (z3Exec, Array (" -in" , " -smt2" ))
120
135
true
121
136
} catch {
122
137
case _ : java.io.IOException => false
123
138
}
124
139
125
- if (hasZ3Exec) name
140
+ if (hasZ3Exec) noPrefixName
126
141
else throw FatalError (" Unknown solver: " + z3Exec)
127
142
128
- case _ => throw FatalError (" Unknown solver: " + name)
143
+ case _ => throw FatalError (" Unknown solver: " + noPrefixName)
144
+ }
145
+ }
146
+
147
+ def nonIncrementalWrap [T , M ](targetProgram : Program )(
148
+ nme : String ,
149
+ targetSem : targetProgram.Semantics ,
150
+ underlyingSolver : () => AbstractSolver {
151
+ val program : targetProgram.type
152
+ type Trees = T
153
+ type Model = M
154
+ }): AbstractSolver {
155
+ val program : targetProgram.type
156
+ type Trees = T
157
+ type Model = M
158
+ } = {
159
+
160
+ if (nonIncremental) {
161
+ new {
162
+ val program : targetProgram.type = targetProgram
163
+ val context = ctx
164
+ } with NonIncrementalSolver {
165
+ type Trees = T
166
+ type Model = M
167
+ val semantics : targetProgram.Semantics = targetSem
168
+ def name = s " no-inc: $nme"
169
+
170
+ def underlying () = underlyingSolver()
171
+ }
172
+ } else {
173
+ underlyingSolver()
129
174
}
130
175
}
131
176
177
+
132
178
finalName match {
133
179
case " nativez3" => create(p)(finalName, {
134
180
val chooseEnc = ChooseEncoder (p)(enc)
@@ -195,12 +241,12 @@ object SolverFactory {
195
241
override protected lazy val targetProgram : targetProg.type = targetProg
196
242
override protected val targetSemantics = targetSem
197
243
198
- protected val underlying = new {
244
+ protected val underlying = nonIncrementalWrap(progEnc.targetProgram)(finalName, targetSem, () => new {
199
245
val program : progEnc.targetProgram.type = progEnc.targetProgram
200
246
val context = ctx
201
247
} with z3.UninterpretedZ3Solver {
202
248
val semantics : program.Semantics = targetSem
203
- }
249
+ })
204
250
}
205
251
})
206
252
@@ -256,13 +302,13 @@ object SolverFactory {
256
302
override protected lazy val targetProgram : targetProg.type = targetProg
257
303
override protected val targetSemantics = targetSem
258
304
259
- protected val underlying = new {
305
+ protected val underlying = nonIncrementalWrap(progEnc.targetProgram)(finalName, targetSem, () => new {
260
306
val program : progEnc.targetProgram.type = progEnc.targetProgram
261
307
val context = ctx
262
308
} with smtlib.Z3Solver {
263
309
val semantics : program.Semantics = targetSem
264
310
override def targetName = executableName
265
- }
311
+ })
266
312
}
267
313
})
268
314
@@ -288,12 +334,12 @@ object SolverFactory {
288
334
override protected lazy val targetProgram : targetProg.type = targetProg
289
335
override protected val targetSemantics = targetSem
290
336
291
- protected val underlying = new {
337
+ protected val underlying = nonIncrementalWrap(progEnc.targetProgram)(finalName, targetSem, () => new {
292
338
val program : progEnc.targetProgram.type = progEnc.targetProgram
293
339
val context = ctx
294
340
} with smtlib.CVC4Solver {
295
341
val semantics : program.Semantics = targetSem
296
- }
342
+ })
297
343
}
298
344
})
299
345
@@ -324,7 +370,13 @@ object SolverFactory {
324
370
}
325
371
}
326
372
327
- def supportedSolver (s : String ) = solverNames.contains(s) || s.startsWith(" smt-z3:" )
373
+ def supportedSolver (s : String ) =
374
+ solverNames.contains(s) ||
375
+ s.startsWith(" smt-z3:" ) ||
376
+ s.startsWith(" no-inc:smt-z3:" ) ||
377
+ s == " no-inc:smt-z3" ||
378
+ s == " no-inc:smt-cvc4" ||
379
+ s == " no-inc:unrollz3"
328
380
329
381
def getFromSettings (p : Program , ctx : Context )
330
382
(enc : ProgramTransformer {
0 commit comments