如何使用Z3获得满足断言的最小变量模型

如何使用Z3获得满足断言的最小变量模型,z3,smt,z3py,Z3,Smt,Z3py,例如: from z3 import * p1,p2, p3 = Reals('p1 p2 p3') s = Optimize() s.add(And(Or(p1>=0, p2>0),Or(p1<=10,p3>0))) print(s.check()) print(s.model()) 没错。但是,在设置较少变量的情况下,获得预期结果(满足约束和(或(p1>=0,p2>0)或(p10))是很有价值的 例如,仅设置p1=0(或范围内的任何值([0,10]),则满足约束。只

例如:

from z3 import *
p1,p2, p3 = Reals('p1 p2 p3')
s = Optimize()
s.add(And(Or(p1>=0, p2>0),Or(p1<=10,p3>0)))
print(s.check())
print(s.model())
没错。但是,在设置较少变量的情况下,获得预期结果(满足约束
和(或(p1>=0,p2>0)或(p10))
是很有价值的

例如,仅设置p1=0(或范围内的任何值([0,10]),则满足约束。只需设置一个变量


所以我的问题是,有没有一种通用的方法来获得最少数量的必要变量?

您所寻找的被称为“符号”模型,即某些变量设置为常量,而其他变量可以设置为表达式。例如,如果您有一个类似
x>y
的约束,那么符号模型可能是
y=0,x>y
。不幸的是,SMT解算器不提供“符号”通常的DPLL样式的约束传播不允许这种简单的符号模型构造

这方面的一个困难是,对于这种最小的模型可能是什么,没有“规范”的概念(这个问题在一般情况下是无法确定的)


如果你对这样的模型感兴趣,你最好使用更高层次的工具,比如mathematica,或者一般的定理证明工具,来提出这样的模型(当然,这些模型最好是半自动化的)基于BDD的解算器也可以提供符号模型,尽管大多数现代解算器使用SAT引擎和/或没有公开足够的API来查看BDD引擎生成的模型。

这是否回答了您的问题?谢谢。很有帮助。我知道有“添加软件”Z3优化对象中的函数。但实际上约束逻辑由数百个变量组成,它们在不同的子句中耦合,例如:(p1>100)| |((p1Yes)。也许我可以添加软原因并检查已求解的模型,以获得哪些变量是冗余的。但是当涉及耦合变量时,例如:
p1,p2=Reals('p1 p2')s=Optimize()s.add(和((p1>=100),或(p1我试图编辑这个问题。希望我能把重点说清楚。谢谢。哦,我看到变量不再是
booleans
,而是变成了
Reals
。这是一个与原来完全不同的问题。好吧,像Z3这样的普通SMT/OMT解算器真的不可能。谢谢别名。这个问题只是来自符号示例ecution。对于一些特定的应用,我通过编程得到了一个解决方案。现在,我想找到一个处理更常见约束的通用方法,将约束赋予Z3并找到答案。这就是我正在研究的问题。感谢@Patrick Trentin和Malte Schwerhoff的所有讨论。到目前为止,我已经了解了这个问题,我应该通过一些见解来解决。似乎软约束应该先尝试一下。
sat
[p3 = 1, p1 = 11, p2 = 1]