在Z3中有明確的方法來定義有界整數嗎?在z3中定義有界整數
例如,假設我想定義一個整數變量「x」,它可以從[1,4]中取值。我可以做以下操作(我正在使用Java API)
IntExpr x = ctx.mkIntConst("x");
solver.add(ctx.mkGT(x, ctx.mkInt(0))); // (assert (> x 0))
solver.add(ctx.mkLT(x, ctx.mkInt(5))); // (assert (< x 5))
但是,我不知道是否有更聰明的方法來做到這一點?一些可以在聲明時自動放置變量的上下限的東西。我列舉了一些枚舉,但我不確定這是否是最佳選擇。
謝謝
謝謝Levent,我唯一擔心的就是搜索空間。添加約束約束條件將有助於Z3修剪大量不相關的解決方案,但這些解決方案仍然存在,並且Z3在某一時刻考慮了這些解決方案。我可能弄錯了,它可能是相同的,但是如果Z3中存在有界整數,那麼可能是這種不相關的解決方案從一開始就不存在。 無論如何,我現在會堅持約束約束。 – Mohammed
@Mohammed給變量或它們的組合增加了冗餘*上下限,可以加快搜索速度,即使這些*約束可以從現有的約束條件推斷出來(例如參見[如何計算WCET .... ](http://dl.acm.org/citation.cfm?id=2597817&dl=ACM&coll=DL&CFID=780316479&CFTOKEN=19429447))。說到這一點,在這種情況下預測* smt *求解器的運行時間就像拋硬幣一樣,有幾個因素起作用,包括正在考慮的問題的結構,布爾部分如何與LAR約束*進行交互。 –