2012-04-04 24 views
7

Tôi đang cố mã hóa QBF theo cú pháp smt-lib 2 cho z3. Chạy kết quả z3 trong một cảnh báoĐịnh lượng và mẫu (công thức QBF)

CẢNH BÁO: thất bại trong việc tìm ra một khuôn mẫu cho lượng hóa (lượng hóa id: 14 k)

và kết quả satisfiability là "không rõ".

Mã này là như sau:

(declare-fun R (Bool Bool Bool Bool) Bool) 
(assert 
    (forall ((x2 Bool) (x3 Bool)) 
    (exists ((y Bool)) 
     (forall ((x1 Bool)) 
     (R x1 x2 x3 y) 
    ) 
    ) 
) 
) 
(check-sat) 

Tôi đã thoát khỏi những cảnh báo bằng cách viết lại mã để

(set-option :auto-config false) 
(set-option :mbqi false) 
(declare-fun R (Bool Bool Bool Bool) Bool) 
(declare-fun x1() Bool) 
(declare-fun x2() Bool) 
(declare-fun x3() Bool) 
(declare-fun y() Bool) 
(assert 
    (forall ((x2 Bool) (x3 Bool)) 
    (! 
    (exists ((y Bool)) 
    (! 
     (forall ((x1 Bool)) 
     (! 
     (R x1 x2 x3 y) 
     :pattern((R x1 x2 x3 y))) 
    ) 
    :pattern((R x1 x2 x3 y))) 
    ) 
    :pattern((R x1 x2 x3 y))) 
) 
) 
(check-sat) 

Kết quả cho ngồi truy vấn, tuy nhiên, vẫn còn "không rõ".

Tôi đoán rằng tôi cần lấy mẫu đúng không? Làm cách nào để chỉ định chúng cho các số lượng lồng nhau? Ví dụ đơn giản với định lượng dường như hoạt động mà không có chú thích mẫu.

Câu trả lời cho What is the reason behind the warning message in Z3: "failed to find a pattern for quantifier (quantifier id: k!18) " và hướng dẫn z3 không giúp tôi quá nhiều, thật không may.

Trả lời

8

Thông báo cảnh báo này có thể bỏ qua. Nó chỉ là thông báo cho bạn rằng động cơ phù hợp với E sẽ không thể xử lý công thức được định lượng này.

Kết hợp e chỉ có hiệu quả để cho thấy rằng sự cố không thỏa mãn. Vì ví dụ của bạn là thỏa đáng, kết hợp E sẽ không hữu ích lắm. Tức là, Z3 sẽ không thể trả về sat bằng công cụ kết hợp E. Mô hình hóa định lượng dựa trên instantiation (MBQI) là động cơ duy nhất trong Z3 có khả năng cho thấy rằng các vấn đề có chứa số lượng là thỏa đáng.

Sử dụng cấu hình mặc định, Z3 sẽ trả lại sat cho ví dụ của bạn. Nó trả về unknown vì bạn đã tắt mô-đun MBQI.

Động cơ MBQI đảm bảo rằng Z3 là quy trình quyết định cho nhiều đoạn (xem http://rise4fun.com/Z3/tutorial/guide). Tuy nhiên, nó là rất tốn kém nói chung, và nên được vô hiệu hóa khi câu trả lời nhanh chóng và xấp xỉ là đủ. Trong trường hợp này, unknown có thể được đọc là probably sat. Các công cụ xác minh như VCC vô hiệu hóa mô-đun MBQI vì nó không có khả năng quyết định các công thức do chúng tạo ra. Đó là, các công thức được sản xuất bởi VCC không nằm trong bất kỳ mảnh nào có thể được quyết định bởi động cơ MBQI. Chúng tôi nói rằng một đoạn có thể được quyết định bởi Z3 khi cho bất kỳ công thức nào trong đoạn Z3 sẽ trả về sat hoặc unsat (tức là nó không trả về unknown). Tất nhiên, yêu cầu này giả định rằng chúng tôi có một lượng tài nguyên không giới hạn. Tức là, Z3 cũng có thể không thành công (tức là, trả lại unknown) cho các đoạn có thể giải quyết được khi hết bộ nhớ hoặc thời gian chờ được người dùng chỉ định.

Cuối cùng, Z3 3.2 có một số bug trong công cụ MBQI. Lỗi đã được sửa và nó không ảnh hưởng đến vấn đề của bạn. Nếu bạn cần tôi có thể cung cấp cho bạn một phiên bản tiền phát hành của Z3 4.0 trong đó có sửa lỗi.

Các vấn đề liên quan