Условное заявление Z3

Как написать условное утверждение в Z3.

eg: 
if (a%2==0){
value=1
}

Я пытаюсь добиться этого в Z3 Solver от Microsoft Research, но пока не повезло

1 ответ

Посмотрите форму SSA: https://en.wikipedia.org/wiki/Static_single_assignment_form

По сути, вам придется изменить свою программу, чтобы она выглядела примерно так:

value_0 = 0
value_1 = (a%2 == 0) ? 1 : value_0

Как только он находится в этой так называемой статической форме одного назначения, теперь вы можете переводить каждую строку более или менее напрямую; с последним назначением value_N будучи окончательным значением value,

Циклы будут проблематичными: обычная стратегия состоит в том, чтобы развернуть их до определенного количества (проверка ограниченной модели) и надеяться, что этого достаточно. Если вы обнаружите, что последней развертки недостаточно, вы можете создать неинтерпретированное значение в этой точке; что может привести к сбою ваших доказательств с поддельными контрпримерами; но это лучшее, что вы можете сделать без схемы, которая включает в себя правильную обработку индукции и инвариантов цикла.

Обратите внимание, что эта область исследований называется "символическим исполнением" и имеет долгую историю, при этом активные исследования все еще проводятся. Вы можете прочитать это: https://en.wikipedia.org/wiki/Symbolic_execution

Другие вопросы по тегам