2012-10-24 30 views
2

想想看,我有一個簡單的SMT-lib的公式:如何從SAT模型中獲取「真實」變量?

(declare-const a Bool) 
(declare-const b Bool) 
(declare-const c Bool) 
(declare-const d Bool) 
(assert (or a b)) 
(assert (or d c)) 
(check-sat) 
(get-model) 

當SAT求解器給出了一個模型。它提供了有真/假值的所有變量。但我只想要「真」價值分配變量。這可能與Z3?

回答

2

這是一個完成此操作的z3py腳本。 http://rise4fun.com/Z3Py/fp5k

我認爲要與模型交互/遍歷模型,您需要使用API​​。

a,b,c,d = Bools('a b c d') 

s = Solver() 

s.add(Or(a, b)) 
s.add(Or(c, d)) 

s.check() 
m = s.model() 
print m 

for t in m.decls(): 
    if is_true(m[t]): 
    print t 
    print m[t] 
+0

謝謝,您的及時答覆..但我不想遍歷整個變量。可能是我有大量的變量,然後我在線性時間檢查他們的任務。我以爲Z3知道變量賦值是否有任何配置只會給出「真實」值的變量。 – user1770051

+0

泰勒的解決方案以線性時間打印「真實」值變量。請記住,這比's.check()'快。 –

+0

感謝Leonardo de Moura,我的意思是,如果我遵循泰勒的解決方案,那麼我必須在線性時間檢查所有變量賦值。但我不想這樣做。我問 - Z3是否有任何配置,以便它始終只爲模型提供「真正的」有價值的變量? – user1770051