如何在Z3中获取表达式的解决方案

时间:2016-08-03 00:59:11

标签: z3 smt

我试图用Z3在理论上做一些事情,但我不知道该怎么做。

想象一下我在C:

中有这个代码
int c;
if (c>=65 && C<91)
    int d = c + 32;

我想知道d的可能解决方案,例如97.我试着像这样在Z3中表达问题:

(declare-const c Int)
(assert (> c 64))
(assert (< c 91))
(define-fun d() Int
 (+ 32 c)
)
(assert (> d 0))
(check-sat)
(get-model)

但是通过这种方式,我得到c的解决方案而不是变量d。

我该怎么做?

非常感谢!

1 个答案:

答案 0 :(得分:0)

如果您想获得d的一个解决方案,您可以使用:

(declare-const c Int)
(declare-const d Int)

(assert (> c 64))
(assert (< c 91))

(assert (= d (+ c 32)))
(check-sat)
(get-model)

如果要查找d的所有解法,可以反复否定模型并将其添加为约束。请参阅泰勒的回复:Z3: finding all satisfying models

编辑:添加,稍微更直接的程序翻译将使用:

(>= 65 c)

而不是

(> 64 c)