z3是否支持其输入约束的rational算术?

z3是否支持其输入约束的rational算术?,z3,smt,cvc4,Z3,Smt,Cvc4,事实上,SMT-LIB标准是否具有理性(而不仅仅是真实)排序?从它的角度看,它不是。 如果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返回一个解,因为real

事实上,SMT-LIB标准是否具有理性(而不仅仅是真实)排序?从它的角度看,它不是。
如果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有自己的rational库,例如,当使用单纯形算法的自适应来解决QF_LRA约束时,它就使用了它。另一方面,是否有一个SMT解算器在输入级支持有理数?

我确信,按照Nikolaj的建议,使用两个整数定义有理数排序是可能的——我很想看到这一点。使用实数排序可能更容易,任何时候你想要一个有理数,断言它等于两个整数的比率。例如:

(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))

SMT-LIB没有rational类型。您可以使用两个整数来模拟有理数。感谢您的响应。在4.8.7上尝试此操作,我发现我必须
(assert((*x q)p)
才能满足要求。