smtlib 是否支持第一个 class 函数?
does smtlib support first class functions?
比如建模 haskell map
函数,它接受一个应用于列表所有元素的 "mapper" 函数。如何在 smtlib 中声明 map
?
没有; SMTLib 本质上是一个一阶理论;根本不支持高阶函数。
然而,Z3 允许在数组上映射函数,扩展名为 (_ map f)
。请参阅 https://rise4fun.com/Z3/tutorial/guide,搜索 "Mapping Functions on Arrays." 这不会为您提供任意高阶函数,但可用于模拟那些对 SMTLib 数组进行操作的函数。
如果您确实打算对高阶函数进行推理,那么 SMTLib 对您来说可能是错误的逻辑。使用 HOL/Isabelle 等更传统的定理证明器或 Agda/Coq 中的现代化身会更合适。你也可以看看精益,它在功能和自动化方面有很好的折衷。
比如建模 haskell map
函数,它接受一个应用于列表所有元素的 "mapper" 函数。如何在 smtlib 中声明 map
?
没有; SMTLib 本质上是一个一阶理论;根本不支持高阶函数。
然而,Z3 允许在数组上映射函数,扩展名为 (_ map f)
。请参阅 https://rise4fun.com/Z3/tutorial/guide,搜索 "Mapping Functions on Arrays." 这不会为您提供任意高阶函数,但可用于模拟那些对 SMTLib 数组进行操作的函数。
如果您确实打算对高阶函数进行推理,那么 SMTLib 对您来说可能是错误的逻辑。使用 HOL/Isabelle 等更传统的定理证明器或 Agda/Coq 中的现代化身会更合适。你也可以看看精益,它在功能和自动化方面有很好的折衷。