Z3/SMT-LIB评估函数和收集结果

Z3/SMT-LIB评估函数和收集结果,z3,smt,Z3,Smt,我试图通过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)) (定义乐趣回收((p包装)(t时间))(列表Bool) (ite(

我试图通过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))
(定义乐趣回收((p包装)(t时间))(列表Bool)
(ite(
不幸的是,这给了我错误
unknown function/constant eval

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

有人有什么想法吗?

在,我找到了以下引语:

命令
eval
计算 Z3。它实际上是在执行Z3生成的“功能程序”

由于eval是一个
,因此它不能在
表达式中使用



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

很有意义!谢谢。请注意,
eval
只有在您进行sat检查后才可用,正如Patrick提到的,它是一个命令,而不是一个函数。你应该在不依赖你提到的
eval
副作用的情况下对你的问题进行建模。SMTLib本质上是一个多排序的一阶逻辑:考虑纯函数编程,而不是效果或评估。如果你更详细地描述你试图建模的内容,你可以得到更好的答案。是的,纯函数式编程很棒,但我确实希望能够提取最终结果。目前,我直接通过管道与Z3连接。这有点烦人,但我用Haskell编写了大量数据,SBV绑定对于我的时间限制来说太慢了。(我有多达50000个变量的问题,当我达到几千个变量时,SBV的性能开始显著下降。)