我正在使用Z3opt。我的大部分模型都可以用标准的SMTLIB表示,但部分需要用通用编程语言实现,包括字符串处理,关联数组等构造。
是否可以在Z3模型中使用外部定义的功能?我知道这会破坏求解器性能,但它只是模型的一小部分。
- 编辑以澄清 -
我希望提供约束的实现(作为函数指针或等效函数),以支持Z3不支持的函数(例如trig函数)。我会接受在使用像这样的黑盒约束时Z3不能应用任何启发式的权衡。
答案 0 :(得分:1)
您可以从Z3公开的二进制接口加载SMTLIB断言,然后使用来自python,Java,.NET,C ++,Ocaml的Z3执行其他操作,然后再调用检查可行性或优化目标的代码。 http://rise4fun.com/z3opt上的z3opt教程包含指向Phan的F#代码的指针,这些代码使用二进制API(在本例中来自F#/ .NET)。源代码中的examples目录包含使用各种API的示例。 如果你需要一些没有暴露的爱好者,那么默认的回退是基于Z3是开源的,所以你可以添加你想要的任何特殊功能。如果您认为有一个有用的特征,那么跟踪https://github.com/z3prover/z3.git上的问题会很有用,如果您实现了它,则可以添加拉取请求。