【问题标题】:Z3py: Convert a Z3 formula to clauses used by picosatZ3py:将 Z3 公式转换为 picosat 使用的子句
【发布时间】:2013-10-23 20:02:37
【问题描述】:

链接:
Z3 theorem prover
picosat with pyhton bindings

我使用 Z3 作为 SAT 求解器。对于较大的公式,似乎存在性能问题,这就是为什么我想检查 picosat 看看它是否是一个更快的选择。 我现有的python代码以z3语法生成一个命题公式:

from z3 import *

import pycosat
from pycosat import solve, itersolve

#
#1 2  3  4  5  6  7   8  (variable names in picosat are numbers!)
#
C, G, M, P, R, S, SN, B = Bools('C G M P R S SN B')
C = (And(*(S,Or(Not(S),P),Or(Not(P),S),Or(Not(P),B),Or(Not(C),P),Or(Not(G),P),Or(Not(M),P),Or(Not(R),P),Or(Not(SN),P),Or(Not(B),P),True,Not(False),Or(R,SN,B,G,M,C,True))))

# formula in Z3:
f = simplify(C)

print f 

输出/结果

And(S,
    Or(Not(S), P),
    Or(Not(P), S),
    Or(Not(P), B),

    Or(Not(C), P),
    Or(Not(G), P),
    Or(Not(M), P),
    Or(Not(R), P),
    Or(Not(SN), P),
    Or(Not(B), P))

Picosat 但是使用数字列表/数组,如下例所示(“clauses1”:6 指变量 P,-6 表示“非 P”等):

import pycosat
from pycosat import solve, itersolve
#
# use pico sat
#
nvars = 8
clauses =[
    [6],
    [-6, 4],   ##  "Or(Not(S), P)" from OUPUT above
    [-4, 6],
    [-4, 8],
    [-1, 4],
    [-2, 4],
    [-3, 4],
    [-5, 4],
    [-7, 4],
    [-8, 4]]

#
# efficiently find all models of the formula
#
sols = list(itersolve(clauses, vars=nvars))
print "result:"
print sols
print "\n\n====\n"

作为将表示 CNF 中的公式的 Z3 变量(如代码示例中的变量“f”)转换为 picosat 用于表示 CNF 中的公式的上述格式的简单解决方案,您推荐什么?我真的尝试使用Z3的python API,但是文档不足以自己解决问题。

(请注意上面的例子只是说明了这个概念。变量C表示的公式将是动态生成的,并且过于复杂,无法直接被z3高效处理)

【问题讨论】:

    标签: python z3 z3py sat-solvers


    【解决方案1】:

    首先,我们应该将 Z3 公式转换为 CNF。以下帖子解决了这个问题

    要将 Z3 CNF 公式转换为 Dimacs,我们只需编写一个遍历它并生成整数列表的函数即可。下面两篇文章介绍了如何遍历Z3公式

    最后,如果你需要从表达式到值的映射,你可以使用下面的方法

    【讨论】:

    • 你知道 picosat 是否相当有效吗?是否有多线程的 SAT 求解器?在 CNF 中获取公式并用数字替换变量名对我来说很容易。 Z3 中的公式已经在 CNF 中。对我来说困难的部分是使用 python API 来遍历和转换公式。遍历“And(Or(Not(A),B),Or(Not(B),C))”生成字符串“[[-A,B],[-B,C]]”。感谢您对所有答案的帮助,也感谢其他人! (顺便说一句,为什么您的帖子中有许多指向 python 在线示例的链接不起作用?例如,rise4fun.com/Z3Py/E1s
    • Picosat 效率很高
    • 有几个多线程 SAT 求解器。示例:manysat (cril.univ-artois.fr/~jabbour/manysat.htm)
    • 关于 Z3Py,由于安全问题,我们不得不暂时禁用它。见tomforb.es/breaking-out-of-secured-python-environments
    • Plingeling (fmv.jku.at/lingeling) 是另一个支持多线程的 SAT 示例。
    猜你喜欢
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多