【问题标题】:Using define-fun-rec in SMT在 SMT 中使用 define-fun-rec
【发布时间】:2016-07-25 23:02:39
【问题描述】:

我目前正在尝试使用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 
   ^
")

我最好的猜测是我需要设置某种标志,或者我需要使用一些特定的逻辑,但是我很难找到任何类型的详细说明或使用 define-fun- 的示例推荐。任何意见,将不胜感激。谢谢!

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

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

【问题讨论】:

    标签: z3 smt cvc4


    【解决方案1】:

    最新版本的 CVC4 可以在“开发版本”(右侧)下下载: http://cvc4.cs.nyu.edu/downloads/

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

    (尽管不幸的是,您的阶乘示例还需要非线性算术,而 CVC4 尚不支持。)

    【讨论】:

      【解决方案2】:
      1. 不要将逻辑设置为 LIA。这不在 LIA 片段中,Z3 将使用错误的策略来解决问题。只需删除 set-logic 行。
      2. 在“fib”的定义中不要使用未定义的函数“f”会有所帮助。
      3. 我建议您将函数称为“fac”而不是“fib”,因为您定义的是阶乘函数。

      因此,

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

      z3-版本

      Z3 版本 4.4.2

      z3 fac.smt2

      如果您将 24 更改为 25,您会变得不满意。

      【讨论】:

      • 我对 (1) 和 (2) 感到很傻——我最初将函数称为 f,然后我想我会让这个名字更具描述性,以便其他人在这里受益——显然我有斐波那契而不是阶乘出于某种原因,在脑海中出现了两次失火......不幸的是,即使在再次使“f”一致并删除 set-logic 行之后,我仍然遇到完全相同的错误。我还尝试复制和粘贴您发布的公式,它也给了我同样的错误。 “z3 -version”确实为我输出“Z3 version 4.4.2”。
      • 事实证明,显然有一些版本的 z3 报告版本号为 4.4.2 但不支持这个......我刚刚从 github 拉出来并尝试再次构建,它工作。感谢您对 Nikolaj 其他主题的指点!
      • 4.4.2尚未正式发布(最新正式发布为4.4.1:github.com/Z3Prover/z3/releases);当前正在开发的所有开发版本都将其版本报告为 4.4.2。理想情况下,我们应该总是在提到这些时报告当前的 githash,但我们并不总是记得。另外,-version 的输出没有报告它们,但我现在已经添加了。
      猜你喜欢
      • 1970-01-01
      • 2014-03-25
      • 2014-11-10
      • 2011-12-06
      • 2011-03-01
      • 1970-01-01
      • 2021-08-10
      • 2022-12-11
      • 1970-01-01
      相关资源
      最近更新 更多