@@ -65,76 +65,90 @@ decision_proceduret::resultt smt2_dect::dec_solve(const exprt &assumption)
6565 std::vector<std::string> argv;
6666 std::string stdin_filename;
6767
68+ auto solver_binary_name = [this ](const std::string &solver_name)
69+ {
70+ if (solver_binary_or_empty.empty ())
71+ return solver_name;
72+ else
73+ return solver_binary_or_empty;
74+ };
75+
6876 switch (solver)
6977 {
7078 case solvert::BITWUZLA:
71- argv = {" bitwuzla" , temp_file_problem ()};
79+ argv = {solver_binary_name ( " bitwuzla" ) , temp_file_problem ()};
7280 break ;
7381
7482 case solvert::BOOLECTOR:
75- argv = {" boolector" , " --smt2" , temp_file_problem (), " -m" };
83+ argv = {
84+ solver_binary_name (" boolector" ), " --smt2" , temp_file_problem (), " -m" };
7685 break ;
7786
7887 case solvert::CPROVER_SMT2:
79- argv = {" smt2_solver" };
88+ argv = {solver_binary_name ( " smt2_solver" ) };
8089 stdin_filename = temp_file_problem ();
8190 break ;
8291
8392 case solvert::CVC3:
84- argv = {" cvc3" ,
85- " +model" ,
86- " -lang" ,
87- " smtlib" ,
88- " -output-lang" ,
89- " smtlib" ,
90- temp_file_problem ()};
93+ argv = {
94+ solver_binary_name (" cvc3" ),
95+ " +model" ,
96+ " -lang" ,
97+ " smtlib" ,
98+ " -output-lang" ,
99+ " smtlib" ,
100+ temp_file_problem ()};
91101 break ;
92102
93103 case solvert::CVC4:
94104 // The flags --bitblast=eager --bv-div-zero-const help but only
95105 // work for pure bit-vector formulas.
96- argv = {" cvc4" , " -L" , " smt2" , temp_file_problem ()};
106+ argv = {solver_binary_name ( " cvc4" ) , " -L" , " smt2" , temp_file_problem ()};
97107 break ;
98108
99109 case solvert::CVC5:
100- argv = {" cvc5" , " --lang" , " smtlib" , temp_file_problem ()};
110+ argv = {
111+ solver_binary_name (" cvc5" ), " --lang" , " smtlib" , temp_file_problem ()};
101112 break ;
102113
103114 case solvert::MATHSAT:
104115 // The options below were recommended by Alberto Griggio
105116 // on 10 July 2013
106117
107- argv = {" mathsat" ,
108- " -input=smt2" ,
109- " -preprocessor.toplevel_propagation=true" ,
110- " -preprocessor.simplification=7" ,
111- " -dpll.branching_random_frequency=0.01" ,
112- " -dpll.branching_random_invalidate_phase_cache=true" ,
113- " -dpll.restart_strategy=3" ,
114- " -dpll.glucose_var_activity=true" ,
115- " -dpll.glucose_learnt_minimization=true" ,
116- " -theory.bv.eager=true" ,
117- " -theory.bv.bit_blast_mode=1" ,
118- " -theory.bv.delay_propagated_eqs=true" ,
119- " -theory.fp.mode=1" ,
120- " -theory.fp.bit_blast_mode=2" ,
121- " -theory.arr.mode=1" };
118+ argv = {
119+ solver_binary_name (" mathsat" ),
120+ " -input=smt2" ,
121+ " -preprocessor.toplevel_propagation=true" ,
122+ " -preprocessor.simplification=7" ,
123+ " -dpll.branching_random_frequency=0.01" ,
124+ " -dpll.branching_random_invalidate_phase_cache=true" ,
125+ " -dpll.restart_strategy=3" ,
126+ " -dpll.glucose_var_activity=true" ,
127+ " -dpll.glucose_learnt_minimization=true" ,
128+ " -theory.bv.eager=true" ,
129+ " -theory.bv.bit_blast_mode=1" ,
130+ " -theory.bv.delay_propagated_eqs=true" ,
131+ " -theory.fp.mode=1" ,
132+ " -theory.fp.bit_blast_mode=2" ,
133+ " -theory.arr.mode=1" };
122134
123135 stdin_filename = temp_file_problem ();
124136 break ;
125137
126138 case solvert::YICES:
127139 // command = "yices -smt -e " // Calling convention for older versions
128140 // Convention for 2.2.1
129- argv = {" yices-smt2" , temp_file_problem ()};
141+ argv = {solver_binary_name ( " yices-smt2" ) , temp_file_problem ()};
130142 break ;
131143
132144 case solvert::Z3:
133- argv = {" z3" , " -smt2" , temp_file_problem ()};
145+ argv = {solver_binary_name ( " z3" ) , " -smt2" , temp_file_problem ()};
134146 break ;
135147
136148 case solvert::GENERIC:
137- UNREACHABLE;
149+ PRECONDITION (!solver_binary_or_empty.empty ());
150+ argv = {solver_binary_or_empty, temp_file_problem ()};
151+ break ;
138152 }
139153
140154 int res =
0 commit comments