z3中的函数声明

时间:2012-05-12 21:03:00

标签: z3

在z3中是否可以声明一个将另一个函数作为参数的函数?例如,这个

(declare-fun foo ( ((Int) Bool) ) Int)

似乎没有用。感谢。

2 个答案:

答案 0 :(得分:5)

不,这是不可能的。但是,您可以定义一个以数组作为参数的函数。

  

(declare-fun foo((Array Int Bool))Int)

你可以使用这个技巧来模拟你问题中的高阶函数。

以下是一个示例:http://rise4fun.com/Z3/qsED

Z3 guide包含有关Z3和SMT的更多信息。

答案 1 :(得分:5)

正如莱昂纳多所提到的,SMT-Lib确实允许更高阶的功能。这不仅仅是一种语法限制:使用高阶函数的推理(通常)超出了SMT求解器可以处理的范围。 (虽然可以在某些特殊情况下使用未解释的函数。)

如果您确实需要推理更高阶函数,那么交互式定理证明是首选武器:IsabelleHOLCoq作为一些例子。

但是,有时您希望高阶函数来推理它们,而只是简化编程任务。 SMT-Lib输入语言不适合最终用户在实际情况下通常需要的高级编程。如果那是你的用例,那么我建议不要直接使用SMT-Lib,而是使用一种编程语言,可以访问Z3(或其他SMT求解器)。有多种选择,具体取决于哪种主机语言最适合您的用例:

  • 如果您是Python用户,那么Z3 4.0附带的Z3Py就是您的选择,
  • 如果您是Scala用户,请查看Scala^Z3
  • 如果Haskell是您的首选语言,请查看SBV

每个绑定都有自己的功能集,Z3Py可能是最通用的,因为它直接由Z3人员支持。 (它还提供对Z3内部的访问,至少暂时无法访问其他选项。)