首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Z3py:将Z3公式转换为picosat使用的子句

Z3py:将Z3公式转换为picosat使用的子句
EN

Stack Overflow用户
提问于 2013-10-23 20:02:37
回答 1查看 1.7K关注 0票数 5

链接:

Z3定理证明器

带pyhton绑定的picosat

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

代码语言:javascript
复制
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 

输出/结果

代码语言:javascript
复制
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”等):

代码语言:javascript
复制
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变量(比如代码示例中的varaible "f“)转换成picosat用来表示CNF公式的前面提到的格式?我确实尝试过使用Z3的python,但是这些文档并不足以自己解决这个问题。

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

EN

回答 1

Stack Overflow用户

发布于 2013-10-24 15:52:50

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

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19551225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档