在Z3中使用MaxSAT查询

时间:2016-05-05 22:31:29

标签: z3 smt

我对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表示您必须满足PSoft 意味着最大化~Qi的数量也可以 满意。具体地,

  1. 是否有允许我执行上述操作的API?
  2. query2会比上面的query1中的循环更快吗?

1 个答案:

答案 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