在z3中是否可以声明一个将另一个函数作为参数的函数?例如,这个
(declare-fun foo ( ((Int) Bool) ) Int)
似乎没有用。感谢。
答案 0 :(得分:5)
不,这是不可能的。但是,您可以定义一个以数组作为参数的函数。
(declare-fun foo((Array Int Bool))Int)
你可以使用这个技巧来模拟你问题中的高阶函数。
以下是一个示例:http://rise4fun.com/Z3/qsED
Z3 guide包含有关Z3和SMT的更多信息。
答案 1 :(得分:5)
正如莱昂纳多所提到的,SMT-Lib确实不允许更高阶的功能。这不仅仅是一种语法限制:使用高阶函数的推理(通常)超出了SMT求解器可以处理的范围。 (虽然可以在某些特殊情况下使用未解释的函数。)
如果您确实需要推理更高阶函数,那么交互式定理证明是首选武器:Isabelle,HOL,Coq作为一些例子。
但是,有时您希望高阶函数不来推理它们,而只是简化编程任务。 SMT-Lib输入语言不适合最终用户在实际情况下通常需要的高级编程。如果那是你的用例,那么我建议不要直接使用SMT-Lib,而是使用一种编程语言,可以访问Z3(或其他SMT求解器)。有多种选择,具体取决于哪种主机语言最适合您的用例:
每个绑定都有自己的功能集,Z3Py可能是最通用的,因为它直接由Z3人员支持。 (它还提供对Z3内部的访问,至少暂时无法访问其他选项。)