2016-04-07 18 views
0

Çözücüde işlev tanımlarını açıklama olarak eklemenin bir yolu var mı?z3: iddialardaki değişken bildirimleri ekleme

Şu anda C++ dosyalarının sınırlı model denetimi üzerinde çalışıyorum ve tanımlayıcı ifadeler olarak tanımları ekleyebilmek, çözme iddiası ve kod satırı için birebir bir yazışma sağlayabilecektir. Örneğin

Aşağıdaki oyuncak programı:

int x, y; 
x = y + 1; 
assert(x != 0) 

kordon kanı mononükleer hücre aşağıdaki smt2 dosyası üretir:

(declare-fun |main::1::[email protected]#1|() (_ BitVec 32)) 
(define-fun |main::1::[email protected]#2|() (_ BitVec 32) (bvadd (_ bv1 32) |main::1::[email protected]#1|)) 
(define-fun |B0|() Bool (= |main::1::[email protected]#1| |main::1::[email protected]#1|)) 
(assert (not (not (= |main::1::[email protected]#2| (_ bv0 32))))) 

z3_parse_string aşağıdaki formülü döndürür.

Not(Not(1 + main::1::[email protected]#1 == 0)) 

Ben çizgisinde, hem de çözücü içine bir şey işlev açıklamalarını eklemek mümkün olup olmadığını merak ediyorum:

([email protected]#2 == 1 + [email protected]#1) AND !([email protected]#2 == 0) 

Yani her fıkra kaynak kodunun bir satıra gevşek tekabül

.

Şu an z3_parse_string API'sının yalnızca (... komut satırlarına eriştiğini ve oradan katlanabileceğini anlıyorum (lütfen yanılıyorsam beni düzeltin) Düşünebildiğim tek çözüm, dosyayı değiştirecek şekilde değiştirmektir. -Eğlence beyan-eğlenceli olur ve tanımı gibi yeni bir iddia hattı içine itilir. önceden

(declare-fun |main::1::[email protected]#2|() (_ BitVec 32)) 
(assert (= |main::1::[email protected]#2| (bvadd (_ bv1 32) |main::1::[email protected]#1|))) 

çok teşekkür

cevap

1

fazla örnek veya gerçek kod (kordon kanı mononükleer hücre veya Z3) görmeden bilmiyorum Ya da daha iyi bir çözüme sahip olursak, genel olarak, insanların Z3_parse_string'u kullanmasından vazgeçiririm Genellikle, gerektiğinden daha fazla karışıklık yaratır. Komut satırı üzerinden tam SMT2 dosyalarına geçmek ya da tüm yolu gidip sorunu Z3-API çağrılarına çevirmek daha iyidir (string ayrıştırma vb. Hariç). Son kontrol ettiğimde, CBMC'nin Z3 için bir API arka ucu vardı, bu yüzden oldukça basit olmalıydı.

+0

Evet, z3_parse_string en kullanıcı dostu değil, beyan biti yeni bir onaylama maddesine kaydırmak için kendi ayrıştırıcımla gelmek zorunda kaldım. CBMC sadece smt2 dosyasını oluşturur ve z3'ü yerel olarak çağırır, daha sonra ilgili değişkenlerin atanmasını alır ve hata izini oluşturmak için kullanır. Çok teşekkürler ama – user3146687