在 z3 中是否可以声明一个以另一个函数作为参数的函数?例如,这个
(declare-fun foo ( ((Int) Bool) ) Int)
似乎不太管用。谢谢。
正如 Leonardo 提到的,SMT-Lib 确实not允许高阶函数。这不仅仅是语法限制:使用高阶函数进行推理(通常)超出了 SMT 求解器的处理能力。 (尽管在某些特殊情况下可以使用未解释的函数。)
如果您确实需要reason对于高阶函数,那么交互式定理证明器是主要的选择武器:Isabelle http://www.cl.cam.ac.uk/research/hvg/isabelle/, HOL http://hol.sourceforge.net/, Coq http://coq.inria.fr/是其中的一些例子。
但是,有时您需要高阶函数not推理它们,而不仅仅是简化编程任务。 SMT-Lib 输入语言不适合最终用户在实际情况中通常需要的高级编程。如果这是您的用例,那么我建议不要直接使用 SMT-Lib,而是使用可让您访问 Z3(或其他 SMT 求解器)的编程语言。有多种选择,具体取决于最适合您的用例的主机语言:
- 如果你是Python用户,Z3Py http://rise4fun.com/z3py刚刚随 Z3 4.0 一起发布的就是这样的方法,
- 如果您是 Scala 用户,请查看Scala^Z3 http://lara.epfl.ch/w/jniz3-scala-examples.
- 如果 Haskell 是您的首选语言,请查看SBV http://hackage.haskell.org/package/sbv.
每个绑定都有自己的功能集,Z3Py 可能是最通用的,因为它直接受到 Z3 人员的支持。 (它还提供对 Z3 内部结构的访问,而其他选项则无法访问这些内部结构,至少目前是这样。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)