我对MAX-SAT感兴趣并且希望Z3能够将其作为内置功能。有什么计划在不久的将来这样做吗?
在没有上述内容的情况下,我尝试使用命令行中的示例maxsat应用程序。不幸的是,每当我执行exec.sh“filename.z3”时,我总是得到以下响应:“检查硬约束是否可以满足...结果:0”。我究竟做错了什么?我向您保证,此响应似乎与文件的实际内容完全无关。
最后,maxsat示例中的注释没有明确指定如何将约束标记为硬或软。硬约束应该是一个前面带有公式的公式,一个软约束公式前面有:假设。那么,要将“(assert(> x 0))”标记为软,我们究竟将“:假设”放在哪里? (我已经阅读了关于硬约束和软约束的查询,但问题/响应似乎更多的是在找到不可满足的核心的背景下,而不是不可满足的公式的“最大可满足核心”。)
答案 0 :(得分:2)
Z3发行版中的MaxSAT示例演示了如何使用Z3 API实现两个MaxSAT算法。该示例仍然使用旧的(已弃用的)API来断言约束,但可以轻松修改它以使用新的求解器API。示例应用程序读取SMT 1.0文件。但是,MaxSAT函数可用于使用C API创建的公式。该脚本假定:assumption
字段是软约束,而:formula
字段是硬约束。这是一个小例子,其中(> x 0)
,(> y 0)
,(< x y)
和(> x (- y 1))
是软约束,(> (+ x y) 0)
和(< (- x y) 100)
是硬约束。示例应用程序返回3
。也就是说,最多可以满足三个软约束。
(benchmark ex
:extrafuns ((x Int))
:extrafuns ((y Int))
;; Soft Constraints
:assumption (> x 0)
:assumption (> y 0)
:assumption (< x y)
:assumption (> x (- y 1))
:formula
(and
;; Hard Constraints
(> (+ x y) 0)
(< (- x y) 100)
))
话虽如此,我们还没有计划直接在Z3 API中支持MaxSAT。在将来的版本中,我们可能会将MaxSAT示例移植到其他API(.NET,Python和C ++)。