Branch data Line data Source code
1 : : /******************************************************************************
2 : : * This file is part of the cvc5 project.
3 : : *
4 : : * Copyright (c) 2009-2026 by the authors listed in the file AUTHORS
5 : : * in the top-level source directory and their institutional affiliations.
6 : : * All rights reserved. See the file COPYING in the top-level source
7 : : * directory for licensing information.
8 : : * ****************************************************************************
9 : : *
10 : : * The cvc5 C API.
11 : : */
12 : :
13 : : extern "C" {
14 : : #include <cvc5/c/cvc5.h>
15 : : }
16 : :
17 : : #include <cvc5/cvc5.h>
18 : :
19 : : #include <cstring>
20 : : #include <fstream>
21 : : #include <iostream>
22 : : #include <variant>
23 : :
24 : : #include "api/c/cvc5_c_structs.h"
25 : : #include "api/c/cvc5_checks.h"
26 : :
27 : : /* -------------------------------------------------------------------------- */
28 : : /* Error handling */
29 : : /* -------------------------------------------------------------------------- */
30 : :
31 : 1028 : bool cvc5_has_error() { return cvc5::cvc5_capi_has_error(); }
32 : :
33 : 1023 : const char* cvc5_get_error_message()
34 : : {
35 : 1023 : return cvc5::cvc5_capi_get_error_message();
36 : : }
37 : :
38 : 1016 : void cvc5_reset_error() { cvc5::cvc5_capi_reset_error(); }
39 : :
40 : : /* -------------------------------------------------------------------------- */
41 : : /* Cvc5Kind */
42 : : /* -------------------------------------------------------------------------- */
43 : :
44 : 0 : size_t cvc5_kind_hash(Cvc5Kind kind)
45 : : {
46 : 0 : return std::hash<cvc5::Kind>{}(static_cast<cvc5::Kind>(kind));
47 : : }
48 : :
49 : 299 : const char* cvc5_kind_to_string(Cvc5Kind kind)
50 : : {
51 [ + + ]: 299 : static thread_local std::string str;
52 : 299 : CVC5_CAPI_TRY_CATCH_BEGIN;
53 [ + + ][ + - ]: 299 : CVC5_CAPI_CHECK_KIND(kind);
[ + + ][ + + ]
[ - - ]
54 : 297 : str = "CVC5_KIND_" + std::to_string(static_cast<cvc5::Kind>(kind));
55 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
56 : 299 : return str.c_str();
57 : : }
58 : :
59 : : /* -------------------------------------------------------------------------- */
60 : : /* Cvc5SortKind */
61 : : /* -------------------------------------------------------------------------- */
62 : :
63 : 0 : size_t cvc5_sort_kind_hash(Cvc5SortKind kind)
64 : : {
65 : 0 : return std::hash<cvc5::SortKind>{}(static_cast<cvc5::SortKind>(kind));
66 : : }
67 : :
68 : 25 : const char* cvc5_sort_kind_to_string(Cvc5SortKind kind)
69 : : {
70 [ + + ]: 25 : static thread_local std::string str;
71 : 25 : CVC5_CAPI_TRY_CATCH_BEGIN;
72 [ + + ][ + - ]: 25 : CVC5_CAPI_CHECK_SORT_KIND(kind);
[ + + ][ + + ]
[ - - ]
73 : 23 : str = "CVC5_SORT_KIND_" + std::to_string(static_cast<cvc5::SortKind>(kind));
74 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
75 : 25 : return str.c_str();
76 : : }
77 : :
78 : : /* -------------------------------------------------------------------------- */
79 : : /* Cvc5RoundingMode */
80 : : /* -------------------------------------------------------------------------- */
81 : :
82 : 2 : const char* cvc5_rm_to_string(Cvc5RoundingMode rm)
83 : : {
84 [ + + ]: 2 : static thread_local std::string str;
85 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
86 : 2 : CVC5_CAPI_CHECK_RM(rm);
87 : 1 : str = std::to_string(static_cast<cvc5::RoundingMode>(rm));
88 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
89 : 2 : return str.c_str();
90 : : }
91 : :
92 : : /* -------------------------------------------------------------------------- */
93 : : /* Cvc5UnknownExplanation */
94 : : /* -------------------------------------------------------------------------- */
95 : :
96 : 3 : const char* cvc5_unknown_explanation_to_string(Cvc5UnknownExplanation exp)
97 : : {
98 [ + + ]: 3 : static thread_local std::string str;
99 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
100 [ + + ][ + - ]: 3 : CVC5_CAPI_CHECK_UNKNOWN_EXPLANATION(exp);
[ + + ][ + + ]
[ - - ]
101 : 2 : str = std::to_string(static_cast<cvc5::UnknownExplanation>(exp));
102 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
103 : 3 : return str.c_str();
104 : : }
105 : :
106 : : /* -------------------------------------------------------------------------- */
107 : : /* Cvc5LearnedLitType */
108 : : /* -------------------------------------------------------------------------- */
109 : :
110 : 2 : const char* cvc5_modes_learned_lit_type_to_string(Cvc5LearnedLitType type)
111 : : {
112 [ + + ]: 2 : static thread_local std::string str;
113 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
114 : 2 : CVC5_CAPI_CHECK_LEARNED_LIT_TYPE(type);
115 : 1 : str = std::to_string(static_cast<cvc5::modes::LearnedLitType>(type));
116 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
117 : 2 : return str.c_str();
118 : : }
119 : :
120 : : /* -------------------------------------------------------------------------- */
121 : : /* Cvc5BlockedModelsMode */
122 : : /* -------------------------------------------------------------------------- */
123 : :
124 : 2 : const char* cvc5_modes_block_models_mode_to_string(Cvc5BlockModelsMode mode)
125 : : {
126 [ + + ]: 2 : static thread_local std::string str;
127 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
128 : 2 : CVC5_CAPI_CHECK_BLOCK_MODELS_MODE(mode);
129 : 1 : str = std::to_string(static_cast<cvc5::modes::BlockModelsMode>(mode));
130 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
131 : 2 : return str.c_str();
132 : : }
133 : :
134 : : /* -------------------------------------------------------------------------- */
135 : : /* Cvc5ProofComponent */
136 : : /* -------------------------------------------------------------------------- */
137 : :
138 : 2 : const char* cvc5_modes_proof_component_to_string(Cvc5ProofComponent pc)
139 : : {
140 [ + + ]: 2 : static thread_local std::string str;
141 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
142 : 2 : CVC5_CAPI_CHECK_PROOF_COMPONENT(pc);
143 : 1 : str = std::to_string(static_cast<cvc5::modes::ProofComponent>(pc));
144 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
145 : 2 : return str.c_str();
146 : : }
147 : :
148 : : /* -------------------------------------------------------------------------- */
149 : : /* Cvc5ProofFormat */
150 : : /* -------------------------------------------------------------------------- */
151 : :
152 : 2 : const char* cvc5_modes_proof_format_to_string(Cvc5ProofFormat format)
153 : : {
154 [ + + ]: 2 : static thread_local std::string str;
155 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
156 : 2 : CVC5_CAPI_CHECK_PROOF_FORMAT(format);
157 : 1 : str = std::to_string(static_cast<cvc5::modes::ProofFormat>(format));
158 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
159 : 2 : return str.c_str();
160 : : }
161 : :
162 : : /* -------------------------------------------------------------------------- */
163 : : /* Cvc5ProofRule */
164 : : /* -------------------------------------------------------------------------- */
165 : :
166 : 171 : const char* cvc5_proof_rule_to_string(Cvc5ProofRule rule)
167 : : {
168 [ + + ]: 171 : static thread_local std::string str;
169 : 171 : CVC5_CAPI_TRY_CATCH_BEGIN;
170 [ + - ][ + - ]: 171 : CVC5_CAPI_CHECK_PROOF_RULE(rule);
[ - + ][ - + ]
[ - - ]
171 : 171 : str = std::to_string(static_cast<cvc5::ProofRule>(rule));
172 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
173 : 171 : return str.c_str();
174 : : }
175 : :
176 : 1 : size_t cvc5_proof_rule_hash(Cvc5ProofRule rule)
177 : : {
178 : 1 : return std::hash<cvc5::ProofRule>{}(static_cast<cvc5::ProofRule>(rule));
179 : : }
180 : :
181 : : /* -------------------------------------------------------------------------- */
182 : : /* Cvc5ProofRewriteRule */
183 : : /* -------------------------------------------------------------------------- */
184 : :
185 : 513 : const char* cvc5_proof_rewrite_rule_to_string(Cvc5ProofRewriteRule rule)
186 : : {
187 [ + + ]: 513 : static thread_local std::string str;
188 : 513 : CVC5_CAPI_TRY_CATCH_BEGIN;
189 [ + - ][ + - ]: 513 : CVC5_CAPI_CHECK_PROOF_REWRITE_RULE(rule);
[ - + ][ - + ]
[ - - ]
190 : 513 : str = std::to_string(static_cast<cvc5::ProofRewriteRule>(rule));
191 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
192 : 513 : return str.c_str();
193 : : }
194 : :
195 : 1 : size_t cvc5_proof_rewrite_rule_hash(Cvc5ProofRewriteRule rule)
196 : : {
197 : 2 : return std::hash<cvc5::ProofRewriteRule>{}(
198 : 2 : static_cast<cvc5::ProofRewriteRule>(rule));
199 : : }
200 : :
201 : : /* -------------------------------------------------------------------------- */
202 : : /* Cvc5FindSynthTarget */
203 : : /* -------------------------------------------------------------------------- */
204 : :
205 : 2 : const char* cvc5_modes_find_synth_target_to_string(Cvc5FindSynthTarget target)
206 : : {
207 [ + + ]: 2 : static thread_local std::string str;
208 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
209 : 2 : CVC5_CAPI_CHECK_FIND_SYNTH_TARGET(target);
210 : 1 : str = std::to_string(static_cast<cvc5::modes::FindSynthTarget>(target));
211 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
212 : 2 : return str.c_str();
213 : : }
214 : :
215 : : /* -------------------------------------------------------------------------- */
216 : : /* Cvc5OptionCategory */
217 : : /* -------------------------------------------------------------------------- */
218 : :
219 : 5 : const char* cvc5_modes_option_category_to_string(Cvc5OptionCategory category)
220 : : {
221 [ + + ]: 5 : static thread_local std::string str;
222 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
223 [ + + ][ + - ]: 5 : CVC5_CAPI_CHECK_OPTION_CATEGORY(category);
[ + + ][ + + ]
[ - - ]
224 : 4 : str = std::to_string(static_cast<cvc5::modes::OptionCategory>(category));
225 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
226 : 5 : return str.c_str();
227 : : }
228 : :
229 : : /* -------------------------------------------------------------------------- */
230 : : /* Cvc5InputLanguage */
231 : : /* -------------------------------------------------------------------------- */
232 : :
233 : 2 : const char* cvc5_modes_input_language_to_string(Cvc5InputLanguage lang)
234 : : {
235 [ + + ]: 2 : static thread_local std::string str;
236 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
237 : 2 : CVC5_CAPI_CHECK_INPUT_LANGUAGE(lang);
238 : 1 : str = std::to_string(static_cast<cvc5::modes::InputLanguage>(lang));
239 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
240 : 2 : return str.c_str();
241 : : }
242 : :
243 : : /* -------------------------------------------------------------------------- */
244 : : /* Cvc5Skolemid */
245 : : /* -------------------------------------------------------------------------- */
246 : :
247 : 61 : const char* cvc5_skolem_id_to_string(Cvc5SkolemId id)
248 : : {
249 [ + + ]: 61 : static thread_local std::string str;
250 : 61 : CVC5_CAPI_TRY_CATCH_BEGIN;
251 [ + - ][ + - ]: 61 : CVC5_CAPI_CHECK_SKOLEM_ID(id);
[ - + ][ - + ]
[ - - ]
252 : 61 : str = std::to_string(static_cast<cvc5::SkolemId>(id));
253 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
254 : 61 : return str.c_str();
255 : : }
256 : :
257 : 4 : size_t cvc5_skolem_id_hash(Cvc5SkolemId id)
258 : : {
259 : 4 : size_t res = 0;
260 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
261 [ + - ][ + - ]: 4 : CVC5_CAPI_CHECK_SKOLEM_ID(id);
[ - + ][ - + ]
[ - - ]
262 : 4 : res = std::hash<cvc5::SkolemId>{}(static_cast<cvc5::SkolemId>(id));
263 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
264 : 4 : return res;
265 : : }
266 : :
267 : : /* -------------------------------------------------------------------------- */
268 : : /* Cvc5Sort */
269 : : /* -------------------------------------------------------------------------- */
270 : :
271 : 2 : Cvc5Sort cvc5_sort_copy(Cvc5Sort sort)
272 : : {
273 : 2 : Cvc5Sort res = nullptr;
274 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
275 : 2 : CVC5_CAPI_CHECK_SORT(sort);
276 : 1 : res = sort->d_tm->copy(sort);
277 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
278 : 2 : return res;
279 : : }
280 : :
281 : 3 : void cvc5_sort_release(Cvc5Sort sort)
282 : : {
283 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
284 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
285 : 2 : sort->d_tm->release(sort);
286 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
287 : 3 : }
288 : :
289 : 56 : bool cvc5_sort_is_equal(Cvc5Sort a, Cvc5Sort b)
290 : : {
291 : 56 : bool res = false;
292 : 56 : CVC5_CAPI_TRY_CATCH_BEGIN;
293 [ + - ][ + + ]: 56 : if (a == nullptr || b == nullptr)
294 : : {
295 : 1 : res = a == b;
296 : : }
297 : : else
298 : : {
299 : 55 : res = a->d_sort == b->d_sort;
300 : : }
301 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
302 : 56 : return res;
303 : : }
304 : :
305 : 2 : bool cvc5_sort_is_disequal(Cvc5Sort a, Cvc5Sort b)
306 : : {
307 : 2 : bool res = false;
308 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
309 [ + - ][ + + ]: 2 : if (a == nullptr || b == nullptr)
310 : : {
311 : 1 : printf("1\n");
312 : 1 : res = a != b;
313 : : }
314 : : else
315 : : {
316 : 1 : printf("2\n");
317 : 1 : res = a->d_sort != b->d_sort;
318 : : }
319 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
320 : 2 : return res;
321 : : }
322 : :
323 : 3 : int64_t cvc5_sort_compare(Cvc5Sort a, Cvc5Sort b)
324 : : {
325 : 3 : int64_t res = false;
326 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
327 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SORT(a);
[ - - ]
328 : 2 : CVC5_CAPI_CHECK_SORT(b);
329 [ - + ][ - + ]: 1 : res = a->d_sort < b->d_sort ? -1 : (a->d_sort > b->d_sort ? 1 : 0);
330 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
331 : 3 : return res;
332 : : }
333 : :
334 : 7 : Cvc5SortKind cvc5_sort_get_kind(Cvc5Sort sort)
335 : : {
336 : 7 : Cvc5SortKind res = CVC5_SORT_KIND_INTERNAL_SORT_KIND;
337 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
338 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
339 : 6 : res = static_cast<Cvc5SortKind>(sort->d_sort.getKind());
340 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
341 : 7 : return res;
342 : : }
343 : :
344 : 9 : bool cvc5_sort_has_symbol(Cvc5Sort sort)
345 : : {
346 : 9 : bool res = false;
347 : 9 : CVC5_CAPI_TRY_CATCH_BEGIN;
348 [ + + ]: 9 : if (sort)
349 : : {
350 : 8 : res = sort->d_sort.hasSymbol();
351 : : }
352 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
353 : 9 : return res;
354 : : }
355 : :
356 : 7 : const char* cvc5_sort_get_symbol(Cvc5Sort sort)
357 : : {
358 : 7 : const char* res = nullptr;
359 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
360 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
361 [ + + ][ + + ]: 7 : CVC5_API_CHECK(cvc5_sort_has_symbol(sort))
[ - - ]
362 : 2 : << "cannot get symbol of sort that has no symbol";
363 [ + + ]: 3 : static thread_local std::string str;
364 [ + - ]: 3 : if (sort->d_sort.hasSymbol())
365 : : {
366 : 3 : str = sort->d_sort.getSymbol();
367 : 3 : res = str.c_str();
368 : : }
369 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
370 : 7 : return res;
371 : : }
372 : :
373 : 7 : bool cvc5_sort_is_boolean(Cvc5Sort sort)
374 : : {
375 : 7 : bool res = false;
376 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
377 [ + + ]: 7 : if (sort)
378 : : {
379 : 6 : res = sort->d_sort.isBoolean();
380 : : }
381 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
382 : 7 : return res;
383 : : }
384 : :
385 : 3 : bool cvc5_sort_is_integer(Cvc5Sort sort)
386 : : {
387 : 3 : bool res = false;
388 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
389 [ + + ]: 3 : if (sort)
390 : : {
391 : 2 : res = sort->d_sort.isInteger();
392 : : }
393 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
394 : 3 : return res;
395 : : }
396 : :
397 : 3 : bool cvc5_sort_is_real(Cvc5Sort sort)
398 : : {
399 : 3 : bool res = false;
400 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
401 [ + + ]: 3 : if (sort)
402 : : {
403 : 2 : res = sort->d_sort.isReal();
404 : : }
405 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
406 : 3 : return res;
407 : : }
408 : :
409 : 3 : bool cvc5_sort_is_string(Cvc5Sort sort)
410 : : {
411 : 3 : bool res = false;
412 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
413 [ + + ]: 3 : if (sort)
414 : : {
415 : 2 : res = sort->d_sort.isString();
416 : : }
417 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
418 : 3 : return res;
419 : : }
420 : :
421 : 3 : bool cvc5_sort_is_regexp(Cvc5Sort sort)
422 : : {
423 : 3 : bool res = false;
424 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
425 [ + + ]: 3 : if (sort)
426 : : {
427 : 2 : res = sort->d_sort.isRegExp();
428 : : }
429 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
430 : 3 : return res;
431 : : }
432 : :
433 : 3 : bool cvc5_sort_is_rm(Cvc5Sort sort)
434 : : {
435 : 3 : bool res = false;
436 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
437 [ + + ]: 3 : if (sort)
438 : : {
439 : 2 : res = sort->d_sort.isRoundingMode();
440 : : }
441 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
442 : 3 : return res;
443 : : }
444 : :
445 : 3 : bool cvc5_sort_is_bv(Cvc5Sort sort)
446 : : {
447 : 3 : bool res = false;
448 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
449 [ + + ]: 3 : if (sort)
450 : : {
451 : 2 : res = sort->d_sort.isBitVector();
452 : : }
453 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
454 : 3 : return res;
455 : : }
456 : :
457 : 3 : bool cvc5_sort_is_fp(Cvc5Sort sort)
458 : : {
459 : 3 : bool res = false;
460 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
461 [ + + ]: 3 : if (sort)
462 : : {
463 : 2 : res = sort->d_sort.isFloatingPoint();
464 : : }
465 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
466 : 3 : return res;
467 : : }
468 : :
469 : 11 : bool cvc5_sort_is_dt(Cvc5Sort sort)
470 : : {
471 : 11 : bool res = false;
472 : 11 : CVC5_CAPI_TRY_CATCH_BEGIN;
473 [ + + ]: 11 : if (sort)
474 : : {
475 : 9 : res = sort->d_sort.isDatatype();
476 : : }
477 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
478 : 11 : return res;
479 : : }
480 : :
481 : 4 : bool cvc5_sort_is_dt_constructor(Cvc5Sort sort)
482 : : {
483 : 4 : bool res = false;
484 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
485 [ + - ]: 4 : if (sort)
486 : : {
487 : 4 : res = sort->d_sort.isDatatypeConstructor();
488 : : }
489 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
490 : 4 : return res;
491 : : }
492 : :
493 : 5 : bool cvc5_sort_is_dt_selector(Cvc5Sort sort)
494 : : {
495 : 5 : bool res = false;
496 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
497 [ + + ]: 5 : if (sort)
498 : : {
499 : 4 : res = sort->d_sort.isDatatypeSelector();
500 : : }
501 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
502 : 5 : return res;
503 : : }
504 : :
505 : 5 : bool cvc5_sort_is_dt_tester(Cvc5Sort sort)
506 : : {
507 : 5 : bool res = false;
508 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
509 [ + + ]: 5 : if (sort)
510 : : {
511 : 4 : res = sort->d_sort.isDatatypeTester();
512 : : }
513 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
514 : 5 : return res;
515 : : }
516 : :
517 : 3 : bool cvc5_sort_is_dt_updater(Cvc5Sort sort)
518 : : {
519 : 3 : bool res = false;
520 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
521 [ + + ]: 3 : if (sort)
522 : : {
523 : 2 : res = sort->d_sort.isDatatypeUpdater();
524 : : }
525 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
526 : 3 : return res;
527 : : }
528 : :
529 : 3 : bool cvc5_sort_is_fun(Cvc5Sort sort)
530 : : {
531 : 3 : bool res = false;
532 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
533 [ + + ]: 3 : if (sort)
534 : : {
535 : 2 : res = sort->d_sort.isFunction();
536 : : }
537 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
538 : 3 : return res;
539 : : }
540 : :
541 : 3 : bool cvc5_sort_is_predicate(Cvc5Sort sort)
542 : : {
543 : 3 : bool res = false;
544 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
545 [ + + ]: 3 : if (sort)
546 : : {
547 : 2 : res = sort->d_sort.isPredicate();
548 : : }
549 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
550 : 3 : return res;
551 : : }
552 : :
553 : 3 : bool cvc5_sort_is_tuple(Cvc5Sort sort)
554 : : {
555 : 3 : bool res = false;
556 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
557 [ + + ]: 3 : if (sort)
558 : : {
559 : 2 : res = sort->d_sort.isTuple();
560 : : }
561 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
562 : 3 : return res;
563 : : }
564 : :
565 : 3 : bool cvc5_sort_is_nullable(Cvc5Sort sort)
566 : : {
567 : 3 : bool res = false;
568 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
569 [ + + ]: 3 : if (sort)
570 : : {
571 : 2 : res = sort->d_sort.isNullable();
572 : : }
573 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
574 : 3 : return res;
575 : : }
576 : :
577 : 3 : bool cvc5_sort_is_record(Cvc5Sort sort)
578 : : {
579 : 3 : bool res = false;
580 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
581 [ + + ]: 3 : if (sort)
582 : : {
583 : 2 : res = sort->d_sort.isRecord();
584 : : }
585 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
586 : 3 : return res;
587 : : }
588 : :
589 : 4 : bool cvc5_sort_is_array(Cvc5Sort sort)
590 : : {
591 : 4 : bool res = false;
592 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
593 [ + + ]: 4 : if (sort)
594 : : {
595 : 3 : res = sort->d_sort.isArray();
596 : : }
597 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
598 : 4 : return res;
599 : : }
600 : :
601 : 3 : bool cvc5_sort_is_ff(Cvc5Sort sort)
602 : : {
603 : 3 : bool res = false;
604 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
605 [ + + ]: 3 : if (sort)
606 : : {
607 : 2 : res = sort->d_sort.isFiniteField();
608 : : }
609 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
610 : 3 : return res;
611 : : }
612 : :
613 : 3 : bool cvc5_sort_is_set(Cvc5Sort sort)
614 : : {
615 : 3 : bool res = false;
616 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
617 [ + + ]: 3 : if (sort)
618 : : {
619 : 2 : res = sort->d_sort.isSet();
620 : : }
621 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
622 : 3 : return res;
623 : : }
624 : :
625 : 3 : bool cvc5_sort_is_bag(Cvc5Sort sort)
626 : : {
627 : 3 : bool res = false;
628 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
629 [ + + ]: 3 : if (sort)
630 : : {
631 : 2 : res = sort->d_sort.isBag();
632 : : }
633 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
634 : 3 : return res;
635 : : }
636 : :
637 : 3 : bool cvc5_sort_is_sequence(Cvc5Sort sort)
638 : : {
639 : 3 : bool res = false;
640 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
641 [ + + ]: 3 : if (sort)
642 : : {
643 : 2 : res = sort->d_sort.isSequence();
644 : : }
645 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
646 : 3 : return res;
647 : : }
648 : :
649 : 5 : bool cvc5_sort_is_abstract(Cvc5Sort sort)
650 : : {
651 : 5 : bool res = false;
652 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
653 [ + + ]: 5 : if (sort)
654 : : {
655 : 4 : res = sort->d_sort.isAbstract();
656 : : }
657 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
658 : 5 : return res;
659 : : }
660 : :
661 : 3 : bool cvc5_sort_is_uninterpreted_sort(Cvc5Sort sort)
662 : : {
663 : 3 : bool res = false;
664 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
665 [ + + ]: 3 : if (sort)
666 : : {
667 : 2 : res = sort->d_sort.isUninterpretedSort();
668 : : }
669 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
670 : 3 : return res;
671 : : }
672 : :
673 : 3 : bool cvc5_sort_is_uninterpreted_sort_constructor(Cvc5Sort sort)
674 : : {
675 : 3 : bool res = false;
676 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
677 [ + + ]: 3 : if (sort)
678 : : {
679 : 2 : res = sort->d_sort.isUninterpretedSortConstructor();
680 : : }
681 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
682 : 3 : return res;
683 : : }
684 : :
685 : 5 : bool cvc5_sort_is_instantiated(Cvc5Sort sort)
686 : : {
687 : 5 : bool res = false;
688 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
689 [ + - ]: 5 : if (sort)
690 : : {
691 : 5 : res = sort->d_sort.isInstantiated();
692 : : }
693 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
694 : 5 : return res;
695 : : }
696 : :
697 : 3 : Cvc5Sort cvc5_sort_get_uninterpreted_sort_constructor(Cvc5Sort sort)
698 : : {
699 : 3 : Cvc5Sort res = nullptr;
700 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
701 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
702 : 2 : res = sort->d_tm->export_sort(sort->d_sort.getUninterpretedSortConstructor());
703 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
704 : 3 : return res;
705 : : }
706 : :
707 : 56 : Cvc5Datatype cvc5_sort_get_datatype(Cvc5Sort sort)
708 : : {
709 : 56 : Cvc5Datatype res = nullptr;
710 : 56 : CVC5_CAPI_TRY_CATCH_BEGIN;
711 [ - + ][ - + ]: 56 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
712 : 56 : res = sort->d_tm->export_dt(sort->d_sort.getDatatype());
713 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
714 : 56 : return res;
715 : : }
716 : :
717 : 23 : Cvc5Sort cvc5_sort_instantiate(Cvc5Sort sort,
718 : : size_t size,
719 : : const Cvc5Sort params[])
720 : : {
721 : 23 : Cvc5Sort res = nullptr;
722 : 23 : CVC5_CAPI_TRY_CATCH_BEGIN;
723 [ - + ][ - + ]: 23 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
724 [ - + ][ - + ]: 23 : CVC5_CAPI_CHECK_NOT_NULL(params);
[ - - ]
725 : 23 : std::vector<cvc5::Sort> cparams;
726 [ + + ]: 58 : for (uint32_t i = 0; i < size; ++i)
727 : : {
728 [ - + ][ - + ]: 35 : CVC5_CAPI_CHECK_SORT_AT_IDX(params, i);
[ - - ]
729 : 35 : cparams.push_back(params[i]->d_sort);
730 : : }
731 : 23 : res = sort->d_tm->export_sort(sort->d_sort.instantiate(cparams));
732 [ + - ][ - + ]: 25 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
733 : 23 : return res;
734 : : }
735 : :
736 : 7 : const Cvc5Sort* cvc5_sort_get_instantiated_parameters(Cvc5Sort sort,
737 : : size_t* size)
738 : : {
739 [ + + ]: 7 : static thread_local std::vector<Cvc5Sort> res;
740 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
741 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
742 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
743 : 5 : res.clear();
744 : 5 : auto sorts = sort->d_sort.getInstantiatedParameters();
745 : 2 : auto tm = sort->d_tm;
746 [ + + ]: 8 : for (auto& s : sorts)
747 : : {
748 : 6 : res.push_back(tm->export_sort(s));
749 : : }
750 : 2 : *size = res.size();
751 [ + - ][ - + ]: 7 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
752 : : // On error, `size` may be invalid (e.g. NULL) and `res` may hold stale data,
753 : : // so we must not dereference `size` here; gate on the error state instead.
754 [ + + ][ + - ]: 7 : return cvc5::cvc5_capi_has_error() || res.empty() ? nullptr : res.data();
755 : : }
756 : :
757 : 1 : Cvc5Sort cvc5_sort_substitute(Cvc5Sort sort, Cvc5Sort s, Cvc5Sort replacement)
758 : : {
759 : 1 : Cvc5Sort res = nullptr;
760 : 1 : CVC5_CAPI_TRY_CATCH_BEGIN;
761 [ - + ][ - + ]: 1 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
762 [ - + ][ - + ]: 1 : CVC5_CAPI_CHECK_SORT(s);
[ - - ]
763 [ - + ][ - + ]: 1 : CVC5_CAPI_CHECK_SORT(replacement);
[ - - ]
764 : 1 : res = sort->d_tm->export_sort(
765 : 2 : sort->d_sort.substitute(s->d_sort, replacement->d_sort));
766 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
767 : 1 : return res;
768 : : }
769 : :
770 : 1 : Cvc5Sort cvc5_sort_substitute_sorts(Cvc5Sort sort,
771 : : size_t size,
772 : : const Cvc5Sort sorts[],
773 : : const Cvc5Sort replacements[])
774 : : {
775 : 1 : Cvc5Sort res = nullptr;
776 : 1 : CVC5_CAPI_TRY_CATCH_BEGIN;
777 [ - + ][ - + ]: 1 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
778 [ - + ][ - + ]: 1 : CVC5_CAPI_CHECK_NOT_NULL(sorts);
[ - - ]
779 [ - + ][ - + ]: 1 : CVC5_CAPI_CHECK_NOT_NULL(replacements);
[ - - ]
780 : 1 : std::vector<cvc5::Sort> csorts;
781 [ + + ]: 3 : for (uint32_t i = 0; i < size; ++i)
782 : : {
783 [ - + ][ - + ]: 2 : CVC5_CAPI_CHECK_SORT_AT_IDX(sorts, i);
[ - - ]
784 : 2 : csorts.push_back(sorts[i]->d_sort);
785 : : }
786 : 1 : std::vector<cvc5::Sort> creplacements;
787 [ + + ]: 3 : for (uint32_t i = 0; i < size; ++i)
788 : : {
789 [ - + ][ - + ]: 2 : CVC5_CAPI_CHECK_SORT_AT_IDX(replacements, i);
[ - - ]
790 : 2 : creplacements.push_back(replacements[i]->d_sort);
791 : : }
792 : 1 : res = sort->d_tm->export_sort(sort->d_sort.substitute(csorts, creplacements));
793 [ - - ][ - - ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
794 : 1 : return res;
795 : : }
796 : :
797 : 4 : const char* cvc5_sort_to_string(Cvc5Sort sort)
798 : : {
799 [ + + ]: 4 : static thread_local std::string str;
800 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
801 [ - + ][ - + ]: 4 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
802 : 4 : str = sort->d_sort.toString();
803 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
804 : 4 : return str.c_str();
805 : : }
806 : :
807 : 9 : size_t cvc5_sort_hash(Cvc5Sort sort)
808 : : {
809 : 9 : size_t res = 0;
810 : 9 : CVC5_CAPI_TRY_CATCH_BEGIN;
811 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
812 : 8 : res = std::hash<cvc5::Sort>{}(sort->d_sort);
813 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
814 : 9 : return res;
815 : : }
816 : :
817 : : /* Datatype constructor sort ------------------------------------------- */
818 : :
819 : 2 : size_t cvc5_sort_dt_constructor_get_arity(Cvc5Sort sort)
820 : : {
821 : 2 : size_t res = 0;
822 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
823 [ - + ][ - + ]: 2 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
824 : 2 : res = sort->d_sort.getDatatypeConstructorArity();
825 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
826 : 2 : return res;
827 : : }
828 : :
829 : 2 : const Cvc5Sort* cvc5_sort_dt_constructor_get_domain(Cvc5Sort sort, size_t* size)
830 : : {
831 [ + + ]: 2 : static thread_local std::vector<Cvc5Sort> res;
832 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
833 [ - + ][ - + ]: 2 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
834 [ - + ][ - + ]: 2 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
835 : 2 : res.clear();
836 : 2 : auto sorts = sort->d_sort.getDatatypeConstructorDomainSorts();
837 : 1 : auto tm = sort->d_tm;
838 [ + + ]: 3 : for (auto& s : sorts)
839 : : {
840 : 2 : res.push_back(tm->export_sort(s));
841 : : }
842 : 1 : *size = res.size();
843 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
844 : : // On error, `size` may be invalid (e.g. NULL) and `res` may hold stale data,
845 : : // so we must not dereference `size` here; gate on the error state instead.
846 [ + + ][ + - ]: 2 : return cvc5::cvc5_capi_has_error() || res.empty() ? nullptr : res.data();
847 : : }
848 : :
849 : 2 : Cvc5Sort cvc5_sort_dt_constructor_get_codomain(Cvc5Sort sort)
850 : : {
851 : 2 : Cvc5Sort res = nullptr;
852 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
853 [ - + ][ - + ]: 2 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
854 : 1 : res = sort->d_tm->export_sort(
855 : 3 : sort->d_sort.getDatatypeConstructorCodomainSort());
856 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
857 : 2 : return res;
858 : : }
859 : :
860 : : /* Dataype Selector sort ------------------------------------------------ */
861 : :
862 : 2 : Cvc5Sort cvc5_sort_dt_selector_get_domain(Cvc5Sort sort)
863 : : {
864 : 2 : Cvc5Sort res = nullptr;
865 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
866 [ - + ][ - + ]: 2 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
867 : 2 : res = sort->d_tm->export_sort(sort->d_sort.getDatatypeSelectorDomainSort());
868 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
869 : 2 : return res;
870 : : }
871 : :
872 : 2 : Cvc5Sort cvc5_sort_dt_selector_get_codomain(Cvc5Sort sort)
873 : : {
874 : 2 : Cvc5Sort res = nullptr;
875 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
876 [ - + ][ - + ]: 2 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
877 : 2 : res = sort->d_tm->export_sort(sort->d_sort.getDatatypeSelectorCodomainSort());
878 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
879 : 2 : return res;
880 : : }
881 : :
882 : : /* Datatype Tester sort ------------------------------------------------ */
883 : :
884 : 2 : Cvc5Sort cvc5_sort_dt_tester_get_domain(Cvc5Sort sort)
885 : : {
886 : 2 : Cvc5Sort res = nullptr;
887 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
888 [ - + ][ - + ]: 2 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
889 : 2 : res = sort->d_tm->export_sort(sort->d_sort.getDatatypeTesterDomainSort());
890 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
891 : 2 : return res;
892 : : }
893 : :
894 : 2 : Cvc5Sort cvc5_sort_dt_tester_get_codomain(Cvc5Sort sort)
895 : : {
896 : 2 : Cvc5Sort res = nullptr;
897 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
898 [ - + ][ - + ]: 2 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
899 : 2 : res = sort->d_tm->export_sort(sort->d_sort.getDatatypeTesterCodomainSort());
900 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
901 : 2 : return res;
902 : : }
903 : :
904 : : /* Function sort ------------------------------------------------------- */
905 : :
906 : 3 : size_t cvc5_sort_fun_get_arity(Cvc5Sort sort)
907 : : {
908 : 3 : size_t res = 0;
909 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
910 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
911 : 2 : res = sort->d_sort.getFunctionArity();
912 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
913 : 3 : return res;
914 : : }
915 : :
916 : 4 : const Cvc5Sort* cvc5_sort_fun_get_domain(Cvc5Sort sort, size_t* size)
917 : : {
918 [ + + ]: 4 : static thread_local std::vector<Cvc5Sort> res;
919 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
920 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
921 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
922 : 2 : res.clear();
923 : 2 : auto sorts = sort->d_sort.getFunctionDomainSorts();
924 : 1 : auto tm = sort->d_tm;
925 [ + + ]: 3 : for (auto& s : sorts)
926 : : {
927 : 2 : res.push_back(tm->export_sort(s));
928 : : }
929 : 1 : *size = res.size();
930 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
931 : : // On error, `size` may be invalid (e.g. NULL) and `res` may hold stale data,
932 : : // so we must not dereference `size` here; gate on the error state instead.
933 [ + + ][ + - ]: 4 : return cvc5::cvc5_capi_has_error() || res.empty() ? nullptr : res.data();
934 : : }
935 : :
936 : 3 : Cvc5Sort cvc5_sort_fun_get_codomain(Cvc5Sort sort)
937 : : {
938 : 3 : Cvc5Sort res = nullptr;
939 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
940 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
941 : 2 : res = sort->d_tm->export_sort(sort->d_sort.getFunctionCodomainSort());
942 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
943 : 3 : return res;
944 : : }
945 : :
946 : : /* Array sort ---------------------------------------------------------- */
947 : :
948 : 10 : Cvc5Sort cvc5_sort_array_get_index_sort(Cvc5Sort sort)
949 : : {
950 : 10 : Cvc5Sort res = nullptr;
951 : 10 : CVC5_CAPI_TRY_CATCH_BEGIN;
952 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
953 : 2 : res = sort->d_tm->export_sort(sort->d_sort.getArrayIndexSort());
954 [ + - ][ - + ]: 9 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
955 : 10 : return res;
956 : : }
957 : :
958 : 4 : Cvc5Sort cvc5_sort_array_get_element_sort(Cvc5Sort sort)
959 : : {
960 : 4 : Cvc5Sort res = nullptr;
961 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
962 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
963 : 3 : res = sort->d_tm->export_sort(sort->d_sort.getArrayElementSort());
964 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
965 : 4 : return res;
966 : : }
967 : :
968 : : /* Set sort ------------------------------------------------------------ */
969 : :
970 : 3 : Cvc5Sort cvc5_sort_set_get_element_sort(Cvc5Sort sort)
971 : : {
972 : 3 : Cvc5Sort res = nullptr;
973 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
974 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
975 : 2 : res = sort->d_tm->export_sort(sort->d_sort.getSetElementSort());
976 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
977 : 3 : return res;
978 : : }
979 : :
980 : : /* Bag sort ------------------------------------------------------------ */
981 : :
982 : 3 : Cvc5Sort cvc5_sort_bag_get_element_sort(Cvc5Sort sort)
983 : : {
984 : 3 : Cvc5Sort res = nullptr;
985 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
986 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
987 : 2 : res = sort->d_tm->export_sort(sort->d_sort.getBagElementSort());
988 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
989 : 3 : return res;
990 : : }
991 : :
992 : : /* Sequence sort ------------------------------------------------------- */
993 : :
994 : 3 : Cvc5Sort cvc5_sort_sequence_get_element_sort(Cvc5Sort sort)
995 : : {
996 : 3 : Cvc5Sort res = nullptr;
997 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
998 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
999 : 2 : res = sort->d_tm->export_sort(sort->d_sort.getSequenceElementSort());
1000 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1001 : 3 : return res;
1002 : : }
1003 : :
1004 : : /* Abstract sort ------------------------------------------------------- */
1005 : :
1006 : 3 : Cvc5SortKind cvc5_sort_abstract_get_kind(Cvc5Sort sort)
1007 : : {
1008 : 3 : Cvc5SortKind res = CVC5_SORT_KIND_INTERNAL_SORT_KIND;
1009 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
1010 [ - + ][ - + ]: 3 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
1011 : 3 : res = static_cast<Cvc5SortKind>(sort->d_sort.getAbstractedKind());
1012 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1013 : 3 : return res;
1014 : : }
1015 : :
1016 : : /* Uninterpreted sort constructor sort --------------------------------- */
1017 : :
1018 : 3 : size_t cvc5_sort_uninterpreted_sort_constructor_get_arity(Cvc5Sort sort)
1019 : : {
1020 : 3 : size_t res = 0;
1021 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
1022 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
1023 : 2 : res = sort->d_sort.getUninterpretedSortConstructorArity();
1024 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1025 : 3 : return res;
1026 : : }
1027 : :
1028 : : /* Bit-vector sort ----------------------------------------------------- */
1029 : :
1030 : 3 : uint32_t cvc5_sort_bv_get_size(Cvc5Sort sort)
1031 : : {
1032 : 3 : uint32_t res = 0;
1033 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
1034 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
1035 : 2 : res = sort->d_sort.getBitVectorSize();
1036 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1037 : 3 : return res;
1038 : : }
1039 : :
1040 : : /* Finite field sort --------------------------------------------------- */
1041 : :
1042 : 5 : const char* cvc5_sort_ff_get_size(Cvc5Sort sort)
1043 : : {
1044 [ + + ]: 5 : static thread_local std::string str;
1045 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
1046 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
1047 : 4 : str = sort->d_sort.getFiniteFieldSize();
1048 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1049 : 5 : return str.c_str();
1050 : : }
1051 : :
1052 : : /* Floating-point sort ------------------------------------------------- */
1053 : :
1054 : 3 : uint32_t cvc5_sort_fp_get_exp_size(Cvc5Sort sort)
1055 : : {
1056 : 3 : uint32_t res = 0;
1057 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
1058 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
1059 : 2 : res = sort->d_sort.getFloatingPointExponentSize();
1060 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1061 : 3 : return res;
1062 : : }
1063 : :
1064 : 3 : uint32_t cvc5_sort_fp_get_sig_size(Cvc5Sort sort)
1065 : : {
1066 : 3 : uint32_t res = 0;
1067 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
1068 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
1069 : 2 : res = sort->d_sort.getFloatingPointSignificandSize();
1070 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1071 : 3 : return res;
1072 : : }
1073 : :
1074 : : /* Datatype sort ------------------------------------------------------- */
1075 : :
1076 : 4 : size_t cvc5_sort_dt_get_arity(Cvc5Sort sort)
1077 : : {
1078 : 4 : size_t res = 0;
1079 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
1080 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
1081 : 3 : res = sort->d_sort.getDatatypeArity();
1082 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1083 : 4 : return res;
1084 : : }
1085 : :
1086 : : /* Tuple sort ---------------------------------------------------------- */
1087 : :
1088 : 3 : size_t cvc5_sort_tuple_get_length(Cvc5Sort sort)
1089 : : {
1090 : 3 : size_t res = 0;
1091 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
1092 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
1093 : 2 : res = sort->d_sort.getTupleLength();
1094 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1095 : 3 : return res;
1096 : : }
1097 : :
1098 : 4 : const Cvc5Sort* cvc5_sort_tuple_get_element_sorts(Cvc5Sort sort, size_t* size)
1099 : : {
1100 [ + + ]: 4 : static thread_local std::vector<Cvc5Sort> res;
1101 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
1102 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
1103 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
1104 : 2 : res.clear();
1105 : 2 : auto sorts = sort->d_sort.getTupleSorts();
1106 : 1 : auto tm = sort->d_tm;
1107 [ + + ]: 3 : for (auto& s : sorts)
1108 : : {
1109 : 2 : res.push_back(tm->export_sort(s));
1110 : : }
1111 : 1 : *size = res.size();
1112 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1113 : : // On error, `size` may be invalid (e.g. NULL) and `res` may hold stale data,
1114 : : // so we must not dereference `size` here; gate on the error state instead.
1115 [ + + ][ + - ]: 4 : return cvc5::cvc5_capi_has_error() || res.empty() ? nullptr : res.data();
1116 : : }
1117 : :
1118 : 3 : Cvc5Sort cvc5_sort_nullable_get_element_sort(Cvc5Sort sort)
1119 : : {
1120 : 3 : Cvc5Sort res = nullptr;
1121 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
1122 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
1123 : 2 : res = sort->d_tm->export_sort(sort->d_sort.getNullableElementSort());
1124 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1125 : 3 : return res;
1126 : : }
1127 : :
1128 : : /* -------------------------------------------------------------------------- */
1129 : : /* Cvc5Datatype */
1130 : : /* -------------------------------------------------------------------------- */
1131 : :
1132 : : /* Cvc5DatatypeConstructorDecl ----------------------------------------- */
1133 : :
1134 : 2 : Cvc5DatatypeConstructorDecl cvc5_dt_cons_decl_copy(
1135 : : Cvc5DatatypeConstructorDecl decl)
1136 : : {
1137 : 2 : Cvc5DatatypeConstructorDecl res = nullptr;
1138 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
1139 : 2 : CVC5_CAPI_CHECK_DT_CONS_DECL(decl);
1140 : 1 : res = decl->d_tm->copy(decl);
1141 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1142 : 2 : return res;
1143 : : }
1144 : :
1145 : 3 : void cvc5_dt_cons_decl_release(Cvc5DatatypeConstructorDecl decl)
1146 : : {
1147 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
1148 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_DT_CONS_DECL(decl);
[ - - ]
1149 : 2 : decl->d_tm->release(decl);
1150 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1151 : 3 : }
1152 : :
1153 : 6 : bool cvc5_dt_cons_decl_is_equal(Cvc5DatatypeConstructorDecl a,
1154 : : Cvc5DatatypeConstructorDecl b)
1155 : : {
1156 : 6 : bool res = false;
1157 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
1158 [ + + ][ + + ]: 6 : if (a == nullptr || b == nullptr)
1159 : : {
1160 : 2 : res = a == b;
1161 : : }
1162 : : else
1163 : : {
1164 : 4 : res = a->d_decl == b->d_decl;
1165 : : }
1166 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1167 : 6 : return res;
1168 : : }
1169 : :
1170 : 80 : void cvc5_dt_cons_decl_add_selector(Cvc5DatatypeConstructorDecl decl,
1171 : : const char* name,
1172 : : Cvc5Sort sort)
1173 : : {
1174 : 80 : CVC5_CAPI_TRY_CATCH_BEGIN;
1175 [ + + ][ + + ]: 80 : CVC5_CAPI_CHECK_DT_CONS_DECL(decl);
[ - - ]
1176 [ + + ][ + + ]: 79 : CVC5_CAPI_CHECK_NOT_NULL(name);
[ - - ]
1177 [ + + ][ + + ]: 78 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
1178 : 76 : decl->d_decl.addSelector(name, sort->d_sort);
1179 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1180 : 80 : }
1181 : :
1182 : 32 : void cvc5_dt_cons_decl_add_selector_self(Cvc5DatatypeConstructorDecl decl,
1183 : : const char* name)
1184 : : {
1185 : 32 : CVC5_CAPI_TRY_CATCH_BEGIN;
1186 [ + + ][ + + ]: 32 : CVC5_CAPI_CHECK_DT_CONS_DECL(decl);
[ - - ]
1187 [ + + ][ + + ]: 31 : CVC5_CAPI_CHECK_NOT_NULL(name);
[ - - ]
1188 : 30 : decl->d_decl.addSelectorSelf(name);
1189 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1190 : 32 : }
1191 : :
1192 : 8 : void cvc5_dt_cons_decl_add_selector_unresolved(Cvc5DatatypeConstructorDecl decl,
1193 : : const char* name,
1194 : : const char* unres_name)
1195 : : {
1196 : 8 : CVC5_CAPI_TRY_CATCH_BEGIN;
1197 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_DT_CONS_DECL(decl);
[ - - ]
1198 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_NOT_NULL(name);
[ - - ]
1199 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_NOT_NULL(unres_name);
[ - - ]
1200 : 5 : decl->d_decl.addSelectorUnresolved(name, unres_name);
1201 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1202 : 8 : }
1203 : :
1204 : 2 : const char* cvc5_dt_cons_decl_to_string(Cvc5DatatypeConstructorDecl decl)
1205 : : {
1206 [ + + ]: 2 : static thread_local std::string str;
1207 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
1208 : 2 : CVC5_CAPI_CHECK_DT_CONS_DECL(decl);
1209 : 1 : str = decl->d_decl.toString();
1210 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1211 : 2 : return str.c_str();
1212 : : }
1213 : :
1214 : 14 : size_t cvc5_dt_cons_decl_hash(Cvc5DatatypeConstructorDecl decl)
1215 : : {
1216 : 14 : size_t res = 0;
1217 : 14 : CVC5_CAPI_TRY_CATCH_BEGIN;
1218 [ + + ][ + + ]: 14 : CVC5_CAPI_CHECK_DT_CONS_DECL(decl);
[ - - ]
1219 : 12 : res = std::hash<cvc5::DatatypeConstructorDecl>{}(decl->d_decl);
1220 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1221 : 14 : return res;
1222 : : }
1223 : :
1224 : : /* Cvc5DatatypeDecl ---------------------------------------------------- */
1225 : :
1226 : 2 : Cvc5DatatypeDecl cvc5_dt_decl_copy(Cvc5DatatypeDecl decl)
1227 : : {
1228 : 2 : Cvc5DatatypeDecl res = nullptr;
1229 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
1230 : 2 : CVC5_CAPI_CHECK_DT_DECL(decl);
1231 : 1 : res = decl->d_tm->copy(decl);
1232 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1233 : 2 : return res;
1234 : : }
1235 : :
1236 : 3 : void cvc5_dt_decl_release(Cvc5DatatypeDecl decl)
1237 : : {
1238 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
1239 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_DT_DECL(decl);
[ - - ]
1240 : 2 : decl->d_tm->release(decl);
1241 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1242 : 3 : }
1243 : :
1244 : 4 : bool cvc5_dt_decl_is_equal(Cvc5DatatypeDecl a, Cvc5DatatypeDecl b)
1245 : : {
1246 : 4 : bool res = false;
1247 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
1248 [ + + ][ + + ]: 4 : if (a == nullptr || b == nullptr)
1249 : : {
1250 : 2 : res = a == b;
1251 : : }
1252 : : else
1253 : : {
1254 : 2 : res = a->d_decl == b->d_decl;
1255 : : }
1256 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1257 : 4 : return res;
1258 : : }
1259 : :
1260 : 122 : void cvc5_dt_decl_add_constructor(Cvc5DatatypeDecl decl,
1261 : : Cvc5DatatypeConstructorDecl cdecl)
1262 : : {
1263 : 122 : CVC5_CAPI_TRY_CATCH_BEGIN;
1264 [ + + ][ + + ]: 122 : CVC5_CAPI_CHECK_DT_DECL(decl);
[ - - ]
1265 [ + + ][ + + ]: 121 : CVC5_CAPI_CHECK_NOT_NULL(cdecl);
[ - - ]
1266 : 120 : decl->d_decl.addConstructor(cdecl->d_decl);
1267 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1268 : 122 : }
1269 : :
1270 : 2 : size_t cvc5_dt_decl_get_num_constructors(Cvc5DatatypeDecl decl)
1271 : : {
1272 : 2 : size_t res = 0;
1273 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
1274 : 2 : CVC5_CAPI_CHECK_DT_DECL(decl);
1275 : 1 : res = decl->d_decl.getNumConstructors();
1276 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1277 : 2 : return res;
1278 : : }
1279 : :
1280 : 2 : bool cvc5_dt_decl_is_parametric(Cvc5DatatypeDecl decl)
1281 : : {
1282 : 2 : size_t res = 0;
1283 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
1284 : 2 : CVC5_CAPI_CHECK_DT_DECL(decl);
1285 : 1 : res = decl->d_decl.isParametric();
1286 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1287 : 2 : return res;
1288 : : }
1289 : :
1290 : 2 : bool cvc5_dt_decl_is_resolved(Cvc5DatatypeDecl decl)
1291 : : {
1292 : 2 : bool res = false;
1293 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
1294 : 2 : CVC5_CAPI_CHECK_DT_DECL(decl);
1295 : 1 : res = decl->d_decl.isResolved();
1296 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1297 : 2 : return res;
1298 : : }
1299 : :
1300 : 1 : const char* cvc5_dt_decl_to_string(Cvc5DatatypeDecl decl)
1301 : : {
1302 [ + - ]: 1 : static thread_local std::string str;
1303 : 1 : CVC5_CAPI_TRY_CATCH_BEGIN;
1304 [ + - ][ + - ]: 1 : CVC5_CAPI_CHECK_DT_DECL(decl);
[ - - ]
1305 : 0 : str = decl->d_decl.toString();
1306 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1307 : 1 : return str.c_str();
1308 : : }
1309 : :
1310 : 8 : const char* cvc5_dt_decl_get_name(Cvc5DatatypeDecl decl)
1311 : : {
1312 [ + + ]: 8 : static thread_local std::string str;
1313 : 8 : CVC5_CAPI_TRY_CATCH_BEGIN;
1314 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_DT_DECL(decl);
[ - - ]
1315 : 6 : str = decl->d_decl.getName();
1316 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1317 : 8 : return str.c_str();
1318 : : }
1319 : :
1320 : 10 : size_t cvc5_dt_decl_hash(Cvc5DatatypeDecl decl)
1321 : : {
1322 : 10 : size_t res = 0;
1323 : 10 : CVC5_CAPI_TRY_CATCH_BEGIN;
1324 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_DT_DECL(decl);
[ - - ]
1325 : 8 : res = std::hash<cvc5::DatatypeDecl>{}(decl->d_decl);
1326 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1327 : 10 : return res;
1328 : : }
1329 : :
1330 : : /* Cvc5DatatypeSelector ------------------------------------------------ */
1331 : :
1332 : 2 : Cvc5DatatypeSelector cvc5_dt_sel_copy(Cvc5DatatypeSelector sel)
1333 : : {
1334 : 2 : Cvc5DatatypeSelector res = nullptr;
1335 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
1336 : 2 : CVC5_CAPI_CHECK_DT_SEL(sel);
1337 : 1 : res = sel->d_tm->copy(sel);
1338 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1339 : 2 : return res;
1340 : : }
1341 : :
1342 : 3 : void cvc5_dt_sel_release(Cvc5DatatypeSelector sel)
1343 : : {
1344 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
1345 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_DT_SEL(sel);
[ - - ]
1346 : 2 : sel->d_tm->release(sel);
1347 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1348 : 3 : }
1349 : :
1350 : 4 : bool cvc5_dt_sel_is_equal(Cvc5DatatypeSelector a, Cvc5DatatypeSelector b)
1351 : : {
1352 : 4 : bool res = false;
1353 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
1354 [ + + ][ + + ]: 4 : if (a == nullptr || b == nullptr)
1355 : : {
1356 : 2 : res = a == b;
1357 : : }
1358 : : else
1359 : : {
1360 : 2 : res = a->d_dt_sel == b->d_dt_sel;
1361 : : }
1362 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1363 : 4 : return res;
1364 : : }
1365 : :
1366 : 5 : const char* cvc5_dt_sel_get_name(Cvc5DatatypeSelector sel)
1367 : : {
1368 [ + + ]: 5 : static thread_local std::string str;
1369 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
1370 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_DT_SEL(sel);
[ - - ]
1371 : 3 : str = sel->d_dt_sel.getName();
1372 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1373 : 5 : return str.c_str();
1374 : : }
1375 : :
1376 : 15 : Cvc5Term cvc5_dt_sel_get_term(Cvc5DatatypeSelector sel)
1377 : : {
1378 : 15 : Cvc5Term res = nullptr;
1379 : 15 : CVC5_CAPI_TRY_CATCH_BEGIN;
1380 [ + + ][ + + ]: 15 : CVC5_CAPI_CHECK_DT_SEL(sel);
[ - - ]
1381 : 14 : res = sel->d_tm->export_term(sel->d_dt_sel.getTerm());
1382 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1383 : 15 : return res;
1384 : : }
1385 : :
1386 : 2 : Cvc5Term cvc5_dt_sel_get_updater_term(Cvc5DatatypeSelector sel)
1387 : : {
1388 : 2 : Cvc5Term res = nullptr;
1389 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
1390 : 2 : CVC5_CAPI_CHECK_DT_SEL(sel);
1391 : 1 : res = sel->d_tm->export_term(sel->d_dt_sel.getUpdaterTerm());
1392 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1393 : 2 : return res;
1394 : : }
1395 : :
1396 : 7 : Cvc5Sort cvc5_dt_sel_get_codomain_sort(Cvc5DatatypeSelector sel)
1397 : : {
1398 : 7 : Cvc5Sort res = nullptr;
1399 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
1400 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_DT_SEL(sel);
[ - - ]
1401 : 6 : res = sel->d_tm->export_sort(sel->d_dt_sel.getCodomainSort());
1402 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1403 : 7 : return res;
1404 : : }
1405 : :
1406 : 2 : const char* cvc5_dt_sel_to_string(Cvc5DatatypeSelector sel)
1407 : : {
1408 [ + + ]: 2 : static thread_local std::string str;
1409 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
1410 : 2 : CVC5_CAPI_CHECK_DT_SEL(sel);
1411 : 1 : str = sel->d_dt_sel.toString();
1412 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1413 : 2 : return str.c_str();
1414 : : }
1415 : :
1416 : 10 : size_t cvc5_dt_sel_hash(Cvc5DatatypeSelector sel)
1417 : : {
1418 : 10 : size_t res = 0;
1419 : 10 : CVC5_CAPI_TRY_CATCH_BEGIN;
1420 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_DT_SEL(sel);
[ - - ]
1421 : 8 : res = std::hash<cvc5::DatatypeSelector>{}(sel->d_dt_sel);
1422 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1423 : 10 : return res;
1424 : : }
1425 : :
1426 : : /* Cvc5DatatypeConstructor --------------------------------------------- */
1427 : :
1428 : 2 : Cvc5DatatypeConstructor cvc5_dt_cons_copy(Cvc5DatatypeConstructor cons)
1429 : : {
1430 : 2 : Cvc5DatatypeConstructor res = nullptr;
1431 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
1432 : 2 : CVC5_CAPI_CHECK_DT_CONS(cons);
1433 : 1 : res = cons->d_tm->copy(cons);
1434 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1435 : 2 : return res;
1436 : : }
1437 : :
1438 : 3 : void cvc5_dt_cons_release(Cvc5DatatypeConstructor cons)
1439 : : {
1440 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
1441 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_DT_CONS(cons);
[ - - ]
1442 : 2 : cons->d_tm->release(cons);
1443 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1444 : 3 : }
1445 : :
1446 : 6 : bool cvc5_dt_cons_is_equal(Cvc5DatatypeConstructor a, Cvc5DatatypeConstructor b)
1447 : : {
1448 : 6 : bool res = false;
1449 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
1450 [ + + ][ + + ]: 6 : if (a == nullptr || b == nullptr)
1451 : : {
1452 : 2 : res = a == b;
1453 : : }
1454 : : else
1455 : : {
1456 : 4 : res = a->d_dt_cons == b->d_dt_cons;
1457 : : }
1458 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1459 : 6 : return res;
1460 : : }
1461 : :
1462 : 5 : const char* cvc5_dt_cons_get_name(Cvc5DatatypeConstructor cons)
1463 : : {
1464 [ + + ]: 5 : static thread_local std::string str;
1465 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
1466 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_DT_CONS(cons);
[ - - ]
1467 : 3 : str = cons->d_dt_cons.getName();
1468 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1469 : 5 : return str.c_str();
1470 : : }
1471 : :
1472 : 13 : Cvc5Term cvc5_dt_cons_get_term(Cvc5DatatypeConstructor cons)
1473 : : {
1474 : 13 : Cvc5Term res = nullptr;
1475 : 13 : CVC5_CAPI_TRY_CATCH_BEGIN;
1476 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_DT_CONS(cons);
[ - - ]
1477 : 12 : res = cons->d_tm->export_term(cons->d_dt_cons.getTerm());
1478 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1479 : 13 : return res;
1480 : : }
1481 : :
1482 : 4 : Cvc5Term cvc5_dt_cons_get_instantiated_term(Cvc5DatatypeConstructor cons,
1483 : : Cvc5Sort sort)
1484 : : {
1485 : 4 : Cvc5Term res = nullptr;
1486 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
1487 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_DT_CONS(cons);
[ - - ]
1488 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
1489 : 1 : res = cons->d_tm->export_term(
1490 : 3 : cons->d_dt_cons.getInstantiatedTerm(sort->d_sort));
1491 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1492 : 4 : return res;
1493 : : }
1494 : :
1495 : 4 : Cvc5Term cvc5_dt_cons_get_tester_term(Cvc5DatatypeConstructor cons)
1496 : : {
1497 : 4 : Cvc5Term res = nullptr;
1498 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
1499 : 4 : CVC5_CAPI_CHECK_DT_CONS(cons);
1500 : 2 : res = cons->d_tm->export_term(cons->d_dt_cons.getTesterTerm());
1501 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1502 : 4 : return res;
1503 : : }
1504 : :
1505 : 2 : size_t cvc5_dt_cons_get_num_selectors(Cvc5DatatypeConstructor cons)
1506 : : {
1507 : 2 : size_t res = 0;
1508 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
1509 : 2 : CVC5_CAPI_CHECK_DT_CONS(cons);
1510 : 1 : res = cons->d_dt_cons.getNumSelectors();
1511 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1512 : 2 : return res;
1513 : : }
1514 : :
1515 : 16 : Cvc5DatatypeSelector cvc5_dt_cons_get_selector(Cvc5DatatypeConstructor cons,
1516 : : size_t index)
1517 : : {
1518 : 16 : Cvc5DatatypeSelector res = nullptr;
1519 : 16 : CVC5_CAPI_TRY_CATCH_BEGIN;
1520 [ + + ][ + + ]: 16 : CVC5_CAPI_CHECK_DT_CONS(cons);
[ - - ]
1521 : 14 : res = cons->d_tm->export_dt_sel(cons->d_dt_cons[index]);
1522 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1523 : 16 : return res;
1524 : : }
1525 : :
1526 : 11 : Cvc5DatatypeSelector cvc5_dt_cons_get_selector_by_name(
1527 : : Cvc5DatatypeConstructor cons, const char* name)
1528 : : {
1529 : 11 : Cvc5DatatypeSelector res = nullptr;
1530 : 11 : CVC5_CAPI_TRY_CATCH_BEGIN;
1531 [ + + ][ + + ]: 11 : CVC5_CAPI_CHECK_DT_CONS(cons);
[ - - ]
1532 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_NOT_NULL(name);
[ - - ]
1533 : 11 : res = cons->d_tm->export_dt_sel(cons->d_dt_cons.getSelector(name));
1534 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1535 : 11 : return res;
1536 : : }
1537 : :
1538 : 2 : const char* cvc5_dt_cons_to_string(Cvc5DatatypeConstructor cons)
1539 : : {
1540 [ + + ]: 2 : static thread_local std::string str;
1541 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
1542 : 2 : CVC5_CAPI_CHECK_DT_CONS(cons);
1543 : 1 : str = cons->d_dt_cons.toString();
1544 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1545 : 2 : return str.c_str();
1546 : : }
1547 : :
1548 : 10 : size_t cvc5_dt_cons_hash(Cvc5DatatypeConstructor cons)
1549 : : {
1550 : 10 : size_t res = 0;
1551 : 10 : CVC5_CAPI_TRY_CATCH_BEGIN;
1552 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_DT_CONS(cons);
[ - - ]
1553 : 8 : res = std::hash<cvc5::DatatypeConstructor>{}(cons->d_dt_cons);
1554 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1555 : 10 : return res;
1556 : : }
1557 : :
1558 : : /* Cvc5Datatype -------------------------------------------------------- */
1559 : :
1560 : 2 : Cvc5Datatype cvc5_dt_copy(Cvc5Datatype dt)
1561 : : {
1562 : 2 : Cvc5Datatype res = nullptr;
1563 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
1564 : 2 : CVC5_CAPI_CHECK_DT(dt);
1565 : 1 : res = dt->d_tm->copy(dt);
1566 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1567 : 2 : return res;
1568 : : }
1569 : :
1570 : 3 : void cvc5_dt_release(Cvc5Datatype dt)
1571 : : {
1572 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
1573 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_DT(dt);
[ - - ]
1574 : 2 : dt->d_tm->release(dt);
1575 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1576 : 3 : }
1577 : :
1578 : 4 : bool cvc5_dt_is_equal(Cvc5Datatype a, Cvc5Datatype b)
1579 : : {
1580 : 4 : bool res = false;
1581 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
1582 [ + + ][ + + ]: 4 : if (a == nullptr || b == nullptr)
1583 : : {
1584 : 2 : res = a == b;
1585 : : }
1586 : : else
1587 : : {
1588 : 2 : res = a->d_dt == b->d_dt;
1589 : : }
1590 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1591 : 4 : return res;
1592 : : }
1593 : :
1594 : 27 : Cvc5DatatypeConstructor cvc5_dt_get_constructor(Cvc5Datatype dt, size_t idx)
1595 : : {
1596 : 27 : Cvc5DatatypeConstructor res = nullptr;
1597 : 27 : CVC5_CAPI_TRY_CATCH_BEGIN;
1598 [ + + ][ + + ]: 27 : CVC5_CAPI_CHECK_DT(dt);
[ - - ]
1599 : 25 : res = dt->d_tm->export_dt_cons(dt->d_dt[idx]);
1600 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1601 : 27 : return res;
1602 : : }
1603 : :
1604 : 13 : Cvc5DatatypeConstructor cvc5_dt_get_constructor_by_name(Cvc5Datatype dt,
1605 : : const char* name)
1606 : : {
1607 : 13 : Cvc5DatatypeConstructor res = nullptr;
1608 : 13 : CVC5_CAPI_TRY_CATCH_BEGIN;
1609 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_DT(dt);
[ - - ]
1610 [ + + ][ + + ]: 12 : CVC5_CAPI_CHECK_NOT_NULL(name);
[ - - ]
1611 : 15 : res = dt->d_tm->export_dt_cons(dt->d_dt.getConstructor(name));
1612 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1613 : 13 : return res;
1614 : : }
1615 : :
1616 : 8 : Cvc5DatatypeSelector cvc5_dt_get_selector(Cvc5Datatype dt, const char* name)
1617 : : {
1618 : 8 : Cvc5DatatypeSelector res = nullptr;
1619 : 8 : CVC5_CAPI_TRY_CATCH_BEGIN;
1620 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_DT(dt);
[ - - ]
1621 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_NOT_NULL(name);
[ - - ]
1622 : 8 : res = dt->d_tm->export_dt_sel(dt->d_dt.getSelector(name));
1623 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1624 : 8 : return res;
1625 : : }
1626 : :
1627 : 7 : const char* cvc5_dt_get_name(Cvc5Datatype dt)
1628 : : {
1629 [ + + ]: 7 : static thread_local std::string str;
1630 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
1631 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_DT(dt);
[ - - ]
1632 : 5 : str = dt->d_dt.getName();
1633 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1634 : 7 : return str.c_str();
1635 : : }
1636 : :
1637 : 1 : size_t cvc5_dt_get_num_constructors(Cvc5Datatype dt)
1638 : : {
1639 : 1 : size_t res = 0;
1640 : 1 : CVC5_CAPI_TRY_CATCH_BEGIN;
1641 [ + - ][ + - ]: 1 : CVC5_CAPI_CHECK_DT(dt);
[ - - ]
1642 : 0 : res = dt->d_dt.getNumConstructors();
1643 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1644 : 1 : return res;
1645 : : }
1646 : :
1647 : 5 : const Cvc5Sort* cvc5_dt_get_parameters(Cvc5Datatype dt, size_t* size)
1648 : : {
1649 [ + + ]: 5 : static thread_local std::vector<Cvc5Sort> res;
1650 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
1651 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_DT(dt);
[ - - ]
1652 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
1653 : 3 : res.clear();
1654 : 3 : auto sorts = dt->d_dt.getParameters();
1655 : 2 : auto tm = dt->d_tm;
1656 [ + + ]: 5 : for (auto& s : sorts)
1657 : : {
1658 : 3 : res.push_back(tm->export_sort(s));
1659 : : }
1660 : 2 : *size = res.size();
1661 [ + - ][ - + ]: 5 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1662 : : // On error, `size` may be invalid (e.g. NULL) and `res` may hold stale data,
1663 : : // so we must not dereference `size` here; gate on the error state instead.
1664 [ + + ][ + - ]: 5 : return cvc5::cvc5_capi_has_error() || res.empty() ? nullptr : res.data();
1665 : : }
1666 : :
1667 : 2 : bool cvc5_dt_is_parametric(Cvc5Datatype dt)
1668 : : {
1669 : 2 : bool res = false;
1670 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
1671 : 2 : CVC5_CAPI_CHECK_DT(dt);
1672 : 1 : res = dt->d_dt.isParametric();
1673 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1674 : 2 : return res;
1675 : : }
1676 : :
1677 : 3 : bool cvc5_dt_is_codatatype(Cvc5Datatype dt)
1678 : : {
1679 : 3 : bool res = false;
1680 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
1681 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_DT(dt);
[ - - ]
1682 : 2 : res = dt->d_dt.isCodatatype();
1683 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1684 : 3 : return res;
1685 : : }
1686 : :
1687 : 4 : bool cvc5_dt_is_tuple(Cvc5Datatype dt)
1688 : : {
1689 : 4 : bool res = false;
1690 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
1691 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_DT(dt);
[ - - ]
1692 : 3 : res = dt->d_dt.isTuple();
1693 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1694 : 4 : return res;
1695 : : }
1696 : :
1697 : 5 : bool cvc5_dt_is_record(Cvc5Datatype dt)
1698 : : {
1699 : 5 : bool res = false;
1700 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
1701 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_DT(dt);
[ - - ]
1702 : 4 : res = dt->d_dt.isRecord();
1703 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1704 : 5 : return res;
1705 : : }
1706 : :
1707 : 13 : bool cvc5_dt_is_finite(Cvc5Datatype dt)
1708 : : {
1709 : 13 : bool res = false;
1710 : 13 : CVC5_CAPI_TRY_CATCH_BEGIN;
1711 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_DT(dt);
[ - - ]
1712 : 11 : res = dt->d_dt.isFinite();
1713 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1714 : 13 : return res;
1715 : : }
1716 : :
1717 : 14 : bool cvc5_dt_is_well_founded(Cvc5Datatype dt)
1718 : : {
1719 : 14 : bool res = false;
1720 : 14 : CVC5_CAPI_TRY_CATCH_BEGIN;
1721 [ + + ][ + + ]: 14 : CVC5_CAPI_CHECK_DT(dt);
[ - - ]
1722 : 13 : res = dt->d_dt.isWellFounded();
1723 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1724 : 14 : return res;
1725 : : }
1726 : :
1727 : 1 : const char* cvc5_dt_to_string(Cvc5Datatype dt)
1728 : : {
1729 [ + - ]: 1 : static thread_local std::string str;
1730 : 1 : CVC5_CAPI_TRY_CATCH_BEGIN;
1731 [ + - ][ + - ]: 1 : CVC5_CAPI_CHECK_DT(dt);
[ - - ]
1732 : 0 : str = dt->d_dt.toString();
1733 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1734 : 1 : return str.c_str();
1735 : : }
1736 : :
1737 : 10 : size_t cvc5_dt_hash(Cvc5Datatype dt)
1738 : : {
1739 : 10 : size_t res = 0;
1740 : 10 : CVC5_CAPI_TRY_CATCH_BEGIN;
1741 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_DT(dt);
[ - - ]
1742 : 8 : res = std::hash<cvc5::Datatype>{}(dt->d_dt);
1743 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1744 : 10 : return res;
1745 : : }
1746 : :
1747 : : /* -------------------------------------------------------------------------- */
1748 : : /* Cvc5Term */
1749 : : /* -------------------------------------------------------------------------- */
1750 : :
1751 : 4 : Cvc5Term cvc5_term_copy(Cvc5Term term)
1752 : : {
1753 : 4 : Cvc5Term res = nullptr;
1754 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
1755 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1756 : 3 : res = term->d_tm->copy(term);
1757 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1758 : 4 : return res;
1759 : : }
1760 : :
1761 : 5 : void cvc5_term_release(Cvc5Term term)
1762 : : {
1763 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
1764 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1765 : 4 : term->d_tm->release(term);
1766 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1767 : 5 : }
1768 : :
1769 : 75 : bool cvc5_term_is_equal(Cvc5Term a, Cvc5Term b)
1770 : : {
1771 : 75 : bool res = false;
1772 : 75 : CVC5_CAPI_TRY_CATCH_BEGIN;
1773 [ + - ][ + + ]: 75 : if (a == nullptr || b == nullptr)
1774 : : {
1775 : 1 : res = a == b;
1776 : : }
1777 : : else
1778 : : {
1779 : 74 : res = a->d_term == b->d_term;
1780 : : }
1781 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1782 : 75 : return res;
1783 : : }
1784 : :
1785 : 13 : bool cvc5_term_is_disequal(Cvc5Term a, Cvc5Term b)
1786 : : {
1787 : 13 : bool res = false;
1788 : 13 : CVC5_CAPI_TRY_CATCH_BEGIN;
1789 [ + - ][ + + ]: 13 : if (a == nullptr || b == nullptr)
1790 : : {
1791 : 1 : res = a != b;
1792 : : }
1793 : : else
1794 : : {
1795 : 12 : res = a->d_term != b->d_term;
1796 : : }
1797 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1798 : 13 : return res;
1799 : : }
1800 : :
1801 : 4 : int64_t cvc5_term_compare(Cvc5Term a, Cvc5Term b)
1802 : : {
1803 : 4 : int64_t res = false;
1804 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
1805 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_TERM(a);
[ - - ]
1806 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_TERM(b);
[ - - ]
1807 [ + + ][ - + ]: 2 : res = a->d_term < b->d_term ? -1 : (a->d_term > b->d_term ? 1 : 0);
1808 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1809 : 4 : return res;
1810 : : }
1811 : :
1812 : 6 : size_t cvc5_term_get_num_children(Cvc5Term term)
1813 : : {
1814 : 6 : size_t res = 0;
1815 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
1816 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1817 : 5 : res = term->d_term.getNumChildren();
1818 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1819 : 6 : return res;
1820 : : }
1821 : :
1822 : 15 : Cvc5Term cvc5_term_get_child(Cvc5Term term, size_t index)
1823 : : {
1824 : 15 : Cvc5Term res = nullptr;
1825 : 15 : CVC5_CAPI_TRY_CATCH_BEGIN;
1826 [ + + ][ + + ]: 15 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1827 : 14 : res = term->d_tm->export_term(term->d_term[index]);
1828 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1829 : 15 : return res;
1830 : : }
1831 : :
1832 : 6 : uint64_t cvc5_term_get_id(Cvc5Term term)
1833 : : {
1834 : 6 : uint64_t res = 0;
1835 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
1836 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1837 : 5 : res = term->d_term.getId();
1838 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1839 : 6 : return res;
1840 : : }
1841 : :
1842 : 25 : Cvc5Kind cvc5_term_get_kind(Cvc5Term term)
1843 : : {
1844 : 25 : Cvc5Kind res = CVC5_KIND_INTERNAL_KIND;
1845 : 25 : CVC5_CAPI_TRY_CATCH_BEGIN;
1846 [ + + ][ + + ]: 25 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1847 : 23 : res = static_cast<Cvc5Kind>(term->d_term.getKind());
1848 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1849 : 25 : return res;
1850 : : }
1851 : :
1852 : 29 : Cvc5Sort cvc5_term_get_sort(Cvc5Term term)
1853 : : {
1854 : 29 : Cvc5Sort res = nullptr;
1855 : 29 : CVC5_CAPI_TRY_CATCH_BEGIN;
1856 [ + + ][ + + ]: 29 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1857 : 28 : res = term->d_tm->export_sort(term->d_term.getSort());
1858 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1859 : 29 : return res;
1860 : : }
1861 : :
1862 : 5 : Cvc5Term cvc5_term_substitute_term(Cvc5Term term,
1863 : : Cvc5Term t,
1864 : : Cvc5Term replacement)
1865 : : {
1866 : 5 : Cvc5Term res = nullptr;
1867 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
1868 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1869 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_TERM(t);
[ - - ]
1870 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_TERM(replacement);
[ - - ]
1871 : 1 : res = term->d_tm->export_term(
1872 : 3 : term->d_term.substitute(t->d_term, replacement->d_term));
1873 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1874 : 5 : return res;
1875 : : }
1876 : :
1877 : 6 : Cvc5Term cvc5_term_substitute_terms(Cvc5Term term,
1878 : : size_t size,
1879 : : const Cvc5Term terms[],
1880 : : const Cvc5Term replacements[])
1881 : : {
1882 : 6 : Cvc5Term res = nullptr;
1883 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
1884 [ - + ][ - + ]: 6 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1885 [ - + ][ - + ]: 6 : CVC5_CAPI_CHECK_NOT_NULL(terms);
[ - - ]
1886 [ - + ][ - + ]: 6 : CVC5_CAPI_CHECK_NOT_NULL(replacements);
[ - - ]
1887 : 6 : std::vector<cvc5::Term> cterms;
1888 [ + + ]: 15 : for (uint32_t i = 0; i < size; ++i)
1889 : : {
1890 [ + + ][ + + ]: 11 : CVC5_CAPI_CHECK_TERM_AT_IDX(terms, i);
[ - - ]
1891 : 9 : cterms.push_back(terms[i]->d_term);
1892 : : }
1893 : 4 : std::vector<cvc5::Term> creplacements;
1894 [ + + ]: 9 : for (uint32_t i = 0; i < size; ++i)
1895 : : {
1896 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_TERM_AT_IDX(replacements, i);
[ - - ]
1897 : 5 : creplacements.push_back(replacements[i]->d_term);
1898 : : }
1899 : 2 : res = term->d_tm->export_term(term->d_term.substitute(cterms, creplacements));
1900 [ + - ][ - + ]: 14 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1901 : 6 : return res;
1902 : : }
1903 : :
1904 : 12 : bool cvc5_term_has_op(Cvc5Term term)
1905 : : {
1906 : 12 : bool res = false;
1907 : 12 : CVC5_CAPI_TRY_CATCH_BEGIN;
1908 [ + + ][ + + ]: 12 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1909 : 11 : res = term->d_term.hasOp();
1910 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1911 : 12 : return res;
1912 : : }
1913 : :
1914 : 10 : Cvc5Op cvc5_term_get_op(Cvc5Term term)
1915 : : {
1916 : 10 : Cvc5Op res = nullptr;
1917 : 10 : CVC5_CAPI_TRY_CATCH_BEGIN;
1918 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1919 : 9 : res = term->d_tm->export_op(term->d_term.getOp());
1920 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1921 : 10 : return res;
1922 : : }
1923 : :
1924 : 5 : bool cvc5_term_has_symbol(Cvc5Term term)
1925 : : {
1926 : 5 : bool res = false;
1927 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
1928 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1929 : 4 : res = term->d_term.hasSymbol();
1930 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1931 : 5 : return res;
1932 : : }
1933 : :
1934 : 3 : const char* cvc5_term_get_symbol(Cvc5Term term)
1935 : : {
1936 : 3 : const char* res = nullptr;
1937 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
1938 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1939 : 3 : CVC5_API_CHECK(cvc5_term_has_symbol(term))
1940 : 1 : << "cannot get symbol of term that has no symbol";
1941 [ + - ]: 1 : static thread_local std::string str;
1942 [ + - ]: 1 : if (term->d_term.hasSymbol())
1943 : : {
1944 : 1 : str = term->d_term.getSymbol();
1945 : 1 : res = str.c_str();
1946 : : }
1947 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1948 : 3 : return res;
1949 : : }
1950 : :
1951 : 25 : const char* cvc5_term_to_string(Cvc5Term term)
1952 : : {
1953 [ + + ]: 25 : static thread_local std::string str;
1954 : 25 : CVC5_CAPI_TRY_CATCH_BEGIN;
1955 [ - + ][ - + ]: 25 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1956 : 25 : str = term->d_term.toString();
1957 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1958 : 25 : return str.c_str();
1959 : : }
1960 : :
1961 : 14 : int32_t cvc5_term_get_real_or_integer_value_sign(Cvc5Term term)
1962 : : {
1963 : 14 : int32_t res = 0;
1964 : 14 : CVC5_CAPI_TRY_CATCH_BEGIN;
1965 [ + + ][ + + ]: 14 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1966 : 12 : res = term->d_term.getRealOrIntegerValueSign();
1967 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1968 : 14 : return res;
1969 : : }
1970 : :
1971 : 13 : bool cvc5_term_is_int32_value(Cvc5Term term)
1972 : : {
1973 : 13 : bool res = false;
1974 : 13 : CVC5_CAPI_TRY_CATCH_BEGIN;
1975 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1976 : 12 : res = term->d_term.isInt32Value();
1977 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1978 : 13 : return res;
1979 : : }
1980 : :
1981 : 5 : int32_t cvc5_term_get_int32_value(Cvc5Term term)
1982 : : {
1983 : 5 : int32_t res = 0;
1984 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
1985 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1986 : 4 : res = term->d_term.getInt32Value();
1987 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1988 : 5 : return res;
1989 : : }
1990 : :
1991 : 24 : bool cvc5_term_is_uint32_value(Cvc5Term term)
1992 : : {
1993 : 24 : bool res = false;
1994 : 24 : CVC5_CAPI_TRY_CATCH_BEGIN;
1995 [ + + ][ + + ]: 24 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
1996 : 23 : res = term->d_term.isUInt32Value();
1997 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
1998 : 24 : return res;
1999 : : }
2000 : :
2001 : 59 : uint32_t cvc5_term_get_uint32_value(Cvc5Term term)
2002 : : {
2003 : 59 : uint32_t res = 0;
2004 : 59 : CVC5_CAPI_TRY_CATCH_BEGIN;
2005 [ + + ][ + + ]: 59 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2006 : 58 : res = term->d_term.getUInt32Value();
2007 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2008 : 59 : return res;
2009 : : }
2010 : :
2011 : 13 : bool cvc5_term_is_int64_value(Cvc5Term term)
2012 : : {
2013 : 13 : bool res = false;
2014 : 13 : CVC5_CAPI_TRY_CATCH_BEGIN;
2015 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2016 : 12 : res = term->d_term.isInt64Value();
2017 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2018 : 13 : return res;
2019 : : }
2020 : :
2021 : 13 : int64_t cvc5_term_get_int64_value(Cvc5Term term)
2022 : : {
2023 : 13 : int64_t res = 0;
2024 : 13 : CVC5_CAPI_TRY_CATCH_BEGIN;
2025 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2026 : 12 : res = term->d_term.getInt64Value();
2027 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2028 : 13 : return res;
2029 : : }
2030 : :
2031 : 13 : bool cvc5_term_is_uint64_value(Cvc5Term term)
2032 : : {
2033 : 13 : bool res = false;
2034 : 13 : CVC5_CAPI_TRY_CATCH_BEGIN;
2035 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2036 : 12 : res = term->d_term.isUInt64Value();
2037 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2038 : 13 : return res;
2039 : : }
2040 : :
2041 : 7 : uint64_t cvc5_term_get_uint64_value(Cvc5Term term)
2042 : : {
2043 : 7 : uint64_t res = 0;
2044 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
2045 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2046 : 6 : res = term->d_term.getUInt64Value();
2047 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2048 : 7 : return res;
2049 : : }
2050 : :
2051 : 13 : bool cvc5_term_is_integer_value(Cvc5Term term)
2052 : : {
2053 : 13 : bool res = false;
2054 : 13 : CVC5_CAPI_TRY_CATCH_BEGIN;
2055 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2056 : 12 : res = term->d_term.isIntegerValue();
2057 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2058 : 13 : return res;
2059 : : }
2060 : :
2061 : 13 : const char* cvc5_term_get_integer_value(Cvc5Term term)
2062 : : {
2063 [ + + ]: 13 : static thread_local std::string res;
2064 : 13 : CVC5_CAPI_TRY_CATCH_BEGIN;
2065 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2066 : 12 : res = term->d_term.getIntegerValue();
2067 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2068 : 13 : return res.c_str();
2069 : : }
2070 : :
2071 : 2 : bool cvc5_term_is_string_value(Cvc5Term term)
2072 : : {
2073 : 2 : bool res = false;
2074 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
2075 : 2 : CVC5_CAPI_CHECK_TERM(term);
2076 : 1 : res = term->d_term.isStringValue();
2077 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2078 : 2 : return res;
2079 : : }
2080 : :
2081 : 0 : const wchar_t* cvc5_term_get_string_value(Cvc5Term term)
2082 : : {
2083 [ - - ]: 0 : static thread_local std::wstring res;
2084 : 0 : CVC5_CAPI_TRY_CATCH_BEGIN;
2085 : 0 : CVC5_CAPI_CHECK_TERM(term);
2086 : 0 : res = term->d_term.getStringValue();
2087 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2088 : 0 : return res.c_str();
2089 : : }
2090 : :
2091 : 3 : const char32_t* cvc5_term_get_u32string_value(Cvc5Term term)
2092 : : {
2093 [ + + ]: 3 : static thread_local std::u32string res;
2094 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
2095 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2096 : 2 : res = term->d_term.getU32StringValue();
2097 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2098 : 3 : return res.c_str();
2099 : : }
2100 : :
2101 : 6 : bool cvc5_term_is_real32_value(Cvc5Term term)
2102 : : {
2103 : 6 : bool res = false;
2104 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
2105 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2106 : 5 : res = term->d_term.isReal32Value();
2107 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2108 : 6 : return res;
2109 : : }
2110 : :
2111 : 8 : void cvc5_term_get_real32_value(Cvc5Term term, int32_t* num, uint32_t* den)
2112 : : {
2113 : 8 : CVC5_CAPI_TRY_CATCH_BEGIN;
2114 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2115 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_NOT_NULL(num);
[ - - ]
2116 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_NOT_NULL(den);
[ - - ]
2117 : 5 : std::tie(*num, *den) = term->d_term.getReal32Value();
2118 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2119 : 8 : }
2120 : :
2121 : 8 : bool cvc5_term_is_real64_value(Cvc5Term term)
2122 : : {
2123 : 8 : bool res = false;
2124 : 8 : CVC5_CAPI_TRY_CATCH_BEGIN;
2125 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2126 : 7 : res = term->d_term.isReal64Value();
2127 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2128 : 8 : return res;
2129 : : }
2130 : :
2131 : 10 : void cvc5_term_get_real64_value(Cvc5Term term, int64_t* num, uint64_t* den)
2132 : : {
2133 : 10 : CVC5_CAPI_TRY_CATCH_BEGIN;
2134 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2135 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_NOT_NULL(num);
[ - - ]
2136 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_NOT_NULL(den);
[ - - ]
2137 : 7 : std::tie(*num, *den) = term->d_term.getReal64Value();
2138 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2139 : 10 : }
2140 : :
2141 : 13 : bool cvc5_term_is_real_value(Cvc5Term term)
2142 : : {
2143 : 13 : bool res = false;
2144 : 13 : CVC5_CAPI_TRY_CATCH_BEGIN;
2145 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2146 : 12 : res = term->d_term.isRealValue();
2147 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2148 : 13 : return res;
2149 : : }
2150 : :
2151 : 11 : const char* cvc5_term_get_real_value(Cvc5Term term)
2152 : : {
2153 [ + + ]: 11 : static thread_local std::string res;
2154 : 11 : CVC5_CAPI_TRY_CATCH_BEGIN;
2155 [ + + ][ + + ]: 11 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2156 : 10 : res = term->d_term.getRealValue();
2157 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2158 : 11 : return res.c_str();
2159 : : }
2160 : :
2161 : 2 : bool cvc5_term_is_const_array(Cvc5Term term)
2162 : : {
2163 : 2 : bool res = false;
2164 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
2165 : 2 : CVC5_CAPI_CHECK_TERM(term);
2166 : 1 : res = term->d_term.isConstArray();
2167 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2168 : 2 : return res;
2169 : : }
2170 : :
2171 : 7 : Cvc5Term cvc5_term_get_const_array_base(Cvc5Term term)
2172 : : {
2173 : 7 : Cvc5Term res = nullptr;
2174 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
2175 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2176 : 5 : res = term->d_tm->export_term(term->d_term.getConstArrayBase());
2177 [ + - ][ - + ]: 5 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2178 : 7 : return res;
2179 : : }
2180 : :
2181 : 3 : bool cvc5_term_is_boolean_value(Cvc5Term term)
2182 : : {
2183 : 3 : bool res = false;
2184 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
2185 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2186 : 2 : res = term->d_term.isBooleanValue();
2187 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2188 : 3 : return res;
2189 : : }
2190 : :
2191 : 6 : bool cvc5_term_get_boolean_value(Cvc5Term term)
2192 : : {
2193 : 6 : bool res = false;
2194 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
2195 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2196 : 5 : res = term->d_term.getBooleanValue();
2197 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2198 : 6 : return res;
2199 : : }
2200 : :
2201 : 8 : bool cvc5_term_is_bv_value(Cvc5Term term)
2202 : : {
2203 : 8 : bool res = false;
2204 : 8 : CVC5_CAPI_TRY_CATCH_BEGIN;
2205 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2206 : 7 : res = term->d_term.isBitVectorValue();
2207 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2208 : 8 : return res;
2209 : : }
2210 : :
2211 : 21 : const char* cvc5_term_get_bv_value(Cvc5Term term, uint32_t base)
2212 : : {
2213 [ + + ]: 21 : static thread_local std::string res;
2214 : 21 : CVC5_CAPI_TRY_CATCH_BEGIN;
2215 [ - + ][ - + ]: 21 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2216 : 21 : res = term->d_term.getBitVectorValue(base);
2217 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2218 : 21 : return res.c_str();
2219 : : }
2220 : :
2221 : 3 : bool cvc5_term_is_ff_value(Cvc5Term term)
2222 : : {
2223 : 3 : bool res = false;
2224 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
2225 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2226 : 2 : res = term->d_term.isFiniteFieldValue();
2227 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2228 : 3 : return res;
2229 : : }
2230 : :
2231 : 7 : const char* cvc5_term_get_ff_value(Cvc5Term term)
2232 : : {
2233 [ + + ]: 7 : static thread_local std::string res;
2234 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
2235 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2236 : 6 : res = term->d_term.getFiniteFieldValue();
2237 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2238 : 7 : return res.c_str();
2239 : : }
2240 : :
2241 : 2 : bool cvc5_term_is_uninterpreted_sort_value(Cvc5Term term)
2242 : : {
2243 : 2 : bool res = false;
2244 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
2245 [ - + ][ - + ]: 2 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2246 : 2 : res = term->d_term.isUninterpretedSortValue();
2247 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2248 : 2 : return res;
2249 : : }
2250 : :
2251 : 3 : const char* cvc5_term_get_uninterpreted_sort_value(Cvc5Term term)
2252 : : {
2253 [ + + ]: 3 : static thread_local std::string res;
2254 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
2255 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2256 : 2 : res = term->d_term.getUninterpretedSortValue();
2257 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2258 : 3 : return res.c_str();
2259 : : }
2260 : :
2261 : 2 : bool cvc5_term_is_tuple_value(Cvc5Term term)
2262 : : {
2263 : 2 : bool res = false;
2264 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
2265 : 2 : CVC5_CAPI_CHECK_TERM(term);
2266 : 1 : res = term->d_term.isTupleValue();
2267 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2268 : 2 : return res;
2269 : : }
2270 : :
2271 : 3 : const Cvc5Term* cvc5_term_get_tuple_value(Cvc5Term term, size_t* size)
2272 : : {
2273 [ + + ]: 3 : static thread_local std::vector<Cvc5Term> res;
2274 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
2275 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2276 : 2 : CVC5_CAPI_CHECK_NOT_NULL(size);
2277 : 1 : res.clear();
2278 : 1 : auto terms = term->d_term.getTupleValue();
2279 [ + + ]: 4 : for (auto& t : terms)
2280 : : {
2281 : 3 : res.push_back(term->d_tm->export_term(t));
2282 : : }
2283 : 1 : *size = res.size();
2284 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2285 : 3 : return res.data();
2286 : : }
2287 : :
2288 : 4 : bool cvc5_term_is_rm_value(Cvc5Term term)
2289 : : {
2290 : 4 : bool res = false;
2291 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
2292 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2293 : 3 : res = term->d_term.isRoundingModeValue();
2294 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2295 : 4 : return res;
2296 : : }
2297 : :
2298 : 7 : Cvc5RoundingMode cvc5_term_get_rm_value(Cvc5Term term)
2299 : : {
2300 : 7 : Cvc5RoundingMode res = CVC5_RM_ROUND_NEAREST_TIES_TO_AWAY;
2301 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
2302 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2303 : 6 : res = static_cast<Cvc5RoundingMode>(term->d_term.getRoundingModeValue());
2304 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2305 : 7 : return res;
2306 : : }
2307 : :
2308 : 3 : bool cvc5_term_is_fp_pos_zero(Cvc5Term term)
2309 : : {
2310 : 3 : bool res = false;
2311 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
2312 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2313 : 2 : res = term->d_term.isFloatingPointPosZero();
2314 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2315 : 3 : return res;
2316 : : }
2317 : :
2318 : 3 : bool cvc5_term_is_fp_neg_zero(Cvc5Term term)
2319 : : {
2320 : 3 : bool res = false;
2321 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
2322 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2323 : 2 : res = term->d_term.isFloatingPointNegZero();
2324 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2325 : 3 : return res;
2326 : : }
2327 : :
2328 : 3 : bool cvc5_term_is_fp_pos_inf(Cvc5Term term)
2329 : : {
2330 : 3 : bool res = false;
2331 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
2332 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2333 : 2 : res = term->d_term.isFloatingPointPosInf();
2334 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2335 : 3 : return res;
2336 : : }
2337 : :
2338 : 3 : bool cvc5_term_is_fp_neg_inf(Cvc5Term term)
2339 : : {
2340 : 3 : bool res = false;
2341 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
2342 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2343 : 2 : res = term->d_term.isFloatingPointNegInf();
2344 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2345 : 3 : return res;
2346 : : }
2347 : :
2348 : 3 : bool cvc5_term_is_fp_nan(Cvc5Term term)
2349 : : {
2350 : 3 : bool res = false;
2351 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
2352 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2353 : 2 : res = term->d_term.isFloatingPointNaN();
2354 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2355 : 3 : return res;
2356 : : }
2357 : :
2358 : 2 : bool cvc5_term_is_fp_value(Cvc5Term term)
2359 : : {
2360 : 2 : bool res = false;
2361 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
2362 : 2 : CVC5_CAPI_CHECK_TERM(term);
2363 : 1 : res = term->d_term.isFloatingPointValue();
2364 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2365 : 2 : return res;
2366 : : }
2367 : :
2368 : 5 : void cvc5_term_get_fp_value(Cvc5Term term,
2369 : : uint32_t* ew,
2370 : : uint32_t* sw,
2371 : : Cvc5Term* val)
2372 : : {
2373 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
2374 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2375 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(ew);
[ - - ]
2376 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(sw);
[ - - ]
2377 : 2 : CVC5_CAPI_CHECK_NOT_NULL(val);
2378 : 1 : cvc5::Term res;
2379 : 1 : std::tie(*ew, *sw, res) = term->d_term.getFloatingPointValue();
2380 : 1 : *val = term->d_tm->export_term(res);
2381 [ + - ][ - + ]: 5 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2382 : 5 : }
2383 : :
2384 : 7 : bool cvc5_term_is_set_value(Cvc5Term term)
2385 : : {
2386 : 7 : bool res = false;
2387 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
2388 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2389 : 6 : res = term->d_term.isSetValue();
2390 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2391 : 7 : return res;
2392 : : }
2393 : :
2394 : 7 : const Cvc5Term* cvc5_term_get_set_value(Cvc5Term term, size_t* size)
2395 : : {
2396 [ + + ]: 7 : static thread_local std::vector<Cvc5Term> res;
2397 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
2398 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2399 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
2400 : 5 : res.clear();
2401 : 5 : auto terms = term->d_term.getSetValue();
2402 [ + + ]: 10 : for (auto& t : terms)
2403 : : {
2404 : 5 : res.push_back(term->d_tm->export_term(t));
2405 : : }
2406 : 5 : *size = res.size();
2407 [ + - ][ - + ]: 7 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2408 : 7 : return res.data();
2409 : : }
2410 : :
2411 : 10 : bool cvc5_term_is_sequence_value(Cvc5Term term)
2412 : : {
2413 : 10 : bool res = false;
2414 : 10 : CVC5_CAPI_TRY_CATCH_BEGIN;
2415 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2416 : 9 : res = term->d_term.isSequenceValue();
2417 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2418 : 10 : return res;
2419 : : }
2420 : :
2421 : 9 : const Cvc5Term* cvc5_term_get_sequence_value(Cvc5Term term, size_t* size)
2422 : : {
2423 [ + + ]: 9 : static thread_local std::vector<Cvc5Term> res;
2424 : 9 : CVC5_CAPI_TRY_CATCH_BEGIN;
2425 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2426 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
2427 : 7 : res.clear();
2428 : 7 : auto terms = term->d_term.getSequenceValue();
2429 [ + + ]: 12 : for (auto& t : terms)
2430 : : {
2431 : 6 : res.push_back(term->d_tm->export_term(t));
2432 : : }
2433 : 6 : *size = res.size();
2434 [ + - ][ - + ]: 9 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2435 : 9 : return res.data();
2436 : : }
2437 : :
2438 : 3 : bool cvc5_term_is_cardinality_constraint(Cvc5Term term)
2439 : : {
2440 : 3 : bool res = false;
2441 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
2442 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2443 : 2 : res = term->d_term.isCardinalityConstraint();
2444 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2445 : 3 : return res;
2446 : : }
2447 : :
2448 : 5 : void cvc5_term_get_cardinality_constraint(Cvc5Term term,
2449 : : Cvc5Sort* sort,
2450 : : uint32_t* upper)
2451 : : {
2452 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
2453 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2454 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(sort);
[ - - ]
2455 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(upper);
[ - - ]
2456 : 2 : cvc5::Sort res;
2457 : 2 : std::tie(res, *upper) = term->d_term.getCardinalityConstraint();
2458 : 1 : *sort = term->d_tm->export_sort(res);
2459 [ + - ][ - + ]: 6 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2460 : 5 : }
2461 : :
2462 : 2 : bool cvc5_term_is_real_algebraic_number(Cvc5Term term)
2463 : : {
2464 : 2 : bool res = false;
2465 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
2466 : 2 : CVC5_CAPI_CHECK_TERM(term);
2467 : 1 : res = term->d_term.isRealAlgebraicNumber();
2468 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2469 : 2 : return res;
2470 : : }
2471 : :
2472 : 4 : Cvc5Term cvc5_term_get_real_algebraic_number_defining_polynomial(Cvc5Term term,
2473 : : Cvc5Term v)
2474 : : {
2475 : 4 : Cvc5Term res = nullptr;
2476 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
2477 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2478 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_TERM(v);
[ - - ]
2479 : 1 : res = term->d_tm->export_term(
2480 : 3 : term->d_term.getRealAlgebraicNumberDefiningPolynomial(v->d_term));
2481 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2482 : 4 : return res;
2483 : : }
2484 : :
2485 : 2 : Cvc5Term cvc5_term_get_real_algebraic_number_lower_bound(Cvc5Term term)
2486 : : {
2487 : 2 : Cvc5Term res = nullptr;
2488 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
2489 : 2 : CVC5_CAPI_CHECK_TERM(term);
2490 : : res =
2491 : 1 : term->d_tm->export_term(term->d_term.getRealAlgebraicNumberLowerBound());
2492 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2493 : 2 : return res;
2494 : : }
2495 : :
2496 : 2 : Cvc5Term cvc5_term_get_real_algebraic_number_upper_bound(Cvc5Term term)
2497 : : {
2498 : 2 : Cvc5Term res = nullptr;
2499 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
2500 : 2 : CVC5_CAPI_CHECK_TERM(term);
2501 : : res =
2502 : 1 : term->d_tm->export_term(term->d_term.getRealAlgebraicNumberUpperBound());
2503 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2504 : 2 : return res;
2505 : : }
2506 : :
2507 : 4 : bool cvc5_term_is_skolem(Cvc5Term term)
2508 : : {
2509 : 4 : bool res = false;
2510 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
2511 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2512 : 3 : res = term->d_term.isSkolem();
2513 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2514 : 4 : return res;
2515 : : }
2516 : :
2517 : 4 : Cvc5SkolemId cvc5_term_get_skolem_id(Cvc5Term term)
2518 : : {
2519 : 4 : Cvc5SkolemId res = CVC5_SKOLEM_ID_NONE;
2520 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
2521 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2522 : 3 : res = static_cast<Cvc5SkolemId>(term->d_term.getSkolemId());
2523 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2524 : 4 : return res;
2525 : : }
2526 : :
2527 : 5 : const Cvc5Term* cvc5_term_get_skolem_indices(Cvc5Term term, size_t* size)
2528 : : {
2529 [ + + ]: 5 : static thread_local std::vector<Cvc5Term> res;
2530 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
2531 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2532 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
2533 : 3 : res.clear();
2534 : 3 : auto terms = term->d_term.getSkolemIndices();
2535 [ + + ]: 6 : for (auto& t : terms)
2536 : : {
2537 : 4 : res.push_back(term->d_tm->export_term(t));
2538 : : }
2539 : 2 : *size = res.size();
2540 [ + - ][ - + ]: 5 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2541 : 5 : return res.data();
2542 : : }
2543 : :
2544 : 10 : size_t cvc5_term_hash(Cvc5Term term)
2545 : : {
2546 : 10 : size_t res = 0;
2547 : 10 : CVC5_CAPI_TRY_CATCH_BEGIN;
2548 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
2549 : 9 : res = std::hash<cvc5::Term>{}(term->d_term);
2550 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2551 : 10 : return res;
2552 : : }
2553 : :
2554 : : /* -------------------------------------------------------------------------- */
2555 : : /* Cvc5Op */
2556 : : /* -------------------------------------------------------------------------- */
2557 : :
2558 : 4 : bool cvc5_op_is_equal(Cvc5Op a, Cvc5Op b)
2559 : : {
2560 : 4 : bool res = false;
2561 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
2562 [ + - ][ + + ]: 4 : if (a == nullptr || b == nullptr)
2563 : : {
2564 : 1 : res = a == b;
2565 : : }
2566 : : else
2567 : : {
2568 : 3 : res = a->d_op == b->d_op;
2569 : : }
2570 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2571 : 4 : return res;
2572 : : }
2573 : :
2574 : 2 : bool cvc5_op_is_disequal(Cvc5Op a, Cvc5Op b)
2575 : : {
2576 : 2 : bool res = false;
2577 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
2578 [ + - ][ + + ]: 2 : if (a == nullptr || b == nullptr)
2579 : : {
2580 : 1 : res = a != b;
2581 : : }
2582 : : else
2583 : : {
2584 : 1 : res = a->d_op != b->d_op;
2585 : : }
2586 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2587 : 2 : return res;
2588 : : }
2589 : :
2590 : 2 : Cvc5Kind cvc5_op_get_kind(Cvc5Op op)
2591 : : {
2592 : 2 : Cvc5Kind res = CVC5_KIND_INTERNAL_KIND;
2593 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
2594 : 2 : CVC5_CAPI_CHECK_OP(op);
2595 : 1 : res = static_cast<Cvc5Kind>(op->d_op.getKind());
2596 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2597 : 2 : return res;
2598 : : }
2599 : :
2600 : 3 : bool cvc5_op_is_indexed(Cvc5Op op)
2601 : : {
2602 : 3 : bool res = false;
2603 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
2604 [ - + ][ - + ]: 3 : CVC5_CAPI_CHECK_OP(op);
[ - - ]
2605 : 3 : res = op->d_op.isIndexed();
2606 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2607 : 3 : return res;
2608 : : }
2609 : :
2610 : 26 : size_t cvc5_op_get_num_indices(Cvc5Op op)
2611 : : {
2612 : 26 : size_t res = 0;
2613 : 26 : CVC5_CAPI_TRY_CATCH_BEGIN;
2614 [ + + ][ + + ]: 26 : CVC5_CAPI_CHECK_OP(op);
[ - - ]
2615 : 25 : res = op->d_op.getNumIndices();
2616 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2617 : 26 : return res;
2618 : : }
2619 : :
2620 : 46 : Cvc5Term cvc5_op_get_index(Cvc5Op op, size_t i)
2621 : : {
2622 : 46 : Cvc5Term res = nullptr;
2623 : 46 : CVC5_CAPI_TRY_CATCH_BEGIN;
2624 [ + + ][ + + ]: 46 : CVC5_CAPI_CHECK_OP(op);
[ - - ]
2625 : 45 : res = op->d_tm->export_term(op->d_op[i]);
2626 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2627 : 46 : return res;
2628 : : }
2629 : :
2630 : 2 : const char* cvc5_op_to_string(Cvc5Op op)
2631 : : {
2632 [ + + ]: 2 : static thread_local std::string str;
2633 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
2634 [ - + ][ - + ]: 2 : CVC5_CAPI_CHECK_OP(op);
[ - - ]
2635 : 2 : str = op->d_op.toString();
2636 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2637 : 2 : return str.c_str();
2638 : : }
2639 : :
2640 : 9 : size_t cvc5_op_hash(Cvc5Op op)
2641 : : {
2642 : 9 : size_t res = 0;
2643 : 9 : CVC5_CAPI_TRY_CATCH_BEGIN;
2644 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_OP(op);
[ - - ]
2645 : 8 : res = std::hash<cvc5::Op>{}(op->d_op);
2646 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2647 : 9 : return res;
2648 : : }
2649 : :
2650 : 2 : Cvc5Op cvc5_op_copy(Cvc5Op op)
2651 : : {
2652 : 2 : Cvc5Op res = nullptr;
2653 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
2654 : 2 : CVC5_CAPI_CHECK_OP(op);
2655 : 1 : res = op->d_tm->copy(op);
2656 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2657 : 2 : return res;
2658 : : }
2659 : :
2660 : 3 : void cvc5_op_release(Cvc5Op op)
2661 : : {
2662 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
2663 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_OP(op);
[ - - ]
2664 : 2 : op->d_tm->release(op);
2665 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2666 : 3 : }
2667 : :
2668 : : /* -------------------------------------------------------------------------- */
2669 : : /* Cvc5TermManager */
2670 : : /* -------------------------------------------------------------------------- */
2671 : :
2672 : 510 : Cvc5TermManager* cvc5_term_manager_new()
2673 : : {
2674 : 510 : Cvc5TermManager* res = nullptr;
2675 : 510 : CVC5_CAPI_TRY_CATCH_BEGIN;
2676 : 510 : res = new Cvc5TermManager();
2677 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2678 : 510 : return res;
2679 : : }
2680 : :
2681 : 511 : void cvc5_term_manager_delete(Cvc5TermManager* tm)
2682 : : {
2683 : 511 : CVC5_CAPI_TRY_CATCH_BEGIN;
2684 [ + + ][ + + ]: 511 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2685 [ + - ]: 510 : delete tm;
2686 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2687 : 511 : }
2688 : :
2689 : 2 : void cvc5_term_manager_release(Cvc5TermManager* tm)
2690 : : {
2691 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
2692 : 2 : CVC5_CAPI_CHECK_NOT_NULL(tm);
2693 : 1 : tm->release();
2694 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2695 : 2 : }
2696 : :
2697 : 2 : Cvc5Statistics cvc5_term_manager_get_statistics(Cvc5TermManager* tm)
2698 : : {
2699 : 2 : Cvc5Statistics res = nullptr;
2700 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
2701 : 2 : CVC5_CAPI_CHECK_NOT_NULL(tm);
2702 : 1 : res = tm->export_stats(tm->d_tm.getStatistics());
2703 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2704 : 2 : return res;
2705 : : }
2706 : :
2707 : 1 : void cvc5_term_manager_print_stats_safe(Cvc5TermManager* tm, int fd)
2708 : : {
2709 : 1 : CVC5_CAPI_TRY_CATCH_BEGIN;
2710 [ - + ][ - + ]: 1 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2711 : 1 : tm->d_tm.printStatisticsSafe(fd);
2712 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2713 : 1 : }
2714 : :
2715 : : /* Sorts Handling ----------------------------------------------------------- */
2716 : :
2717 : 411 : Cvc5Sort cvc5_get_boolean_sort(Cvc5TermManager* tm)
2718 : : {
2719 : 411 : Cvc5Sort res = nullptr;
2720 : 411 : CVC5_CAPI_TRY_CATCH_BEGIN;
2721 [ + + ][ + + ]: 411 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2722 : 410 : res = tm->export_sort(tm->d_tm.getBooleanSort());
2723 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2724 : 411 : return res;
2725 : : }
2726 : :
2727 : 425 : Cvc5Sort cvc5_get_integer_sort(Cvc5TermManager* tm)
2728 : : {
2729 : 425 : Cvc5Sort res = nullptr;
2730 : 425 : CVC5_CAPI_TRY_CATCH_BEGIN;
2731 [ + + ][ + + ]: 425 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2732 : 424 : res = tm->export_sort(tm->d_tm.getIntegerSort());
2733 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2734 : 425 : return res;
2735 : : }
2736 : :
2737 : 382 : Cvc5Sort cvc5_get_real_sort(Cvc5TermManager* tm)
2738 : : {
2739 : 382 : Cvc5Sort res = nullptr;
2740 : 382 : CVC5_CAPI_TRY_CATCH_BEGIN;
2741 [ + + ][ + + ]: 382 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2742 : 381 : res = tm->export_sort(tm->d_tm.getRealSort());
2743 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2744 : 382 : return res;
2745 : : }
2746 : :
2747 : 4 : Cvc5Sort cvc5_get_regexp_sort(Cvc5TermManager* tm)
2748 : : {
2749 : 4 : Cvc5Sort res = nullptr;
2750 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
2751 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2752 : 3 : res = tm->export_sort(tm->d_tm.getRegExpSort());
2753 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2754 : 4 : return res;
2755 : : }
2756 : :
2757 : 4 : Cvc5Sort cvc5_get_rm_sort(Cvc5TermManager* tm)
2758 : : {
2759 : 4 : Cvc5Sort res = nullptr;
2760 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
2761 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2762 : 3 : res = tm->export_sort(tm->d_tm.getRoundingModeSort());
2763 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2764 : 4 : return res;
2765 : : }
2766 : :
2767 : 155 : Cvc5Sort cvc5_get_string_sort(Cvc5TermManager* tm)
2768 : : {
2769 : 155 : Cvc5Sort res = nullptr;
2770 : 155 : CVC5_CAPI_TRY_CATCH_BEGIN;
2771 [ + + ][ + + ]: 155 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2772 : 154 : res = tm->export_sort(tm->d_tm.getStringSort());
2773 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2774 : 155 : return res;
2775 : : }
2776 : :
2777 : 32 : Cvc5Sort cvc5_mk_array_sort(Cvc5TermManager* tm, Cvc5Sort index, Cvc5Sort elem)
2778 : : {
2779 : 32 : Cvc5Sort res = nullptr;
2780 : 32 : CVC5_CAPI_TRY_CATCH_BEGIN;
2781 [ + + ][ + + ]: 32 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2782 [ + + ][ + + ]: 31 : CVC5_CAPI_CHECK_SORT(index);
[ - - ]
2783 [ + + ][ + + ]: 30 : CVC5_CAPI_CHECK_SORT(elem);
[ - - ]
2784 : 29 : res = tm->export_sort(tm->d_tm.mkArraySort(index->d_sort, elem->d_sort));
2785 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2786 : 32 : return res;
2787 : : }
2788 : :
2789 : 40 : Cvc5Sort cvc5_mk_bv_sort(Cvc5TermManager* tm, uint32_t size)
2790 : : {
2791 : 40 : Cvc5Sort res = nullptr;
2792 : 40 : CVC5_CAPI_TRY_CATCH_BEGIN;
2793 [ + + ][ + + ]: 40 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2794 : 39 : res = tm->export_sort(tm->d_tm.mkBitVectorSort(size));
2795 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2796 : 40 : return res;
2797 : : }
2798 : :
2799 : 10 : Cvc5Sort cvc5_mk_fp_sort(Cvc5TermManager* tm, uint32_t exp, uint32_t sig)
2800 : : {
2801 : 10 : Cvc5Sort res = nullptr;
2802 : 10 : CVC5_CAPI_TRY_CATCH_BEGIN;
2803 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2804 : 9 : res = tm->export_sort(tm->d_tm.mkFloatingPointSort(exp, sig));
2805 [ + - ][ - + ]: 5 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2806 : 10 : return res;
2807 : : }
2808 : :
2809 : 24 : Cvc5Sort cvc5_mk_ff_sort(Cvc5TermManager* tm, const char* size, uint32_t base)
2810 : : {
2811 : 24 : Cvc5Sort res = nullptr;
2812 : 24 : CVC5_CAPI_TRY_CATCH_BEGIN;
2813 [ + + ][ + + ]: 24 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2814 [ + + ][ + + ]: 23 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
2815 : 38 : res = tm->export_sort(tm->d_tm.mkFiniteFieldSort(size, base));
2816 [ + - ][ - + ]: 10 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2817 : 24 : return res;
2818 : : }
2819 : :
2820 : 43 : Cvc5Sort cvc5_mk_dt_sort(Cvc5TermManager* tm, Cvc5DatatypeDecl decl)
2821 : : {
2822 : 43 : Cvc5Sort res = nullptr;
2823 : 43 : CVC5_CAPI_TRY_CATCH_BEGIN;
2824 [ + + ][ + + ]: 43 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2825 [ + + ][ + + ]: 41 : CVC5_CAPI_CHECK_DT_DECL(decl);
[ - - ]
2826 : 40 : res = tm->export_sort(tm->d_tm.mkDatatypeSort(decl->d_decl));
2827 [ + - ][ - + ]: 6 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2828 : 43 : return res;
2829 : : }
2830 : :
2831 : 20 : const Cvc5Sort* cvc5_mk_dt_sorts(Cvc5TermManager* tm,
2832 : : size_t size,
2833 : : const Cvc5DatatypeDecl decls[])
2834 : : {
2835 [ + + ]: 20 : static thread_local std::vector<Cvc5Sort> res;
2836 : 20 : CVC5_CAPI_TRY_CATCH_BEGIN;
2837 [ + + ][ + + ]: 20 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2838 [ + + ][ + + ]: 18 : CVC5_CAPI_CHECK_NOT_NULL(decls);
[ - - ]
2839 : 16 : res.clear();
2840 : 16 : std::vector<cvc5::DatatypeDecl> cdecls;
2841 [ + + ]: 42 : for (size_t i = 0; i < size; ++i)
2842 : : {
2843 [ - + ][ - + ]: 26 : CVC5_CAPI_CHECK_DT_DECL_AT_IDX(decls, i);
[ - - ]
2844 : 26 : cdecls.push_back(decls[i]->d_decl);
2845 : : }
2846 : 16 : auto sorts = tm->d_tm.mkDatatypeSorts(cdecls);
2847 [ + + ]: 30 : for (auto& s : sorts)
2848 : : {
2849 : 19 : res.push_back(tm->export_sort(s));
2850 : : }
2851 [ + - ][ - + ]: 25 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2852 : 20 : return res.data();
2853 : : }
2854 : :
2855 : 68 : Cvc5Sort cvc5_mk_fun_sort(Cvc5TermManager* tm,
2856 : : size_t size,
2857 : : const Cvc5Sort sorts[],
2858 : : Cvc5Sort codomain)
2859 : : {
2860 : 68 : Cvc5Sort res = nullptr;
2861 : 68 : CVC5_CAPI_TRY_CATCH_BEGIN;
2862 [ + + ][ + + ]: 68 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2863 [ + + ][ + + ]: 67 : CVC5_CAPI_CHECK_NOT_NULL(sorts);
[ - - ]
2864 : 66 : std::vector<cvc5::Sort> csorts;
2865 [ + + ]: 151 : for (size_t i = 0; i < size; ++i)
2866 : : {
2867 [ + + ][ + + ]: 86 : CVC5_CAPI_CHECK_SORT_AT_IDX(sorts, i);
[ - - ]
2868 : 85 : csorts.push_back(sorts[i]->d_sort);
2869 : : }
2870 : 65 : res = tm->export_sort(tm->d_tm.mkFunctionSort(csorts, codomain->d_sort));
2871 [ + - ][ - + ]: 73 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2872 : 68 : return res;
2873 : : }
2874 : :
2875 : 24 : Cvc5Sort cvc5_mk_param_sort(Cvc5TermManager* tm, const char* symbol)
2876 : : {
2877 : 24 : Cvc5Sort res = nullptr;
2878 : 24 : CVC5_CAPI_TRY_CATCH_BEGIN;
2879 [ + + ][ + + ]: 24 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2880 [ + + ][ + + ]: 23 : CVC5_CAPI_CHECK_NOT_NULL(symbol);
[ - - ]
2881 : 22 : res = tm->export_sort(tm->d_tm.mkParamSort(symbol));
2882 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2883 : 24 : return res;
2884 : : }
2885 : :
2886 : 9 : Cvc5Sort cvc5_mk_predicate_sort(Cvc5TermManager* tm,
2887 : : size_t size,
2888 : : const Cvc5Sort sorts[])
2889 : : {
2890 : 9 : Cvc5Sort res = nullptr;
2891 : 9 : CVC5_CAPI_TRY_CATCH_BEGIN;
2892 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2893 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_NOT_NULL(sorts);
[ - - ]
2894 : 7 : std::vector<cvc5::Sort> csorts;
2895 [ + + ]: 12 : for (size_t i = 0; i < size; ++i)
2896 : : {
2897 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_SORT_AT_IDX(sorts, i);
[ - - ]
2898 : 5 : csorts.push_back(sorts[i]->d_sort);
2899 : : }
2900 : 5 : res = tm->export_sort(tm->d_tm.mkPredicateSort(csorts));
2901 [ + - ][ - + ]: 13 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2902 : 9 : return res;
2903 : : }
2904 : :
2905 : 9 : Cvc5Sort cvc5_mk_record_sort(Cvc5TermManager* tm,
2906 : : size_t size,
2907 : : const char* names[],
2908 : : const Cvc5Sort sorts[])
2909 : : {
2910 : 9 : Cvc5Sort res = nullptr;
2911 : 9 : CVC5_CAPI_TRY_CATCH_BEGIN;
2912 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2913 [ + + ]: 8 : if (names != nullptr)
2914 : : {
2915 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_NOT_NULL(sorts);
[ - - ]
2916 : 6 : std::vector<std::pair<std::string, cvc5::Sort>> cfields;
2917 [ + + ]: 18 : for (size_t i = 0; i < size; ++i)
2918 : : {
2919 [ - + ][ - + ]: 13 : CVC5_CAPI_CHECK_NOT_NULL_AT_IDX(names, i);
[ - - ]
2920 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_SORT_AT_IDX(sorts, i);
[ - - ]
2921 : 12 : cfields.emplace_back(names[i], sorts[i]->d_sort);
2922 : : }
2923 : 5 : res = tm->export_sort(tm->d_tm.mkRecordSort(cfields));
2924 : 6 : }
2925 : : else
2926 : : {
2927 : 1 : res = tm->export_sort(tm->d_tm.mkRecordSort({}));
2928 : : }
2929 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2930 : 9 : return res;
2931 : : }
2932 : :
2933 : 15 : Cvc5Sort cvc5_mk_set_sort(Cvc5TermManager* tm, Cvc5Sort sort)
2934 : : {
2935 : 15 : Cvc5Sort res = nullptr;
2936 : 15 : CVC5_CAPI_TRY_CATCH_BEGIN;
2937 [ + + ][ + + ]: 15 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2938 [ + + ][ + + ]: 14 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
2939 : 13 : res = tm->export_sort(tm->d_tm.mkSetSort(sort->d_sort));
2940 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2941 : 15 : return res;
2942 : : }
2943 : :
2944 : 10 : Cvc5Sort cvc5_mk_bag_sort(Cvc5TermManager* tm, Cvc5Sort sort)
2945 : : {
2946 : 10 : Cvc5Sort res = nullptr;
2947 : 10 : CVC5_CAPI_TRY_CATCH_BEGIN;
2948 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2949 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
2950 : 8 : res = tm->export_sort(tm->d_tm.mkBagSort(sort->d_sort));
2951 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2952 : 10 : return res;
2953 : : }
2954 : :
2955 : 13 : Cvc5Sort cvc5_mk_sequence_sort(Cvc5TermManager* tm, Cvc5Sort sort)
2956 : : {
2957 : 13 : Cvc5Sort res = nullptr;
2958 : 13 : CVC5_CAPI_TRY_CATCH_BEGIN;
2959 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2960 [ + + ][ + + ]: 12 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
2961 : 11 : res = tm->export_sort(tm->d_tm.mkSequenceSort(sort->d_sort));
2962 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2963 : 13 : return res;
2964 : : }
2965 : :
2966 : 14 : Cvc5Sort cvc5_mk_abstract_sort(Cvc5TermManager* tm, Cvc5SortKind k)
2967 : : {
2968 : 14 : Cvc5Sort res = nullptr;
2969 : 14 : CVC5_CAPI_TRY_CATCH_BEGIN;
2970 [ + + ][ + + ]: 14 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2971 : : res =
2972 : 13 : tm->export_sort(tm->d_tm.mkAbstractSort(static_cast<cvc5::SortKind>(k)));
2973 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2974 : 14 : return res;
2975 : : }
2976 : :
2977 : 264 : Cvc5Sort cvc5_mk_uninterpreted_sort(Cvc5TermManager* tm, const char* symbol)
2978 : : {
2979 : 264 : Cvc5Sort res = nullptr;
2980 : 264 : CVC5_CAPI_TRY_CATCH_BEGIN;
2981 [ + + ][ + + ]: 264 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
2982 [ + + ]: 263 : if (symbol)
2983 : : {
2984 : 262 : res = tm->export_sort(tm->d_tm.mkUninterpretedSort(symbol));
2985 : : }
2986 : : else
2987 : : {
2988 : 1 : res = tm->export_sort(tm->d_tm.mkUninterpretedSort());
2989 : : }
2990 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
2991 : 264 : return res;
2992 : : }
2993 : :
2994 : 18 : Cvc5Sort cvc5_mk_unresolved_dt_sort(Cvc5TermManager* tm,
2995 : : const char* symbol,
2996 : : size_t arity)
2997 : : {
2998 : 18 : Cvc5Sort res = nullptr;
2999 : 18 : CVC5_CAPI_TRY_CATCH_BEGIN;
3000 [ + + ][ + + ]: 18 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3001 [ + + ][ + + ]: 17 : CVC5_CAPI_CHECK_NOT_NULL(symbol);
[ - - ]
3002 : 16 : res = tm->export_sort(tm->d_tm.mkUnresolvedDatatypeSort(symbol, arity));
3003 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3004 : 18 : return res;
3005 : : }
3006 : :
3007 : 17 : Cvc5Sort cvc5_mk_uninterpreted_sort_constructor_sort(Cvc5TermManager* tm,
3008 : : size_t arity,
3009 : : const char* symbol)
3010 : : {
3011 : 17 : Cvc5Sort res = nullptr;
3012 : 17 : CVC5_CAPI_TRY_CATCH_BEGIN;
3013 [ + + ][ + + ]: 17 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3014 [ + + ]: 16 : if (symbol)
3015 : : {
3016 : 12 : res = tm->export_sort(
3017 : 26 : tm->d_tm.mkUninterpretedSortConstructorSort(arity, symbol));
3018 : : }
3019 : : else
3020 : : {
3021 : 3 : res = tm->export_sort(tm->d_tm.mkUninterpretedSortConstructorSort(arity));
3022 : : }
3023 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3024 : 17 : return res;
3025 : : }
3026 : :
3027 : 12 : Cvc5Sort cvc5_mk_tuple_sort(Cvc5TermManager* tm,
3028 : : size_t size,
3029 : : const Cvc5Sort sorts[])
3030 : : {
3031 : 12 : Cvc5Sort res = nullptr;
3032 : 12 : CVC5_CAPI_TRY_CATCH_BEGIN;
3033 [ + + ][ + + ]: 12 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3034 [ - + ][ - + ]: 10 : CVC5_CAPI_CHECK_NOT_NULL(sorts);
[ - - ]
3035 : 10 : std::vector<cvc5::Sort> csorts;
3036 [ + + ]: 24 : for (size_t i = 0; i < size; ++i)
3037 : : {
3038 [ + + ][ + + ]: 15 : CVC5_CAPI_CHECK_SORT_AT_IDX(sorts, i);
[ - - ]
3039 : 14 : csorts.push_back(sorts[i]->d_sort);
3040 : : }
3041 : 9 : res = tm->export_sort(tm->d_tm.mkTupleSort(csorts));
3042 [ + - ][ - + ]: 14 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3043 : 12 : return res;
3044 : : }
3045 : :
3046 : 8 : Cvc5Sort cvc5_mk_nullable_sort(Cvc5TermManager* tm, Cvc5Sort sort)
3047 : : {
3048 : 8 : Cvc5Sort res = nullptr;
3049 : 8 : CVC5_CAPI_TRY_CATCH_BEGIN;
3050 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3051 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
3052 : 6 : res = tm->export_sort(tm->d_tm.mkNullableSort(sort->d_sort));
3053 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3054 : 8 : return res;
3055 : : }
3056 : :
3057 : : /* Datatype constructor declaration ------------------------------------ */
3058 : :
3059 : 142 : Cvc5DatatypeConstructorDecl cvc5_mk_dt_cons_decl(Cvc5TermManager* tm,
3060 : : const char* name)
3061 : : {
3062 : 142 : Cvc5DatatypeConstructorDecl res = nullptr;
3063 : 142 : CVC5_CAPI_TRY_CATCH_BEGIN;
3064 [ - + ][ - + ]: 142 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3065 [ - + ][ - + ]: 142 : CVC5_CAPI_CHECK_NOT_NULL(name);
[ - - ]
3066 : 142 : res = tm->export_dt_cons_decl(tm->d_tm.mkDatatypeConstructorDecl(name));
3067 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3068 : 142 : return res;
3069 : : }
3070 : :
3071 : : /* Datatype declaration ------------------------------------------------ */
3072 : :
3073 : 56 : Cvc5DatatypeDecl cvc5_mk_dt_decl(Cvc5TermManager* tm,
3074 : : const char* name,
3075 : : bool is_codt)
3076 : : {
3077 : 56 : Cvc5DatatypeDecl res = nullptr;
3078 : 56 : CVC5_CAPI_TRY_CATCH_BEGIN;
3079 [ - + ][ - + ]: 56 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3080 [ - + ][ - + ]: 56 : CVC5_CAPI_CHECK_NOT_NULL(name);
[ - - ]
3081 : 56 : res = tm->export_dt_decl(tm->d_tm.mkDatatypeDecl(name, is_codt));
3082 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3083 : 56 : return res;
3084 : : }
3085 : :
3086 : 20 : Cvc5DatatypeDecl cvc5_mk_dt_decl_with_params(Cvc5TermManager* tm,
3087 : : const char* name,
3088 : : size_t size,
3089 : : const Cvc5Sort* params,
3090 : : bool is_codt)
3091 : : {
3092 : 20 : Cvc5DatatypeDecl res = nullptr;
3093 : 20 : CVC5_CAPI_TRY_CATCH_BEGIN;
3094 [ + + ][ + + ]: 20 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3095 [ + + ][ + + ]: 18 : CVC5_CAPI_CHECK_NOT_NULL(name);
[ - - ]
3096 : 17 : std::vector<cvc5::Sort> cparams;
3097 [ + + ]: 17 : if (params)
3098 : : {
3099 [ + + ]: 28 : for (size_t i = 0; i < size; ++i)
3100 : : {
3101 [ + + ][ + + ]: 15 : CVC5_CAPI_CHECK_SORT_AT_IDX(params, i);
[ - - ]
3102 : 14 : cparams.push_back(params[i]->d_sort);
3103 : : }
3104 : : }
3105 : 16 : res = tm->export_dt_decl(tm->d_tm.mkDatatypeDecl(name, cparams, is_codt));
3106 [ + - ][ - + ]: 21 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3107 : 20 : return res;
3108 : : }
3109 : :
3110 : : /* Create Terms --------------------------------------------------------- */
3111 : :
3112 : 374 : Cvc5Term cvc5_mk_term(Cvc5TermManager* tm,
3113 : : Cvc5Kind kind,
3114 : : size_t size,
3115 : : const Cvc5Term children[])
3116 : : {
3117 : 374 : Cvc5Term res = nullptr;
3118 : 374 : CVC5_CAPI_TRY_CATCH_BEGIN;
3119 [ + + ][ + + ]: 374 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3120 [ + - ][ + - ]: 371 : CVC5_CAPI_CHECK_KIND(kind);
[ - + ][ - + ]
[ - - ]
3121 [ + + ][ + + ]: 374 : CVC5_API_CHECK(children || size == 0)
[ + + ][ + + ]
[ - - ]
3122 : 3 : << "unexpected NULL argument for 'children'";
3123 : 368 : std::vector<cvc5::Term> cchildren;
3124 [ + + ]: 1055 : for (size_t i = 0; i < size; ++i)
3125 : : {
3126 [ + + ][ + + ]: 693 : CVC5_CAPI_CHECK_TERM_AT_IDX(children, i);
[ - - ]
3127 : 687 : cchildren.push_back(children[i]->d_term);
3128 : : }
3129 : 348 : res = tm->export_term(
3130 : 710 : tm->d_tm.mkTerm(static_cast<cvc5::Kind>(kind), cchildren));
3131 [ + - ][ - + ]: 394 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3132 : 374 : return res;
3133 : : }
3134 : :
3135 : 48 : Cvc5Term cvc5_mk_term_from_op(Cvc5TermManager* tm,
3136 : : Cvc5Op op,
3137 : : size_t size,
3138 : : const Cvc5Term children[])
3139 : : {
3140 : 48 : Cvc5Term res = nullptr;
3141 : 48 : CVC5_CAPI_TRY_CATCH_BEGIN;
3142 [ - + ][ - + ]: 48 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3143 [ - + ][ - + ]: 48 : CVC5_CAPI_CHECK_NOT_NULL(op);
[ - - ]
3144 [ + + ][ + - ]: 48 : CVC5_API_CHECK(children || size == 0)
[ - + ][ - + ]
[ - - ]
3145 : 0 : << "unexpected NULL argument for 'children'";
3146 : 48 : std::vector<cvc5::Term> cchildren;
3147 [ + + ]: 124 : for (size_t i = 0; i < size; ++i)
3148 : : {
3149 [ + + ][ + + ]: 80 : CVC5_CAPI_CHECK_TERM_AT_IDX(children, i);
[ - - ]
3150 : 76 : cchildren.push_back(children[i]->d_term);
3151 : : }
3152 : 44 : res = tm->export_term(tm->d_tm.mkTerm(op->d_op, cchildren));
3153 [ + - ][ - + ]: 60 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3154 : 48 : return res;
3155 : : }
3156 : :
3157 : 8 : Cvc5Term cvc5_mk_tuple(Cvc5TermManager* tm, size_t size, const Cvc5Term terms[])
3158 : : {
3159 : 8 : Cvc5Term res = nullptr;
3160 : 8 : CVC5_CAPI_TRY_CATCH_BEGIN;
3161 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3162 [ - + ][ - + ]: 6 : CVC5_CAPI_CHECK_NOT_NULL(terms);
[ - - ]
3163 : 6 : std::vector<cvc5::Term> cterms;
3164 [ + + ]: 17 : for (size_t i = 0; i < size; ++i)
3165 : : {
3166 [ - + ][ - + ]: 11 : CVC5_CAPI_CHECK_TERM_AT_IDX(terms, i);
[ - - ]
3167 : 11 : cterms.push_back(terms[i]->d_term);
3168 : : }
3169 : 6 : res = tm->export_term(tm->d_tm.mkTuple(cterms));
3170 [ + - ][ - + ]: 9 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3171 : 8 : return res;
3172 : : }
3173 : :
3174 : 17 : Cvc5Term cvc5_mk_nullable_some(Cvc5TermManager* tm, Cvc5Term term)
3175 : : {
3176 : 17 : Cvc5Term res = nullptr;
3177 : 17 : CVC5_CAPI_TRY_CATCH_BEGIN;
3178 [ + + ][ + + ]: 17 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3179 [ + + ][ + + ]: 16 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
3180 : 15 : res = tm->export_term(tm->d_tm.mkNullableSome(term->d_term));
3181 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3182 : 17 : return res;
3183 : : }
3184 : :
3185 : 5 : Cvc5Term cvc5_mk_nullable_val(Cvc5TermManager* tm, Cvc5Term term)
3186 : : {
3187 : 5 : Cvc5Term res = nullptr;
3188 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
3189 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3190 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
3191 : 3 : res = tm->export_term(tm->d_tm.mkNullableVal(term->d_term));
3192 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3193 : 5 : return res;
3194 : : }
3195 : :
3196 : 5 : Cvc5Term cvc5_mk_nullable_is_null(Cvc5TermManager* tm, Cvc5Term term)
3197 : : {
3198 : 5 : Cvc5Term res = nullptr;
3199 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
3200 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3201 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
3202 : 3 : res = tm->export_term(tm->d_tm.mkNullableIsNull(term->d_term));
3203 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3204 : 5 : return res;
3205 : : }
3206 : :
3207 : 4 : Cvc5Term cvc5_mk_nullable_is_some(Cvc5TermManager* tm, Cvc5Term term)
3208 : : {
3209 : 4 : Cvc5Term res = nullptr;
3210 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
3211 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3212 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
3213 : 2 : res = tm->export_term(tm->d_tm.mkNullableIsSome(term->d_term));
3214 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3215 : 4 : return res;
3216 : : }
3217 : :
3218 : 4 : Cvc5Term cvc5_mk_nullable_null(Cvc5TermManager* tm, Cvc5Sort sort)
3219 : : {
3220 : 4 : Cvc5Term res = nullptr;
3221 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
3222 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3223 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
3224 : 2 : res = tm->export_term(tm->d_tm.mkNullableNull(sort->d_sort));
3225 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3226 : 4 : return res;
3227 : : }
3228 : :
3229 : 4 : Cvc5Term cvc5_mk_nullable_lift(Cvc5TermManager* tm,
3230 : : Cvc5Kind kind,
3231 : : size_t size,
3232 : : const Cvc5Term args[])
3233 : : {
3234 : 4 : Cvc5Term res = nullptr;
3235 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
3236 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3237 [ + - ][ + - ]: 3 : CVC5_CAPI_CHECK_KIND(kind);
[ - + ][ - + ]
[ - - ]
3238 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(args);
[ - - ]
3239 : 2 : std::vector<cvc5::Term> cargs;
3240 [ + + ]: 6 : for (size_t i = 0; i < size; ++i)
3241 : : {
3242 [ - + ][ - + ]: 4 : CVC5_CAPI_CHECK_TERM_AT_IDX(args, i);
[ - - ]
3243 : 4 : cargs.push_back(args[i]->d_term);
3244 : : }
3245 : 1 : res = tm->export_term(
3246 : 3 : tm->d_tm.mkNullableLift(static_cast<cvc5::Kind>(kind), cargs));
3247 [ + - ][ - + ]: 5 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3248 : 4 : return res;
3249 : : }
3250 : :
3251 : 4 : Cvc5Term cvc5_mk_skolem(Cvc5TermManager* tm,
3252 : : Cvc5SkolemId id,
3253 : : size_t size,
3254 : : const Cvc5Term indices[])
3255 : : {
3256 : 4 : Cvc5Term res = nullptr;
3257 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
3258 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3259 [ + - ][ + - ]: 3 : CVC5_CAPI_CHECK_SKOLEM_ID(id);
[ - + ][ - + ]
[ - - ]
3260 : 3 : std::vector<cvc5::Term> cindices;
3261 [ + + ]: 3 : if (indices)
3262 : : {
3263 [ + + ]: 6 : for (size_t i = 0; i < size; ++i)
3264 : : {
3265 [ - + ][ - + ]: 4 : CVC5_CAPI_CHECK_TERM_AT_IDX(indices, i);
[ - - ]
3266 : 4 : cindices.push_back(indices[i]->d_term);
3267 : : }
3268 : : }
3269 : 2 : res = tm->export_term(
3270 : 5 : tm->d_tm.mkSkolem(static_cast<cvc5::SkolemId>(id), cindices));
3271 [ + - ][ - + ]: 5 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3272 : 4 : return res;
3273 : : }
3274 : :
3275 : 2 : size_t cvc5_get_num_idxs_for_skolem_id(Cvc5TermManager* tm, Cvc5SkolemId id)
3276 : : {
3277 : 2 : size_t res = 0;
3278 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
3279 : 2 : CVC5_CAPI_CHECK_NOT_NULL(tm);
3280 [ + - ][ + - ]: 1 : CVC5_CAPI_CHECK_SKOLEM_ID(id);
[ - + ][ - + ]
[ - - ]
3281 : 1 : res = tm->d_tm.getNumIndicesForSkolemId(static_cast<cvc5::SkolemId>(id));
3282 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3283 : 2 : return res;
3284 : : }
3285 : :
3286 : : /* Create Operators ---------------------------------------------------- */
3287 : :
3288 : 101 : Cvc5Op cvc5_mk_op(Cvc5TermManager* tm,
3289 : : Cvc5Kind kind,
3290 : : size_t size,
3291 : : const uint32_t idxs[])
3292 : : {
3293 : 101 : Cvc5Op res = nullptr;
3294 : 101 : CVC5_CAPI_TRY_CATCH_BEGIN;
3295 [ + + ][ + + ]: 101 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3296 [ + - ][ + - ]: 97 : CVC5_CAPI_CHECK_KIND(kind);
[ - + ][ - + ]
[ - - ]
3297 [ + + ][ + + ]: 97 : CVC5_API_CHECK(idxs || size == 0) << "unexpected NULL argument for 'idxs'";
[ + + ][ + + ]
[ - - ]
3298 : 95 : std::vector<uint32_t> cidxs;
3299 [ + + ]: 234 : for (size_t i = 0; i < size; ++i)
3300 : : {
3301 : 139 : cidxs.push_back(idxs[i]);
3302 : : }
3303 : 95 : res = tm->export_op(tm->d_tm.mkOp(static_cast<cvc5::Kind>(kind), cidxs));
3304 [ + - ][ - + ]: 104 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3305 : 101 : return res;
3306 : : }
3307 : :
3308 : 4 : Cvc5Op cvc5_mk_op_from_str(Cvc5TermManager* tm, Cvc5Kind kind, const char* arg)
3309 : : {
3310 : 4 : Cvc5Op res = nullptr;
3311 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
3312 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3313 [ + - ][ + - ]: 3 : CVC5_CAPI_CHECK_KIND(kind);
[ - + ][ - + ]
[ - - ]
3314 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(arg);
[ - - ]
3315 : 4 : res = tm->export_op(tm->d_tm.mkOp(static_cast<cvc5::Kind>(kind), arg));
3316 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3317 : 4 : return res;
3318 : : }
3319 : :
3320 : : /* Create Constants ---------------------------------------------------- */
3321 : :
3322 : 68 : Cvc5Term cvc5_mk_true(Cvc5TermManager* tm)
3323 : : {
3324 : 68 : Cvc5Term res = nullptr;
3325 : 68 : CVC5_CAPI_TRY_CATCH_BEGIN;
3326 [ + + ][ + + ]: 68 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3327 : 67 : res = tm->export_term(tm->d_tm.mkTrue());
3328 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3329 : 68 : return res;
3330 : : }
3331 : :
3332 : 44 : Cvc5Term cvc5_mk_false(Cvc5TermManager* tm)
3333 : : {
3334 : 44 : Cvc5Term res = nullptr;
3335 : 44 : CVC5_CAPI_TRY_CATCH_BEGIN;
3336 [ - + ][ - + ]: 44 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3337 : 44 : res = tm->export_term(tm->d_tm.mkFalse());
3338 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3339 : 44 : return res;
3340 : : }
3341 : :
3342 : 5 : Cvc5Term cvc5_mk_boolean(Cvc5TermManager* tm, bool val)
3343 : : {
3344 : 5 : Cvc5Term res = nullptr;
3345 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
3346 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3347 : 4 : res = tm->export_term(tm->d_tm.mkBoolean(val));
3348 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3349 : 5 : return res;
3350 : : }
3351 : :
3352 : 2 : Cvc5Term cvc5_mk_pi(Cvc5TermManager* tm)
3353 : : {
3354 : 2 : Cvc5Term res = nullptr;
3355 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
3356 : 2 : CVC5_CAPI_CHECK_NOT_NULL(tm);
3357 : 1 : res = tm->export_term(tm->d_tm.mkPi());
3358 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3359 : 2 : return res;
3360 : : }
3361 : :
3362 : 47 : Cvc5Term cvc5_mk_integer(Cvc5TermManager* tm, const char* s)
3363 : : {
3364 : 47 : Cvc5Term res = nullptr;
3365 : 47 : CVC5_CAPI_TRY_CATCH_BEGIN;
3366 [ + + ][ + + ]: 47 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3367 [ + + ][ + + ]: 45 : CVC5_CAPI_CHECK_NOT_NULL(s);
[ - - ]
3368 : 85 : res = tm->export_term(tm->d_tm.mkInteger(s));
3369 [ + - ][ - + ]: 25 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3370 : 47 : return res;
3371 : : }
3372 : :
3373 : 125 : Cvc5Term cvc5_mk_integer_int64(Cvc5TermManager* tm, int64_t val)
3374 : : {
3375 : 125 : Cvc5Term res = nullptr;
3376 : 125 : CVC5_CAPI_TRY_CATCH_BEGIN;
3377 [ - + ][ - + ]: 125 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3378 : 125 : res = tm->export_term(tm->d_tm.mkInteger(val));
3379 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3380 : 125 : return res;
3381 : : }
3382 : :
3383 : 37 : Cvc5Term cvc5_mk_real(Cvc5TermManager* tm, const char* s)
3384 : : {
3385 : 37 : Cvc5Term res = nullptr;
3386 : 37 : CVC5_CAPI_TRY_CATCH_BEGIN;
3387 [ + + ][ + + ]: 37 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3388 [ + + ][ + + ]: 35 : CVC5_CAPI_CHECK_NOT_NULL(s);
[ - - ]
3389 : 49 : res = tm->export_term(tm->d_tm.mkReal(s));
3390 [ + - ][ - + ]: 12 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3391 : 37 : return res;
3392 : : }
3393 : :
3394 : 13 : Cvc5Term cvc5_mk_real_int64(Cvc5TermManager* tm, int64_t val)
3395 : : {
3396 : 13 : Cvc5Term res = nullptr;
3397 : 13 : CVC5_CAPI_TRY_CATCH_BEGIN;
3398 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3399 : 12 : res = tm->export_term(tm->d_tm.mkReal(val));
3400 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3401 : 13 : return res;
3402 : : }
3403 : :
3404 : 9 : Cvc5Term cvc5_mk_real_num_den(Cvc5TermManager* tm, int64_t num, int64_t den)
3405 : : {
3406 : 9 : Cvc5Term res = nullptr;
3407 : 9 : CVC5_CAPI_TRY_CATCH_BEGIN;
3408 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3409 : 8 : res = tm->export_term(tm->d_tm.mkReal(num, den));
3410 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3411 : 9 : return res;
3412 : : }
3413 : :
3414 : 2 : Cvc5Term cvc5_mk_regexp_all(Cvc5TermManager* tm)
3415 : : {
3416 : 2 : Cvc5Term res = nullptr;
3417 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
3418 : 2 : CVC5_CAPI_CHECK_NOT_NULL(tm);
3419 : 1 : res = tm->export_term(tm->d_tm.mkRegexpAll());
3420 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3421 : 2 : return res;
3422 : : }
3423 : :
3424 : 2 : Cvc5Term cvc5_mk_regexp_allchar(Cvc5TermManager* tm)
3425 : : {
3426 : 2 : Cvc5Term res = nullptr;
3427 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
3428 : 2 : CVC5_CAPI_CHECK_NOT_NULL(tm);
3429 : 1 : res = tm->export_term(tm->d_tm.mkRegexpAllchar());
3430 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3431 : 2 : return res;
3432 : : }
3433 : :
3434 : 2 : Cvc5Term cvc5_mk_regexp_none(Cvc5TermManager* tm)
3435 : : {
3436 : 2 : Cvc5Term res = nullptr;
3437 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
3438 : 2 : CVC5_CAPI_CHECK_NOT_NULL(tm);
3439 : 1 : res = tm->export_term(tm->d_tm.mkRegexpNone());
3440 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3441 : 2 : return res;
3442 : : }
3443 : :
3444 : 6 : Cvc5Term cvc5_mk_empty_set(Cvc5TermManager* tm, Cvc5Sort sort)
3445 : : {
3446 : 6 : Cvc5Term res = nullptr;
3447 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
3448 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3449 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
3450 : 4 : res = tm->export_term(tm->d_tm.mkEmptySet(sort->d_sort));
3451 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3452 : 6 : return res;
3453 : : }
3454 : :
3455 : 5 : Cvc5Term cvc5_mk_empty_bag(Cvc5TermManager* tm, Cvc5Sort sort)
3456 : : {
3457 : 5 : Cvc5Term res = nullptr;
3458 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
3459 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3460 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
3461 : 3 : res = tm->export_term(tm->d_tm.mkEmptyBag(sort->d_sort));
3462 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3463 : 5 : return res;
3464 : : }
3465 : :
3466 : 2 : Cvc5Term cvc5_mk_sep_emp(Cvc5TermManager* tm)
3467 : : {
3468 : 2 : Cvc5Term res = nullptr;
3469 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
3470 : 2 : CVC5_CAPI_CHECK_NOT_NULL(tm);
3471 : 1 : res = tm->export_term(tm->d_tm.mkSepEmp());
3472 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3473 : 2 : return res;
3474 : : }
3475 : :
3476 : 11 : Cvc5Term cvc5_mk_sep_nil(Cvc5TermManager* tm, Cvc5Sort sort)
3477 : : {
3478 : 11 : Cvc5Term res = nullptr;
3479 : 11 : CVC5_CAPI_TRY_CATCH_BEGIN;
3480 [ + + ][ + + ]: 11 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3481 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
3482 : 9 : res = tm->export_term(tm->d_tm.mkSepNil(sort->d_sort));
3483 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3484 : 11 : return res;
3485 : : }
3486 : :
3487 : 10 : Cvc5Term cvc5_mk_string(Cvc5TermManager* tm, const char* s, bool use_esc_seq)
3488 : : {
3489 : 10 : Cvc5Term res = nullptr;
3490 : 10 : CVC5_CAPI_TRY_CATCH_BEGIN;
3491 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3492 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_NOT_NULL(s);
[ - - ]
3493 : 8 : res = tm->export_term(tm->d_tm.mkString(s, use_esc_seq));
3494 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3495 : 10 : return res;
3496 : : }
3497 : :
3498 : 0 : Cvc5Term cvc5_mk_string_from_wchar(Cvc5TermManager* tm, const wchar_t* s)
3499 : : {
3500 : 0 : Cvc5Term res = nullptr;
3501 : 0 : CVC5_CAPI_TRY_CATCH_BEGIN;
3502 : 0 : CVC5_CAPI_CHECK_NOT_NULL(tm);
3503 : 0 : CVC5_CAPI_CHECK_NOT_NULL(s);
3504 : 0 : res = tm->export_term(tm->d_tm.mkString(s));
3505 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3506 : 0 : return res;
3507 : : }
3508 : :
3509 : 1 : Cvc5Term cvc5_mk_string_from_char32(Cvc5TermManager* tm, const char32_t* s)
3510 : : {
3511 : 1 : Cvc5Term res = nullptr;
3512 : 1 : CVC5_CAPI_TRY_CATCH_BEGIN;
3513 [ - + ][ - + ]: 1 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3514 [ - + ][ - + ]: 1 : CVC5_CAPI_CHECK_NOT_NULL(s);
[ - - ]
3515 : 1 : res = tm->export_term(tm->d_tm.mkString(s));
3516 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3517 : 1 : return res;
3518 : : }
3519 : :
3520 : 9 : Cvc5Term cvc5_mk_empty_sequence(Cvc5TermManager* tm, Cvc5Sort sort)
3521 : : {
3522 : 9 : Cvc5Term res = nullptr;
3523 : 9 : CVC5_CAPI_TRY_CATCH_BEGIN;
3524 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3525 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
3526 : 5 : res = tm->export_term(tm->d_tm.mkEmptySequence(sort->d_sort));
3527 [ + - ][ - + ]: 5 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3528 : 9 : return res;
3529 : : }
3530 : :
3531 : 4 : Cvc5Term cvc5_mk_universe_set(Cvc5TermManager* tm, Cvc5Sort sort)
3532 : : {
3533 : 4 : Cvc5Term res = nullptr;
3534 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
3535 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3536 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
3537 : 2 : res = tm->export_term(tm->d_tm.mkUniverseSet(sort->d_sort));
3538 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3539 : 4 : return res;
3540 : : }
3541 : :
3542 : 25 : Cvc5Term cvc5_mk_bv_uint64(Cvc5TermManager* tm, uint32_t size, uint64_t val)
3543 : : {
3544 : 25 : Cvc5Term res = nullptr;
3545 : 25 : CVC5_CAPI_TRY_CATCH_BEGIN;
3546 [ + + ][ + + ]: 25 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3547 : 23 : res = tm->export_term(tm->d_tm.mkBitVector(size, val));
3548 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3549 : 25 : return res;
3550 : : }
3551 : :
3552 : 47 : Cvc5Term cvc5_mk_bv(Cvc5TermManager* tm,
3553 : : uint32_t size,
3554 : : const char* s,
3555 : : uint32_t base)
3556 : : {
3557 : 47 : Cvc5Term res = nullptr;
3558 : 47 : CVC5_CAPI_TRY_CATCH_BEGIN;
3559 [ + + ][ + + ]: 47 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3560 [ - + ][ - + ]: 46 : CVC5_CAPI_CHECK_NOT_NULL(s);
[ - - ]
3561 : 78 : res = tm->export_term(tm->d_tm.mkBitVector(size, s, base));
3562 [ + - ][ - + ]: 17 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3563 : 47 : return res;
3564 : : }
3565 : :
3566 : 32 : Cvc5Term cvc5_mk_ff_elem(Cvc5TermManager* tm,
3567 : : const char* value,
3568 : : Cvc5Sort sort,
3569 : : uint32_t base)
3570 : : {
3571 : 32 : Cvc5Term res = nullptr;
3572 : 32 : CVC5_CAPI_TRY_CATCH_BEGIN;
3573 [ + + ][ + + ]: 32 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3574 [ - + ][ - + ]: 31 : CVC5_CAPI_CHECK_NOT_NULL(value);
[ - - ]
3575 [ - + ][ - + ]: 31 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
3576 : 35 : res = tm->export_term(tm->d_tm.mkFiniteFieldElem(value, sort->d_sort, base));
3577 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3578 : 32 : return res;
3579 : : }
3580 : :
3581 : 18 : Cvc5Term cvc5_mk_const_array(Cvc5TermManager* tm, Cvc5Sort sort, Cvc5Term val)
3582 : : {
3583 : 18 : Cvc5Term res = nullptr;
3584 : 18 : CVC5_CAPI_TRY_CATCH_BEGIN;
3585 [ + + ][ + + ]: 18 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3586 [ + + ][ + + ]: 16 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
3587 [ + + ][ + + ]: 14 : CVC5_CAPI_CHECK_TERM(val);
[ - - ]
3588 : 12 : res = tm->export_term(tm->d_tm.mkConstArray(sort->d_sort, val->d_term));
3589 [ + - ][ - + ]: 12 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3590 : 18 : return res;
3591 : : }
3592 : :
3593 : 3 : Cvc5Term cvc5_mk_fp_pos_inf(Cvc5TermManager* tm, uint32_t exp, uint32_t sig)
3594 : : {
3595 : 3 : Cvc5Term res = nullptr;
3596 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
3597 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3598 : 2 : res = tm->export_term(tm->d_tm.mkFloatingPointPosInf(exp, sig));
3599 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3600 : 3 : return res;
3601 : : }
3602 : :
3603 : 3 : Cvc5Term cvc5_mk_fp_neg_inf(Cvc5TermManager* tm, uint32_t exp, uint32_t sig)
3604 : : {
3605 : 3 : Cvc5Term res = nullptr;
3606 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
3607 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3608 : 2 : res = tm->export_term(tm->d_tm.mkFloatingPointNegInf(exp, sig));
3609 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3610 : 3 : return res;
3611 : : }
3612 : :
3613 : 3 : Cvc5Term cvc5_mk_fp_nan(Cvc5TermManager* tm, uint32_t exp, uint32_t sig)
3614 : : {
3615 : 3 : Cvc5Term res = nullptr;
3616 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
3617 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3618 : 2 : res = tm->export_term(tm->d_tm.mkFloatingPointNaN(exp, sig));
3619 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3620 : 3 : return res;
3621 : : }
3622 : :
3623 : 3 : Cvc5Term cvc5_mk_fp_pos_zero(Cvc5TermManager* tm, uint32_t exp, uint32_t sig)
3624 : : {
3625 : 3 : Cvc5Term res = nullptr;
3626 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
3627 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3628 : 2 : res = tm->export_term(tm->d_tm.mkFloatingPointPosZero(exp, sig));
3629 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3630 : 3 : return res;
3631 : : }
3632 : :
3633 : 3 : Cvc5Term cvc5_mk_fp_neg_zero(Cvc5TermManager* tm, uint32_t exp, uint32_t sig)
3634 : : {
3635 : 3 : Cvc5Term res = nullptr;
3636 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
3637 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3638 : 2 : res = tm->export_term(tm->d_tm.mkFloatingPointNegZero(exp, sig));
3639 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3640 : 3 : return res;
3641 : : }
3642 : :
3643 : 12 : Cvc5Term cvc5_mk_rm(Cvc5TermManager* tm, Cvc5RoundingMode rm)
3644 : : {
3645 : 12 : Cvc5Term res = nullptr;
3646 : 12 : CVC5_CAPI_TRY_CATCH_BEGIN;
3647 [ + + ][ + + ]: 12 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3648 : 11 : res = tm->export_term(
3649 : 22 : tm->d_tm.mkRoundingMode(static_cast<cvc5::RoundingMode>(rm)));
3650 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3651 : 12 : return res;
3652 : : }
3653 : :
3654 : 11 : Cvc5Term cvc5_mk_fp(Cvc5TermManager* tm,
3655 : : uint32_t exp,
3656 : : uint32_t sig,
3657 : : Cvc5Term val)
3658 : : {
3659 : 11 : Cvc5Term res = nullptr;
3660 : 11 : CVC5_CAPI_TRY_CATCH_BEGIN;
3661 [ + + ][ + + ]: 11 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3662 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_TERM(val);
[ - - ]
3663 : 9 : res = tm->export_term(tm->d_tm.mkFloatingPoint(exp, sig, val->d_term));
3664 [ + - ][ - + ]: 8 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3665 : 11 : return res;
3666 : : }
3667 : :
3668 : 12 : Cvc5Term cvc5_mk_fp_from_ieee(Cvc5TermManager* tm,
3669 : : Cvc5Term sign,
3670 : : Cvc5Term exp,
3671 : : Cvc5Term sig)
3672 : : {
3673 : 12 : Cvc5Term res = nullptr;
3674 : 12 : CVC5_CAPI_TRY_CATCH_BEGIN;
3675 [ + + ][ + + ]: 12 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3676 [ + + ][ + + ]: 11 : CVC5_CAPI_CHECK_TERM(sign);
[ - - ]
3677 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_TERM(exp);
[ - - ]
3678 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_TERM(sig);
[ - - ]
3679 : 1 : res = tm->export_term(
3680 : 9 : tm->d_tm.mkFloatingPoint(sign->d_term, exp->d_term, sig->d_term));
3681 [ + - ][ - + ]: 11 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3682 : 12 : return res;
3683 : : }
3684 : :
3685 : 9 : Cvc5Term cvc5_mk_cardinality_constraint(Cvc5TermManager* tm,
3686 : : Cvc5Sort sort,
3687 : : uint32_t upperBound)
3688 : : {
3689 : 9 : Cvc5Term res = nullptr;
3690 : 9 : CVC5_CAPI_TRY_CATCH_BEGIN;
3691 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3692 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
3693 : 2 : res = tm->export_term(
3694 : 7 : tm->d_tm.mkCardinalityConstraint(sort->d_sort, upperBound));
3695 [ + - ][ - + ]: 7 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3696 : 9 : return res;
3697 : : }
3698 : :
3699 : : /* Create Variables ----------------------------------------------------- */
3700 : :
3701 : 219 : Cvc5Term cvc5_mk_const(Cvc5TermManager* tm, Cvc5Sort sort, const char* symbol)
3702 : : {
3703 : 219 : Cvc5Term res = nullptr;
3704 : 219 : CVC5_CAPI_TRY_CATCH_BEGIN;
3705 [ + + ][ + + ]: 219 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3706 [ + + ][ + + ]: 218 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
3707 [ + + ]: 217 : if (symbol)
3708 : : {
3709 : 214 : res = tm->export_term(tm->d_tm.mkConst(sort->d_sort, symbol));
3710 : : }
3711 : : else
3712 : : {
3713 : 4 : res = tm->export_term(tm->d_tm.mkConst(sort->d_sort));
3714 : : }
3715 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3716 : 219 : return res;
3717 : : }
3718 : :
3719 : 87 : Cvc5Term cvc5_mk_var(Cvc5TermManager* tm, Cvc5Sort sort, const char* symbol)
3720 : : {
3721 : 87 : Cvc5Term res = nullptr;
3722 : 87 : CVC5_CAPI_TRY_CATCH_BEGIN;
3723 [ + + ][ + + ]: 87 : CVC5_CAPI_CHECK_NOT_NULL(tm);
[ - - ]
3724 [ + + ][ + + ]: 86 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
3725 [ + + ]: 85 : if (symbol)
3726 : : {
3727 : 84 : res = tm->export_term(tm->d_tm.mkVar(sort->d_sort, symbol));
3728 : : }
3729 : : else
3730 : : {
3731 : 2 : res = tm->export_term(tm->d_tm.mkVar(sort->d_sort));
3732 : : }
3733 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3734 : 87 : return res;
3735 : : }
3736 : :
3737 : : /* -------------------------------------------------------------------------- */
3738 : : /* Cvc5Result */
3739 : : /* -------------------------------------------------------------------------- */
3740 : :
3741 : 2 : Cvc5Result cvc5_result_copy(Cvc5Result result)
3742 : : {
3743 : 2 : Cvc5Result res = nullptr;
3744 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
3745 : 2 : CVC5_CAPI_CHECK_RESULT(result);
3746 : 1 : res = result->d_cvc5->copy(result);
3747 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3748 : 2 : return res;
3749 : : }
3750 : :
3751 : 4 : void cvc5_result_release(Cvc5Result result)
3752 : : {
3753 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
3754 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_RESULT(result);
[ - - ]
3755 : 3 : result->d_cvc5->release(result);
3756 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3757 : 4 : }
3758 : :
3759 : 2 : bool cvc5_result_is_null(const Cvc5Result result)
3760 : : {
3761 : 2 : bool res = false;
3762 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
3763 : 2 : CVC5_CAPI_CHECK_RESULT(result);
3764 : 1 : res = result->d_result.isNull();
3765 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3766 : 2 : return res;
3767 : : }
3768 : :
3769 : 16 : bool cvc5_result_is_sat(const Cvc5Result result)
3770 : : {
3771 : 16 : bool res = false;
3772 : 16 : CVC5_CAPI_TRY_CATCH_BEGIN;
3773 [ + + ][ + + ]: 16 : CVC5_CAPI_CHECK_RESULT(result);
[ - - ]
3774 : 15 : res = result->d_result.isSat();
3775 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3776 : 16 : return res;
3777 : : }
3778 : :
3779 : 31 : bool cvc5_result_is_unsat(const Cvc5Result result)
3780 : : {
3781 : 31 : bool res = false;
3782 : 31 : CVC5_CAPI_TRY_CATCH_BEGIN;
3783 [ + + ][ + + ]: 31 : CVC5_CAPI_CHECK_RESULT(result);
[ - - ]
3784 : 30 : res = result->d_result.isUnsat();
3785 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3786 : 31 : return res;
3787 : : }
3788 : :
3789 : 5 : bool cvc5_result_is_unknown(const Cvc5Result result)
3790 : : {
3791 : 5 : bool res = false;
3792 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
3793 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_RESULT(result);
[ - - ]
3794 : 4 : res = result->d_result.isUnknown();
3795 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3796 : 5 : return res;
3797 : : }
3798 : :
3799 : 4 : bool cvc5_result_is_equal(const Cvc5Result a, const Cvc5Result b)
3800 : : {
3801 : 4 : bool res = false;
3802 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
3803 [ + + ][ + + ]: 4 : if (a == nullptr || b == nullptr)
3804 : : {
3805 : 2 : res = a == b;
3806 : : }
3807 : : else
3808 : : {
3809 : 2 : res = a->d_result == b->d_result;
3810 : : }
3811 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3812 : 4 : return res;
3813 : : }
3814 : :
3815 : 4 : bool cvc5_result_is_disequal(const Cvc5Result a, const Cvc5Result b)
3816 : : {
3817 : 4 : bool res = false;
3818 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
3819 [ + + ][ + + ]: 4 : if (a == nullptr || b == nullptr)
3820 : : {
3821 : 2 : res = a != b;
3822 : : }
3823 : : else
3824 : : {
3825 : 2 : res = a->d_result != b->d_result;
3826 : : }
3827 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3828 : 4 : return res;
3829 : : }
3830 : :
3831 : 1 : Cvc5UnknownExplanation cvc5_result_get_unknown_explanation(
3832 : : const Cvc5Result result)
3833 : : {
3834 : 1 : Cvc5UnknownExplanation res = CVC5_UNKNOWN_EXPLANATION_LAST;
3835 : 1 : CVC5_CAPI_TRY_CATCH_BEGIN;
3836 [ - + ][ - + ]: 1 : CVC5_CAPI_CHECK_RESULT(result);
[ - - ]
3837 : 1 : res = static_cast<Cvc5UnknownExplanation>(
3838 : 1 : result->d_result.getUnknownExplanation());
3839 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3840 : 1 : return res;
3841 : : }
3842 : :
3843 : 4 : const char* cvc5_result_to_string(const Cvc5Result result)
3844 : : {
3845 [ + + ]: 4 : static thread_local std::string str;
3846 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
3847 [ - + ][ - + ]: 4 : CVC5_CAPI_CHECK_RESULT(result);
[ - - ]
3848 : 4 : str = result->d_result.toString();
3849 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3850 : 4 : return str.c_str();
3851 : : }
3852 : :
3853 : 9 : size_t cvc5_result_hash(Cvc5Result result)
3854 : : {
3855 : 9 : size_t res = 0;
3856 : 9 : CVC5_CAPI_TRY_CATCH_BEGIN;
3857 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_RESULT(result);
[ - - ]
3858 : 8 : res = std::hash<cvc5::Result>{}(result->d_result);
3859 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3860 : 9 : return res;
3861 : : }
3862 : :
3863 : : /* -------------------------------------------------------------------------- */
3864 : : /* Cvc5SynthResult */
3865 : : /* -------------------------------------------------------------------------- */
3866 : :
3867 : 2 : Cvc5SynthResult cvc5_synth_result_copy(Cvc5SynthResult result)
3868 : : {
3869 : 2 : Cvc5SynthResult res = nullptr;
3870 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
3871 : 2 : CVC5_CAPI_CHECK_SYNTH_RESULT(result);
3872 : 1 : res = result->d_cvc5->copy(result);
3873 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3874 : 2 : return res;
3875 : : }
3876 : :
3877 : 3 : void cvc5_synth_result_release(Cvc5SynthResult result)
3878 : : {
3879 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
3880 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SYNTH_RESULT(result);
[ - - ]
3881 : 2 : result->d_cvc5->release(result);
3882 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3883 : 3 : }
3884 : :
3885 : 3 : bool cvc5_synth_result_is_null(const Cvc5SynthResult result)
3886 : : {
3887 : 3 : bool res = false;
3888 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
3889 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SYNTH_RESULT(result);
[ - - ]
3890 : 2 : res = result->d_result.isNull();
3891 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3892 : 3 : return res;
3893 : : }
3894 : :
3895 : 6 : bool cvc5_synth_result_has_solution(const Cvc5SynthResult result)
3896 : : {
3897 : 6 : bool res = false;
3898 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
3899 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_SYNTH_RESULT(result);
[ - - ]
3900 : 5 : res = result->d_result.hasSolution();
3901 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3902 : 6 : return res;
3903 : : }
3904 : :
3905 : 3 : bool cvc5_synth_result_has_no_solution(const Cvc5SynthResult result)
3906 : : {
3907 : 3 : bool res = false;
3908 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
3909 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SYNTH_RESULT(result);
[ - - ]
3910 : 2 : res = result->d_result.hasNoSolution();
3911 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3912 : 3 : return res;
3913 : : }
3914 : :
3915 : 3 : bool cvc5_synth_result_is_unknown(const Cvc5SynthResult result)
3916 : : {
3917 : 3 : bool res = false;
3918 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
3919 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_SYNTH_RESULT(result);
[ - - ]
3920 : 2 : res = result->d_result.isUnknown();
3921 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3922 : 3 : return res;
3923 : : }
3924 : :
3925 : 4 : bool cvc5_synth_result_is_equal(const Cvc5SynthResult a,
3926 : : const Cvc5SynthResult b)
3927 : : {
3928 : 4 : bool res = false;
3929 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
3930 [ + + ][ + + ]: 4 : if (a == nullptr || b == nullptr)
3931 : : {
3932 : 2 : res = a == b;
3933 : : }
3934 : : else
3935 : : {
3936 : 2 : res = a->d_result == b->d_result;
3937 : : }
3938 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3939 : 4 : return res;
3940 : : }
3941 : :
3942 : 4 : bool cvc5_synth_result_is_disequal(const Cvc5SynthResult a,
3943 : : const Cvc5SynthResult b)
3944 : : {
3945 : 4 : bool res = false;
3946 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
3947 [ + + ][ + + ]: 4 : if (a == nullptr || b == nullptr)
3948 : : {
3949 : 2 : res = a != b;
3950 : : }
3951 : : else
3952 : : {
3953 : 2 : res = a->d_result != b->d_result;
3954 : : }
3955 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3956 : 4 : return res;
3957 : : }
3958 : :
3959 : 1 : const char* cvc5_synth_result_to_string(const Cvc5SynthResult result)
3960 : : {
3961 [ + - ]: 1 : static thread_local std::string str;
3962 : 1 : CVC5_CAPI_TRY_CATCH_BEGIN;
3963 [ - + ][ - + ]: 1 : CVC5_CAPI_CHECK_SYNTH_RESULT(result);
[ - - ]
3964 : 1 : str = result->d_result.toString();
3965 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3966 : 1 : return str.c_str();
3967 : : }
3968 : :
3969 : 9 : size_t cvc5_synth_result_hash(Cvc5SynthResult result)
3970 : : {
3971 : 9 : size_t res = 0;
3972 : 9 : CVC5_CAPI_TRY_CATCH_BEGIN;
3973 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_SYNTH_RESULT(result);
[ - - ]
3974 : 8 : res = std::hash<cvc5::SynthResult>{}(result->d_result);
3975 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3976 : 9 : return res;
3977 : : }
3978 : :
3979 : : /* -------------------------------------------------------------------------- */
3980 : : /* Cvc5Proof */
3981 : : /* -------------------------------------------------------------------------- */
3982 : :
3983 : 16 : Cvc5ProofRule cvc5_proof_get_rule(Cvc5Proof proof)
3984 : : {
3985 : 16 : Cvc5ProofRule res = CVC5_PROOF_RULE_LAST;
3986 : 16 : CVC5_CAPI_TRY_CATCH_BEGIN;
3987 [ + + ][ + + ]: 16 : CVC5_CAPI_CHECK_PROOF(proof);
[ - - ]
3988 : 15 : res = static_cast<Cvc5ProofRule>(proof->d_proof.getRule());
3989 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
3990 : 16 : return res;
3991 : : }
3992 : :
3993 : 3 : Cvc5ProofRewriteRule cvc5_proof_get_rewrite_rule(Cvc5Proof proof)
3994 : : {
3995 : 3 : Cvc5ProofRewriteRule res = CVC5_PROOF_REWRITE_RULE_LAST;
3996 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
3997 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_PROOF(proof);
[ - - ]
3998 : 2 : res = static_cast<Cvc5ProofRewriteRule>(proof->d_proof.getRewriteRule());
3999 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4000 : 3 : return res;
4001 : : }
4002 : :
4003 : 2 : Cvc5Term cvc5_proof_get_result(Cvc5Proof proof)
4004 : : {
4005 : 2 : Cvc5Term res = nullptr;
4006 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
4007 : 2 : CVC5_CAPI_CHECK_PROOF(proof);
4008 : 1 : res = proof->d_cvc5->d_tm->export_term(proof->d_proof.getResult());
4009 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4010 : 2 : return res;
4011 : : }
4012 : :
4013 : 14 : const Cvc5Proof* cvc5_proof_get_children(Cvc5Proof proof, size_t* size)
4014 : : {
4015 [ + + ]: 14 : static thread_local std::vector<Cvc5Proof> res;
4016 : 14 : CVC5_CAPI_TRY_CATCH_BEGIN;
4017 [ + + ][ + + ]: 14 : CVC5_CAPI_CHECK_PROOF(proof);
[ - - ]
4018 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
4019 : 12 : res.clear();
4020 : 12 : auto children = proof->d_proof.getChildren();
4021 [ + + ]: 26 : for (auto& p : children)
4022 : : {
4023 : 14 : res.push_back(proof->d_cvc5->export_proof(p));
4024 : : }
4025 : 12 : *size = res.size();
4026 [ + - ][ - + ]: 14 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4027 : 14 : return res.data();
4028 : : }
4029 : :
4030 : 3 : const Cvc5Term* cvc5_proof_get_arguments(Cvc5Proof proof, size_t* size)
4031 : : {
4032 [ + + ]: 3 : static thread_local std::vector<Cvc5Term> res;
4033 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
4034 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_PROOF(proof);
[ - - ]
4035 : 2 : CVC5_CAPI_CHECK_NOT_NULL(size);
4036 : 1 : res.clear();
4037 : 1 : auto args = proof->d_proof.getArguments();
4038 [ - + ]: 1 : for (auto& t : args)
4039 : : {
4040 : 0 : res.push_back(proof->d_cvc5->d_tm->export_term(t));
4041 : : }
4042 : 1 : *size = res.size();
4043 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4044 : 3 : return res.data();
4045 : : }
4046 : :
4047 : 6 : bool cvc5_proof_is_equal(Cvc5Proof a, Cvc5Proof b)
4048 : : {
4049 : 6 : bool res = false;
4050 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
4051 [ + + ][ + + ]: 6 : if (a == nullptr || b == nullptr)
4052 : : {
4053 : 3 : res = a == b;
4054 : : }
4055 : : else
4056 : : {
4057 : 3 : res = a->d_proof == b->d_proof;
4058 : : }
4059 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4060 : 6 : return res;
4061 : : }
4062 : :
4063 : 4 : bool cvc5_proof_is_disequal(Cvc5Proof a, Cvc5Proof b)
4064 : : {
4065 : 4 : bool res = false;
4066 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
4067 [ + + ][ + + ]: 4 : if (a == nullptr || b == nullptr)
4068 : : {
4069 : 2 : res = a != b;
4070 : : }
4071 : : else
4072 : : {
4073 : 2 : res = a->d_proof != b->d_proof;
4074 : : }
4075 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4076 : 4 : return res;
4077 : : }
4078 : :
4079 : 5 : size_t cvc5_proof_hash(Cvc5Proof proof)
4080 : : {
4081 : 5 : size_t res = 0;
4082 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
4083 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_PROOF(proof);
[ - - ]
4084 : 4 : res = std::hash<cvc5::Proof>{}(proof->d_proof);
4085 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4086 : 5 : return res;
4087 : : }
4088 : :
4089 : 2 : Cvc5Proof cvc5_proof_copy(Cvc5Proof proof)
4090 : : {
4091 : 2 : Cvc5Proof res = nullptr;
4092 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
4093 : 2 : CVC5_CAPI_CHECK_PROOF(proof);
4094 : 1 : res = proof->d_cvc5->copy(proof);
4095 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4096 : 2 : return res;
4097 : : }
4098 : :
4099 : 3 : void cvc5_proof_release(Cvc5Proof proof)
4100 : : {
4101 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
4102 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_PROOF(proof);
[ - - ]
4103 : 2 : proof->d_cvc5->release(proof);
4104 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4105 : 3 : }
4106 : :
4107 : : /* -------------------------------------------------------------------------- */
4108 : : /* Cvc5Grammar */
4109 : : /* -------------------------------------------------------------------------- */
4110 : :
4111 : 18 : void cvc5_grammar_add_rule(Cvc5Grammar grammar, Cvc5Term symbol, Cvc5Term rule)
4112 : : {
4113 : 18 : CVC5_CAPI_TRY_CATCH_BEGIN;
4114 [ + + ][ + + ]: 18 : CVC5_CAPI_CHECK_GRAMMAR(grammar);
[ - - ]
4115 [ + + ][ + + ]: 17 : CVC5_CAPI_CHECK_TERM(symbol);
[ - - ]
4116 [ + + ][ + + ]: 16 : CVC5_CAPI_CHECK_TERM(rule);
[ - - ]
4117 : 15 : grammar->d_grammar.addRule(symbol->d_term, rule->d_term);
4118 [ + - ][ - + ]: 6 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4119 : 18 : }
4120 : :
4121 : 14 : void cvc5_grammar_add_rules(Cvc5Grammar grammar,
4122 : : Cvc5Term symbol,
4123 : : size_t size,
4124 : : const Cvc5Term rules[])
4125 : : {
4126 : 14 : CVC5_CAPI_TRY_CATCH_BEGIN;
4127 [ + + ][ + + ]: 14 : CVC5_CAPI_CHECK_GRAMMAR(grammar);
[ - - ]
4128 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_TERM(symbol);
[ - - ]
4129 [ + + ][ + + ]: 12 : CVC5_CAPI_CHECK_NOT_NULL(rules);
[ - - ]
4130 : 11 : std::vector<cvc5::Term> crules;
4131 [ + + ]: 22 : for (size_t i = 0; i < size; ++i)
4132 : : {
4133 [ + + ][ + + ]: 12 : CVC5_CAPI_CHECK_TERM_AT_IDX(rules, i);
[ - - ]
4134 : 11 : crules.push_back(rules[i]->d_term);
4135 : : }
4136 : 10 : grammar->d_grammar.addRules(symbol->d_term, crules);
4137 [ + - ][ - + ]: 19 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4138 : 14 : }
4139 : :
4140 : 6 : void cvc5_grammar_add_any_constant(Cvc5Grammar grammar, Cvc5Term symbol)
4141 : : {
4142 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
4143 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_GRAMMAR(grammar);
[ - - ]
4144 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_TERM(symbol);
[ - - ]
4145 : 4 : grammar->d_grammar.addAnyConstant(symbol->d_term);
4146 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4147 : 6 : }
4148 : :
4149 : 8 : void cvc5_grammar_add_any_variable(Cvc5Grammar grammar, Cvc5Term symbol)
4150 : : {
4151 : 8 : CVC5_CAPI_TRY_CATCH_BEGIN;
4152 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_GRAMMAR(grammar);
[ - - ]
4153 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_TERM(symbol);
[ - - ]
4154 : 6 : grammar->d_grammar.addAnyVariable(symbol->d_term);
4155 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4156 : 8 : }
4157 : :
4158 : 3 : const char* cvc5_grammar_to_string(const Cvc5Grammar grammar)
4159 : : {
4160 [ + + ]: 3 : static thread_local std::string str;
4161 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
4162 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_GRAMMAR(grammar);
[ - - ]
4163 : 2 : str = grammar->d_grammar.toString();
4164 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4165 : 3 : return str.c_str();
4166 : : }
4167 : :
4168 : 14 : bool cvc5_grammar_is_equal(Cvc5Grammar a, Cvc5Grammar b)
4169 : : {
4170 : 14 : bool res = false;
4171 : 14 : CVC5_CAPI_TRY_CATCH_BEGIN;
4172 [ + - ][ - + ]: 14 : if (a == nullptr || b == nullptr)
4173 : : {
4174 : 0 : res = a == b;
4175 : : }
4176 : : else
4177 : : {
4178 : 14 : res = a->d_grammar == b->d_grammar;
4179 : : }
4180 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4181 : 14 : return res;
4182 : : }
4183 : :
4184 : 7 : bool cvc5_grammar_is_disequal(Cvc5Grammar a, Cvc5Grammar b)
4185 : : {
4186 : 7 : bool res = false;
4187 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
4188 [ + - ][ - + ]: 7 : if (a == nullptr || b == nullptr)
4189 : : {
4190 : 0 : res = a != b;
4191 : : }
4192 : : else
4193 : : {
4194 : 7 : res = a->d_grammar != b->d_grammar;
4195 : : }
4196 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4197 : 7 : return res;
4198 : : }
4199 : :
4200 : 21 : size_t cvc5_grammar_hash(Cvc5Grammar grammar)
4201 : : {
4202 : 21 : size_t res = 0;
4203 : 21 : CVC5_CAPI_TRY_CATCH_BEGIN;
4204 [ + + ][ + + ]: 21 : CVC5_CAPI_CHECK_GRAMMAR(grammar);
[ - - ]
4205 : 20 : res = std::hash<cvc5::Grammar>{}(grammar->d_grammar);
4206 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4207 : 21 : return res;
4208 : : }
4209 : :
4210 : 2 : Cvc5Grammar cvc5_grammar_copy(Cvc5Grammar grammar)
4211 : : {
4212 : 2 : Cvc5Grammar res = nullptr;
4213 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
4214 : 2 : CVC5_CAPI_CHECK_GRAMMAR(grammar);
4215 : 1 : res = grammar->d_cvc5->copy(grammar);
4216 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4217 : 2 : return res;
4218 : : }
4219 : :
4220 : 3 : void cvc5_grammar_release(Cvc5Grammar grammar)
4221 : : {
4222 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
4223 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_GRAMMAR(grammar);
[ - - ]
4224 : 2 : grammar->d_cvc5->release(grammar);
4225 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4226 : 3 : }
4227 : :
4228 : : /* -------------------------------------------------------------------------- */
4229 : : /* Cvc5Stat */
4230 : : /* -------------------------------------------------------------------------- */
4231 : :
4232 : 6 : bool cvc5_stat_is_internal(Cvc5Stat stat)
4233 : : {
4234 : 6 : bool res = false;
4235 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
4236 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_STAT(stat);
[ - - ]
4237 : 5 : res = stat->d_stat.isInternal();
4238 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4239 : 6 : return res;
4240 : : }
4241 : :
4242 : 5 : bool cvc5_stat_is_default(Cvc5Stat stat)
4243 : : {
4244 : 5 : bool res = false;
4245 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
4246 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_STAT(stat);
[ - - ]
4247 : 4 : res = stat->d_stat.isDefault();
4248 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4249 : 5 : return res;
4250 : : }
4251 : :
4252 : 6 : bool cvc5_stat_is_int(Cvc5Stat stat)
4253 : : {
4254 : 6 : bool res = false;
4255 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
4256 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_STAT(stat);
[ - - ]
4257 : 5 : res = stat->d_stat.isInt();
4258 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4259 : 6 : return res;
4260 : : }
4261 : :
4262 : 4 : int64_t cvc5_stat_get_int(Cvc5Stat stat)
4263 : : {
4264 : 4 : int64_t res = 0;
4265 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
4266 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_STAT(stat);
[ - - ]
4267 : 3 : res = stat->d_stat.getInt();
4268 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4269 : 4 : return res;
4270 : : }
4271 : :
4272 : 5 : bool cvc5_stat_is_double(Cvc5Stat stat)
4273 : : {
4274 : 5 : bool res = false;
4275 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
4276 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_STAT(stat);
[ - - ]
4277 : 4 : res = stat->d_stat.isDouble();
4278 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4279 : 5 : return res;
4280 : : }
4281 : :
4282 : 3 : double cvc5_stat_get_double(Cvc5Stat stat)
4283 : : {
4284 : 3 : double res = 0.0;
4285 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
4286 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_STAT(stat);
[ - - ]
4287 : 2 : res = stat->d_stat.getDouble();
4288 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4289 : 3 : return res;
4290 : : }
4291 : :
4292 : 6 : bool cvc5_stat_is_string(Cvc5Stat stat)
4293 : : {
4294 : 6 : bool res = false;
4295 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
4296 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_STAT(stat);
[ - - ]
4297 : 5 : res = stat->d_stat.isString();
4298 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4299 : 6 : return res;
4300 : : }
4301 : :
4302 : 4 : const char* cvc5_stat_get_string(Cvc5Stat stat)
4303 : : {
4304 [ + + ]: 4 : static thread_local std::string str;
4305 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
4306 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_STAT(stat);
[ - - ]
4307 : 3 : str = stat->d_stat.getString();
4308 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4309 : 4 : return str.c_str();
4310 : : }
4311 : :
4312 : 5 : bool cvc5_stat_is_histogram(Cvc5Stat stat)
4313 : : {
4314 : 5 : bool res = false;
4315 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
4316 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_STAT(stat);
[ - - ]
4317 : 4 : res = stat->d_stat.isHistogram();
4318 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4319 : 5 : return res;
4320 : : }
4321 : :
4322 : 7 : void cvc5_stat_get_histogram(Cvc5Stat stat,
4323 : : const char** keys[],
4324 : : uint64_t* values[],
4325 : : size_t* size)
4326 : : {
4327 [ + + ]: 7 : static thread_local std::vector<const char*> rkeys;
4328 [ + + ]: 7 : static thread_local std::vector<uint64_t> rvalues;
4329 [ + + ]: 7 : static thread_local cvc5::Stat::HistogramData histo;
4330 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
4331 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_STAT(stat);
[ - - ]
4332 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_NOT_NULL(keys);
[ - - ]
4333 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_NOT_NULL(values);
[ - - ]
4334 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
4335 : 3 : rkeys.clear();
4336 : 3 : rvalues.clear();
4337 : 3 : histo = stat->d_stat.getHistogram();
4338 [ + + ]: 4 : for (auto& h : histo)
4339 : : {
4340 : 2 : rkeys.push_back(h.first.c_str());
4341 : 2 : rvalues.push_back(h.second);
4342 : : }
4343 : 2 : *size = rkeys.size();
4344 : 2 : *keys = rkeys.data();
4345 : 2 : *values = rvalues.data();
4346 [ + - ][ - + ]: 5 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4347 : 7 : }
4348 : :
4349 : 568 : const char* cvc5_stat_to_string(Cvc5Stat stat)
4350 : : {
4351 [ + + ]: 568 : static thread_local std::string str;
4352 : 568 : CVC5_CAPI_TRY_CATCH_BEGIN;
4353 [ + + ][ + + ]: 568 : CVC5_CAPI_CHECK_STAT(stat);
[ - - ]
4354 : 567 : str = stat->d_stat.toString();
4355 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4356 : 568 : return str.c_str();
4357 : : }
4358 : :
4359 : : /* -------------------------------------------------------------------------- */
4360 : : /* Cvc5Statistics */
4361 : : /* -------------------------------------------------------------------------- */
4362 : :
4363 : 6 : void cvc5_stats_iter_init(Cvc5Statistics stat, bool internal, bool dflt)
4364 : : {
4365 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
4366 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_STATS(stat);
[ - - ]
4367 : 5 : stat->d_iter.reset(
4368 : 5 : new cvc5::Statistics::iterator(stat->d_stat.begin(internal, dflt)));
4369 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4370 : 6 : }
4371 : :
4372 : 569 : bool cvc5_stats_iter_has_next(Cvc5Statistics stat)
4373 : : {
4374 : 569 : bool res = false;
4375 : 569 : CVC5_CAPI_TRY_CATCH_BEGIN;
4376 [ + + ][ + + ]: 569 : CVC5_CAPI_CHECK_STATS(stat);
[ - - ]
4377 [ + + ][ + + ]: 568 : CVC5_API_CHECK(stat->d_iter != nullptr) << "iterator not initialized";
[ - - ]
4378 : 567 : res = *stat->d_iter != stat->d_stat.end();
4379 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4380 : 569 : return res;
4381 : : }
4382 : :
4383 : 565 : Cvc5Stat cvc5_stats_iter_next(Cvc5Statistics stat, const char** name)
4384 : : {
4385 [ + + ]: 565 : static thread_local std::string str;
4386 : 565 : Cvc5Stat res = nullptr;
4387 : 565 : CVC5_CAPI_TRY_CATCH_BEGIN;
4388 [ + + ][ + + ]: 565 : CVC5_CAPI_CHECK_STATS(stat);
[ - - ]
4389 [ - + ][ - + ]: 564 : CVC5_API_CHECK(stat->d_iter != nullptr) << "iterator not initialized";
[ - - ]
4390 : 564 : cvc5::Stat rstat;
4391 : 564 : std::tie(str, rstat) = **stat->d_iter;
4392 [ + + ]: 564 : if (name)
4393 : : {
4394 : 563 : *name = str.c_str();
4395 : : }
4396 : 564 : res = stat->d_tm->export_stat(rstat);
4397 : 564 : (*stat->d_iter)++;
4398 [ + - ][ - + ]: 565 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4399 : 565 : return res;
4400 : : }
4401 : :
4402 : 19 : Cvc5Stat cvc5_stats_get(Cvc5Statistics stat, const char* name)
4403 : : {
4404 : 19 : Cvc5Stat res = nullptr;
4405 : 19 : CVC5_CAPI_TRY_CATCH_BEGIN;
4406 [ + + ][ + + ]: 19 : CVC5_CAPI_CHECK_STATS(stat);
[ - - ]
4407 [ + + ][ + + ]: 18 : CVC5_CAPI_CHECK_NOT_NULL(name);
[ - - ]
4408 : 17 : res = stat->d_tm->export_stat(stat->d_stat.get(name));
4409 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4410 : 19 : return res;
4411 : : }
4412 : :
4413 : 4 : const char* cvc5_stats_to_string(Cvc5Statistics stat)
4414 : : {
4415 [ + + ]: 4 : static thread_local std::string str;
4416 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
4417 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_STATS(stat);
[ - - ]
4418 : 3 : str = stat->d_stat.toString();
4419 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4420 : 4 : return str.c_str();
4421 : : }
4422 : :
4423 : : /* -------------------------------------------------------------------------- */
4424 : : /* Cvc5 */
4425 : : /* -------------------------------------------------------------------------- */
4426 : :
4427 : 305 : Cvc5* cvc5_new(Cvc5TermManager* tm)
4428 : : {
4429 : 305 : Cvc5* res = nullptr;
4430 : 305 : CVC5_CAPI_TRY_CATCH_BEGIN;
4431 : 305 : res = new Cvc5(tm);
4432 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4433 : 305 : return res;
4434 : : }
4435 : :
4436 : 305 : void cvc5_delete(Cvc5* cvc5)
4437 : : {
4438 : 305 : CVC5_CAPI_TRY_CATCH_BEGIN;
4439 [ + - ]: 305 : delete cvc5;
4440 : : CVC5_CAPI_TRY_CATCH_END;
4441 : 305 : }
4442 : :
4443 : 19 : Cvc5TermManager* cvc5_get_tm(Cvc5* cvc5)
4444 : : {
4445 : 19 : Cvc5TermManager* tm = nullptr;
4446 : 19 : CVC5_CAPI_TRY_CATCH_BEGIN;
4447 [ - + ][ - + ]: 19 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4448 : 19 : tm = cvc5->d_tm;
4449 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4450 : 19 : return tm;
4451 : : }
4452 : :
4453 : 22 : void cvc5_set_info(Cvc5* cvc5, const char* keyword, const char* value)
4454 : : {
4455 : 22 : CVC5_CAPI_TRY_CATCH_BEGIN;
4456 [ + + ][ + + ]: 22 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4457 [ + + ][ + + ]: 21 : CVC5_CAPI_CHECK_NOT_NULL(keyword);
[ - - ]
4458 [ + + ][ + + ]: 20 : CVC5_CAPI_CHECK_NOT_NULL(value);
[ - - ]
4459 : 39 : cvc5->d_solver.setInfo(keyword, value);
4460 [ + - ][ - + ]: 8 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4461 : 22 : }
4462 : :
4463 : 37 : void cvc5_set_logic(Cvc5* cvc5, const char* logic)
4464 : : {
4465 : 37 : CVC5_CAPI_TRY_CATCH_BEGIN;
4466 [ + + ][ + + ]: 37 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4467 [ + + ][ + + ]: 36 : CVC5_CAPI_CHECK_NOT_NULL(logic);
[ - - ]
4468 : 41 : cvc5->d_solver.setLogic(logic);
4469 [ + - ][ - + ]: 5 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4470 : 37 : }
4471 : :
4472 : 5 : bool cvc5_is_logic_set(Cvc5* cvc5)
4473 : : {
4474 : 5 : bool res = false;
4475 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
4476 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4477 : 4 : res = cvc5->d_solver.isLogicSet();
4478 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4479 : 5 : return res;
4480 : : }
4481 : :
4482 : 5 : const char* cvc5_get_logic(Cvc5* cvc5)
4483 : : {
4484 [ + + ]: 5 : static thread_local std::string str;
4485 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
4486 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4487 : 4 : str = cvc5->d_solver.getLogic();
4488 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4489 : 5 : return str.c_str();
4490 : : }
4491 : :
4492 : 201 : void cvc5_set_option(Cvc5* cvc5, const char* option, const char* value)
4493 : : {
4494 : 201 : CVC5_CAPI_TRY_CATCH_BEGIN;
4495 [ + + ][ + + ]: 201 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4496 [ + + ][ + + ]: 200 : CVC5_CAPI_CHECK_NOT_NULL(option);
[ - - ]
4497 [ + + ][ + + ]: 199 : CVC5_CAPI_CHECK_NOT_NULL(value);
[ - - ]
4498 : 214 : cvc5->d_solver.setOption(option, value);
4499 [ + - ][ - + ]: 7 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4500 : 201 : }
4501 : :
4502 : 21 : Cvc5Statistics cvc5_get_statistics(Cvc5* cvc5)
4503 : : {
4504 : 21 : Cvc5Statistics res = nullptr;
4505 : 21 : CVC5_CAPI_TRY_CATCH_BEGIN;
4506 [ + + ][ + + ]: 21 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4507 : 20 : res = cvc5->d_tm->export_stats(cvc5->d_solver.getStatistics());
4508 [ + - ][ - + ]: 1 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4509 : 21 : return res;
4510 : : }
4511 : :
4512 : 1 : void cvc5_print_stats_safe(Cvc5* cvc5, int fd)
4513 : : {
4514 : 1 : CVC5_CAPI_TRY_CATCH_BEGIN;
4515 [ - + ][ - + ]: 1 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4516 : 1 : cvc5->d_solver.printStatisticsSafe(fd);
4517 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4518 : 1 : }
4519 : :
4520 : 5 : bool cvc5_is_output_on(Cvc5* cvc5, const char* tag)
4521 : : {
4522 : 5 : bool res = false;
4523 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
4524 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4525 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(tag);
[ - - ]
4526 : 5 : res = cvc5->d_solver.isOutputOn(tag);
4527 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4528 : 5 : return res;
4529 : : }
4530 : :
4531 : 8 : void cvc5_get_output(Cvc5* cvc5, const char* tag, const char* filename)
4532 : : {
4533 : 8 : CVC5_CAPI_TRY_CATCH_BEGIN;
4534 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4535 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_NOT_NULL(tag);
[ - - ]
4536 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_NOT_NULL(filename);
[ - - ]
4537 [ + + ]: 7 : if (cvc5->d_solver.isOutputOn(tag))
4538 : : {
4539 : : std::ostream* out;
4540 [ + + ]: 3 : if (filename != std::string("<stdout>"))
4541 : : {
4542 [ - + ]: 1 : if (cvc5->d_output_tag_file_stream.is_open())
4543 : : {
4544 : 0 : cvc5->d_output_tag_file_stream.close();
4545 : : }
4546 : 1 : cvc5->d_output_tag_file_stream.open(filename);
4547 : 1 : out = &cvc5->d_output_tag_file_stream;
4548 : : }
4549 : : else
4550 : : {
4551 : 2 : out = &std::cout;
4552 : : }
4553 : 3 : cvc5->d_output_tag_stream = &cvc5->d_solver.getOutput(tag);
4554 : 3 : cvc5->d_output_tag_streambuf = cvc5->d_output_tag_stream->rdbuf();
4555 : 3 : cvc5->d_output_tag_stream->rdbuf(out->rdbuf());
4556 : : }
4557 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4558 : 8 : }
4559 : :
4560 : 4 : void cvc5_close_output(Cvc5* cvc5, const char* filename)
4561 : : {
4562 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
4563 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4564 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(filename);
[ - - ]
4565 [ + + ]: 2 : if (cvc5->d_output_tag_file_stream.is_open())
4566 : : {
4567 : 1 : cvc5->d_output_tag_file_stream.close();
4568 : : }
4569 : : // reset redirected output stream returned by Solver::getOutput()
4570 [ + + ]: 2 : if (cvc5->d_output_tag_stream)
4571 : : {
4572 [ - + ][ - + ]: 1 : Assert(cvc5->d_output_tag_streambuf);
[ - - ]
4573 : 1 : cvc5->d_output_tag_stream->rdbuf(cvc5->d_output_tag_streambuf);
4574 : : }
4575 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4576 : 4 : }
4577 : :
4578 : 1 : const char* cvc5_get_version(Cvc5* cvc5)
4579 : : {
4580 [ + - ]: 1 : static thread_local std::string str;
4581 : 1 : CVC5_CAPI_TRY_CATCH_BEGIN;
4582 [ - + ][ - + ]: 1 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4583 : 1 : str = cvc5->d_solver.getVersion();
4584 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4585 : 1 : return str.c_str();
4586 : : }
4587 : :
4588 : : /* .................................................................... */
4589 : : /* SMT-LIB-style Term/Sort Creation */
4590 : : /* .................................................................... */
4591 : :
4592 : 12 : Cvc5Sort cvc5_declare_dt(Cvc5* cvc5,
4593 : : const char* symbol,
4594 : : size_t size,
4595 : : const Cvc5DatatypeConstructorDecl ctors[])
4596 : : {
4597 : 12 : Cvc5Sort res = nullptr;
4598 : 12 : CVC5_CAPI_TRY_CATCH_BEGIN;
4599 [ + + ][ + + ]: 12 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4600 [ - + ][ - + ]: 11 : CVC5_CAPI_CHECK_NOT_NULL(symbol);
[ - - ]
4601 [ - + ][ - + ]: 11 : CVC5_CAPI_CHECK_NOT_NULL(ctors);
[ - - ]
4602 : 11 : std::vector<cvc5::DatatypeConstructorDecl> cctors;
4603 [ + + ]: 26 : for (size_t i = 0; i < size; ++i)
4604 : : {
4605 [ + + ][ + + ]: 16 : CVC5_CAPI_CHECK_DT_CONS_DECL_AT_IDX(ctors, i);
[ - - ]
4606 : 15 : cctors.push_back(ctors[i]->d_decl);
4607 : : }
4608 : 16 : res = cvc5->d_tm->export_sort(cvc5->d_solver.declareDatatype(symbol, cctors));
4609 [ + - ][ - + ]: 16 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4610 : 12 : return res;
4611 : : }
4612 : :
4613 : 31 : Cvc5Term cvc5_declare_fun(Cvc5* cvc5,
4614 : : const char* symbol,
4615 : : size_t size,
4616 : : const Cvc5Sort sorts[],
4617 : : Cvc5Sort sort,
4618 : : bool fresh)
4619 : : {
4620 : 31 : Cvc5Term res = nullptr;
4621 : 31 : CVC5_CAPI_TRY_CATCH_BEGIN;
4622 [ + + ][ + + ]: 31 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4623 [ - + ][ - + ]: 30 : CVC5_CAPI_CHECK_NOT_NULL(symbol);
[ - - ]
4624 [ + + ][ + + ]: 30 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
4625 : 29 : std::vector<cvc5::Sort> csorts;
4626 [ + + ]: 29 : if (sorts != nullptr)
4627 : : {
4628 [ + + ]: 40 : for (size_t i = 0; i < size; ++i)
4629 : : {
4630 [ - + ][ - + ]: 24 : CVC5_CAPI_CHECK_SORT_AT_IDX(sorts, i);
[ - - ]
4631 : 24 : csorts.push_back(sorts[i]->d_sort);
4632 : : }
4633 : : }
4634 : 25 : res = cvc5->d_tm->export_term(
4635 : 62 : cvc5->d_solver.declareFun(symbol, csorts, sort->d_sort, fresh));
4636 [ + - ][ - + ]: 35 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4637 : 31 : return res;
4638 : : }
4639 : :
4640 : 12 : Cvc5Sort cvc5_declare_sort(Cvc5* cvc5,
4641 : : const char* symbol,
4642 : : uint32_t arity,
4643 : : bool fresh)
4644 : : {
4645 : 12 : Cvc5Sort res = nullptr;
4646 : 12 : CVC5_CAPI_TRY_CATCH_BEGIN;
4647 [ + + ][ + + ]: 12 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4648 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_NOT_NULL(symbol);
[ - - ]
4649 : : res =
4650 : 8 : cvc5->d_tm->export_sort(cvc5->d_solver.declareSort(symbol, arity, fresh));
4651 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4652 : 12 : return res;
4653 : : }
4654 : :
4655 : : /* .................................................................... */
4656 : : /* Formula Handling */
4657 : : /* .................................................................... */
4658 : :
4659 : 22 : Cvc5Term cvc5_define_fun(Cvc5* cvc5,
4660 : : const char* symbol,
4661 : : size_t size,
4662 : : const Cvc5Term vars[],
4663 : : const Cvc5Sort sort,
4664 : : const Cvc5Term term,
4665 : : bool global)
4666 : : {
4667 : 22 : Cvc5Term res = nullptr;
4668 : 22 : CVC5_CAPI_TRY_CATCH_BEGIN;
4669 [ + + ][ + + ]: 22 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4670 [ - + ][ - + ]: 21 : CVC5_CAPI_CHECK_NOT_NULL(symbol);
[ - - ]
4671 [ + + ][ + + ]: 21 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
4672 [ + + ][ + + ]: 20 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
4673 : 19 : std::vector<cvc5::Term> cvars;
4674 [ + + ]: 19 : if (vars != nullptr)
4675 : : {
4676 [ + + ]: 35 : for (size_t i = 0; i < size; ++i)
4677 : : {
4678 [ - + ][ - + ]: 20 : CVC5_CAPI_CHECK_TERM_AT_IDX(vars, i);
[ - - ]
4679 : 20 : cvars.push_back(vars[i]->d_term);
4680 : : }
4681 : : }
4682 : 37 : res = cvc5->d_tm->export_term(cvc5->d_solver.defineFun(
4683 : 19 : symbol, cvars, sort->d_sort, term->d_term, global));
4684 [ + - ][ - + ]: 31 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4685 : 22 : return res;
4686 : : }
4687 : :
4688 : 18 : Cvc5Term cvc5_define_fun_rec(Cvc5* cvc5,
4689 : : const char* symbol,
4690 : : size_t size,
4691 : : const Cvc5Term vars[],
4692 : : const Cvc5Sort sort,
4693 : : const Cvc5Term term,
4694 : : bool global)
4695 : : {
4696 : 18 : Cvc5Term res = nullptr;
4697 : 18 : CVC5_CAPI_TRY_CATCH_BEGIN;
4698 [ + + ][ + + ]: 18 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4699 [ + + ][ + + ]: 17 : CVC5_CAPI_CHECK_NOT_NULL(symbol);
[ - - ]
4700 [ + + ][ + + ]: 16 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
4701 [ + + ][ + + ]: 15 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
4702 : 14 : std::vector<cvc5::Term> cvars;
4703 [ + + ]: 14 : if (vars != nullptr)
4704 : : {
4705 [ + + ]: 25 : for (size_t i = 0; i < size; ++i)
4706 : : {
4707 [ - + ][ - + ]: 14 : CVC5_CAPI_CHECK_TERM_AT_IDX(vars, i);
[ - - ]
4708 : 14 : cvars.push_back(vars[i]->d_term);
4709 : : }
4710 : : }
4711 : 32 : res = cvc5->d_tm->export_term(cvc5->d_solver.defineFunRec(
4712 : 14 : symbol, cvars, sort->d_sort, term->d_term, global));
4713 [ + - ][ - + ]: 27 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4714 : 18 : return res;
4715 : : }
4716 : :
4717 : 13 : Cvc5Term cvc5_define_fun_rec_from_const(Cvc5* cvc5,
4718 : : Cvc5Term fun,
4719 : : size_t size,
4720 : : const Cvc5Term vars[],
4721 : : const Cvc5Term term,
4722 : : bool global)
4723 : : {
4724 : 13 : Cvc5Term res = nullptr;
4725 : 13 : CVC5_CAPI_TRY_CATCH_BEGIN;
4726 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4727 [ + + ][ + + ]: 12 : CVC5_CAPI_CHECK_TERM(fun);
[ - - ]
4728 [ + + ][ + + ]: 11 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
4729 : 10 : std::vector<cvc5::Term> cvars;
4730 [ + - ]: 10 : if (vars != nullptr)
4731 : : {
4732 [ + + ]: 24 : for (size_t i = 0; i < size; ++i)
4733 : : {
4734 [ - + ][ - + ]: 14 : CVC5_CAPI_CHECK_TERM_AT_IDX(vars, i);
[ - - ]
4735 : 14 : cvars.push_back(vars[i]->d_term);
4736 : : }
4737 : : }
4738 : 2 : res = cvc5->d_tm->export_term(
4739 : 12 : cvc5->d_solver.defineFunRec(fun->d_term, cvars, term->d_term, global));
4740 [ + - ][ - + ]: 21 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4741 : 13 : return res;
4742 : : }
4743 : :
4744 : 15 : void cvc5_define_funs_rec(Cvc5* cvc5,
4745 : : size_t nfuns,
4746 : : const Cvc5Term funs[],
4747 : : size_t nvars[],
4748 : : const Cvc5Term* vars[],
4749 : : const Cvc5Term terms[],
4750 : : bool global)
4751 : : {
4752 : 15 : CVC5_CAPI_TRY_CATCH_BEGIN;
4753 [ - + ][ - + ]: 15 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4754 [ - + ][ - + ]: 15 : CVC5_CAPI_CHECK_NOT_NULL(funs);
[ - - ]
4755 [ - + ][ - + ]: 15 : CVC5_CAPI_CHECK_NOT_NULL(nvars);
[ - - ]
4756 [ - + ][ - + ]: 15 : CVC5_CAPI_CHECK_NOT_NULL(vars);
[ - - ]
4757 [ - + ][ - + ]: 15 : CVC5_CAPI_CHECK_NOT_NULL(terms);
[ - - ]
4758 : 15 : std::vector<cvc5::Term> cfuns;
4759 [ + + ]: 44 : for (size_t i = 0; i < nfuns; ++i)
4760 : : {
4761 [ - + ][ - + ]: 29 : CVC5_CAPI_CHECK_TERM_AT_IDX(funs, i);
[ - - ]
4762 : 29 : cfuns.push_back(funs[i]->d_term);
4763 : : }
4764 : 15 : std::vector<std::vector<cvc5::Term>> cvars;
4765 [ + + ]: 44 : for (size_t i = 0; i < nfuns; ++i)
4766 : : {
4767 : 29 : std::vector<cvc5::Term> cv;
4768 [ + + ]: 71 : for (size_t j = 0; j < nvars[i]; ++j)
4769 : : {
4770 [ - + ][ - + ]: 42 : CVC5_CAPI_CHECK_TERM_AT_IDX(vars[i], j);
[ - - ]
4771 : 42 : cv.push_back(vars[i][j]->d_term);
4772 : : }
4773 : 29 : cvars.push_back(cv);
4774 : 29 : }
4775 : 15 : std::vector<cvc5::Term> cterms;
4776 [ + + ]: 44 : for (size_t i = 0; i < nfuns; ++i)
4777 : : {
4778 [ - + ][ - + ]: 29 : CVC5_CAPI_CHECK_TERM_AT_IDX(terms, i);
[ - - ]
4779 : 29 : cterms.push_back(terms[i]->d_term);
4780 : : }
4781 : 15 : cvc5->d_solver.defineFunsRec(cfuns, cvars, cterms, global);
4782 [ + - ][ - + ]: 48 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4783 : 15 : }
4784 : :
4785 : 46 : Cvc5Term cvc5_simplify(Cvc5* cvc5, Cvc5Term term, bool apply_subs)
4786 : : {
4787 : 46 : Cvc5Term res = nullptr;
4788 : 46 : CVC5_CAPI_TRY_CATCH_BEGIN;
4789 [ + + ][ + + ]: 46 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4790 [ + + ][ + + ]: 45 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
4791 : 42 : res = cvc5->d_tm->export_term(
4792 : 86 : cvc5->d_solver.simplify(term->d_term, apply_subs));
4793 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4794 : 46 : return res;
4795 : : }
4796 : :
4797 : 165 : void cvc5_assert_formula(Cvc5* cvc5, Cvc5Term term)
4798 : : {
4799 : 165 : CVC5_CAPI_TRY_CATCH_BEGIN;
4800 [ + + ][ + + ]: 165 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4801 [ + + ][ + + ]: 164 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
4802 : 163 : cvc5->d_solver.assertFormula(term->d_term);
4803 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4804 : 165 : }
4805 : :
4806 : 111 : Cvc5Result cvc5_check_sat(Cvc5* cvc5)
4807 : : {
4808 : 111 : Cvc5Result res = nullptr;
4809 : 111 : CVC5_CAPI_TRY_CATCH_BEGIN;
4810 [ + + ][ + + ]: 111 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4811 : 110 : res = cvc5->export_result(cvc5->d_solver.checkSat());
4812 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4813 : 111 : return res;
4814 : : }
4815 : :
4816 : 20 : Cvc5Result cvc5_check_sat_assuming(Cvc5* cvc5,
4817 : : size_t size,
4818 : : const Cvc5Term assumptions[])
4819 : : {
4820 : 20 : Cvc5Result res = nullptr;
4821 : 20 : CVC5_CAPI_TRY_CATCH_BEGIN;
4822 [ + + ][ + + ]: 20 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4823 [ + + ][ + + ]: 19 : CVC5_CAPI_CHECK_NOT_NULL(assumptions);
[ - - ]
4824 : 18 : std::vector<cvc5::Term> cassumptions;
4825 [ + + ]: 36 : for (size_t i = 0; i < size; ++i)
4826 : : {
4827 [ + + ][ + + ]: 19 : CVC5_CAPI_CHECK_TERM_AT_IDX(assumptions, i);
[ - - ]
4828 : 18 : cassumptions.push_back(assumptions[i]->d_term);
4829 : : }
4830 : 17 : res = cvc5->export_result(cvc5->d_solver.checkSatAssuming(cassumptions));
4831 [ + - ][ - + ]: 24 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4832 : 20 : return res;
4833 : : }
4834 : :
4835 : 3 : const Cvc5Term* cvc5_get_assertions(Cvc5* cvc5, size_t* size)
4836 : : {
4837 [ + + ]: 3 : static thread_local std::vector<Cvc5Term> res;
4838 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
4839 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4840 : 2 : CVC5_CAPI_CHECK_NOT_NULL(size);
4841 : 1 : res.clear();
4842 : 1 : auto assertions = cvc5->d_solver.getAssertions();
4843 [ + + ]: 3 : for (auto& t : assertions)
4844 : : {
4845 : 2 : res.push_back(cvc5->d_tm->export_term(t));
4846 : : }
4847 : 1 : *size = res.size();
4848 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4849 : 3 : return res.data();
4850 : : }
4851 : :
4852 : 4 : const char* cvc5_get_info(Cvc5* cvc5, const char* flag)
4853 : : {
4854 [ + + ]: 4 : static thread_local std::string str;
4855 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
4856 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4857 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(flag);
[ - - ]
4858 : 4 : str = cvc5->d_solver.getInfo(flag);
4859 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4860 : 4 : return str.c_str();
4861 : : }
4862 : :
4863 : 4 : const char* cvc5_get_option(Cvc5* cvc5, const char* option)
4864 : : {
4865 [ + + ]: 4 : static thread_local std::string str;
4866 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
4867 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4868 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(option);
[ - - ]
4869 : 4 : str = cvc5->d_solver.getOption(option);
4870 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4871 : 4 : return str.c_str();
4872 : : }
4873 : :
4874 : 3 : const char** cvc5_get_option_names(Cvc5* cvc5, size_t* size)
4875 : : {
4876 [ + + ]: 3 : static thread_local std::vector<const char*> res;
4877 [ + + ]: 3 : static thread_local std::vector<std::string> names;
4878 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
4879 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4880 : 2 : CVC5_CAPI_CHECK_NOT_NULL(size);
4881 : 1 : res.clear();
4882 : 1 : names = cvc5->d_solver.getOptionNames();
4883 [ + + ]: 534 : for (auto& s : names)
4884 : : {
4885 : 533 : res.push_back(s.c_str());
4886 : : }
4887 : 1 : *size = res.size();
4888 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
4889 : 3 : return res.data();
4890 : : }
4891 : :
4892 : : static thread_local std::vector<const char*> c_modes;
4893 : :
4894 : : template <class... Ts>
4895 : : struct overloaded : Ts...
4896 : : {
4897 : : using Ts::operator()...;
4898 : : };
4899 : : template <class... Ts>
4900 : : overloaded(Ts...) -> overloaded<Ts...>;
4901 : :
4902 : 11 : void cvc5_get_option_info(Cvc5* cvc5, const char* option, Cvc5OptionInfo* info)
4903 : : {
4904 : 11 : CVC5_CAPI_TRY_CATCH_BEGIN;
4905 [ + + ][ + + ]: 11 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
4906 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_NOT_NULL(option);
[ - - ]
4907 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_NOT_NULL(info);
[ - - ]
4908 : :
4909 [ + + ]: 8 : static thread_local cvc5::OptionInfo cpp_info;
4910 : 10 : cpp_info = cvc5->d_solver.getOptionInfo(option);
4911 : :
4912 : 7 : std::memset(info, 0, sizeof(*info));
4913 : :
4914 : 7 : info->name = cpp_info.name.c_str();
4915 : :
4916 : 7 : info->num_aliases = cpp_info.aliases.size();
4917 [ + + ]: 7 : static thread_local std::vector<const char*> c_aliases;
4918 : 7 : c_aliases.clear();
4919 [ + + ]: 9 : for (const auto& a : cpp_info.aliases)
4920 : : {
4921 : 2 : c_aliases.push_back(a.c_str());
4922 : : }
4923 : 7 : info->aliases = c_aliases.data();
4924 : :
4925 : 7 : info->num_no_supports = cpp_info.noSupports.size();
4926 [ + + ]: 7 : static thread_local std::vector<const char*> c_no_supports;
4927 : 7 : c_no_supports.clear();
4928 [ - + ]: 7 : for (const auto& a : cpp_info.noSupports)
4929 : : {
4930 : 0 : c_no_supports.push_back(a.c_str());
4931 : : }
4932 : 7 : info->no_supports = c_no_supports.data();
4933 : :
4934 : 7 : info->is_set_by_user = cpp_info.setByUser;
4935 [ + + ][ + - ]: 7 : switch (cpp_info.category)
4936 : : {
4937 : 1 : case cvc5::modes::OptionCategory::REGULAR:
4938 : 1 : info->category = CVC5_OPTION_CATEGORY_REGULAR;
4939 : 1 : break;
4940 : 1 : case cvc5::modes::OptionCategory::EXPERT:
4941 : 1 : info->category = CVC5_OPTION_CATEGORY_EXPERT;
4942 : 1 : break;
4943 : 5 : case cvc5::modes::OptionCategory::COMMON:
4944 : 5 : info->category = CVC5_OPTION_CATEGORY_COMMON;
4945 : 5 : break;
4946 : 0 : default:
4947 : 0 : Assert(cpp_info.category == cvc5::modes::OptionCategory::UNDOCUMENTED);
4948 : 0 : info->category = CVC5_OPTION_CATEGORY_UNDOCUMENTED;
4949 : : }
4950 : :
4951 : 7 : std::visit(
4952 : 7 : overloaded{
4953 : 1 : [info](const cvc5::OptionInfo::VoidInfo& vi) {
4954 : : (void)vi;
4955 : 1 : info->kind = CVC5_OPTION_INFO_VOID;
4956 : 1 : },
4957 : 1 : [info](const cvc5::OptionInfo::ValueInfo<bool>& vi) {
4958 : 1 : info->kind = CVC5_OPTION_INFO_BOOL;
4959 : 1 : info->info_bool.dflt = vi.defaultValue;
4960 : 1 : info->info_bool.cur = vi.currentValue;
4961 : 1 : },
4962 : 2 : [info](const cvc5::OptionInfo::ValueInfo<std::string>& vi) {
4963 : 1 : info->kind = CVC5_OPTION_INFO_STR;
4964 : 1 : info->info_str.dflt = vi.defaultValue.c_str();
4965 : 1 : info->info_str.cur = vi.currentValue.c_str();
4966 : 1 : },
4967 : 1 : [info](const cvc5::OptionInfo::NumberInfo<int64_t>& vi) {
4968 : 1 : info->kind = CVC5_OPTION_INFO_INT64;
4969 : 1 : info->info_int.dflt = vi.defaultValue;
4970 : 1 : info->info_int.cur = vi.currentValue;
4971 [ - + ]: 1 : if (vi.minimum)
4972 : : {
4973 : 0 : info->info_int.min = *vi.minimum;
4974 : 0 : info->info_int.has_min = true;
4975 : : }
4976 [ - + ]: 1 : if (vi.maximum)
4977 : : {
4978 : 0 : info->info_int.max = *vi.maximum;
4979 : 0 : info->info_int.has_max = true;
4980 : : }
4981 : 1 : },
4982 : 1 : [info](const cvc5::OptionInfo::NumberInfo<uint64_t>& vi) {
4983 : 1 : info->kind = CVC5_OPTION_INFO_UINT64;
4984 : 1 : info->info_uint.dflt = vi.defaultValue;
4985 : 1 : info->info_uint.cur = vi.currentValue;
4986 [ - + ]: 1 : if (vi.minimum)
4987 : : {
4988 : 0 : info->info_uint.min = *vi.minimum;
4989 : 0 : info->info_uint.has_min = true;
4990 : : }
4991 [ - + ]: 1 : if (vi.maximum)
4992 : : {
4993 : 0 : info->info_uint.max = *vi.maximum;
4994 : 0 : info->info_uint.has_max = true;
4995 : : }
4996 : 1 : },
4997 : 3 : [info](const cvc5::OptionInfo::NumberInfo<double>& vi) {
4998 : 1 : info->kind = CVC5_OPTION_INFO_DOUBLE;
4999 : 1 : info->info_double.dflt = vi.defaultValue;
5000 : 1 : info->info_double.cur = vi.currentValue;
5001 [ + - ]: 1 : if (vi.minimum)
5002 : : {
5003 : 1 : info->info_double.min = *vi.minimum;
5004 : 1 : info->info_double.has_min = true;
5005 : : }
5006 [ + - ]: 1 : if (vi.maximum)
5007 : : {
5008 : 1 : info->info_double.max = *vi.maximum;
5009 : 1 : info->info_double.has_max = true;
5010 : : }
5011 : 1 : },
5012 : 5 : [info](const cvc5::OptionInfo::ModeInfo&) {
5013 : 1 : info->kind = CVC5_OPTION_INFO_MODES;
5014 : 1 : info->info_mode.cur =
5015 : 1 : std::get<cvc5::OptionInfo::ModeInfo>(cpp_info.valueInfo)
5016 : 1 : .currentValue.c_str();
5017 : 1 : info->info_mode.dflt =
5018 : 1 : std::get<cvc5::OptionInfo::ModeInfo>(cpp_info.valueInfo)
5019 : 1 : .defaultValue.c_str();
5020 : 1 : info->info_mode.num_modes =
5021 : 1 : std::get<cvc5::OptionInfo::ModeInfo>(cpp_info.valueInfo)
5022 : 1 : .modes.size();
5023 : 1 : c_modes.clear();
5024 : 1 : for (const auto& m :
5025 [ + + ]: 4 : std::get<cvc5::OptionInfo::ModeInfo>(cpp_info.valueInfo).modes)
5026 : : {
5027 : 2 : c_modes.push_back(m.c_str());
5028 : : }
5029 : 1 : info->info_mode.modes = c_modes.data();
5030 : 1 : },
5031 : : },
5032 : : cpp_info.valueInfo);
5033 : :
5034 : 7 : info->d_cpp_info = &cpp_info;
5035 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5036 : 11 : }
5037 : :
5038 : 7 : const char* cvc5_option_info_to_string(const Cvc5OptionInfo* info)
5039 : : {
5040 [ + + ]: 7 : static thread_local std::string str;
5041 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
5042 [ - + ][ - + ]: 7 : CVC5_CAPI_CHECK_NOT_NULL(info);
[ - - ]
5043 [ - + ][ - + ]: 7 : Assert(info->d_cpp_info);
[ - - ]
5044 : 7 : str = static_cast<cvc5::OptionInfo*>(info->d_cpp_info)->toString();
5045 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5046 : 7 : return str.c_str();
5047 : : }
5048 : :
5049 : 6 : const Cvc5Term* cvc5_get_unsat_assumptions(Cvc5* cvc5, size_t* size)
5050 : : {
5051 [ + + ]: 6 : static thread_local std::vector<Cvc5Term> res;
5052 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
5053 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5054 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
5055 : 4 : res.clear();
5056 : 4 : auto assumptions = cvc5->d_solver.getUnsatAssumptions();
5057 [ + + ]: 2 : for (auto& t : assumptions)
5058 : : {
5059 : 1 : res.push_back(cvc5->d_tm->export_term(t));
5060 : : }
5061 : 1 : *size = res.size();
5062 [ + - ][ - + ]: 6 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5063 : 6 : return res.data();
5064 : : }
5065 : :
5066 : 5 : const Cvc5Term* cvc5_get_unsat_core(Cvc5* cvc5, size_t* size)
5067 : : {
5068 [ + + ]: 5 : static thread_local std::vector<Cvc5Term> res;
5069 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
5070 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5071 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
5072 : 3 : res.clear();
5073 : 3 : auto assertions = cvc5->d_solver.getUnsatCore();
5074 [ + + ]: 4 : for (auto& t : assertions)
5075 : : {
5076 : 3 : res.push_back(cvc5->d_tm->export_term(t));
5077 : : }
5078 : 1 : *size = res.size();
5079 [ + - ][ - + ]: 5 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5080 : 5 : return res.data();
5081 : : }
5082 : :
5083 : 5 : const Cvc5Term* cvc5_get_unsat_core_lemmas(Cvc5* cvc5, size_t* size)
5084 : : {
5085 [ + + ]: 5 : static thread_local std::vector<Cvc5Term> res;
5086 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
5087 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5088 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
5089 : 3 : res.clear();
5090 : 3 : auto assertions = cvc5->d_solver.getUnsatCoreLemmas();
5091 [ + + ]: 3 : for (auto& t : assertions)
5092 : : {
5093 : 1 : res.push_back(cvc5->d_tm->export_term(t));
5094 : : }
5095 : 2 : *size = res.size();
5096 [ + - ][ - + ]: 5 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5097 : 5 : return res.data();
5098 : : }
5099 : :
5100 : 8 : void cvc5_get_difficulty(Cvc5* cvc5,
5101 : : size_t* size,
5102 : : Cvc5Term* inputs[],
5103 : : Cvc5Term* values[])
5104 : : {
5105 : 8 : CVC5_CAPI_TRY_CATCH_BEGIN;
5106 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5107 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
5108 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_NOT_NULL(inputs);
[ - - ]
5109 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_NOT_NULL(values);
[ - - ]
5110 : 4 : auto res = cvc5->d_solver.getDifficulty();
5111 [ + + ]: 2 : static thread_local std::vector<Cvc5Term> rinputs;
5112 [ + + ]: 2 : static thread_local std::vector<Cvc5Term> rvalues;
5113 : 2 : rinputs.clear();
5114 : 2 : rvalues.clear();
5115 [ + + ]: 4 : for (const auto& p : res)
5116 : : {
5117 : 2 : rinputs.push_back(cvc5->d_tm->export_term(p.first));
5118 : 2 : rvalues.push_back(cvc5->d_tm->export_term(p.second));
5119 : : }
5120 : 2 : *size = rinputs.size();
5121 : 2 : *inputs = rinputs.data();
5122 : 2 : *values = rvalues.data();
5123 [ + - ][ - + ]: 8 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5124 : 8 : }
5125 : :
5126 : 5 : const Cvc5Term* cvc5_get_timeout_core(Cvc5* cvc5,
5127 : : Cvc5Result* result,
5128 : : size_t* size)
5129 : : {
5130 [ + + ]: 5 : static thread_local std::vector<Cvc5Term> res;
5131 : 5 : CVC5_CAPI_TRY_CATCH_BEGIN;
5132 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5133 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(result);
[ - - ]
5134 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
5135 : 2 : res.clear();
5136 : 2 : auto ccore = cvc5->d_solver.getTimeoutCore();
5137 : 2 : *result = cvc5->export_result(ccore.first);
5138 [ + + ]: 4 : for (const auto& t : ccore.second)
5139 : : {
5140 : 2 : res.push_back(cvc5->d_tm->export_term(t));
5141 : : }
5142 : 2 : *size = ccore.second.size();
5143 [ + - ][ - + ]: 5 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5144 : 5 : return res.data();
5145 : : }
5146 : :
5147 : 2 : const Cvc5Term* cvc5_get_timeout_core_assuming(Cvc5* cvc5,
5148 : : size_t size,
5149 : : const Cvc5Term assumptions[],
5150 : : Cvc5Result* result,
5151 : : size_t* rsize)
5152 : : {
5153 [ + + ]: 2 : static thread_local std::vector<Cvc5Term> res;
5154 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
5155 [ - + ][ - + ]: 2 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5156 : 2 : CVC5_CAPI_CHECK_NOT_NULL(assumptions);
5157 : 1 : std::vector<cvc5::Term> cassumptions;
5158 [ + + ]: 3 : for (size_t i = 0; i < size; ++i)
5159 : : {
5160 [ - + ][ - + ]: 2 : CVC5_CAPI_CHECK_TERM_AT_IDX(assumptions, i);
[ - - ]
5161 : 2 : cassumptions.push_back(assumptions[i]->d_term);
5162 : : }
5163 [ - + ][ - + ]: 1 : CVC5_CAPI_CHECK_NOT_NULL(result);
[ - - ]
5164 [ - + ][ - + ]: 1 : CVC5_CAPI_CHECK_NOT_NULL(rsize);
[ - - ]
5165 : 1 : res.clear();
5166 : 1 : auto ccore = cvc5->d_solver.getTimeoutCoreAssuming(cassumptions);
5167 : 1 : *result = cvc5->export_result(ccore.first);
5168 [ + + ]: 2 : for (const auto& t : ccore.second)
5169 : : {
5170 : 1 : res.push_back(cvc5->d_tm->export_term(t));
5171 : : }
5172 : 1 : *rsize = ccore.second.size();
5173 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5174 : 2 : return res.data();
5175 : : }
5176 : :
5177 : 15 : const Cvc5Proof* cvc5_get_proof(Cvc5* cvc5, Cvc5ProofComponent c, size_t* size)
5178 : : {
5179 [ + + ]: 15 : static thread_local std::vector<Cvc5Proof> res;
5180 : 15 : CVC5_CAPI_TRY_CATCH_BEGIN;
5181 [ + + ][ + + ]: 15 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5182 [ + + ][ + + ]: 14 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
5183 : 13 : res.clear();
5184 : : auto proofs =
5185 : 13 : cvc5->d_solver.getProof(static_cast<cvc5::modes::ProofComponent>(c));
5186 [ + + ]: 26 : for (const auto& p : proofs)
5187 : : {
5188 : 13 : res.push_back(cvc5->export_proof(p));
5189 : : }
5190 : 13 : *size = proofs.size();
5191 [ + - ][ - + ]: 15 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5192 : 15 : return res.data();
5193 : : }
5194 : :
5195 : 6 : const Cvc5Term* cvc5_get_learned_literals(Cvc5* cvc5,
5196 : : Cvc5LearnedLitType type,
5197 : : size_t* size)
5198 : : {
5199 [ + + ]: 6 : static thread_local std::vector<Cvc5Term> res;
5200 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
5201 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5202 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
5203 : 4 : res.clear();
5204 : : auto lits = cvc5->d_solver.getLearnedLiterals(
5205 : 4 : static_cast<cvc5::modes::LearnedLitType>(type));
5206 [ + + ]: 5 : for (const auto& t : lits)
5207 : : {
5208 : 2 : res.push_back(cvc5->d_tm->export_term(t));
5209 : : }
5210 : 3 : *size = res.size();
5211 [ + - ][ - + ]: 6 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5212 : 6 : return res.data();
5213 : : }
5214 : :
5215 : 36 : Cvc5Term cvc5_get_value(Cvc5* cvc5, Cvc5Term term)
5216 : : {
5217 : 36 : Cvc5Term res = nullptr;
5218 : 36 : CVC5_CAPI_TRY_CATCH_BEGIN;
5219 [ + + ][ + + ]: 36 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5220 [ + + ][ + + ]: 35 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
5221 : 34 : res = cvc5->d_tm->export_term(cvc5->d_solver.getValue(term->d_term));
5222 [ + - ][ - + ]: 7 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5223 : 36 : return res;
5224 : : }
5225 : :
5226 : 4 : const Cvc5Term* cvc5_get_values(Cvc5* cvc5,
5227 : : size_t size,
5228 : : const Cvc5Term terms[],
5229 : : size_t* rsize)
5230 : : {
5231 [ + + ]: 4 : static thread_local std::vector<Cvc5Term> res;
5232 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
5233 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5234 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(terms);
[ - - ]
5235 : 2 : CVC5_CAPI_CHECK_NOT_NULL(rsize);
5236 : 1 : res.clear();
5237 : 1 : std::vector<cvc5::Term> cterms;
5238 [ + + ]: 4 : for (size_t i = 0; i < size; ++i)
5239 : : {
5240 : 3 : cterms.push_back(terms[i]->d_term);
5241 : : }
5242 : 1 : auto values = cvc5->d_solver.getValue(cterms);
5243 [ + + ]: 4 : for (const auto& t : values)
5244 : : {
5245 : 3 : res.push_back(cvc5->d_tm->export_term(t));
5246 : : }
5247 : 1 : *rsize = res.size();
5248 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5249 : 4 : return res.data();
5250 : : }
5251 : :
5252 : 7 : const Cvc5Term* cvc5_get_model_domain_elements(Cvc5* cvc5,
5253 : : Cvc5Sort sort,
5254 : : size_t* size)
5255 : : {
5256 [ + + ]: 7 : static thread_local std::vector<Cvc5Term> res;
5257 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
5258 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5259 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
5260 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_NOT_NULL(size);
[ - - ]
5261 : 4 : res.clear();
5262 : 4 : auto elems = cvc5->d_solver.getModelDomainElements(sort->d_sort);
5263 [ + + ]: 6 : for (const auto& t : elems)
5264 : : {
5265 : 4 : res.push_back(cvc5->d_tm->export_term(t));
5266 : : }
5267 : 2 : *size = res.size();
5268 [ + - ][ - + ]: 7 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5269 : 7 : return res.data();
5270 : : }
5271 : :
5272 : 7 : bool cvc5_is_model_core_symbol(Cvc5* cvc5, Cvc5Term v)
5273 : : {
5274 : 7 : bool res = false;
5275 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
5276 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5277 [ + + ]: 6 : if (v)
5278 : : {
5279 : 5 : res = cvc5->d_solver.isModelCoreSymbol(v->d_term);
5280 : : }
5281 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5282 : 7 : return res;
5283 : : }
5284 : :
5285 : 8 : const char* cvc5_get_model(Cvc5* cvc5,
5286 : : size_t nsorts,
5287 : : const Cvc5Sort sorts[],
5288 : : size_t nconsts,
5289 : : const Cvc5Term consts[])
5290 : : {
5291 [ + + ]: 8 : static thread_local std::string str;
5292 : 8 : CVC5_CAPI_TRY_CATCH_BEGIN;
5293 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5294 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_NOT_NULL(sorts);
[ - - ]
5295 : 4 : CVC5_CAPI_CHECK_NOT_NULL(consts);
5296 : 2 : std::vector<cvc5::Sort> csorts;
5297 [ + + ]: 4 : for (size_t i = 0; i < nsorts; ++i)
5298 : : {
5299 [ - + ][ - + ]: 2 : CVC5_CAPI_CHECK_SORT_AT_IDX(sorts, i);
[ - - ]
5300 : 2 : csorts.push_back(sorts[i]->d_sort);
5301 : : }
5302 : 2 : std::vector<cvc5::Term> cconsts;
5303 [ + + ]: 6 : for (size_t i = 0; i < nconsts; ++i)
5304 : : {
5305 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_TERM_AT_IDX(consts, i);
[ - - ]
5306 : 4 : cconsts.push_back(consts[i]->d_term);
5307 : : }
5308 : 1 : str = cvc5->d_solver.getModel(csorts, cconsts);
5309 [ + - ][ - + ]: 10 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5310 : 8 : return str.c_str();
5311 : : }
5312 : :
5313 : 6 : Cvc5Term cvc5_get_quantifier_elimination(Cvc5* cvc5, Cvc5Term q)
5314 : : {
5315 : 6 : Cvc5Term res = nullptr;
5316 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
5317 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5318 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_TERM(q);
[ - - ]
5319 : 1 : res = cvc5->d_tm->export_term(
5320 : 5 : cvc5->d_solver.getQuantifierElimination(q->d_term));
5321 [ + - ][ - + ]: 5 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5322 : 6 : return res;
5323 : : }
5324 : :
5325 : 4 : Cvc5Term cvc5_get_quantifier_elimination_disjunct(Cvc5* cvc5, Cvc5Term q)
5326 : : {
5327 : 4 : Cvc5Term res = nullptr;
5328 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
5329 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5330 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_TERM(q);
[ - - ]
5331 : 1 : res = cvc5->d_tm->export_term(
5332 : 3 : cvc5->d_solver.getQuantifierEliminationDisjunct(q->d_term));
5333 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5334 : 4 : return res;
5335 : : }
5336 : :
5337 : 10 : void cvc5_declare_sep_heap(Cvc5* cvc5, Cvc5Sort loc, Cvc5Sort data)
5338 : : {
5339 : 10 : CVC5_CAPI_TRY_CATCH_BEGIN;
5340 [ - + ][ - + ]: 10 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5341 [ - + ][ - + ]: 10 : CVC5_CAPI_CHECK_SORT(loc);
[ - - ]
5342 [ - + ][ - + ]: 10 : CVC5_CAPI_CHECK_SORT(data);
[ - - ]
5343 : 10 : cvc5->d_solver.declareSepHeap(loc->d_sort, data->d_sort);
5344 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5345 : 10 : }
5346 : :
5347 : 6 : Cvc5Term cvc5_get_value_sep_heap(Cvc5* cvc5)
5348 : : {
5349 : 6 : Cvc5Term res = nullptr;
5350 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
5351 [ - + ][ - + ]: 6 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5352 : 6 : res = cvc5->d_tm->export_term(cvc5->d_solver.getValueSepHeap());
5353 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5354 : 6 : return res;
5355 : : }
5356 : :
5357 : 6 : Cvc5Term cvc5_get_value_sep_nil(Cvc5* cvc5)
5358 : : {
5359 : 6 : Cvc5Term res = nullptr;
5360 : 6 : CVC5_CAPI_TRY_CATCH_BEGIN;
5361 [ - + ][ - + ]: 6 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5362 : 6 : res = cvc5->d_tm->export_term(cvc5->d_solver.getValueSepNil());
5363 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5364 : 6 : return res;
5365 : : }
5366 : :
5367 : 11 : Cvc5Term cvc5_declare_pool(Cvc5* cvc5,
5368 : : const char* symbol,
5369 : : Cvc5Sort sort,
5370 : : size_t size,
5371 : : const Cvc5Term init_value[])
5372 : : {
5373 : 11 : Cvc5Term res = nullptr;
5374 : 11 : CVC5_CAPI_TRY_CATCH_BEGIN;
5375 [ + + ][ + + ]: 11 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5376 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_NOT_NULL(symbol);
[ - - ]
5377 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
5378 : 8 : std::vector<cvc5::Term> cinit_value;
5379 [ + + ]: 8 : if (init_value != nullptr)
5380 : : {
5381 [ + + ]: 22 : for (size_t i = 0; i < size; ++i)
5382 : : {
5383 [ + + ][ + + ]: 18 : CVC5_CAPI_CHECK_TERM_AT_IDX(init_value, i);
[ - - ]
5384 : 15 : cinit_value.push_back(init_value[i]->d_term);
5385 : : }
5386 : : }
5387 : 2 : res = cvc5->d_tm->export_term(
5388 : 13 : cvc5->d_solver.declarePool(symbol, sort->d_sort, cinit_value));
5389 [ + - ][ - + ]: 17 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5390 : 11 : return res;
5391 : : }
5392 : :
5393 : : namespace {
5394 : 12 : cvc5::Term call_oracle(Cvc5* cvc5,
5395 : : Cvc5Term (*fun)(size_t, const Cvc5Term*, void*),
5396 : : const std::vector<cvc5::Term>& terms,
5397 : : void* state)
5398 : : {
5399 : 12 : std::vector<Cvc5Term> cterms;
5400 [ + + ]: 26 : for (auto& t : terms)
5401 : : {
5402 : 14 : cterms.push_back(cvc5->d_tm->export_term(t));
5403 : : }
5404 : 24 : return fun(cterms.size(), cterms.data(), state)->d_term;
5405 : 12 : }
5406 : : } // namespace
5407 : :
5408 : 12 : Cvc5Term cvc5_declare_oracle_fun(Cvc5* cvc5,
5409 : : const char* symbol,
5410 : : size_t size,
5411 : : const Cvc5Sort sorts[],
5412 : : Cvc5Sort sort,
5413 : : void* state,
5414 : : Cvc5Term (*fun)(size_t,
5415 : : const Cvc5Term*,
5416 : : void*))
5417 : : {
5418 : 12 : Cvc5Term res = nullptr;
5419 : 12 : CVC5_CAPI_TRY_CATCH_BEGIN;
5420 [ + + ][ + + ]: 12 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5421 [ + + ][ + + ]: 11 : CVC5_CAPI_CHECK_NOT_NULL(symbol);
[ - - ]
5422 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
5423 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_NOT_NULL(fun);
[ - - ]
5424 : 8 : std::vector<cvc5::Sort> csorts;
5425 [ + - ]: 8 : if (sorts != nullptr)
5426 : : {
5427 [ + + ]: 18 : for (size_t i = 0; i < size; ++i)
5428 : : {
5429 [ - + ][ - + ]: 10 : CVC5_CAPI_CHECK_SORT_AT_IDX(sorts, i);
[ - - ]
5430 : 10 : csorts.push_back(sorts[i]->d_sort);
5431 : : }
5432 : : }
5433 : : std::function<cvc5::Term(const std::vector<cvc5::Term>&)> cfun =
5434 : 12 : [cvc5, state, fun](const std::vector<cvc5::Term>& terms) {
5435 : 12 : cvc5::Term term = call_oracle(cvc5, fun, terms, state);
5436 : 12 : return term;
5437 : 8 : };
5438 : 5 : res = cvc5->d_tm->export_term(
5439 : 22 : cvc5->d_solver.declareOracleFun(symbol, csorts, sort->d_sort, cfun));
5440 [ + - ][ - + ]: 18 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5441 : 12 : return res;
5442 : : }
5443 : :
5444 : 2 : void cvc5_add_plugin(Cvc5* cvc5, Cvc5Plugin* plugin)
5445 : : {
5446 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
5447 [ - + ][ - + ]: 2 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5448 [ - + ][ - + ]: 2 : CVC5_CAPI_CHECK_NOT_NULL(plugin);
[ - - ]
5449 : 2 : cvc5->d_plugin.reset(new Cvc5::PluginCpp(cvc5->d_tm->d_tm, cvc5, plugin));
5450 : 2 : cvc5->d_solver.addPlugin(*cvc5->d_plugin);
5451 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5452 : 2 : }
5453 : :
5454 : 7 : Cvc5Term cvc5_get_interpolant(Cvc5* cvc5, Cvc5Term conj)
5455 : : {
5456 : 7 : Cvc5Term res = nullptr;
5457 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
5458 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5459 [ + + ][ + + ]: 5 : CVC5_CAPI_CHECK_TERM(conj);
[ - - ]
5460 : 3 : cvc5::Term cres = cvc5->d_solver.getInterpolant(conj->d_term);
5461 [ - + ]: 2 : res = cres.isNull() ? nullptr : cvc5->d_tm->export_term(cres);
5462 [ + - ][ - + ]: 7 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5463 : 7 : return res;
5464 : : }
5465 : :
5466 : 8 : Cvc5Term cvc5_get_interpolant_with_grammar(Cvc5* cvc5,
5467 : : Cvc5Term conj,
5468 : : Cvc5Grammar grammar)
5469 : : {
5470 : 8 : Cvc5Term res = nullptr;
5471 : 8 : CVC5_CAPI_TRY_CATCH_BEGIN;
5472 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5473 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_TERM(conj);
[ - - ]
5474 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_GRAMMAR(grammar);
[ - - ]
5475 : : cvc5::Term cres =
5476 : 5 : cvc5->d_solver.getInterpolant(conj->d_term, grammar->d_grammar);
5477 [ - + ]: 2 : res = cres.isNull() ? nullptr : cvc5->d_tm->export_term(cres);
5478 [ + - ][ - + ]: 8 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5479 : 8 : return res;
5480 : : }
5481 : :
5482 : 2 : Cvc5Term cvc5_get_interpolant_next(Cvc5* cvc5)
5483 : : {
5484 : 2 : Cvc5Term res = nullptr;
5485 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
5486 : 2 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
5487 : 1 : cvc5::Term cres = cvc5->d_solver.getInterpolantNext();
5488 [ - + ]: 1 : res = cres.isNull() ? nullptr : cvc5->d_tm->export_term(cres);
5489 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5490 : 2 : return res;
5491 : : }
5492 : :
5493 : 8 : Cvc5Term cvc5_get_abduct(Cvc5* cvc5, Cvc5Term conj)
5494 : : {
5495 : 8 : Cvc5Term res = nullptr;
5496 : 8 : CVC5_CAPI_TRY_CATCH_BEGIN;
5497 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5498 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_TERM(conj);
[ - - ]
5499 : 4 : cvc5::Term cres = cvc5->d_solver.getAbduct(conj->d_term);
5500 [ - + ]: 2 : res = cres.isNull() ? nullptr : cvc5->d_tm->export_term(cres);
5501 [ + - ][ - + ]: 8 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5502 : 8 : return res;
5503 : : }
5504 : :
5505 : 8 : Cvc5Term cvc5_get_abduct_with_grammar(Cvc5* cvc5,
5506 : : Cvc5Term conj,
5507 : : Cvc5Grammar grammar)
5508 : : {
5509 : 8 : Cvc5Term res = nullptr;
5510 : 8 : CVC5_CAPI_TRY_CATCH_BEGIN;
5511 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5512 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_TERM(conj);
[ - - ]
5513 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_GRAMMAR(grammar);
[ - - ]
5514 : 5 : cvc5::Term cres = cvc5->d_solver.getAbduct(conj->d_term, grammar->d_grammar);
5515 [ - + ]: 2 : res = cres.isNull() ? nullptr : cvc5->d_tm->export_term(cres);
5516 [ + - ][ - + ]: 8 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5517 : 8 : return res;
5518 : : }
5519 : :
5520 : 2 : Cvc5Term cvc5_get_abduct_next(Cvc5* cvc5)
5521 : : {
5522 : 2 : Cvc5Term res = nullptr;
5523 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
5524 : 2 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
5525 : 1 : cvc5::Term cres = cvc5->d_solver.getAbductNext();
5526 [ - + ]: 1 : res = cres.isNull() ? nullptr : cvc5->d_tm->export_term(cres);
5527 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5528 : 2 : return res;
5529 : : }
5530 : :
5531 : 4 : void cvc5_block_model(Cvc5* cvc5, Cvc5BlockModelsMode mode)
5532 : : {
5533 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
5534 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5535 : 3 : cvc5->d_solver.blockModel(static_cast<cvc5::modes::BlockModelsMode>(mode));
5536 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5537 : 4 : }
5538 : :
5539 : 9 : void cvc5_block_model_values(Cvc5* cvc5, size_t size, const Cvc5Term terms[])
5540 : : {
5541 : 9 : CVC5_CAPI_TRY_CATCH_BEGIN;
5542 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5543 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_NOT_NULL(terms);
[ - - ]
5544 : 7 : std::vector<cvc5::Term> cterms;
5545 [ + + ]: 13 : for (size_t i = 0; i < size; ++i)
5546 : : {
5547 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_TERM_AT_IDX(terms, i);
[ - - ]
5548 : 6 : cterms.push_back(terms[i]->d_term);
5549 : : }
5550 : 6 : cvc5->d_solver.blockModelValues(cterms);
5551 [ + - ][ - + ]: 13 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5552 : 9 : }
5553 : :
5554 : 3 : const char* cvc5_get_instantiations(Cvc5* cvc5)
5555 : : {
5556 [ + + ]: 3 : static thread_local std::string str;
5557 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
5558 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5559 : 2 : str = cvc5->d_solver.getInstantiations();
5560 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5561 : 3 : return str.c_str();
5562 : : }
5563 : :
5564 : 7 : void cvc5_push(Cvc5* cvc5, uint32_t nscopes)
5565 : : {
5566 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
5567 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5568 : 6 : cvc5->d_solver.push(nscopes);
5569 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5570 : 7 : }
5571 : :
5572 : 7 : void cvc5_pop(Cvc5* cvc5, uint32_t nscopes)
5573 : : {
5574 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
5575 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5576 : 6 : cvc5->d_solver.pop(nscopes);
5577 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5578 : 7 : }
5579 : :
5580 : 4 : void cvc5_reset_assertions(Cvc5* cvc5)
5581 : : {
5582 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
5583 [ - + ][ - + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5584 : 4 : cvc5->d_solver.resetAssertions();
5585 [ - - ][ - - ]: 0 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5586 : 4 : }
5587 : :
5588 : 4 : const char* cvc5_proof_to_string(Cvc5* cvc5,
5589 : : Cvc5Proof proof,
5590 : : Cvc5ProofFormat format,
5591 : : size_t size,
5592 : : const Cvc5Term assertions[],
5593 : : const char* names[])
5594 : : {
5595 [ + + ]: 4 : static thread_local std::string str;
5596 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
5597 [ - + ][ - + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5598 [ - + ][ - + ]: 4 : CVC5_CAPI_CHECK_PROOF(proof);
[ - - ]
5599 [ + + ][ + - ]: 4 : CVC5_API_CHECK(assertions || names == nullptr) << "unexpected NULL argument";
[ - + ][ - + ]
[ - - ]
5600 : 4 : std::map<cvc5::Term, std::string> cassertion_names;
5601 [ + + ]: 4 : if (assertions)
5602 : : {
5603 [ + + ]: 3 : for (size_t i = 0; i < size; ++i)
5604 : : {
5605 : 2 : cassertion_names.emplace(assertions[i]->d_term, names[i]);
5606 : : }
5607 : : }
5608 : 8 : str = proof->d_cvc5->d_solver.proofToString(
5609 : 4 : proof->d_proof,
5610 : : static_cast<cvc5::modes::ProofFormat>(format),
5611 : 4 : cassertion_names);
5612 [ - - ][ - - ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5613 : 4 : return str.c_str();
5614 : : }
5615 : :
5616 : 8 : Cvc5Term cvc5_declare_sygus_var(Cvc5* cvc5, const char* symbol, Cvc5Sort sort)
5617 : : {
5618 : 8 : Cvc5Term res = nullptr;
5619 : 8 : CVC5_CAPI_TRY_CATCH_BEGIN;
5620 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5621 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_NOT_NULL(symbol);
[ - - ]
5622 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
5623 : 3 : res = cvc5->d_tm->export_term(
5624 : 12 : cvc5->d_solver.declareSygusVar(symbol, sort->d_sort));
5625 [ + - ][ - + ]: 5 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5626 : 8 : return res;
5627 : : }
5628 : :
5629 : 39 : Cvc5Grammar cvc5_mk_grammar(Cvc5* cvc5,
5630 : : size_t nbound_vars,
5631 : : const Cvc5Term bound_vars[],
5632 : : size_t nsymbols,
5633 : : const Cvc5Term symbols[])
5634 : : {
5635 : 39 : Cvc5Grammar res = nullptr;
5636 : 39 : CVC5_CAPI_TRY_CATCH_BEGIN;
5637 [ + + ][ + + ]: 39 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5638 [ + + ][ + + ]: 38 : CVC5_CAPI_CHECK_NOT_NULL(symbols);
[ - - ]
5639 : 33 : std::vector<cvc5::Term> cbound_vars;
5640 [ + + ]: 33 : if (nbound_vars)
5641 : : {
5642 [ + + ]: 34 : for (size_t i = 0; i < nbound_vars; ++i)
5643 : : {
5644 : 17 : cbound_vars.push_back(bound_vars[i]->d_term);
5645 : : }
5646 : : }
5647 : 33 : std::vector<cvc5::Term> csymbols;
5648 [ + + ]: 66 : for (size_t i = 0; i < nsymbols; ++i)
5649 : : {
5650 : 33 : csymbols.push_back(symbols[i]->d_term);
5651 : : }
5652 : 33 : res = cvc5->export_grammar(cvc5->d_solver.mkGrammar(cbound_vars, csymbols));
5653 [ + - ][ - + ]: 43 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5654 : 39 : return res;
5655 : : }
5656 : :
5657 : 12 : Cvc5Term cvc5_synth_fun(Cvc5* cvc5,
5658 : : const char* symbol,
5659 : : size_t size,
5660 : : const Cvc5Term bound_vars[],
5661 : : Cvc5Sort sort)
5662 : : {
5663 : 12 : Cvc5Term res = nullptr;
5664 : 12 : CVC5_CAPI_TRY_CATCH_BEGIN;
5665 [ - + ][ - + ]: 12 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5666 [ - + ][ - + ]: 12 : CVC5_CAPI_CHECK_NOT_NULL(symbol);
[ - - ]
5667 [ - + ][ - + ]: 12 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
5668 : 12 : std::vector<cvc5::Term> cbound_vars;
5669 [ + + ]: 12 : if (size)
5670 : : {
5671 [ + + ]: 2 : for (size_t i = 0; i < size; ++i)
5672 : : {
5673 : 1 : cbound_vars.push_back(bound_vars[i]->d_term);
5674 : : }
5675 : : }
5676 : 12 : res = cvc5->d_tm->export_term(
5677 : 24 : cvc5->d_solver.synthFun(symbol, cbound_vars, sort->d_sort));
5678 [ - - ][ - - ]: 12 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5679 : 12 : return res;
5680 : : }
5681 : :
5682 : 13 : Cvc5Term cvc5_synth_fun_with_grammar(Cvc5* cvc5,
5683 : : const char* symbol,
5684 : : size_t size,
5685 : : const Cvc5Term bound_vars[],
5686 : : Cvc5Sort sort,
5687 : : Cvc5Grammar grammar)
5688 : : {
5689 : 13 : Cvc5Term res = nullptr;
5690 : 13 : CVC5_CAPI_TRY_CATCH_BEGIN;
5691 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5692 [ - + ][ - + ]: 12 : CVC5_CAPI_CHECK_NOT_NULL(symbol);
[ - - ]
5693 [ + + ][ + + ]: 12 : CVC5_CAPI_CHECK_SORT(sort);
[ - - ]
5694 [ + + ][ + + ]: 11 : CVC5_CAPI_CHECK_GRAMMAR(grammar);
[ - - ]
5695 : 10 : std::vector<cvc5::Term> cbound_vars;
5696 [ + + ]: 10 : if (size)
5697 : : {
5698 [ + + ]: 8 : for (size_t i = 0; i < size; ++i)
5699 : : {
5700 : 4 : cbound_vars.push_back(bound_vars[i]->d_term);
5701 : : }
5702 : : }
5703 : 22 : res = cvc5->d_tm->export_term(cvc5->d_solver.synthFun(
5704 : 10 : symbol, cbound_vars, sort->d_sort, grammar->d_grammar));
5705 [ + - ][ - + ]: 17 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5706 : 13 : return res;
5707 : : }
5708 : :
5709 : 13 : void cvc5_add_sygus_constraint(Cvc5* cvc5, Cvc5Term term)
5710 : : {
5711 : 13 : CVC5_CAPI_TRY_CATCH_BEGIN;
5712 [ + + ][ + + ]: 13 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5713 [ + + ][ + + ]: 12 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
5714 : 11 : cvc5->d_solver.addSygusConstraint(term->d_term);
5715 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5716 : 13 : }
5717 : :
5718 : 3 : const Cvc5Term* cvc5_get_sygus_constraints(Cvc5* cvc5, size_t* size)
5719 : : {
5720 [ + + ]: 3 : static thread_local std::vector<Cvc5Term> res;
5721 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
5722 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5723 : 2 : CVC5_CAPI_CHECK_NOT_NULL(size);
5724 : 1 : res.clear();
5725 : 1 : auto terms = cvc5->d_solver.getSygusConstraints();
5726 [ + + ]: 3 : for (auto& t : terms)
5727 : : {
5728 : 2 : res.push_back(cvc5->d_tm->export_term(t));
5729 : : }
5730 : 1 : *size = res.size();
5731 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5732 : : // On error, `size` may be invalid (e.g. NULL) and `res` may hold stale data,
5733 : : // so we must not dereference `size` here; gate on the error state instead.
5734 [ + + ][ + - ]: 3 : return cvc5::cvc5_capi_has_error() || res.empty() ? nullptr : res.data();
5735 : : }
5736 : :
5737 : 9 : void cvc5_add_sygus_assume(Cvc5* cvc5, Cvc5Term term)
5738 : : {
5739 : 9 : CVC5_CAPI_TRY_CATCH_BEGIN;
5740 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5741 [ + + ][ + + ]: 8 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
5742 : 7 : cvc5->d_solver.addSygusAssume(term->d_term);
5743 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5744 : 9 : }
5745 : :
5746 : 3 : const Cvc5Term* cvc5_get_sygus_assumptions(Cvc5* cvc5, size_t* size)
5747 : : {
5748 [ + + ]: 3 : static thread_local std::vector<Cvc5Term> res;
5749 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
5750 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5751 : 2 : CVC5_CAPI_CHECK_NOT_NULL(size);
5752 : 1 : res.clear();
5753 : 1 : auto terms = cvc5->d_solver.getSygusAssumptions();
5754 [ + + ]: 5 : for (auto& t : terms)
5755 : : {
5756 : 4 : res.push_back(cvc5->d_tm->export_term(t));
5757 : : }
5758 : 1 : *size = res.size();
5759 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5760 : : // On error, `size` may be invalid (e.g. NULL) and `res` may hold stale data,
5761 : : // so we must not dereference `size` here; gate on the error state instead.
5762 [ + + ][ + - ]: 3 : return cvc5::cvc5_capi_has_error() || res.empty() ? nullptr : res.data();
5763 : : }
5764 : :
5765 : 20 : void cvc5_add_sygus_inv_constraint(
5766 : : Cvc5* cvc5, Cvc5Term inv, Cvc5Term pre, Cvc5Term trans, Cvc5Term post)
5767 : : {
5768 : 20 : CVC5_CAPI_TRY_CATCH_BEGIN;
5769 [ + + ][ + + ]: 20 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5770 [ + + ][ + + ]: 19 : CVC5_CAPI_CHECK_TERM(inv);
[ - - ]
5771 [ + + ][ + + ]: 18 : CVC5_CAPI_CHECK_TERM(pre);
[ - - ]
5772 [ + + ][ + + ]: 17 : CVC5_CAPI_CHECK_TERM(trans);
[ - - ]
5773 [ + + ][ + + ]: 16 : CVC5_CAPI_CHECK_TERM(post);
[ - - ]
5774 : 15 : cvc5->d_solver.addSygusInvConstraint(
5775 : 15 : inv->d_term, pre->d_term, trans->d_term, post->d_term);
5776 [ + - ][ - + ]: 18 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5777 : 20 : }
5778 : :
5779 : 14 : Cvc5SynthResult cvc5_check_synth(Cvc5* cvc5)
5780 : : {
5781 : 14 : Cvc5SynthResult res = nullptr;
5782 : 14 : CVC5_CAPI_TRY_CATCH_BEGIN;
5783 [ + + ][ + + ]: 14 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5784 : 13 : res = cvc5->export_synth_result(cvc5->d_solver.checkSynth());
5785 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5786 : 14 : return res;
5787 : : }
5788 : :
5789 : 4 : Cvc5SynthResult cvc5_check_synth_next(Cvc5* cvc5)
5790 : : {
5791 : 4 : Cvc5SynthResult res = nullptr;
5792 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
5793 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5794 : 3 : res = cvc5->export_synth_result(cvc5->d_solver.checkSynthNext());
5795 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5796 : 4 : return res;
5797 : : }
5798 : :
5799 : 7 : Cvc5Term cvc5_get_synth_solution(Cvc5* cvc5, Cvc5Term term)
5800 : : {
5801 : 7 : Cvc5Term res = nullptr;
5802 : 7 : CVC5_CAPI_TRY_CATCH_BEGIN;
5803 [ + + ][ + + ]: 7 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5804 [ + + ][ + + ]: 6 : CVC5_CAPI_CHECK_TERM(term);
[ - - ]
5805 : 5 : res = cvc5->d_tm->export_term(cvc5->d_solver.getSynthSolution(term->d_term));
5806 [ + - ][ - + ]: 5 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5807 : 7 : return res;
5808 : : }
5809 : :
5810 : 10 : const Cvc5Term* cvc5_get_synth_solutions(Cvc5* cvc5,
5811 : : size_t size,
5812 : : const Cvc5Term terms[])
5813 : : {
5814 [ + + ]: 10 : static thread_local std::vector<Cvc5Term> res;
5815 : 10 : CVC5_CAPI_TRY_CATCH_BEGIN;
5816 [ + + ][ + + ]: 10 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5817 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_NOT_NULL(terms);
[ - - ]
5818 : 8 : res.clear();
5819 : 8 : std::vector<cvc5::Term> cterms;
5820 [ + + ]: 16 : for (size_t i = 0; i < size; ++i)
5821 : : {
5822 [ + + ][ + + ]: 9 : CVC5_CAPI_CHECK_TERM_AT_IDX(terms, i);
[ - - ]
5823 : 8 : cterms.push_back(terms[i]->d_term);
5824 : : }
5825 : 7 : auto rterms = cvc5->d_solver.getSynthSolutions(cterms);
5826 [ + + ]: 9 : for (auto& t : rterms)
5827 : : {
5828 : 5 : res.push_back(cvc5->d_tm->export_term(t));
5829 : : }
5830 [ + - ][ - + ]: 14 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5831 : 10 : return res.data();
5832 : : }
5833 : :
5834 : 3 : Cvc5Term cvc5_find_synth(Cvc5* cvc5, Cvc5FindSynthTarget target)
5835 : : {
5836 : 3 : Cvc5Term res = nullptr;
5837 : 3 : CVC5_CAPI_TRY_CATCH_BEGIN;
5838 [ + + ][ + + ]: 3 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5839 : 2 : CVC5_CAPI_CHECK_FIND_SYNTH_TARGET(target);
5840 : : cvc5::Term cres = cvc5->d_solver.findSynth(
5841 : 1 : static_cast<cvc5::modes::FindSynthTarget>(target));
5842 [ - + ]: 1 : res = cres.isNull() ? nullptr : cvc5->d_tm->export_term(cres);
5843 [ + - ][ - + ]: 3 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5844 : 3 : return res;
5845 : : }
5846 : :
5847 : 4 : Cvc5Term cvc5_find_synth_with_grammar(Cvc5* cvc5,
5848 : : Cvc5FindSynthTarget target,
5849 : : Cvc5Grammar grammar)
5850 : : {
5851 : 4 : Cvc5Term res = nullptr;
5852 : 4 : CVC5_CAPI_TRY_CATCH_BEGIN;
5853 [ + + ][ + + ]: 4 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
[ - - ]
5854 [ + - ][ + + ]: 3 : CVC5_CAPI_CHECK_FIND_SYNTH_TARGET(target);
[ + + ][ + + ]
[ - - ]
5855 : 2 : CVC5_CAPI_CHECK_GRAMMAR(grammar);
5856 : : cvc5::Term cres = cvc5->d_solver.findSynth(
5857 : 1 : static_cast<cvc5::modes::FindSynthTarget>(target), grammar->d_grammar);
5858 [ - + ]: 1 : res = cres.isNull() ? nullptr : cvc5->d_tm->export_term(cres);
5859 [ + - ][ - + ]: 4 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5860 : 4 : return res;
5861 : : }
5862 : :
5863 : 2 : Cvc5Term cvc5_find_synth_next(Cvc5* cvc5)
5864 : : {
5865 : 2 : Cvc5Term res = nullptr;
5866 : 2 : CVC5_CAPI_TRY_CATCH_BEGIN;
5867 : 2 : CVC5_CAPI_CHECK_NOT_NULL(cvc5);
5868 : 1 : cvc5::Term cres = cvc5->d_solver.findSynthNext();
5869 [ - + ]: 1 : res = cres.isNull() ? nullptr : cvc5->d_tm->export_term(cres);
5870 [ + - ][ - + ]: 2 : CVC5_CAPI_TRY_CATCH_END;
[ - - ][ - - ]
[ - - ][ - - ]
[ - ]
5871 : 2 : return res;
5872 : : }
|