我正在使用Z3 theorem prover(Z3Py)的Python綁定。我有N個布爾變量,x1,..,xN。我想表達這樣一個約束,即它們中的N個應該是正確的。我該怎麼做,在Z3Py?有沒有內置的支持?我查看了在線文檔,但Z3Py docs沒有提及任何API。我知道我可以分別表示至少有一個是真的(assert Or(x1,..,xN)),並且至多有一個是真的(assert Not(And) (xi,xj)),對於所有i,j)。我也知道other ways手動表示N中的1和N中的約束。但是我有這樣的印象:當求解器內置對這個約束的支持時,它有時可能比手動表達它更有效。Z3Py中的K-out-of約束
6
A
回答
7
是的,Z3Py內置了對此的支持。這裏有一個未公開的API,這在Z3Py文檔中沒有提到:使用PbEq
。特別是,表達式
PbEq(((x1,1),(x2,1),..,(xN,1)),K)
如果N個布爾變量中恰好有K個參數設置爲true,則該參數爲真。有some reports,這種編碼將比手動表達約束的天真方式更快。
要表達1-out-of-N約束,只需設置K = 1並使用PbEq
即可。要表示最多約束的K-out-N約束,請使用PbLe
。要表達一個至少爲K-out-N的約束條件,請使用PbGe
。
相關問題
- 1. Z3Py:不等於元組的約束
- 2. z3py:什麼是斷言「東西不存在」約束的正確方法
- 3. scipy.optimize.leastsq有約束約束
- 4. 如何在Orange中的先驗約束中引入synstactic約束
- 5. Z3Py中的替換
- 6. R中的二次約束的二次約束:Rsolnp?
- 7. 在iOS7上的UICollectionViewCell子類中未約束的約束條件
- 8. 約束的UIcollectionView
- 9. 約束的
- 10. Android約束中心
- 11. 在python中,找到約束的最小約束?
- 12. Elasticsearch字段約束中的多個字段約束條件
- 13. 在CPLEX Concert Technology中設置約束的約束Java
- 14. 指定類型約束約束
- 15. 約束優化R建立約束
- 16. 約束種:通過多個約束
- 17. 約束佈局改變約束編程
- 18. Elm中的類型約束
- 19. PHP中的約束編程
- 20. DATEADD SQLServer中的約束
- 21. Xcode中的約束問題
- 22. MYsql中的child-parent約束?
- 23. 重寫AMPL中的約束
- 24. DynamoDB中的NOT NULL約束
- 25. SQLite中的唯一約束
- 26. asm中的不可約束
- 27. 在grails中的約束
- 28. R中的約束優化
- 29. 約束Rails中的路由
- 30. xib中的全局約束
有趣。有沒有辦法通過smt-lib接口訪問'PbEq'? (也許通過戰術或其他一些z3魔法?) –
@LeventErkok,我不知道。好問題!內部C/C++ API是Z3_mk_pbeq()。 –
在此處提交一張票以查看z3人是否可以找出一種方法:https://github.com/Z3Prover/z3/issues/960 –