1 :- module(solver_dispatcher, [init_interface/1,reset_interface/1,smt_solver_interface_call/2,
2 pretty_print_smt/1, pretty_print_smt/3,
3 smt_solver_version/2, smt_solver_header_version/2]).
4
5 :- use_module(extension('cvc4interface/cvc4interface')).
6 :- use_module(extension('z3interface/z3interface')).
7
8 %:- use_module(library(system), [environ/2]).
9 :- use_module(probsrc(debug), [debug_format_flush/3]).
10 :- use_module(probsrc(error_manager), [add_error/3, add_message/3]).
11
12 :- use_module(probsrc(module_information),[module_info/2]).
13 :- module_info(group,smt_solvers).
14 :- module_info(description,'This module provides an interface to SMT-solvers like CVC4 or Z3.').
15
16 init_interface(cvc4) :-
17 init_cvc4interface.
18 init_interface(z3) :-
19 init_z3interface,!.
20 init_interface(z3) :-
21 (z3interface_init_error(E)
22 -> add_error(z3,'Loading Z3 extension failed:',E)
23 ; add_error(z3,'Z3 initialisation failed:','') % should not happen
24 ),
25 add_message(z3,'Be sure that libz3.dylib/so/dll is on your dynamic library path',''),
26 % Z3_HOME is not used (anymore), Z3_HOME_FOR_PROB is used when compiling
27 % (environ('Z3_HOME',Path) -> add_message(z3,'Currently Z3_HOME is set to: ',Path)
28 % ; add_message(z3,'Currently Z3_HOME is not set.','') ),
29 fail.
30 reset_interface(cvc4) :-
31 reset_cvc4interface.
32 reset_interface(z3) :-
33 reset_z3interface.
34
35
36 :- meta_predicate smt_solver_interface_call(+,+).
37 smt_solver_interface_call(z3,Call) :-
38 %debug_format_flush(9,'z3: calling ~w~n',[Call]),
39 z3_interface_call(Call),
40 debug_format_flush(9,'z3: called ~w~n',[Call]).
41 smt_solver_interface_call(cvc4,Call) :-
42 %debug_format_flush(9,'cvc4: calling ~w~n',[Call]),
43 cvc4_interface_call(Call),
44 debug_format_flush(9,'cvc4: called ~w~n',[Call]).
45
46 pretty_print_smt(z3) :- !,pretty_print_smt.
47 pretty_print_smt(Solver) :- format('Pretty print not available for ~w~n',[Solver]).
48
49 pretty_print_smt(TranslationType, z3, ExprID) :- !, pretty_print_smt_for_id(TranslationType, ExprID).
50 pretty_print_smt(_, Solver, _) :- format('Pretty print not available for ~w~n', [Solver]).
51
52
53 smt_solver_version(z3,Version) :- !,
54 init_interface(z3),
55 z3_interface_call(get_full_version(Version)).
56 smt_solver_version(_,'?').
57
58 % version of the header files with which the ProB extension was linked with
59 % if this is too old or too new compared to the used solver we may have problems !
60 smt_solver_header_version(z3,Version) :- !,
61 init_interface(z3),
62 z3_interface_call(get_header_version(Version)).
63 smt_solver_header_version(_,'?').