是否可以表达地板,使其可以用作表达式而不是语句?在Yices中,我们可以执行类似的操作,生成sat
和(= fooInt 5)
:
(define floor::(-> x::real (subtype (y::int) (and (<= y x) (< x (+ y 1))))))
(define fooReal::real 11/2)
(define fooInt::int)
(assert (= fooInt (floor fooReal))
我在Z3中最接近的是以下(我认为因为Z3不支持依赖类型):
(declare-const fooInt Int)
(define-fun fooReal () Real 5.5)
(assert (and (>= fooReal fooInt)(< fooReal (+ fooInt 1))))
Floor作为表达式是理想的,因为它会更接近地匹配我生成Z3输入的AST。如果我错过了一个明显的解决方案,我很抱歉。
答案 0 :(得分:2)
看起来你可以利用SMT-LIB2中指定的to_int
的语义(参见http://smtlib.cs.uiowa.edu/theories/Reals_Ints.smt2)来使用函数(rise4fun link:http://rise4fun.com/Z3/da5I)发言:< / p>
(define-fun floor ((x Real)) Int
(to_int x))
(declare-const fooInt Int)
(define-fun fooReal () Real 5.5)
(assert (= fooInt (floor fooReal)))
(check-sat) ; sat
(get-model) ; 5
(assert (> fooInt 5))
(check-sat) ; unsat