如何使用Z3Py解决包含60个布尔变量和99个子句的2-SAT实例

如何使用Z3Py解决包含60个布尔变量和99个子句的2-SAT实例,z3,z3py,2-satisfiability,Z3,Z3py,2 Satisfiability,我正在使用以下代码: X = BoolVector('x', 60) M = [[21, 34],[-49, -12],[7, 18], [-5, -1],[28, 17], [3, 55],[36, 33], [-6, -50],[44, -41], [-55, 3],[14, -54],[-30, 13], [-13, 60],[54, -16],[-48, 41], [3, 6],[49, -48],[34, -4],

我正在使用以下代码:

X = BoolVector('x', 60)
M = [[21, 34],[-49, -12],[7, 18],
     [-5, -1],[28, 17],
     [3, 55],[36, 33],
     [-6, -50],[44, -41],
     [-55, 3],[14, -54],[-30, 13],
     [-13, 60],[54, -16],[-48, 41],
     [3, 6],[49, -48],[34, -4],
     [14, -46],[58, -20],
     [52, 54],[-37, -25],[56, -1],
     [50, -9],[-58, 11],
     [-19, 58],[17, 8],[56, 51],
     [38, 49],[-13, 36],
     [24, 9],[18, -29],
     [6, 49],[-30, 4],[-13, -20],
     [31, -9],[54, -4],[37, 17],
     [-48, -8],[-7, -45],[-3, -42],
     [27, -22],[-50, -27],[47, 19],[-21, 20],[-20, -37],
     [-42, 12],[-35, 1],[-41, -19],[11, 30],[-17, -48],
     [21, -49],[16, -53],[57, 57],[15, 2],[-6, -7],[-23, -28],
     [-12, -17],[-59, -36],[38, -6],[-16, -6],[21, -14],
     [17, -7],[3, -49],[-55, -13],[22, -52],[24, -56],[22, -42],
     [13, -4],[-8, -16],[-55, -7],[-12, 48],
     [52, 18],[-47, 44],[-22, -23],[-29, -23],[-53, 57],
     [-38, 54],[43, -53],[49, -18],[-60, 58],[-5, -14],[16, 34],
     [-24, -43],[10, -21],[-52, -40],[-45, -22],[-5, -11],
     [-32, -11],[-15, 11],[-24, 44],[-17, -15],[10, -27],
     [8, -26],[-36, 24],[13, 1],[59, -34],[-40, -25],[11, -22]] 
     s = Solver()
     for i in range(99):
           if M[i][0] > 0:
              if M[i][1] >0:
                  s.add(Or(X[M[i][0]-1],X[M[i][2]-1]))
              else:
                  s.add(Or(X[M[i][0]-1],Not(X[-M[i][3]-1])))
           else:
              if M[i][4] >0:
                  s.add(Or(Not(X[-M[i][0]-1]),X[M[i][5]-1]))
              else:
                  s.add(Or(Not(X[-M[i][0]-1]),Not(X[-M[i][6]-1])))
print "instance 2-SAT =", s  
print s.check() 
m = s.model()     

for k in range(60):
    if is_true(m.evaluate(X[k])):
        print X[k], "=", 1
    else:
        print X[k], "=", 0
输出为:联机运行此示例

在本例中,矩阵M将2-SAT实例定义为CNF()。在本例中,矩阵M是作为手动输入引入的。请让我知道如何自动介绍矩阵M()。非常感谢。

--我的问题:如何使用Z3Py从存档txt中读取矩阵M

恐怕我只能对这个问题作一个非常笼统的回答。 一般的答案是用python编写解析器 并将结果提供给通过Z3py公开的接口函数。 网上有很多为各种格式编写解析器的例子, 包括DIMACS格式

Z3公开了一些用于解析SMT-LIB2格式基准的API。你可以称之为 来自Python的API函数。Python包装器中的相关函数 它们被称为parse_smt2_string和parse_smt2_file。

--我的问题:如何使用Z3Py从存档txt读取矩阵M

恐怕我只能对这个问题作一个非常笼统的回答。 一般的答案是用python编写解析器 并将结果提供给通过Z3py公开的接口函数。 网上有很多为各种格式编写解析器的例子, 包括DIMACS格式

Z3公开了一些用于解析SMT-LIB2格式基准的API。你可以称之为 来自Python的API函数。Python包装器中的相关函数
被称为parse_smt2_string和parse_smt2_file。

nput必须来自某个地方。如果输入矩阵不是程序中的静态构造,它将从何而来?另一个程序的输出?我不明白你在问什么。我的问题是:如何使用Z3Pynput从存档txt中读取矩阵M必须来自某个地方。如果输入矩阵不是程序中的静态构造,它将从何而来?另一个程序的输出?我不明白你在问什么。我的问题是:如何使用Z3Py从存档txt中读取矩阵M