python z变换_python – Z3py:将Z3公式转换为picosat使用的子句

本文档介绍如何将使用Z3生成的命题公式转换为Picosat可以理解的CNF子句格式。示例展示了如何将Z3布尔变量转换为Picosat所需的数字数组,并提供了解决大型公式性能问题的思路。
摘要由CSDN通过智能技术生成

我使用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有效地处理)

解决方法:

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

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

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

标签:python,z3,sat-solvers,z3py

来源: https://codeday.me/bug/20190629/1324829.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值