2012-12-17 18 views
6

Z3'ü kullanarak 12000'den fazla boole değişkeni ile SAT sorununu çözmeye çalışıyorum. Değişkenlerin çoğunun çözümde yanlış olarak değerlendirmesini bekliyorum. İlk önce "polarite yanlış" ı denemek için Z3'ü SAT çözücü olarak yönlendirmek veya ipucu vermek için bir yol var mı? Bunu cryptominisat 2 ile denedim ve iyi sonuçlar aldım.Z3 Z3'ü SAT Çözücü olarak kullanma polaritesi

+0

Hoşgeldin:

İşte SON DÜZENLEME

SMT 2.0 tam bir örnek (da mevcuttur online) 'dir! Ne denedin? – IronMan84

+1

Büyüyen karmaşıklığı olan birkaç CNF/DIMACS dosyası oluşturdum. Bazıları hemen Z3/DIMACS tarafından çözülebilir. Diğerleri saatler alır ya da hiç bitmez. Dosyalar için Cryptominisat 2'yi kullandım ve "--polarity-mode = false" ekledikten sonra çözdüm. Z3'ün INI parametrelerinde polarite ile ilgili bir parametre bulamadım. Bu nedenle, yığın akışında akıllıca bir ipucu bulmayı umuyorum. –

cevap

5

Z3, çözücü ve ön işlemciler topluluğudur. Bazı çözücüler için ipuçları sağlayabiliriz. (check-sat) komutu kullanıldığında, Z3 çözücüyü bizim için otomatik olarak seçecektir. Çözücüyü kendimiz seçmek istiyorsak, (check-sat-using <strategy>)'u seçmeliyiz. Örneğin, aşağıdaki komut Z3'e bir Boole SAT çözücü kullanması talimatını verecektir.

(check-sat-using sat) 

Biz her zaman kullanarak ilk "yanlış kutuplarını" denemek için zorlayabilirsiniz:

(check-sat-using (with sat :phase always-false)) 

Ayrıca ön işlemler kontrol edebilirsiniz. Biz sat çağırmadan önce CNF formülü koymak istiyorsak kullanmalıdır:

(check-sat-using (then tseitin-cnf (with sat :phase always-false))) 

EDIT: Eğer DIMACS giriş biçimini ve Z3 v4.3.1 kullanıyorsanız, o zaman için parametreleri ayarlamak olamaz tüm kullanılabilir çözücüler komut satırını kullanarak. Bir sonraki sürüm bu sınırlamayı ele alacak.

git clone https://git01.codeplex.com/z3 -b unstable 

ve Z3 derlemek: Bu arada, kullanmakta iş-içinde-ilerleme şube indirebilirsiniz. Ardından, kutup false zorlamak için, bu modül için mevcut tüm seçenekleri gösterecektir komut satırı seçeneği

sat.phase=always_false 

komut z3 -pm:sat kullanın. Yığın taşması için

(declare-const p Bool) 
(declare-const q Bool) 
(declare-const r Bool) 
(declare-const s Bool) 

(assert (or (not p) (not q) (not r))) 
(assert (or r s)) 
(assert (or r (not s))) 
(assert (or r (and p q))) 

(echo "With always false") 
(check-sat-using (then tseitin-cnf (with sat :phase always-false))) 
(get-model) 
(echo "With always true") 
(check-sat-using (then tseitin-cnf (with sat :phase always-true))) 
(get-model) 
+0

Anlık cevap için teşekkürler! –

+0

Şu anda, Z3 için giriş biçimi olarak DIMACS kullanıyorum. İpucu kullanmak için DIMACS/CNF cümleleri SMT formatına çevirmeli miyim? Z3'ün SMT kümesi boolean ifadesi olarak formüle edilen orijinal problemimi çözmesine izin vermeye çalıştım. Ama ben SAT çözücünün benim durumumda çok daha hızlı olduğunu buldum. –

+0

Yanıtı, DIMACS giriş formatı ile ilgili bilgilerle güncelledim. –

İlgili konular