我使用QF_FPABV逻辑(无量词浮点运算和位向量逻辑??)以SMT2格式编写z3查询。 查询如下所示:
(set-logic QF_FPABV)
(set-option :produce-models true)
(declare-fun f0 () (_ FP 8 24))
(declare-fun f1 () (_ FP 8 24))
(declare-fun f2 () (_ FP 8 24))
(assert (= f2 (* roundNearestTiesToEven f0 f1)))
(assert (>= f2 ((_ asFloat 8 24) roundNearestTiesToEven 3.0 0)))
(check-sat)
; (check-sat-using (then simplify solve-eqs bit-blast smt))
(get-model)
用
(check-sat),
我获得了结果和模型:
sat
(model
(define-fun f2 () (_ FP 8 24)
(as +1.44919359683990478515625p127 (_ FP 8 24)))
(define-fun f1 () (_ FP 8 24)
(as +1.476345062255859375p0 (_ FP 8 24)))
(define-fun f0 () (_ FP 8 24)
(as +1.9632179737091064453125p126 (_ FP 8 24)))
)
这就是我的期望。 但是,如果我使用
(check-sat-using (then simplify solve-eqs bit-blast smt))
相反,我获得了:
sat
(model
;; universe for RoundingMode:
;; RoundingMode!val!0
;; -----------
;; definitions for universe elements:
(declare-fun RoundingMode!val!0 () RoundingMode)
;; cardinality constraint:
(forall ((x RoundingMode)) (= x RoundingMode!val!0))
;; -----------
;; universe for (_ FP 8 24):
;; FP!val!0 FP!val!1 FP!val!2 FP!val!3
;; -----------
;; definitions for universe elements:
(declare-fun FP!val!0 () (_ FP 8 24))
(declare-fun FP!val!1 () (_ FP 8 24))
(declare-fun FP!val!2 () (_ FP 8 24))
(declare-fun FP!val!3 () (_ FP 8 24))
;; cardinality constraint:
(forall ((x (_ FP 8 24)))
(or (= x FP!val!0) (= x FP!val!1) (= x FP!val!2) (= x FP!val!3)))
;; -----------
(define-fun f1 () (_ FP 8 24)
FP!val!2)
(define-fun f0 () (_ FP 8 24)
FP!val!1)
(define-fun f2 () (_ FP 8 24)
(* roundNearestTiesToEven FP!val!1 FP!val!2))
)
这个模型解释起来并不容易......
对于这个简单的例子,我可以使用(check-sat)获取人类可读的结果。 对于包含非线性操作的一些复杂示例, 我需要使用(check-sat-using(然后简化solve-eqs bit-blast smt)) 避免从z3获得“未知”......
是否有任何文件可以教我解释这种非人类可读的模型?
答案 0 :(得分:4)
这里的问题是浮点理论还没有与Z3的SMT内核完全集成(我正在一个单独的分支中研究它)。因此,内核将所有浮点排序视为未解释,因此模型包含这些排序(Universe)的定义。目前,解决这个问题的最佳方法是直接调用fpa2bv策略,例如,更改
(check-sat-using (then simplify solve-eqs bit-blast smt))
到
(check-sat-using (then simplify fpa2bv simplify solve-eqs bit-blast smt))
在调用fpa2bv之前必须调用简化策略,并且还需要在bit-blast策略之前调用简化器,因为这些策略依赖于简化器来消除某些特定的表达式。
答案 1 :(得分:1)
我认为这是Z3中模型完成代码的问题。很久以前就有类似的错误:Z3 FP logic: produces unexpected model
我认为问题已经得到解决,并且该票证中的代码示例现在可以正常使用z3 4.3.2,但显然您在此处提供的代码片段会触发类似的问题,但尚未解决。