1 :- module(cvc4interface, [init_cvc4interface/0,
2 reset_cvc4interface/0, % TODO: make more lightweight once cvc 1.5 is out
3 cvc4_interface_call/1]).
4
5 :- use_module('../../src/module_information.pl').
6 :- module_info(group,experimental).
7 :- module_info(description,'This is the interface between ProB and the CVC4 SMT solver').
8
9 /*
10 :- use_module(probsrc(bsyntaxtree), [map_over_typed_bexpr/2,
11 find_typed_identifier_uses/3,
12 get_texpr_type/2,
13 get_texpr_id/2]).
14 */
15 foreign_resource('cvc4interface', [init,
16 reset,
17 mk_var,
18 mk_bounded_var,
19 mk_int_const,
20 mk_string_const,
21 mk_bool_const,
22 mk_empty_set,
23 mk_record_const,
24 mk_record_field,
25 mk_set,
26 mk_sort,
27 mk_sort_with_cardinality,
28 pop_frame, push_frame,
29 setup_enumerated_set,
30 mk_op,
31 mk_op_arglist,
32 query,
33 get_string,
34 mk_quantifier,
35 conjoin_negated_state,
36 add_interpreter_constraint,
37 mk_couple]).
38
39 % will be called by solver_interface:
40 :- public mk_var/3, mk_bounded_var/3, mk_empty_set/2, mk_int_const/2, mk_bool_const/2, mk_string_const/2.
41 :- public mk_set/2, mk_sort/1, mk_sort_with_cardinality/2, mk_record_const/3, mk_record_field/4.
42 :- public setup_enumerated_set/1, mk_op/4, mk_quantifier/4, mk_op_arglist/3, query/3, get_string/2, conjoin_negated_state/3.
43 :- public pop_frame/0, push_frame/0, add_interpreter_constraint/4, mk_couple/4.
44
45 % function declarations
46 foreign(init, c, init).
47 foreign(reset, c, reset).
48 foreign(mk_var, c, mk_var(+term, +string, [-integer])). % creates a variable; first argument is an atom of the type,
49 % second argument is the identifier
50 foreign(mk_bounded_var, c, mk_bounded_var(+term, +string, [-integer])).
51 foreign(mk_empty_set, c, mk_empty_set(+term, [-integer])).
52 foreign(mk_int_const, c, mk_int_const(+integer, [-integer])). % creates an int constant
53 foreign(mk_bool_const, c, mk_bool_const(+string, [-integer])). % creates a bool constant
54 foreign(mk_string_const, c, mk_string_const(+atom, [-integer])).
55 foreign(mk_set, c, mk_set(+term, [-integer])).
56 foreign(mk_sort, c, mk_sort(+atom)).
57 foreign(mk_sort_with_cardinality, c, mk_sort_with_cardinality(+atom,+integer)).
58 foreign(mk_record_const, c, mk_record_const(+term, +term, [-integer])).
59 foreign(mk_record_field, c, mk_record_field(+integer, +integer, +atom, [-integer])).
60 foreign(setup_enumerated_set, c, setup_enumerated_set(+term)).
61 foreign(mk_op, c, mk_op(+string, +integer, +integer, [-integer])).
62 foreign(mk_quantifier, c, mk_quantifier(+string, +term, +integer, [-integer])).
63 foreign(mk_op_arglist, c, mk_op_arglist(+string, +term, [-integer])).
64 foreign(query, c, query(+integer,+integer,[-atom])).
65 foreign(get_string, c, get_string(+integer, [-atom])).
66 foreign(conjoin_negated_state, c, conjoin_negated_state(+term,+integer,[-integer])).
67 foreign(pop_frame, c, pop_frame).
68 foreign(push_frame, c, push_frame).
69 foreign(add_interpreter_constraint, c, add_interpreter_constraint(+integer,+atom,+integer,[-term])).
70 foreign(mk_couple, c, mk_couple(+term,+integer,+integer,[-integer])).
71
72
73 %:- load_foreign_resource(cvc4interface).
74 :- dynamic is_initialised/0.
75
76 init_cvc4interface :- is_initialised,!.
77 init_cvc4interface :-
78 catch(load_foreign_resource(library(cvc4interface)),_,fail),
79 init,
80 assert(is_initialised).
81
82 reset_cvc4interface :- is_initialised, !,
83 reset.
84 reset_cvc4interface :- init_cvc4interface.
85
86 :- meta_predicate cvc4_interface_call(+).
87 cvc4_interface_call(Call) :-
88 call(Call).