为什么是运营商'/';和';分区';在Z3中给出不同的结果?

为什么是运营商'/';和';分区';在Z3中给出不同的结果?,z3,Z3,我试图用两个整数来表示一个实数,用它们作为实数的分子和分母。我编写了以下程序: (declare-const a Int) (declare-const b Int) (declare-const f Real) (assert (= f (/ a b))) (assert (= f 0.5)) (assert (> b 2)) (assert (> b a)) (check-sat) (get-model) 程序返回SAT结果如下: sat (model (define

我试图用两个整数来表示一个实数,用它们作为实数的分子和分母。我编写了以下程序:

(declare-const a Int)
(declare-const b Int)
(declare-const f Real)

(assert (= f (/ a b)))
(assert (= f 0.5))
(assert (> b 2))
(assert (> b a))

(check-sat)
(get-model)
程序返回SAT结果如下:

sat
(model 
  (define-fun f () Real
    (/ 1.0 2.0))
  (define-fun b () Int
    4)
  (define-fun a () Int
    2)
)
但是,如果我写的是“(assert(=f(div a b)))”而不是“(assert(=f(/a b))”,那么结果是UNSAT。为什么div不返回相同的结果


此外,也是我最关心的问题,我没有找到在z3.NETAPI中使用运算符“/”的方法。我只能看到函数MkDiv,它实际上用于运算符“div”。有没有一种方法可以在z3.NETAPI的情况下应用运算符“/”呢?提前感谢。

严格来说,这两个公式都不符合SMT-LIB2,因为
/
是一个接受两个实输入并产生一个实输出的函数,而
div
是一个接受两个Int输入并产生一个Int的函数(请参阅)。Z3更轻松,可以自动转换这些对象。如果我们启用选项
smtlib2_compliant=true
,那么在这两种情况下它都会报告错误

div
版本不可满足的原因是,根据
(=f(/ab))
,如果
f
是一个整数,则确实不存在满足
(=f 0.5)
的整数