cprover
Loading...
Searching...
No Matches
solver_factory.cpp
Go to the documentation of this file.
1/*******************************************************************\
2
3Module: Solver Factory
4
5Author: Daniel Kroening, Peter Schrammel
6
7\*******************************************************************/
8
11
12#include "solver_factory.h"
13
14#include <util/cmdline.h>
16#include <util/exit_codes.h>
17#include <util/message.h>
18#include <util/options.h>
19#include <util/unicode.h>
20#include <util/version.h>
21
24#include <solvers/prop/prop.h>
33
34#include <iostream>
35#include <vector>
36
38 const optionst &_options,
39 const namespacet &_ns,
40 message_handlert &_message_handler,
41 bool _output_xml_in_refinement)
42 : options(_options),
43 ns(_ns),
44 message_handler(_message_handler),
45 output_xml_in_refinement(_output_xml_in_refinement)
46{
47}
48
49solver_factoryt::solvert::solvert(std::unique_ptr<stack_decision_proceduret> p)
50 : decision_procedure_ptr(std::move(p))
51{
52}
53
55 std::unique_ptr<stack_decision_proceduret> p1,
56 std::unique_ptr<propt> p2)
57 : prop_ptr(std::move(p2)), decision_procedure_ptr(std::move(p1))
58{
59}
60
62 std::unique_ptr<stack_decision_proceduret> p1,
63 std::unique_ptr<std::ofstream> p2)
64 : ofstream_ptr(std::move(p2)), decision_procedure_ptr(std::move(p1))
65{
66}
67
69 std::unique_ptr<boolbvt> p1,
70 std::unique_ptr<propt> p2)
71 : prop_ptr(std::move(p2)), decision_procedure_is_boolbvt_ptr(std::move(p1))
72{
73}
74
76 std::unique_ptr<boolbvt> p1,
77 std::unique_ptr<propt> p2,
78 std::unique_ptr<std::ofstream> p3)
79 : ofstream_ptr(std::move(p3)),
80 prop_ptr(std::move(p2)),
82{
83}
84
95
101
103 solver_resource_limitst &decision_procedure)
104{
105 const int timeout_seconds =
106 options.get_signed_int_option("solver-time-limit");
107
108 if(timeout_seconds > 0)
109 decision_procedure.set_time_limit_seconds(timeout_seconds);
110}
111
112std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_solver()
113{
114 if(options.get_bool_option("dimacs"))
115 return get_dimacs();
116 if(options.is_set("external-sat-solver"))
117 return get_external_sat();
118 if(
119 options.get_bool_option("refine") &&
120 !options.get_bool_option("refine-strings"))
121 {
122 return get_bv_refinement();
123 }
124 else if(options.get_bool_option("refine-strings"))
125 return get_string_refinement();
126 const auto incremental_smt2_solver =
127 options.get_option("incremental-smt2-solver");
128 if(!incremental_smt2_solver.empty())
129 return get_incremental_smt2(incremental_smt2_solver);
130 if(options.get_bool_option("smt2"))
132 return get_default();
133}
134
138{
139 // we shouldn't get here if this option isn't set
140 PRECONDITION(options.get_bool_option("smt2"));
141
143
144 if(options.get_bool_option("bitwuzla"))
146 else if(options.get_bool_option("boolector"))
148 else if(options.get_bool_option("cprover-smt2"))
150 else if(options.get_bool_option("mathsat"))
152 else if(options.get_bool_option("cvc3"))
154 else if(options.get_bool_option("cvc4"))
156 else if(options.get_bool_option("cvc5"))
158 else if(options.get_bool_option("yices"))
160 else if(options.get_bool_option("z3"))
162 else if(options.get_bool_option("generic"))
164
165 return s;
166}
167
171 const std::string &solver)
172{
174 log.warning() << "The specified solver, '" << solver
175 << "', is not available. "
176 << "The default solver will be used instead." << messaget::eom;
177}
178
179template <typename SatcheckT>
180static typename std::enable_if<
181 !std::is_base_of<hardness_collectort, SatcheckT>::value,
182 std::unique_ptr<SatcheckT>>::type
184{
185 auto satcheck = std::make_unique<SatcheckT>(message_handler);
186 if(options.is_set("write-solver-stats-to"))
187 {
189 log.warning()
190 << "Configured solver does not support --write-solver-stats-to. "
191 << "Solver stats will not be written." << messaget::eom;
192 }
193 return satcheck;
194}
195
196template <typename SatcheckT>
197static typename std::enable_if<
198 std::is_base_of<hardness_collectort, SatcheckT>::value,
199 std::unique_ptr<SatcheckT>>::type
201{
202 auto satcheck = std::make_unique<SatcheckT>(message_handler);
203 if(options.is_set("write-solver-stats-to"))
204 {
205 std::unique_ptr<solver_hardnesst> solver_hardness =
206 std::make_unique<solver_hardnesst>();
207 solver_hardness->set_outfile(options.get_option("write-solver-stats-to"));
208 satcheck->solver_hardness = std::move(solver_hardness);
209 }
210 return satcheck;
211}
212
213static std::unique_ptr<propt>
215{
216 const bool no_simplifier = options.get_bool_option("beautify") ||
217 !options.get_bool_option("sat-preprocessor") ||
218 options.get_bool_option("refine-strings");
219
220 if(options.is_set("sat-solver"))
221 {
222 const std::string &solver_option = options.get_option("sat-solver");
223 if(solver_option == "zchaff")
224 {
225#if defined SATCHECK_ZCHAFF
227#else
229#endif
230 }
231 else if(solver_option == "booleforce")
232 {
233#if defined SATCHECK_BOOLERFORCE
235#else
237#endif
238 }
239 else if(solver_option == "minisat1")
240 {
241#if defined SATCHECK_MINISAT1
243#else
245#endif
246 }
247 else if(solver_option == "minisat2")
248 {
249#if defined SATCHECK_MINISAT2
250 if(no_simplifier)
251 {
252 // simplifier won't work with beautification
255 }
256 else // with simplifier
257 {
260 }
261#else
263#endif
264 }
265 else if(solver_option == "ipasir")
266 {
267#if defined SATCHECK_IPASIR
269#else
271#endif
272 }
273 else if(solver_option == "picosat")
274 {
275#if defined SATCHECK_PICOSAT
277#else
279#endif
280 }
281 else if(solver_option == "lingeling")
282 {
283#if defined SATCHECK_LINGELING
285#else
287#endif
288 }
289 else if(solver_option == "glucose")
290 {
291#if defined SATCHECK_GLUCOSE
292 if(no_simplifier)
293 {
294 // simplifier won't work with beautification
297 }
298 else // with simplifier
299 {
302 }
303#else
305#endif
306 }
307 else if(solver_option == "cadical")
308 {
309#if defined SATCHECK_CADICAL
312#else
314#endif
315 }
316 else
317 {
319 log.error() << "unknown solver '" << solver_option << "'"
320 << messaget::eom;
322 }
323 }
324
325 // default solver
326 if(no_simplifier)
327 {
328 // simplifier won't work with beautification
331 }
332 else // with simplifier
333 {
335 }
336}
337
338static std::unique_ptr<std::ofstream> open_outfile_and_check(
339 const std::string &filename,
341 const std::string &arg_name)
342{
343 if(filename.empty())
344 return nullptr;
345
346 auto out = std::make_unique<std::ofstream>(widen_if_needed(filename));
347
348 if(!*out)
349 {
351 "failed to open file: " + filename, arg_name);
352 }
353
355 log.status() << "Outputting formula to file: " << filename << messaget::eom;
356 return out;
357}
358
359std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_default()
360{
361 auto sat_solver = get_sat_solver(message_handler, options);
362
363 bool get_array_constraints =
364 options.get_bool_option("show-array-constraints");
365 auto bv_pointers = std::make_unique<bv_pointerst>(
366 ns, *sat_solver, message_handler, get_array_constraints);
367
368 if(options.get_option("arrays-uf") == "never")
369 bv_pointers->unbounded_array = bv_pointerst::unbounded_arrayt::U_NONE;
370 else if(options.get_option("arrays-uf") == "always")
371 bv_pointers->unbounded_array = bv_pointerst::unbounded_arrayt::U_ALL;
372
374
375 std::unique_ptr<boolbvt> boolbv = std::move(bv_pointers);
376 return std::make_unique<solvert>(std::move(boolbv), std::move(sat_solver));
377}
378
379std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_dimacs()
380{
383
384 auto prop = std::make_unique<dimacs_cnft>(message_handler);
385
386 std::string filename = options.get_option("outfile");
387
388 if(filename.empty() || filename == "-")
389 {
390 std::unique_ptr<boolbvt> bv_dimacs =
391 std::make_unique<bv_dimacst>(ns, *prop, message_handler, std::cout);
392
393 return std::make_unique<solvert>(std::move(bv_dimacs), std::move(prop));
394 }
395
396 auto outfile = open_outfile_and_check(filename, message_handler, "--outfile");
397
398 std::unique_ptr<boolbvt> bv_dimacs =
399 std::make_unique<bv_dimacst>(ns, *prop, message_handler, *outfile);
400
401 return std::make_unique<solvert>(
402 std::move(bv_dimacs), std::move(prop), std::move(outfile));
403}
404
405std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_external_sat()
406{
409
410 std::string external_sat_solver = options.get_option("external-sat-solver");
411 auto prop =
412 std::make_unique<external_satt>(message_handler, external_sat_solver);
413
414 std::unique_ptr<boolbvt> bv_pointers =
415 std::make_unique<bv_pointerst>(ns, *prop, message_handler);
416
417 return std::make_unique<solvert>(std::move(bv_pointers), std::move(prop));
418}
419
420std::unique_ptr<solver_factoryt::solvert> solver_factoryt::get_bv_refinement()
421{
422 std::unique_ptr<propt> prop = get_sat_solver(message_handler, options);
423
425 info.ns = &ns;
426 info.prop = prop.get();
428
429 // we allow setting some parameters
430 if(options.get_bool_option("max-node-refinement"))
432 options.get_unsigned_int_option("max-node-refinement");
433
434 info.refine_arrays = options.get_bool_option("refine-arrays");
435 info.refine_arithmetic = options.get_bool_option("refine-arithmetic");
437
438 std::unique_ptr<boolbvt> decision_procedure =
439 std::make_unique<bv_refinementt>(info);
440 set_decision_procedure_time_limit(*decision_procedure);
441 return std::make_unique<solvert>(
442 std::move(decision_procedure), std::move(prop));
443}
444
448std::unique_ptr<solver_factoryt::solvert>
450{
452 info.ns = &ns;
454 info.prop = prop.get();
457 if(options.get_bool_option("max-node-refinement"))
459 options.get_unsigned_int_option("max-node-refinement");
460 info.refine_arrays = options.get_bool_option("refine-arrays");
461 info.refine_arithmetic = options.get_bool_option("refine-arithmetic");
463
464 std::unique_ptr<boolbvt> decision_procedure =
465 std::make_unique<string_refinementt>(info);
466 set_decision_procedure_time_limit(*decision_procedure);
467 return std::make_unique<solvert>(
468 std::move(decision_procedure), std::move(prop));
469}
470
471std::unique_ptr<solver_factoryt::solvert>
472solver_factoryt::get_incremental_smt2(std::string solver_command)
473{
475
476 const std::string outfile_arg = options.get_option("outfile");
477 const std::string dump_smt_formula = options.get_option("dump-smt-formula");
478
479 if(!outfile_arg.empty() && !dump_smt_formula.empty())
480 {
482 "Argument --outfile is incompatible with --dump-smt-formula. ",
483 "--outfile");
484 }
485
486 std::unique_ptr<smt_base_solver_processt> solver_process = nullptr;
487
488 if(!outfile_arg.empty())
489 {
490 bool on_std_out = outfile_arg == "-";
491 std::unique_ptr<std::ostream> outfile =
492 on_std_out
493 ? nullptr
494 : open_outfile_and_check(outfile_arg, message_handler, "--outfile");
495 solver_process = std::make_unique<smt_incremental_dry_run_solvert>(
496 message_handler, on_std_out ? std::cout : *outfile, std::move(outfile));
497 }
498 else
499 {
500 const auto out_filename = options.get_option("dump-smt-formula");
501
502 // If no out_filename is provided `open_outfile_and_check` will return
503 // `nullptr`, and the solver will work normally without any logging.
504 solver_process = std::make_unique<smt_piped_solver_processt>(
505 std::move(solver_command),
508 out_filename, message_handler, "--dump-smt-formula"));
509 }
510
511 return std::make_unique<solvert>(
512 std::make_unique<smt2_incremental_decision_proceduret>(
513 ns, std::move(solver_process), message_handler));
514}
515
516std::unique_ptr<solver_factoryt::solvert>
518{
520
521 const std::string &filename = options.get_option("outfile");
522
523 if(filename.empty())
524 {
526 {
528 "required filename not provided",
529 "--outfile",
530 "provide a filename with --outfile");
531 }
532
533 auto smt2_dec = std::make_unique<smt2_dect>(
534 ns,
535 "cbmc",
536 std::string("Generated by CBMC ") + CBMC_VERSION,
537 "QF_AUFBV",
538 solver,
539 options.get_option("external-smt2-solver"),
541
542 if(options.get_bool_option("fpa"))
543 smt2_dec->use_FPA_theory = true;
544
545 return std::make_unique<solvert>(std::move(smt2_dec));
546 }
547 else if(filename == "-")
548 {
549 auto smt2_conv = std::make_unique<smt2_convt>(
550 ns,
551 "cbmc",
552 std::string("Generated by CBMC ") + CBMC_VERSION,
553 "QF_AUFBV",
554 solver,
555 std::cout);
556
557 if(options.get_bool_option("fpa"))
558 smt2_conv->use_FPA_theory = true;
559
560 return std::make_unique<solvert>(std::move(smt2_conv));
561 }
562 else
563 {
564 auto out = open_outfile_and_check(filename, message_handler, "--outfile");
565
566 auto smt2_conv = std::make_unique<smt2_convt>(
567 ns,
568 "cbmc",
569 std::string("Generated by CBMC ") + CBMC_VERSION,
570 "QF_AUFBV",
571 solver,
572 *out);
573
574 if(options.get_bool_option("fpa"))
575 smt2_conv->use_FPA_theory = true;
576
577 return std::make_unique<solvert>(std::move(smt2_conv), std::move(out));
578 }
579}
580
582{
583 if(options.get_bool_option("beautify"))
584 {
586 "the chosen solver does not support beautification", "--beautify");
587 }
588}
589
591{
592 const bool all_properties = options.get_bool_option("all-properties");
593 const bool cover = options.is_set("cover");
594 const bool incremental_loop = options.is_set("incremental-loop");
595
596 if(all_properties)
597 {
599 "the chosen solver does not support incremental solving",
600 "--all_properties");
601 }
602 else if(cover)
603 {
605 "the chosen solver does not support incremental solving", "--cover");
606 }
607 else if(incremental_loop)
608 {
610 "the chosen solver does not support incremental solving",
611 "--incremental-loop");
612 }
613}
614
615static void parse_sat_options(const cmdlinet &cmdline, optionst &options)
616{
617 if(cmdline.isset("external-sat-solver"))
618 {
620 "external-sat-solver", cmdline.get_value("external-sat-solver"));
621 }
622
623 options.set_option("sat-preprocessor", !cmdline.isset("no-sat-preprocessor"));
624
625 if(cmdline.isset("dimacs"))
626 options.set_option("dimacs", true);
627
628 if(cmdline.isset("sat-solver"))
629 options.set_option("sat-solver", cmdline.get_value("sat-solver"));
630}
631
632static void parse_smt2_options(const cmdlinet &cmdline, optionst &options)
633{
634 if(cmdline.isset("smt2"))
635 options.set_option("smt2", true);
636
637 if(cmdline.isset("fpa"))
638 options.set_option("fpa", true);
639
640 bool solver_set = false;
641
642 if(cmdline.isset("bitwuzla"))
643 {
644 options.set_option("bitwuzla", true), solver_set = true;
645 options.set_option("smt2", true);
646 }
647
648 if(cmdline.isset("boolector"))
649 {
650 options.set_option("boolector", true), solver_set = true;
651 options.set_option("smt2", true);
652 }
653
654 if(cmdline.isset("cprover-smt2"))
655 {
656 options.set_option("cprover-smt2", true), solver_set = true;
657 options.set_option("smt2", true);
658 }
659
660 if(cmdline.isset("mathsat"))
661 {
662 options.set_option("mathsat", true), solver_set = true;
663 options.set_option("smt2", true);
664 }
665
666 if(cmdline.isset("cvc4"))
667 {
668 options.set_option("cvc4", true), solver_set = true;
669 options.set_option("smt2", true);
670 }
671
672 if(cmdline.isset("cvc5"))
673 {
674 options.set_option("cvc5", true), solver_set = true;
675 options.set_option("smt2", true);
676 }
677
678 if(cmdline.isset("incremental-smt2-solver"))
679 {
681 "incremental-smt2-solver", cmdline.get_value("incremental-smt2-solver")),
682 solver_set = true;
683 }
684
685 if(cmdline.isset("yices"))
686 {
687 options.set_option("yices", true), solver_set = true;
688 options.set_option("smt2", true);
689 }
690
691 if(cmdline.isset("z3"))
692 {
693 options.set_option("z3", true), solver_set = true;
694 options.set_option("smt2", true);
695 }
696
697 if(cmdline.isset("external-smt2-solver"))
698 {
700 "external-smt2-solver", cmdline.get_value("external-smt2-solver"));
701 solver_set = true;
702 options.set_option("smt2", true);
703 }
704
705 if(cmdline.isset("smt2") && !solver_set)
706 {
707 if(cmdline.isset("outfile"))
708 {
709 // outfile and no solver should give standard compliant SMT-LIB
710 options.set_option("generic", true);
711 }
712 else
713 {
714 // the default smt2 solver
715 options.set_option("z3", true);
716 }
717 }
718}
719
721{
722 parse_sat_options(cmdline, options);
723 parse_smt2_options(cmdline, options);
724
725 // Detect conflicting solver backend selections. The solver categories
726 // are mutually exclusive: DIMACS output, an external SAT solver, an
727 // SMT2 solver (including --smt2, solver-specific flags like --z3, and
728 // --external-smt2-solver), and the incremental SMT2 solver.
729 std::vector<std::string> solver_flags;
730
731 if(cmdline.isset("dimacs"))
732 solver_flags.push_back("--dimacs");
733
734 if(cmdline.isset("external-sat-solver"))
735 solver_flags.push_back("--external-sat-solver");
736
737 // All SMT2-related flags are in the same category (at most one
738 // reported in the conflict message).
739 for(const char *smt2_flag :
740 {"smt2",
741 "bitwuzla",
742 "boolector",
743 "cprover-smt2",
744 "mathsat",
745 "cvc3",
746 "cvc4",
747 "cvc5",
748 "yices",
749 "z3",
750 "external-smt2-solver"})
751 {
752 if(cmdline.isset(smt2_flag))
753 {
754 solver_flags.push_back(std::string("--") + smt2_flag);
755 break;
756 }
757 }
758
759 if(cmdline.isset("incremental-smt2-solver"))
760 solver_flags.push_back("--incremental-smt2-solver");
761
762 if(solver_flags.size() > 1)
763 {
765 "conflicting solver options: " + solver_flags[0] + " and " +
766 solver_flags[1] + " must not be given together",
767 solver_flags[0] + " " + solver_flags[1]);
768 }
769
770 // --fpa is not supported with the incremental SMT2 solver
771 if(cmdline.isset("incremental-smt2-solver") && cmdline.isset("fpa"))
772 {
774 "--fpa is not supported with --incremental-smt2-solver",
775 "--fpa --incremental-smt2-solver");
776 }
777
778 if(cmdline.isset("outfile"))
779 options.set_option("outfile", cmdline.get_value("outfile"));
780
781 if(cmdline.isset("dump-smt-formula"))
783 "dump-smt-formula", cmdline.get_value("dump-smt-formula"));
784
785 if(cmdline.isset("write-solver-stats-to"))
786 {
788 "write-solver-stats-to", cmdline.get_value("write-solver-stats-to"));
789 }
790
791 if(cmdline.isset("beautify"))
792 options.set_option("beautify", true);
793
794 if(cmdline.isset("refine-arrays"))
795 {
796 options.set_option("refine", true);
797 options.set_option("refine-arrays", true);
798 }
799
800 if(cmdline.isset("refine-arithmetic"))
801 {
802 options.set_option("refine", true);
803 options.set_option("refine-arithmetic", true);
804 }
805
806 if(cmdline.isset("refine"))
807 {
808 options.set_option("refine", true);
809 options.set_option("refine-arrays", true);
810 options.set_option("refine-arithmetic", true);
811 }
812
813 if(cmdline.isset("max-node-refinement"))
814 {
816 "max-node-refinement", cmdline.get_value("max-node-refinement"));
817 }
818}
Writing DIMACS Files.
Abstraction Refinement Loop.
std::string get_value(char option) const
Definition cmdline.cpp:48
virtual bool isset(char option) const
Definition cmdline.cpp:30
Thrown when users pass incorrect command line arguments, for example passing no files to analysis or ...
Class that provides messages with a built-in verbosity 'level'.
Definition message.h:154
mstreamt & error() const
Definition message.h:391
mstreamt & warning() const
Definition message.h:396
static eomt eom
Definition message.h:289
mstreamt & status() const
Definition message.h:406
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition namespace.h:91
bool is_set(const std::string &option) const
N.B. opts.is_set("foo") does not imply opts.get_bool_option("foo").
Definition options.cpp:62
bool get_bool_option(const std::string &option) const
Definition options.cpp:44
void set_option(const std::string &option, const bool value)
Definition options.cpp:28
const std::string get_option(const std::string &option) const
Definition options.cpp:67
std::unique_ptr< stack_decision_proceduret > decision_procedure_ptr
std::unique_ptr< propt > prop_ptr
std::unique_ptr< std::ofstream > ofstream_ptr
boolbvt & boolbv_decision_procedure() const
solvert(std::unique_ptr< stack_decision_proceduret > p)
stack_decision_proceduret & decision_procedure() const
std::unique_ptr< boolbvt > decision_procedure_is_boolbvt_ptr
message_handlert & message_handler
const optionst & options
const namespacet & ns
std::unique_ptr< solvert > get_external_sat()
std::unique_ptr< solvert > get_default()
solver_factoryt(const optionst &_options, const namespacet &_ns, message_handlert &_message_handler, bool _output_xml_in_refinement)
Note: The solver returned will hold a reference to the namespace ns.
void set_decision_procedure_time_limit(solver_resource_limitst &decision_procedure)
Sets the timeout of decision_procedure if the solver-time-limit option has a positive value (in secon...
std::unique_ptr< solvert > get_dimacs()
std::unique_ptr< solvert > get_string_refinement()
the string refinement adds to the bit vector refinement specifications for functions from the Java st...
std::unique_ptr< solvert > get_smt2(smt2_dect::solvert solver)
const bool output_xml_in_refinement
smt2_dect::solvert get_smt2_solver_type() const
Uses the options to pick an SMT 2.0 solver.
virtual std::unique_ptr< solvert > get_solver()
Returns a solvert object.
std::unique_ptr< solvert > get_incremental_smt2(std::string solver_command)
std::unique_ptr< solvert > get_bv_refinement()
virtual void set_time_limit_seconds(uint32_t)=0
Set the limit for the solver to time out in seconds.
Document and give macros for the exit codes of CPROVER binaries.
#define CPROVER_EXIT_USAGE_ERROR
A usage error is returned when the command line is invalid or conflicting.
Definition exit_codes.h:33
Allows calling an external SAT solver to allow faster integration of newer SAT solvers.
STL namespace.
Options.
Decision procedure with incremental SMT2 solving.
void solver(std::vector< framet > &frames, const std::unordered_set< symbol_exprt, irep_hash > &address_taken, const solver_optionst &solver_options, const namespacet &ns, std::vector< propertyt > &properties, std::size_t property_index)
Definition solver.cpp:44
static std::enable_if<!std::is_base_of< hardness_collectort, SatcheckT >::value, std::unique_ptr< SatcheckT > >::type make_satcheck_prop(message_handlert &message_handler, const optionst &options)
static void parse_sat_options(const cmdlinet &cmdline, optionst &options)
static std::unique_ptr< std::ofstream > open_outfile_and_check(const std::string &filename, message_handlert &message_handler, const std::string &arg_name)
static void parse_smt2_options(const cmdlinet &cmdline, optionst &options)
static std::unique_ptr< propt > get_sat_solver(message_handlert &message_handler, const optionst &options)
static void emit_solver_warning(message_handlert &message_handler, const std::string &solver)
Emit a warning for non-existent solver solver via message_handler.
Solver Factory.
void parse_solver_options(const cmdlinet &cmdline, optionst &options)
Parse solver-related command-line parameters in cmdline and set corresponding values in options.
Solver capability to set resource limits.
#define PRECONDITION(CONDITION)
Definition invariant.h:463
String support via creating string constraints and progressively instantiating the universal constrai...
#define DEFAULT_MAX_NB_REFINEMENT
unsigned max_node_refinement
Max number of times we refine a formula node.
bool refine_arrays
Enable array refinement.
bool refine_arithmetic
Enable arithmetic refinement.
const namespacet * ns
message_handlert * message_handler
string_refinementt constructor arguments
#define widen_if_needed(s)
Definition unicode.h:28
const char * CBMC_VERSION