Z3 非线性实数与线性整数的结合

Z3 非线性实数与线性整数的结合,z3,Z3,我读过关于非线性算术和未解释函数的帖子。我对SMT世界还很陌生,所以如果我没有使用正确的词汇或这是一个糟糕的问题,我深表歉意 对于下面的代码,在一个不相关的顶级断言assert>i10的上面,有一些断言放在堆栈上。但是,Z3返回案例的unsat,并将Reals第一次推送到第一个pop。我认为这与Z3尝试使用Int解算器有关,因为第一个断言是关于Int的,Z3将e1分配给/1.0 2.0,这是一个没有Int表示的数字,因为约束assert

我读过关于非线性算术和未解释函数的帖子。我对SMT世界还很陌生,所以如果我没有使用正确的词汇或这是一个糟糕的问题,我深表歉意

对于下面的代码,在一个不相关的顶级断言assert>i10的上面,有一些断言放在堆栈上。但是,Z3返回案例的unsat,并将Reals第一次推送到第一个pop。我认为这与Z3尝试使用Int解算器有关,因为第一个断言是关于Int的,Z3将e1分配给/1.0 2.0,这是一个没有Int表示的数字,因为约束assert
(set-option :global-decls false)

(declare-const i Int)
(assert (> i 10))

(push)
  (declare-const e1 Real)
  (declare-const e2 Real)

  (define-fun e3 () Real (/ e1 e2))
  (assert (> e1 0))
  (assert (> e2 0))
  (assert (< e3 1))

  ;(check-sat-using qfnra-nlsat)
  (check-sat)
(pop)
(push)
  (declare-const e1 Int)
  (declare-const e2 Int)

  (define-fun e3 () Int (div e1 e2))
  (assert (> e2 0))
  (assert (> e3 0))

  ;(check-sat-using qfnra-nlsat)
  (check-sat)
(pop)

是否有一次呼叫检查,我可以在所有情况下使用,或者我需要使用检查sat使用。。。根据断言的类型?

由于您混合了实数和整数排序,我认为您需要使用check-sat-using。发件人:

默认情况下,非线性实数算法NLSat解算器不用于非线性整数问题。它通常对整数问题非常无效。尽管如此,我们可以强制Z3使用NLSat,即使是整数问题

您强制Z3在整数约束上使用非线性实数算术解算器,并使用qfnra nlsat检查sat。下面还介绍了如何在Python中使用z3py执行此操作:


我想在将来的某个时候,尽管开发人员可以确认您不必这样做,但我最后听到的是,例如,和,非线性实数算术解算器策略尚未与其他解算器完全集成。

谢谢,泰勒。很遗憾,我没有代表投票支持你: