Z3求解器输出令人满意的模型?

时间:2014-07-09 18:19:18

标签: z3

在Z3中,如果输入脚本是用SMTLib格式编写的,是否可以输出模型(满足模型的值赋值)? get-model返回满足约束的解释。有没有办法从这些解释中提取具体的值。我知道我们可以使用python / C ++ API来获取模型值。

1 个答案:

答案 0 :(得分:2)

您可能想要使用get-value,这是一个最小的例子(rise4fun链接:http://rise4fun.com/Z3/wR81):

(declare-fun x () Int)
(declare-fun y () Int)
(declare-fun z () Int)
(assert (>= (* 2 x) (+ y z)))
(declare-fun f (Int) Int)
(declare-fun g (Int Int) Int)
(assert (< (f x) (g x x)))
(assert (> (f y) (g x x)))
(check-sat) ; sat
(get-model) ; returns:
; (model 
;  (define-fun z () Int
;    0)
;  (define-fun y () Int
;    (- 38))
;  (define-fun x () Int
;    0)
;  (define-fun g ((x!1 Int) (x!2 Int)) Int
;    (ite (and (= x!1 0) (= x!2 0)) 0
;      0))
;  (define-fun f ((x!1 Int)) Int
;    (ite (= x!1 0) (- 1)
;    (ite (= x!1 (- 38)) 1
;      (- 1))))
;)
(get-value (x)) ; returns ((x 0))
(get-value ((f x))) ; returns (((f x) (- 1)))

您可能必须根据您尝试做的事情等来解析此问题。

有关详细信息,请查看SMT-LIB标准:

http://smtlib.cs.uiowa.edu/language.shtml

最新版本为:http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.0-r12.09.09.pdf

您可以在第39页/图3.5中看到get-value的一些示例。