/* * Check whether the substitution [r1 := r2] is valid. * - r1 must be a root and r2 must be a constant * - r1 must have positive polarity * - returns true if r1 is a free root and * if r2's type is a subtype of r1's class type. * * (e.g., x := 1/2 is not a valid substitution if x is an integer variable). */ bool intern_tbl_valid_const_subst(intern_tbl_t *tbl, term_t r1, term_t r2) { type_t tau1, tau2; bool ok; assert(is_pos_term(r1) && intern_tbl_is_root(tbl, r1) && intern_tbl_is_root(tbl, r2) && is_constant_term(tbl->terms, r2)); ok = false; if (intern_tbl_root_is_free(tbl, r1)) { tau1 = intern_tbl_type_of_root(tbl, r1); tau2 = intern_tbl_type_of_root(tbl, r2); ok = is_subtype(tbl->types, tau2, tau1); } return ok; }
/* * Print what's mapped to t in the context's internalization table. * - if t is mapped to a Boolean, the corresponding DIMACS literal is printed * - if t is mapped to a bitvector then the corresponding literal array is printed * - otherwise we print "non boolean" */ void dimacs_print_internalized_term(FILE *f, context_t *ctx, term_t t) { intern_tbl_t *intern; type_table_t *types; term_t r; type_t tau; int32_t code; uint32_t polarity; intern = &ctx->intern; types = ctx->types; r = intern_tbl_get_root(intern, t); if (t != r) { // substitution: t --> r (can't deal with this) fputs("eliminated", f); } else if (intern_tbl_root_is_mapped(intern, r)) { // t = r is mapped to something polarity = polarity_of(r); r = unsigned_term(r); tau = intern_tbl_type_of_root(intern, r); if (is_boolean_type(tau)) { // Boolean term code = intern_tbl_map_of_root(intern, r); assert(code_is_valid(code)); dimacs_print_bool_code(f, code, polarity); } else if (is_bv_type(types, tau)) { // Bitvector term code = intern_tbl_map_of_root(intern, r); assert(code_is_valid(code)); assert(polarity == 0); dimacs_print_bv_code(f, ctx, code); } else { // Can't be converted to DIMACS fputs("non boolean", f); } } else { // r not mapped to anything fputs("not internalized", f); } }