我对Z3 / SMTLib API有疑问。
液体类型所需的关键SMT子程序 tools是以下查询:
INPUT: A "background" formula P
, A list of "goal" formulas Qs = [Q1,...,Qn]
OUTPUT: Largest Qs' \subset Qs s.t. forall Q in Qs', P => Q.
目前,我们以明显的方式计算:
def query1(P, Qs):
Qs' := []
ASSERT(P)
for Q in Qs:
PUSH()
ASSERT (not Q)
if CHECKUNSAT():
Qs'.add(Q)
POP()
return Qs'
我的问题:有什么更快的方法可以通过MaxSAT做到吗?
def query2(P, Qs):
F = (Hard P) /\ ((Soft ~Q1) \/ ... \/ (Soft ~QN))
Rs = MaxSat(F)
Qs' = Qs - Rs
return Qs'
即Hard
表示您必须满足P
和Soft
意味着最大化~Qi
的数量也可以
满意。具体地,
query2
会比上面的query1
中的循环更快吗?答案 0 :(得分:0)
有些令人困惑:这不是一个真正的最大问题。它正在计算最大的隐含文字集。它类似于计算一组隐含的等式,例如,等于" true"的文字是什么。 我们在get-implied-equalities功能和Josh的论文中对此进行了一些调整。通常,SAT有一些专门的方法,它们在进行全面检查之前使用过滤(sat sweeping)来删除候选者。
你的" query2"应该真的是这样的:
def query2(P, Qs):
while True:
F = And(P, Or[Not(Q) for Q in Qs])
if sat == CheckSAT(F):
Qs = [Q for Q in Qs if is_false(model.eval(Q)) ]
else:
return Qs