Я немного экспериментирую с boolector , поэтому я пытаюсь создать модель для простого кода. Предположим, что у меня есть следующий псевдокод:
int a = 5;
int b = 4;
int c = 3;
Для этого простого набора инструкций я могу создать модель, и все отлично работает. Проблема в том, что после этого у меня есть другие инструкции, такие как
b = 10;
c = 20;
Очевидно, что не удается сгенерировать модель, потому что b
не может быть равно 4
и 10
в том же модуле. Один из сопровождающих предложил мне использовать boolector_push
и boolector_pop
для создания новых Context
s при необходимости.
Код для boolector_push
:
void
boolector_push (Btor *btor, uint32_t level)
{
BTOR_ABORT_ARG_NULL (btor);
BTOR_TRAPI ("%u", level);
BTOR_ABORT (!btor_opt_get (btor, BTOR_OPT_INCREMENTAL),
"incremental usage has not been enabled");
if (level == 0) return;
uint32_t i;
for (i = 0; i < level; i++)
{
BTOR_PUSH_STACK (btor->assertions_trail,
BTOR_COUNT_STACK (btor->assertions));
}
btor->num_push_pop++;
}
Вместо этого для boolector_pop
есть
void
boolector_pop (Btor *btor, uint32_t level)
{
BTOR_ABORT_ARG_NULL (btor);
BTOR_TRAPI ("%u", level);
BTOR_ABORT (!btor_opt_get (btor, BTOR_OPT_INCREMENTAL),
"incremental usage has not been enabled");
BTOR_ABORT (level > BTOR_COUNT_STACK (btor->assertions_trail),
"can not pop more levels (%u) than created via push (%u).",
level,
BTOR_COUNT_STACK (btor->assertions_trail));
if (level == 0) return;
uint32_t i, pos;
BtorNode *cur;
for (i = 0, pos = 0; i < level; i++)
pos = BTOR_POP_STACK (btor->assertions_trail);
while (BTOR_COUNT_STACK (btor->assertions) > pos)
{
cur = BTOR_POP_STACK (btor->assertions);
btor_hashint_table_remove (btor->assertions_cache, btor_node_get_id (cur));
btor_node_release (btor, cur);
}
btor->num_push_pop++;
}
По моему мнению, эти две функции отслеживают утверждения, сгенерированные с помощью boolector_assert
, так как можно получить окончательную и правильную модель с использованием boolector_push
и boolector_pop
учитывая, что ограничения будут одинаковыми?
Чего мне не хватает?
Спасибо