簡體   English   中英

Z3py:將Z3公式轉換為picosat使用的子句

[英]Z3py: Convert a Z3 formula to clauses used by picosat

鏈接:
Z3定理證明
picosat與pyhton綁定

我使用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公式

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM