簡體   English   中英

Z3Py中的K-out-of-N約束

[英]K-out-of-N constraint in Z3Py

我正在使用Python綁定Z3定理證明器 (Z3Py)。 我有N個布爾變量,x1,..,xN。 我想表達一個約束條件,即N中的N個應該是真的。 我怎么能在Z3Py中做到這一點? 有沒有內置的支持? 我檢查了在線文檔,但Z3Py文檔沒有提及任何API。

對於N個中的一個約束,我知道我可以單獨表達至少一個是真的(斷言Or(x1,..,xN))並且最多只有一個為真(斷言Not(And(xi,xj) ))所有i,j)。 我也知道其他方法來手動表達N-out和N-K-out-of-N約束。 但是我的印象是,當解算器內置支持此約束時,它有時可能比手動表達它更有效。

是的,Z3Py內置了對此的支持。 有一個未記錄的API,這在Z3Py文檔中沒有提到:使用PbEq 特別是表達

PbEq(((x1,1),(x2,1),..,(xN,1)),K)

如果N個布爾變量中的K個被設置為true,則為真。 一些報道稱這種編碼比手動表達約束的天真方式更快。

要表示1-out-of-N約束,只需設置K = 1並使用PbEq 要表達最多K-out-of-N約束,請使用PbLe 要表達至少K-out-of-N約束,請使用PbGe

您可以在Python中表達這樣:

import z3

s = z3.Solver()
bvars = [z3.Bool("Var {0}".format(x)) for x in range(10)]
#Exactly 3 of the variables should be true
s.add( z3.PbEq([(x,1) for x in bvars], 3) )
s.check()
m = s.model()

s = z3.Solver()
bvars = [z3.Bool("Var {0}".format(x)) for x in range(10)]
#<=3 of the variables should be true
s.add( z3.PbLe([(x,1) for x in bvars], 3) )
s.check()
m = s.model()

s = z3.Solver()
bvars = [z3.Bool("Var {0}".format(x)) for x in range(10)]
#>=3 of the variables should be true
s.add( z3.PbGe([(x,1) for x in bvars], 3) )
s.check()
m = s.model()

暫無
暫無

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

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