在SMT中使用define-fun-rec

时间:2016-07-25 23:02:40

标签: z3 smt cvc4

我目前正在尝试使用define-fun-rec编写SMT脚本。我已经使用Z3,版本4.4.2和CVC4版本1.4进行了测试。据我所知,这些是两者的最新版本,都支持功能*。但是,两者似乎都没有认出这个命令。

(我根据Nikolaj的回复对此进行了一些更改。它仍然会给出错误消息。)具体来说,给定:

(define-fun-rec 
    fac ((x Int)) Int
    (
        ite (<= x 1) 
            1 
            (* x (fac (- x 1)))
    )
)

(assert (= (fac 4) 24))

(check-sat)

Z3输出:

unsupported
; define-fun-rec
(error "line 10 column 17: unknown function/constant fac")
sat

CVC4输出:

(error "Parse Error: fac.smt2:1.15: expected SMT-LIBv2 command, got `define-fun-rec'.

  (define-fun-rec 
   ^
")

我最好的猜测是我需要设置某种标志,或者我需要使用某些特定的逻辑,但我在查找任何类型的详细说明或示例时遇到了很多麻烦 - 有趣的拍摄。任何意见,将不胜感激。谢谢!

* Z3有支持:How to deal with recursive function in Z3?

CVC4有支持:http://lara.epfl.ch/~reynolds/pres-smt15.pdf

2 个答案:

答案 0 :(得分:2)

最新版本的CVC4可以在&#34;开发版本&#34;下载。 (在右侧): http://cvc4.cs.nyu.edu/downloads/

最新的开发版本支持递归函数定义。您可以使用cvc4命令行选项&#34; - fmf-fun&#34;假设定义是可接受的,启用一种技术,可以找到涉及递归函数应用的问题的小模型。

(虽然不幸的是你的factorial例子也需要非线性算法,CVC4还不支持。)

答案 1 :(得分:1)

  1. 不要将逻辑设置为LIA。这不在LIA片段中,Z3将使用错误的策略来解决问题。只需删除set-logic line。
  2. 有助于不使用未定义的功能&#34; f&#34;在&#34; fib&#34;的定义内。
  3. 我建议您调用函数&#34; fac&#34;而不是&#34; fib&#34;因为你正在定义一个阶乘函数。
  4. 因此,

    (define-fun-rec 
       fac ((x Int)) Int
       (
        ite (<= x 1) 
            1 
            (* x (fac (- x 1)))
       )
    )
    
    (assert (= (fac 4) 24))
    
    (check-sat)
    
      

    z3 -version

    Z3版本4.4.2

      

    z3 fac.smt2

    如果你将24改为25,你会感到不满。