Есть ли способ выполнить недетерминированный рекурсивный вызов в спецификации отношения muZ3? В частности, я хочу перевести функцию, подобную следующей:
int foo(int x) {
...
if (*) y = foo(y);
...
}
в формат правила muZ3.
Есть ли способ выполнить недетерминированный рекурсивный вызов в спецификации отношения muZ3? В частности, я хочу перевести функцию, подобную следующей:
int foo(int x) {
...
if (*) y = foo(y);
...
}
в формат правила muZ3.
У вас может быть отдельное правило для двух случаев:
(declare-fun foo (Int Int) Bool)
(assert (forall ((x Int) (y Int) (z Int)) (=> (and ... (foo x y) ...) (foo x z)))
(assert (forall ((x Int) (y Int) (z Int)) (=> (and ... true ...) (foo x z)))