实现floor作为表达式,而不是声明

时间:2013-10-31 16:14:07

标签: z3

是否可以表达地板,使其可以用作表达式而不是语句?在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。如果我错过了一个明显的解决方案,我很抱歉。

1 个答案:

答案 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