事实上,SMT-LIB标准是否具有理性(不仅仅是真实的)排序?按照website,它没有 如果x是理性的并且我们有约束x ^ 2 = 2,那么我们应该回到“不可满足”。我能编码该约束的最接近的是:
;;(set-logic QF_NRA) ;; intentionally commented out
(declare-const x Real)
(assert (= (* x x) 2.0))
(check-sat)
(get-model)
z3返回一个解决方案,因为在reals中有一个解决方案(无理)。我确实理解z3有自己的理性库,例如,当使用Simplex算法的自适应解决QF_LRA约束时,它使用它。在相关的说明中,是否有一个SMT求解器支持输入级别的有理数?
答案 0 :(得分:1)
我确信可以使用Nikolaj建议的两个整数来定义Rational排序 - 我很有兴趣看到它。使用Real排序可能更容易,并且只要你想要理性,就断言它等于两个Ints的比率。例如:
(set-option :pp.decimal true)
(declare-const x Real)
(declare-const p Int)
(declare-const q Int)
(assert (> q 0))
(assert (= x (/ p q)))
(assert (= x 0.5))
(check-sat)
(get-value (x p q))
这很快就会回来了
sat
((x 0.5)
(p 1)
(q 2))