我已阅读有关非线性算术和未解释函数的帖子。我对 SMT 世界还是很陌生,所以如果我没有使用正确的词汇,或者这是一个糟糕的问题,我深表歉意。
对于以下代码,在堆栈中放置了一些断言,位于不相关的顶级断言之上(assert (> i 10))
。但是,对于 Reals 的情况,Z3 返回 unsat(第一次推送到第一次弹出)。我认为这与 Z3 尝试使用 Int 求解器有关,因为第一个断言是在 Int 上,并且 Z3 将 e1 分配给(/ 1.0 2.0)
,这是一个没有 Int 表示的数字,因为约束(assert (< e3 1))
(如果我删除这个约束,有用)。使用(check-sat-using qfnra-nlsat)
解决了 Reals 的问题,但返回unknown
了 Ints 的情况,但是,我仍然可以获得满足约束的 Int 情况的模型。
(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)
是否有单个调用来检查我是否可以在所有情况下使用,或者我是否需要(check-sat-using ...)
根据断言的类型使用?