z3:科学计数法的set-logic意外行为

时间:2016-09-20 17:04:17

标签: z3 smt z3py

当我使用以下代码

调用 z3
    (declare-const x Real)
    (assert (> x (* -1.79769 (^ 10.0 308.0))))
    (check-sat)
    (get-model)

然后我得到以下内容,预期(以及正确)回答:

    sat
    (model 
      (define-fun x () Real
        (+ 1.0 (* (- (/ 179769.0 100000.0)) (^ 10.0 308.0))))
    )

但有时我需要解决更复杂的问题,我需要指定一个逻辑来获得正确的结果,比如AUFNIRA(它支持整数/实数和线性/非线性算术)。

但是这些特定逻辑中没有一个支持 科学记数法 的表示形式,我在这里使用类似(* -1.7 (^ 10.0 308.0))的值来表示这一点(它只代表-1.7e308)通用科学记数法)。

特别是,如果我只是添加set-logic命令获取下面的代码

    (set-logic AUFNIRA)
    (declare-const x Real)
    (assert (> x (* -1.79769 (^ 10.0 308.0))))
    (check-sat)
    (get-model)

然后我收到以下错误

    (error "line 3 column 38: unknown function/constant ^")
    sat
    (model 
    )

(注意空模型)。

我的问题是:如果没有指定逻辑,解算器如何支持 power 运算符^并返回正确的解决方案,但是如果我尝试指定 < em>任何 逻辑然后返回此错误?

我的意思是,如果在没有指定逻辑的情况下它起作用,则意味着某些逻辑必须包含它,我是对的吗?如果是,哪个逻辑确实包含此运算符?

根据this question,我尝试了以下所有逻辑:

BOOL,LIA,LRA,NIA,NRA,QF_LRA,QF_NIA,QF_NRA,QF_UFLIA,QF_UFLRA,QF_UFNIA,QF_UFNRA,UFLIRA,UFLRA,UFNIA,AUFNIRA

(是的,即使是平凡无关的一个)但它们似乎都没有支持电力运营商。这怎么可能?

谢谢

1 个答案:

答案 0 :(得分:0)

SMT-LIB逻辑在smtlib.org中指定。电力运营商不是 任何SMT-LIB逻辑的一部分,因此解析器拒绝这些运算符。指定SMT-LIB逻辑时的期望是求解器根据支持的片段行为。对于运算符,例如^除非第二个参数是非负整数,否则没有一般决策过程。