我有一个很大的布尔公式要求解决,由于编辑的原因,我必须在此处粘贴图像:
另外,我已经有一个函数area
来衡量4个整数的维数:area(c,d,e,f)=|c−d|×|e−f|
我想做的不仅仅是弄清楚公式是否可以满足:我正在寻找一个最佳的6元组(a,b,c,d,e,f)
,这使得大公式TRUE
和area(c,d,e,f)
成为大于或等于任何其他6元组的维度,也满足公式。
换句话说,找到大公式的Max(area(c,d,e,f))
子喷射。
我想知道SMT求解器是否可以帮助解决这个问题。我知道Z3
支持quantifiers
,并且能够说明布尔表达式是否可满足。但问题是Z3
是否有助于找到函数area
的最佳解决方案。
有没有人有任何想法?任何关于SMT求解器,Z3或其他算法的评论都会赞赏......
答案 0 :(得分:3)
简而言之,是的。
因为您的公式包含量词,所以我不认为Microsoft Solver Foundation是一个合适的选择。正如您所说,Z3支持量词,整数理论,并用于检查可满足性。虽然Z3不直接支持优化,但您可以使用通用量词轻松编码优化问题:
sat(a,b,c,d,e,f)=> (forall a1,b1,c1,d1,e1,f1,sat(a1,b1,c1,d1,e1,f1)&& 目标(a,b,c,d,e,f)> =目标(a1,b1,c1,d1,e1,f1))
其中:sat
是用于检查可满足性的布尔表达式,goal
是area
函数,是您的优化目标。
正如您所看到的,该表述从字面上翻译成您在问题中的要求。 (a, b, c, d, e, f)
的分配是您需要找到的最佳解决方案。
另外,Z3有一个Linux发行版并提供OCaml API,完全符合您的偏好。
答案 1 :(得分:3)
目标函数使用非线性整数算术和量词。 已经非线性整数算术很难(不可判定) 没有量词,添加量词会使情况更糟。 如果您将排序从Int更改为Real,那么我们就有了 非线性实数的有限量词消除 ((set-option:ELIM_QUANTIFIERS为true) (set-option:ELIM_NLARITH_QUANTIFIERS为true)) 但这似乎并不适合您似乎正在解决的问题。 试着看它是否可以表述为线性或二次优化问题。 有许多工具可以针对二次优化进行调整 (并且它们可能不太倾向于,比如说Z3是布尔搜索)。 试试Solver Foundation,它包含几个优化工具的插件。
可以使用Z3来解决优化问题, 但典型的方法是在外面有一个循环 Z3。首先,您提出要检查的问题是否可以满足, 然后你搜索下一个令人满意的改进任务 当前的(从满意的模型中检索)。 要搜索下一个令人满意的作业,你将断言 分配给您寻找的下一个值的“目标”可以改善“目标” 分配到当前的最佳值。
以下是一些幻灯片http://research.microsoft.com/en-us/people/nbjorner/lecture1.pptx 这应该是相关的。他们非常接近处理这类问题。 本套牌中的最后几张幻灯片说明了如何使用Z3的API进行搜索 楷模。如果您想为其编写解析器,您当然也可以使用文本API 输出格式。有许多方法可以与Z3进行交互以进行优化 问题,但它们都要求你在Z3之上编写优化搜索。 当您具有约束的布尔组合时,这仍然有用 Z3支持的算术和其他域,但标准优化问题 可以通过专用的优化工具更好地解决。
答案 2 :(得分:1)
您的问题不仅仅是可满足性问题,而是优化或更具体的混合整数编程之一。 使用任何解算器(因为您标记了问题Z3并且您似乎使用的是Windows)Microsoft Solver Foundation,它也不会太难解决,它也提供免费版。
答案 3 :(得分:1)
我相信this page会非常有用。这个例子已经得到了很好的解释,它将有助于阅读整篇文章。