• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

SRI-CSL / yices2 / 12367760548

17 Dec 2024 06:41AM UTC coverage: 65.285% (-0.6%) from 65.92%
12367760548

push

github

web-flow
Fixes GitHub coverage issue (#544)

* Update action.yml

* Update action.yml

81020 of 124102 relevant lines covered (65.29%)

1509382.01 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

50.0
/src/terms/term_manager.h
1
/*
2
 * This file is part of the Yices SMT Solver.
3
 * Copyright (C) 2017 SRI International.
4
 *
5
 * Yices is free software: you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation, either version 3 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * Yices is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with Yices.  If not, see <http://www.gnu.org/licenses/>.
17
 */
18

19
/*
20
 * TERM MANAGER
21
 */
22

23
/*
24
 * A term manager includes a term_table and auxiliary buffers and data
25
 * structures that are used to implement term constructors and
26
 * simplifications.
27
 *
28
 * Most of this used to be in 'yices_api.c' and relied on global variables.
29
 * A term_manager is more flexible and modular. It enables use of independent
30
 * term tables.
31
 */
32

33
#ifndef __TERM_MANAGER_H
34
#define __TERM_MANAGER_H
35

36
#include <stdint.h>
37

38
#include "terms/bvlogic_buffers.h"
39
#include "terms/terms.h"
40

41

42
/*
43
 * Internal components:
44
 * - terms = pointer to a term table
45
 * - pprod = pointer to a power-product table
46
 * - types = pointer to an external type table.
47
 *
48
 * Optional components allocated and initialized lazily:
49
 * - nodes = node table for bvlogic buffer
50
 * - bvarith_store = store for bitvector monomials (large coefficients)
51
 * - bvarith64_store = store for bitvector monomials (64bit coefficients)
52
 *
53
 * Internal buffers: allocated lazily too
54
 * - arith_buffer = for arithmetic polynomials
55
 * - bvarith_buffer = for bit-vector polynomials
56
 * - bvlogic_buffer = for other bit-vector constructs
57
 * - pp_buffer = for power products
58
 *
59
 * Auxiliary objects:
60
 * - r0: rational buffer
61
 * - bv0, bv1, bv2: buffers to store bitvector constants
62
 * - vector0: vector of integers
63
 *
64
 * Options:
65
 * - simplify_ite = true if ite simplication is enabled
66
 * - simplify_bveq1 = true if bitvector equalities of size 1 can simplify to Boolean
67
 */
68
typedef struct term_manager_s {
69
  term_table_t *terms;
70
  type_table_t *types;
71
  pprod_table_t *pprods;
72

73
  rba_buffer_t *arith_buffer;
74
  bvarith_buffer_t *bvarith_buffer;
75
  bvarith64_buffer_t *bvarith64_buffer;
76
  bvlogic_buffer_t *bvlogic_buffer;
77
  pp_buffer_t *pp_buffer;
78

79
  object_store_t *bvarith_store;
80
  object_store_t *bvarith64_store;
81
  node_table_t *nodes;
82

83
  rational_t r0;
84
  bvconstant_t bv0;
85
  bvconstant_t bv1;
86
  bvconstant_t bv2;
87
  ivector_t vector0;
88

89
  bool simplify_ite;
90
  bool simplify_bveq1;
91
  bool simplify_bvite_offset;
92

93
} term_manager_t;
94

95

96

97
/*
98
 * GLOBAL OPERATIONS
99
 */
100

101
/*
102
 * Initialization:
103
 * - terms = attached term table
104
 */
105
extern void init_term_manager(term_manager_t *manager, term_table_t *terms);
106

107

108
/*
109
 * Delete all: free memory
110
 */
111
extern void delete_term_manager(term_manager_t *manager);
112

113

114
/*
115
 * Reset:
116
 * - free the internal buffers and empty the stores
117
 */
118
extern void reset_term_manager(term_manager_t *manager);
119

120

121

122
/*
123
 * Get the internal components
124
 */
125
static inline term_table_t *term_manager_get_terms(term_manager_t *manager) {
26,205,749✔
126
  return manager->terms;
26,205,749✔
127
}
128

129
static inline pprod_table_t *term_manager_get_pprods(term_manager_t *manager) {
130
  return manager->pprods;
131
}
132

133
static inline type_table_t *term_manager_get_types(term_manager_t *manager) {
×
134
  return manager->types;
×
135
}
136

137

138
/*
139
 * Access to the internal stores:
140
 * - the store is allocated and initialized if needed
141
 */
142
extern node_table_t *term_manager_get_nodes(term_manager_t *manager);
143
extern object_store_t *term_manager_get_bvarith_store(term_manager_t *manager);
144
extern object_store_t *term_manager_get_bvarith64_store(term_manager_t *manager);
145

146

147
/*
148
 * Access to the internal buffers:
149
 * - they are allocated and initialized if needed (and the store they need too)
150
 *
151
 * WARNING:
152
 * - the term constructors may modify these buffers
153
 */
154
extern rba_buffer_t *term_manager_get_arith_buffer(term_manager_t *manager);
155
extern bvarith_buffer_t *term_manager_get_bvarith_buffer(term_manager_t *manager);
156
extern bvarith64_buffer_t *term_manager_get_bvarith64_buffer(term_manager_t *manager);
157
extern bvlogic_buffer_t *term_manager_get_bvlogic_buffer(term_manager_t *manager);
158
extern pp_buffer_t *term_manager_get_pp_buffer(term_manager_t *manager);
159

160

161
/*
162
 * BOOLEAN TERM CONSTRUCTORS
163
 */
164

165
/*
166
 * Binary constructor: both x and y must be Boolean terms (in manager->terms)
167
 * - all constructors apply the obvious simplifications
168
 * - and is converted to not (or (not ..) ...)
169
 * - iff and binary xor are turned into a binary equality between Boolean terms
170
 */
171
extern term_t mk_binary_or(term_manager_t *manager, term_t x, term_t y);
172
extern term_t mk_binary_and(term_manager_t *manager, term_t x, term_t y);
173
extern term_t mk_binary_xor(term_manager_t *manager, term_t x, term_t y);
174
extern term_t mk_implies(term_manager_t *manager, term_t x, term_t y);
175
extern term_t mk_iff(term_manager_t *manager, term_t x, term_t y);
176

177

178
/*
179
 * Boolean if-then-else: (ite c x y)
180
 * - both x and y must be Boolean (and c too)
181
 */
182
extern term_t mk_bool_ite(term_manager_t *manager, term_t c, term_t x, term_t y);
183

184

185
/*
186
 * N-ary constructors
187
 * - n = number of arguments (must be positive and no more than YICES_MAX_ARITY)
188
 * - a = array of n Boolean terms
189
 *
190
 * SIDE EFFECT: a is modified
191
 */
192
extern term_t mk_or(term_manager_t *manager, uint32_t n, term_t a[]);
193
extern term_t mk_and(term_manager_t *manager, uint32_t n, term_t a[]);
194
extern term_t mk_xor(term_manager_t *manager, uint32_t n, term_t a[]);
195

196

197
/*
198
 * Variants: do not modify a
199
 */
200
extern term_t mk_or_safe(term_manager_t *manager, uint32_t n, const term_t a[]);
201
extern term_t mk_and_safe(term_manager_t *manager, uint32_t n, const term_t a[]);
202
extern term_t mk_xor_safe(term_manager_t *manager, uint32_t n, const term_t a[]);
203

204

205

206
/*
207
 * GENERIC CONSTRUCTORS
208
 */
209

210
/*
211
 * Constant of type tau and index i
212
 * - tau must be uninterpreted or scalar type
213
 * - i must be non-negative and smaller than the size of tau
214
 *   (which matters only if tau is scalar)
215
 */
216
extern term_t mk_constant(term_manager_t *manager, type_t tau, int32_t i);
217

218

219
/*
220
 * New uninterpreted term (global variable) of type tau
221
 */
222
extern term_t mk_uterm(term_manager_t *manager, type_t tau);
223

224

225
/*
226
 * Fresh variable of type tau (for quantifiers)
227
 */
228
extern term_t mk_variable(term_manager_t *manager, type_t tau);
229

230

231
/*
232
 * Function application:
233
 * - fun must have arity n
234
 * - arg = array of n arguments
235
 * - the argument types much match the domain of f
236
 */
237
extern term_t mk_application(term_manager_t *manager, term_t fun, uint32_t n, const term_t arg[]);
238

239

240
/*
241
 * If-then-else: (if c then t else e)
242
 * - c must be Boolean
243
 * - t and e must have compatible types tau1 and tau2
244
 * - tau must be the least common supertype of tau1 and tau2
245
 */
246
extern term_t mk_ite(term_manager_t *manager, term_t c, term_t t, term_t e, type_t tau);
247

248

249
/*
250
 * Equality: t1 and t2 must have compatible types
251
 */
252
extern term_t mk_eq(term_manager_t *manager, term_t t1, term_t t2);
253
extern term_t mk_neq(term_manager_t *manager, term_t t1, term_t t2);  // t1 != t2
254

255

256
/*
257
 * Array equality:
258
 * - given two arrays a and b of n term, build
259
 *   (and (= a[0] b[0]) ... (= a[n-1] b[n-1])
260
 */
261
extern term_t mk_array_eq(term_manager_t *manager, uint32_t n, const term_t a[], const term_t b[]);
262

263

264
/*
265
 * Array inequality:
266
 * - given two arrays a and b of n terms, build the term
267
 *   (or (/= a[0] b[0]) ... (/= a[n-1] b[n-1]))
268
 */
269
extern term_t mk_array_neq(term_manager_t *manager, uint32_t n, const term_t a[], const term_t b[]);
270

271

272
/*
273
 * Tuple constructor:
274
 * - arg = array of n terms
275
 * - n must be positive and no more than YICES_MAX_ARITY
276
 */
277
extern term_t mk_tuple(term_manager_t *manager, uint32_t n, const term_t arg[]);
278

279

280
/*
281
 * Projection: component i of tuple
282
 */
283
extern term_t mk_select(term_manager_t *manager, uint32_t i, term_t tuple);
284

285

286
/*
287
 * Function update: (update f (arg[0] ... arg[n-1]) new_v)
288
 * - f must have function type and arity n
289
 */
290
extern term_t mk_update(term_manager_t *manager, term_t fun, uint32_t n, const term_t arg[], term_t new_v);
291

292

293
/*
294
 * Distinct: all terms arg[0] ... arg[n-1] must have compatible types
295
 * - n must be positive and no more than YICES_MAX_ARITY
296
 * - arg[] may be modified (sorted)
297
 */
298
extern term_t mk_distinct(term_manager_t *manager, uint32_t n, term_t arg[]);
299

300

301
/*
302
 * Tuple update: replace component i of tuple by new_v
303
 */
304
extern term_t mk_tuple_update(term_manager_t *manager, term_t tuple, uint32_t index, term_t new_v);
305

306

307
/*
308
 * Quantifiers:
309
 * - n = number of variables (n must be positive and no more than YICES_MAX_VAR)
310
 * - all variables v[0 ... n-1] must be distinct
311
 * - body must be a Boolean term
312
 */
313
extern term_t mk_forall(term_manager_t *manager, uint32_t n, const term_t v[], term_t body);
314
extern term_t mk_exists(term_manager_t *manager, uint32_t n, const term_t v[], term_t body);
315

316

317
/*
318
 * Lambda terms:
319
 * - n = number of variables (must be positive and no more than YICES_MAX_VAR)
320
 * - all variables v[0 ... n-1] must be distinct
321
 */
322
extern term_t mk_lambda(term_manager_t *manager, uint32_t n, const term_t v[], term_t body);
323

324

325

326
/*
327
 * ARITHMETIC TERM AND ATOM CONSTRUCTORS
328
 */
329

330
/*
331
 * Arithmetic constant
332
 * - r must be normalized
333
 */
334
extern term_t mk_arith_constant(term_manager_t *manager, rational_t *r);
335

336

337
/*
338
 * Convert b to an arithmetic term:
339
 * - b->ptbl must be equal to manager->pprods
340
 * - b may be the same as manager->arith_buffer
341
 * - side effect: b is reset
342
 *
343
 * - if b is a constant then a constant rational is created
344
 * - if b is of the form 1. t then t is returned
345
 * - if b is of the from 1. t_1^d_1 ... t_n^d_n then a power product is returned
346
 * - otherwise a polynomial term is created
347
 */
348
extern term_t mk_arith_term(term_manager_t *manager, rba_buffer_t *b);
349

350
/*
351
 * Variant: use the term table
352
 */
353
extern term_t mk_direct_arith_term(term_table_t *tbl, rba_buffer_t *b);
354

355

356
/*
357
 * Create an arithmetic atom from the content of buffer b:
358
 * - b->ptbl must be equal to manager->pprods
359
 * - b may be the same as manager->arith_buffer
360
 * - all functions normalize b first
361
 * - side effect: b is reset
362
 */
363
extern term_t mk_arith_eq0(term_manager_t *manager, rba_buffer_t *b);   // b == 0
364
extern term_t mk_arith_neq0(term_manager_t *manager, rba_buffer_t *b);  // b != 0
365
extern term_t mk_arith_geq0(term_manager_t *manager, rba_buffer_t *b);  // b >= 0
366
extern term_t mk_arith_leq0(term_manager_t *manager, rba_buffer_t *b);  // b <= 0
367
extern term_t mk_arith_gt0(term_manager_t *manager, rba_buffer_t *b);   // b > 0
368
extern term_t mk_arith_lt0(term_manager_t *manager, rba_buffer_t *b);   // b < 0
369

370

371
/*
372
 * Variant: create an arithmetic atom from term t
373
 */
374
extern term_t mk_arith_term_eq0(term_manager_t *manager, term_t t);   // t == 0
375
extern term_t mk_arith_term_neq0(term_manager_t *manager, term_t t);  // t != 0
376
extern term_t mk_arith_term_geq0(term_manager_t *manager, term_t t);  // t >= 0
377
extern term_t mk_arith_term_leq0(term_manager_t *manager, term_t t);  // t <= 0
378
extern term_t mk_arith_term_gt0(term_manager_t *manager, term_t t);   // t > 0
379
extern term_t mk_arith_term_lt0(term_manager_t *manager, term_t t);   // t < 0
380

381

382

383
/*
384
 * Binary atoms
385
 * - t1 and t2 must be arithmetic terms in manager->terms
386
 */
387
extern term_t mk_arith_eq(term_manager_t *manager, term_t t1, term_t t2);   // t1 == t2
388
extern term_t mk_arith_neq(term_manager_t *manager, term_t t1, term_t t2);  // t1 != t2
389
extern term_t mk_arith_geq(term_manager_t *manager, term_t t1, term_t t2);  // t1 >= t2
390
extern term_t mk_arith_leq(term_manager_t *manager, term_t t1, term_t t2);  // t1 <= t2
391
extern term_t mk_arith_gt(term_manager_t *manager, term_t t1, term_t t2);   // t1 > t2
392
extern term_t mk_arith_lt(term_manager_t *manager, term_t t1, term_t t2);   // t1 < t2
393

394

395
/*
396
 * Variants: direct construction/simplification from a term table
397
 * These functions normalize b then create an atom
398
 * - side effect: b is reset
399
 * If simplify_ite is true, simplifications are enabled
400
 */
401
extern term_t mk_direct_arith_geq0(term_table_t *tbl, rba_buffer_t *b, bool simplify_ite);  // b >= 0
402
extern term_t mk_direct_arith_leq0(term_table_t *tbl, rba_buffer_t *b, bool simplify_ite);  // b <= 0
403
extern term_t mk_direct_arith_gt0(term_table_t *tbl, rba_buffer_t *b, bool simplify_ite);   // b > 0
404
extern term_t mk_direct_arith_lt0(term_table_t *tbl, rba_buffer_t *b, bool simplify_ite);   // b < 0
405
extern term_t mk_direct_arith_eq0(term_table_t *tbl, rba_buffer_t *b, bool simplify_ite);   // b == 0
406

407

408
/*
409
 * Arithmetic root atom.
410
 */
411
extern term_t mk_arith_root_atom(term_manager_t* manager, uint32_t k, term_t x, term_t p, root_atom_rel_t r);
412

413
/*
414
 * Arithmetic root atom (b is a buffer that can be cleared and used for computation).
415
 */
416
extern term_t mk_direct_arith_root_atom(rba_buffer_t* b, term_table_t* terms, uint32_t k, term_t x, term_t p, root_atom_rel_t r, bool simplify_ite);
417

418

419
/*
420
 * Arithmetic root atoms.
421
 */
422
extern term_t mk_arith_root_atom_lt(term_manager_t *manager, uint32_t k, term_t x, term_t p);
423
extern term_t mk_arith_root_atom_leq(term_manager_t *manager, uint32_t k, term_t x, term_t p);
424
extern term_t mk_arith_root_atom_eq(term_manager_t *manager, uint32_t k, term_t x, term_t p);
425
extern term_t mk_arith_root_atom_neq(term_manager_t *manager, uint32_t k, term_t x, term_t p);
426
extern term_t mk_arith_root_atom_gt(term_manager_t *manager, uint32_t k, term_t x, term_t p);
427
extern term_t mk_arith_root_atom_geq(term_manager_t *manager, uint32_t k, term_t x, term_t p);
428

429

430
/*
431
 * Arithmetic root atoms (direct versions).
432
 */
433
extern term_t mk_direct_arith_root_atom_lt(rba_buffer_t* b, term_table_t* terms, uint32_t k, term_t x, term_t p, bool simplify_ite);
434
extern term_t mk_direct_arith_root_atom_leq(rba_buffer_t* b, term_table_t* terms, uint32_t k, term_t x, term_t p, bool simplify_ite);
435
extern term_t mk_direct_arith_root_atom_eq(rba_buffer_t* b, term_table_t* terms, uint32_t k, term_t x, term_t p, bool simplify_ite);
436
extern term_t mk_direct_arith_root_atom_neq(rba_buffer_t* b, term_table_t* terms, uint32_t k, term_t x, term_t p, bool simplify_ite);
437
extern term_t mk_direct_arith_root_atom_gt(rba_buffer_t* b, term_table_t* terms, uint32_t k, term_t x, term_t p, bool simplify_ite);
438
extern term_t mk_direct_arith_root_atom_geq(rba_buffer_t* b, term_table_t* terms, uint32_t k, term_t x, term_t p, bool simplify_ite);
439

440

441

442
/*
443
 * More arithmetic constructs for div/mod and mixed arithmetic
444
 * - these are to support SMT-LIB 2 operators
445
 */
446
extern term_t mk_arith_is_int(term_manager_t *manager, term_t t);              // is_int t
447
extern term_t mk_arith_idiv(term_manager_t *manager, term_t t1, term_t t2);    // (div t1 t2)
448
extern term_t mk_arith_mod(term_manager_t *manager, term_t t1, term_t t2);     // (mod t1 t2)
449
extern term_t mk_arith_divides(term_manager_t *manager, term_t t1, term_t t2); // t1 divides t2
450

451
extern term_t mk_arith_abs(term_manager_t *manager, term_t t);    // absolute value of t
452
extern term_t mk_arith_floor(term_manager_t *manager, term_t t);  // largest integer <= t
453
extern term_t mk_arith_ceil(term_manager_t *manager, term_t t);   // smallest integer >= t
454

455

456
/*
457
 * Rational division
458
 */
459
extern term_t mk_arith_rdiv(term_manager_t *manager, term_t t1, term_t t2);
460

461

462
/*
463
 * FINITE FIELD ARITHMETIC
464
 */
465

466
/*
467
 * Finite field arithmetic constant
468
 * - r must be normalized wrt. mod
469
 */
470
extern term_t mk_arith_ff_constant(term_manager_t *manager, rational_t *r, rational_t *mod);
471

472
/*
473
 * Convert b to a finite field arithmetic term:
474
 * - b->ptbl must be equal to manager->pprods
475
 * - b may be the same as manager->arith_buffer
476
 * - tau must be a type in manager->types
477
 * - side effect: b is reset
478
 *
479
 * - if b is a constant then a constant finite field is created
480
 * - if b is of the form 1. t then t is returned
481
 * - if b is of the from 1. t_1^d_1 ... t_n^d_n then a power product is returned
482
 * - otherwise a polynomial term is created
483
 */
484
extern term_t mk_arith_ff_term(term_manager_t *manager, rba_buffer_t *b, const rational_t *mod);
485

486
/*
487
 * Variant: use the term table
488
 */
489
extern term_t mk_direct_arith_ff_term(term_table_t *tbl, rba_buffer_t *b, const rational_t *mod);
490

491
/*
492
 * Create a finite field arithmetic atom from the content of buffer b:
493
 * - b->ptbl must be equal to manager->pprods
494
 * - b may be the same as manager->arith_buffer
495
 * - all functions normalize b first
496
 * - tau must be a type in manager->types
497
 * - side effect: b is reset
498
 */
499
extern term_t mk_arith_ff_eq0(term_manager_t *manager, rba_buffer_t *b, const rational_t *mod);   // b == 0
500
extern term_t mk_arith_ff_neq0(term_manager_t *manager, rba_buffer_t *b, const rational_t *mod);  // b != 0
501

502
/*
503
 * Variant: create an arithmetic atom from term t
504
 */
505
extern term_t mk_arith_ff_term_eq0(term_manager_t *manager, term_t t);   // t == 0
506
extern term_t mk_arith_ff_term_neq0(term_manager_t *manager, term_t t);  // t != 0
507

508
/*
509
 * Binary atoms
510
 * - t1 and t2 must be finite field arithmetic terms in manager->terms
511
 * - t1 and t2 must have the same finite field type tau
512
 */
513
extern term_t mk_arith_ff_eq(term_manager_t *manager, term_t t1, term_t t2);   // t1 == t2
514
extern term_t mk_arith_ff_neq(term_manager_t *manager, term_t t1, term_t t2);  // t1 != t2
515

516
/*
517
 * Variants: direct construction/simplification from a term table
518
 * These functions normalize b then create an atom
519
 * - side effect: b is reset
520
 * If simplify_ite is true, simplifications are enabled
521
 */
522
extern term_t mk_direct_arith_ff_eq0(term_table_t *tbl, rba_buffer_t *b, const rational_t *mod, bool simplify_ite);   // b == 0
523

524

525
/*
526
 * BITVECTOR TERMS AND ATOMS
527
 */
528

529
/*
530
 * Bitvector constant:
531
 * - b->bitsize must be positive and no more than YICES_MAX_BVSIZE
532
 */
533
extern term_t mk_bv_constant(term_manager_t *manager, bvconstant_t *b);
534

535

536
/*
537
 * Convert a polynomial buffer to a bitvector terms:
538
 * - b must use the same pprod as manager (i.e., b->ptbl = &manager->pprods)
539
 * - b may be equal to manager->bvarith_buffer
540
 * - side effect: b is reset
541
 *
542
 * This normalizes b first then check for the following:
543
 * 1) b reduced to a single variable x: return x
544
 * 2) b reduced to a power product pp: return pp
545
 * 3) b is constant, return a BV64_CONSTANT or BV_CONSTANT term
546
 * 4) b can be converted to a BV_ARRAY term (by converting + and *
547
 *    to bitwise or and shift): return the BV_ARRAY
548
 *
549
 * Otherwise, build a bit-vector polynomial.
550
 */
551
extern term_t mk_bvarith_term(term_manager_t *manager, bvarith_buffer_t *b);
552

553

554
/*
555
 * Same thing for a 64bit coefficient buffer
556
 */
557
extern term_t mk_bvarith64_term(term_manager_t *manager, bvarith64_buffer_t *b);
558

559

560
/*
561
 * Same thing for a logical buffer b (array of bits), then reset b.
562
 * - b must not be empty.
563
 * - build a bitvector constant if possible
564
 * - if b is of the form (select 0 t) ... (select k t) and t has bitsize (k+1)
565
 *   then return t
566
 * - otherwise build a bitarray term
567
 */
568
extern term_t mk_bvlogic_term(term_manager_t *manager, bvlogic_buffer_t *b);
569

570

571
/*
572
 * Bit-vector if-then-else (ite c t e)
573
 * - c must be Boolean
574
 * - t and e must bitvector terms of the same type
575
 */
576
extern term_t mk_bv_ite(term_manager_t *manager, term_t c, term_t t, term_t e);
577

578

579
/*
580
 * Bit array
581
 * - a must be an array of n boolean terms
582
 * - n must be positive and no more than YICES_MAX_BVSIZE
583
 */
584
extern term_t mk_bvarray(term_manager_t *manager, uint32_t n, const term_t *a);
585

586

587
/*
588
 * Shift and division constructors
589
 * - t1 and t2 must be bitvector terms of the same type
590
 */
591
extern term_t mk_bvshl(term_manager_t *manager, term_t t1, term_t t2);   // t1 << t2
592
extern term_t mk_bvlshr(term_manager_t *manager, term_t t1, term_t t2);  // t1 >> t2 (logical shift)
593
extern term_t mk_bvashr(term_manager_t *manager, term_t t1, term_t t2);  // t1 >> t2 (arithmetic shift)
594

595
// unsigned division of t1 by t2
596
extern term_t mk_bvdiv(term_manager_t *manager, term_t t1, term_t t2);   // quotient
597
extern term_t mk_bvrem(term_manager_t *manager, term_t t1, term_t t2);   // remainder
598

599
// signed division, with rounding to zero
600
extern term_t mk_bvsdiv(term_manager_t *manager, term_t t1, term_t t2);   // quotient
601
extern term_t mk_bvsrem(term_manager_t *manager, term_t t1, term_t t2);   // remainder
602

603
// remainder in signed division, with rounding to -infinity
604
extern term_t mk_bvsmod(term_manager_t *manager, term_t t1, term_t t2);
605

606

607
/*
608
 * Extract bit i of t
609
 * - t must be a bitvector term
610
 * - i must be between 0 and n-1, where n = bitsize of t
611
 */
612
extern term_t mk_bitextract(term_manager_t *manager, term_t t, uint32_t i);
613

614

615
/*
616
 * Convert bit i of buffer b to a Boolean term then reset b
617
 * - i must be between 0 and n-1 when n = b->bitsize
618
 */
619
extern term_t bvl_get_bit(term_manager_t *manager, bvlogic_buffer_t *b, uint32_t i);
620

621

622
/*
623
 * Atoms: t1 and t2 must be bitvector terms of the same type
624
 */
625
extern term_t mk_bveq(term_manager_t *manager, term_t t1, term_t t2);   // t1 == t2
626
extern term_t mk_bvneq(term_manager_t *manager, term_t t1, term_t t2);  // t1 != t2
627

628
// unsigned inequalities
629
extern term_t mk_bvge(term_manager_t *manager, term_t t1, term_t t2);   // t1 >= t2
630
extern term_t mk_bvgt(term_manager_t *manager, term_t t1, term_t t2);   // t1 > t2
631
extern term_t mk_bvle(term_manager_t *manager, term_t t1, term_t t2);   // t1 <= t2
632
extern term_t mk_bvlt(term_manager_t *manager, term_t t1, term_t t2);   // t1 < t2
633

634

635
// signed inequalities
636
extern term_t mk_bvsge(term_manager_t *manager, term_t t1, term_t t2);   // t1 >= t2
637
extern term_t mk_bvsgt(term_manager_t *manager, term_t t1, term_t t2);   // t1 >  t2
638
extern term_t mk_bvsle(term_manager_t *manager, term_t t1, term_t t2);   // t1 <= t2
639
extern term_t mk_bvslt(term_manager_t *manager, term_t t1, term_t t2);   // t1 <  t2
640

641

642

643
/*
644
 * POWER-PRODUCT AND POLYNOMIAL CONSTRUCTORS
645
 */
646

647
/*
648
 * The following functions are intended to support operations such as term_substitution
649
 * or simplification of terms:
650
 * - for example, for a power product p = t_1^e_1 ... t_k^e_k, we want to construct
651
 *      f(t_1)^e_1 ... f(t_k)^e_k
652
 *   where f is a function that maps terms to terms.
653
 *   To do this: first construct an array a such that a[i] = f(t_i) then call function
654
 *    mk_pprod(manager, p, n, a) where n = p->len = size of a
655
 */
656

657
/*
658
 * Arithmetic product:
659
 * - p is a power product descriptor: t_0^e_0 ... t_{n-1}^e_{n-1}
660
 * - a is an array of n arithmetic terms
661
 * - this function constructs the term a[0]^e_0 ... a[n-1]^e_{n-1}
662
 *
663
 * IMPORTANT: make sure the total degree is no more than YICES_MAX_DEGREE
664
 * before calling this function.
665
 */
666
extern term_t mk_arith_pprod(term_manager_t *manager, pprod_t *p, uint32_t n, const term_t *a);
667

668
/*
669
 * Arithmetic product:
670
 * - p is a power product descriptor: t_0^e_0 ... t_{n-1}^e_{n-1}
671
 * - a is an array of n finite field arithmetic terms
672
 * - this function constructs the term a[0]^e_0 ... a[n-1]^e_{n-1}
673
 *
674
 * IMPORTANT: make sure the total degree is no more than YICES_MAX_DEGREE
675
 * before calling this function.
676
 */
677
extern term_t mk_arith_ff_pprod(term_manager_t *mngr, pprod_t *p, uint32_t n, const term_t *a, const rational_t *mod);
678

679
/*
680
 * Bitvector product: 1 to 64 bits vector
681
 * - p is a power product descriptor: t_0^e_0 ... t_{n-1}^e_{n-1}
682
 * - a is an array of n bitvector terms
683
 * - nbits = number of bits in each term of a
684
 * - this function constructs the term a[0]^e_0 ... a[n-1]^e_{n-1}
685
 *
686
 * IMPORTANT: make sure the total degree is no more than YICES_MAX_DEGREE
687
 * before calling this function.
688
 */
689
extern term_t mk_bvarith64_pprod(term_manager_t *manager, pprod_t *p, uint32_t n, const term_t *a, uint32_t nbits);
690

691
/*
692
 * Bitvector product: more than 64 bits
693
 * - p is a power product descriptor: t_0^e_0 ... t_{n-1}^e_{n-1}
694
 * - a is an array of n bitvector terms
695
 * - nbits = number of bits in each term of a
696
 * - this function constructs the term a[0]^e_0 ... a[n-1]^e_{n-1}
697
 *
698
 * IMPORTANT: make sure the total degree is no more than YICES_MAX_DEGREE
699
 * before calling this function.
700
 */
701
extern term_t mk_bvarith_pprod(term_manager_t *manager, pprod_t *p, uint32_t n, const term_t *a, uint32_t nbits);
702

703
/*
704
 * Generic product:
705
 * - p is a power product descriptor
706
 * - a is an array of term
707
 * - n must be positive
708
 * - this function check the type of a[0] then calls one of the three preceding
709
 *   mk_..._pprod functions
710
 *
711
 * All terms of a must be arithmetic terms or all of them must be bitvector terms
712
 * with the same bitsize (number of bits).
713
 */
714
extern term_t mk_pprod(term_manager_t *manager, pprod_t *p, uint32_t n, const term_t *a);
715

716
/*
717
 * Arithmetic polynomials:
718
 * - p is c_0 t_0 + ... + c_{n-1} t_{n-1}
719
 * - a must be an array of n terms (or const_idx)
720
 * - the function builds c_0 a[0] + ... + c_{n-1} a[n-1]
721
 *
722
 * Special convention: if a[i] is const_idx (then c_i * a[i] is just c_i)
723
 */
724
extern term_t mk_arith_poly(term_manager_t *manager, polynomial_t *p, uint32_t n, const term_t *a);
725

726
/*
727
 * Finite Field polynomial: same as mk_arith_poly but all elements of a
728
 * must be either const_idx of finite field terms of the same order
729
 * - the order must be the same as the coefficients of p
730
 */
731
extern term_t mk_arith_ff_poly(term_manager_t *mngr, polynomial_t *p, uint32_t n, const term_t *a, const rational_t *mod);
732

733
/*
734
 * Bitvector polynomial: same as mk_arith_poly but all elements of a
735
 * must be either const_idx of bitvector terms of the equal size
736
 * - the size must be the same as the coefficients of p
737
 */
738
extern term_t mk_bvarith64_poly(term_manager_t *manager, bvpoly64_t *p, uint32_t n, const term_t *a);
739

740
/*
741
 * Bitvector polynomials: terms with more than 64bits
742
 * - same conventions as mk_bvarith64_poly.
743
 */
744
extern term_t mk_bvarith_poly(term_manager_t *manager, bvpoly_t *p, uint32_t n, const term_t *a);
745

746

747
/*
748
 * Support for eliminating arithmetic variables:
749
 * - given a polynomial p and a term t that occurs in p,
750
 *   construct the polynomial q such that (t == q) is equivalent to (p == 0)
751
 *   (i.e., write p as a.t + r and construct  q :=  -r/a).
752
 * - returns a term equal to q if (t == q) is equivalent to (a.t + r == 0)
753
 * - return NULL_TERM if the types of t and q are not compatible (i.e., t is an
754
 *   integer term, but q is not an integer polynomial).
755
 */
756
extern term_t mk_arith_elim_poly(term_manager_t *manager, polynomial_t *p, term_t t);
757

758

759
#endif /* __TERM_MANAGER_H */
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc