У меня есть целочисленная константа, скажем:
expr x = ctx.int_const("x");
Я пытаюсь применить случайные ограничения к отдельным битам x. Однако оказывается, что вы не можете использовать побитовые операции с целочисленными сортировками, только битовые векторы. Мой первоначальный подход до реализации этого был такой:
for(int i = 0; i < 32; i++){
int mask = 0x00000001 << i;
if(rand()%2)
solver.add((x & mask) == 0);
else
solver.add((x & mask) != 0);
}
Это, конечно, не работает, поскольку Z3 создает исключение. Немного покопавшись в API, я нашел функцию Z3_mk_int2bv
и решил, что попробую:
for(int i = 0; i < 32; i++){
if(rand()%2)
solver.add(z3::expr(ctx(),Z3_mk_int2bv(ctx(), 32, v())).extract(i, i) == ctx().bv_val(0, 1));
else
solver.add(z3::expr(ctx(),Z3_mk_int2bv(ctx(), 32, v())).extract(i, i) != ctx().bv_val(0, 1));
}
Хотя на вышеупомянутые решающие вызовы add не добавляется утверждение, фактическое Время решения внезапно взорвалось. Настолько, что мне еще предстоит увидеть, сколько на самом деле это займет времени. Добавление похожих выражений с использованием битовых векторов не требует больших затрат на SAT-решателе, поскольку время решения, насколько я могу судить, составляет менее секунды.
Мне интересно, что это за выражение выше что может привести к такому ухудшению производительности решателя, и есть ли лучший подход?