【问题标题】:Z3/SMT-LIB Evaluating function and collecting resultsZ3/SMT-LIB 评估功能和收集结果
【发布时间】:2018-03-02 03:22:33
【问题描述】:

我正在尝试以一种自动查询所有可用值的方式从 Z3 中获取一些值:

(define-fun-rec out ((p Pkg) (t Time)) (List Bool)
  (ite (< t 0) (as nil (List Bool)) (insert (eval (installed p t)) (out p (- t 1)))))

(eval (out a t-final))

不幸的是,这给了我错误unknown function/constant eval

我还尝试在函数中执行 eval 副作用而不是构建列表,但这也不起作用,因为我无法对语句进行排序(eval 和递归调用)。

有人有什么想法吗?

【问题讨论】:

    标签: z3 smt


    【解决方案1】:

    this page,我找到了以下引用:

    命令 eval 计算最后一个模型中的表达式 Z3。它本质上是在执行Z3产生的“功能程序”

    由于 eval 是 &lt;command&gt;,因此它不能在 &lt;term&gt; 表达式中使用。


    我相信模型枚举应该使用一些 API 接口而不是 SmtLibv2 format 更容易,因为人们可以轻松地编写一个循环,将可满足性检查与学习阻塞子句交替进行,该阻塞子句从搜索空间中删除以前找到的解决方案。

    【讨论】:

    • 有道理!谢谢。
    • 请注意,eval 仅在您进行检查后可用,并且正如帕特里克所说,它是一个命令,而不是一个函数。你应该模拟你的问题,而不是像你提到的那样依赖evalside-effects。 SMTLib 本质上是一个多排序的一阶逻辑:考虑纯函数式编程而不是效果或评估。如果您更详细地描述您要建模的内容,您可以获得更好的答案。
    • 是的,纯函数式编程很棒,但我确实希望能够提取最终结果。目前我正在通过管道直接与 Z3 交互。这有点烦人,但我在 Haskell 中编写了我的数据搅动,而且 SBV 绑定对于我的时间限制来说太慢了。 (我遇到了多达 50 000 个变量的问题,一旦达到几千个变量,SBV 的性能就开始显着下降。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2011-12-09
    • 2015-02-27
    相关资源
    最近更新 更多