Tôi gặp vấn đề tương tự. Cụ thể hơn, tôi cần các chức năng:
Z3_ast Z3_mk_bvredxnor(Z3_context ctx, Z3_ast t)
mà thực hiện một XNOR trên tất cả các bit của một bitvector đưa ra trong tham số cho hàm, và trả về một bitvector chiều dài 1.
Kể từ khi chức năng này không tồn tại trong API, tôi bắt đầu sử dụng:
Z3_ast mk_bvredxnor(Z3_context ctx, Z3_ast t)
{
size_t i;
size_t s = Z3_get_bv_sort_size(ctx,Z3_get_sort(ctx,t));
Z3_ast ret = Z3_mk_extract(ctx,0,0,t);
for(i=1;i<s;i++)
ret = Z3_mk_bvxnor(ctx,ret,Z3_mk_extract(ctx,i,i,t));
return ret;
}
Sau đó, cố gắng gỡ lỗi những hạn chế của tôi là một cơn ác mộng.
Vì vậy, tôi đã đưa ra:
Z3_func_decl getBvredxnorDecl(Z3_context ctx, int size)
{
static bool sizes[64]={0};
static Z3_func_decl declTab[64]={0};
if(sizes[size])
return declTab[size];
Z3_sort bv_size = Z3_mk_bv_sort(ctx, size);
Z3_sort bv1 = Z3_mk_bv_sort(ctx, 1);
stringstream buff;
buff << "bvredxnor" << size;
Z3_symbol var_name = Z3_mk_string_symbol(ctx,"X");
Z3_symbol func_name = Z3_mk_string_symbol(ctx, buff.str().c_str());
Z3_func_decl bvredxnorDecl = Z3_mk_func_decl(ctx,
func_name,
1,
&bv_size,
bv1);
declTab[size]=bvredxnorDecl;
Z3_ast b = Z3_mk_bound(ctx,0,bv_size); /* bounded variable */
Z3_ast bvredxnorApp = Z3_mk_app(ctx,bvredxnorDecl, 1, &b);
Z3_pattern pattern = Z3_mk_pattern(ctx,1,&bvredxnorApp);
Z3_ast bvredxnor_def = mk_bvredxnor(ctx,b);
Z3_ast def = Z3_mk_eq(ctx,bvredxnorApp,bvredxnor_def);
Z3_ast axiom = Z3_mk_forall(ctx,0,1,&pattern,1,&bv_size,&name,def);
Z3_assert_cnstr(ctx,axiom);
return bvredxnorDecl;
}
Z3_ast bvredxnor(Z3_context ctx, Z3_ast t)
{
int size = Z3_get_bv_sort_size(ctx,Z3_get_sort(ctx,t));
return Z3_mk_app(ctx,getBvredxnorDecl(ctx,size),1, &t);
}
Bất kỳ comment để cải thiện điều này sẽ được hoan nghênh. Trong lúc này, nó giải quyết vấn đề tôi đã here
Nó hiện các trick, nhưng complexify mô hình của tôi ...
Ngoài ra tôi tự hỏi:
- Vì đây là tất cả thực hiện programatically, tôi giả sử MACRO_FINDER = TRUE sẽ không có bất kỳ tác động nào (vì nó là một bước xử lý).
- Vì MBQI được bật theo mặc định, không cần phải kích hoạt, phải không?
Cảm ơn bạn đã trả lời chi tiết. Sử dụng định lượng phổ quát chắc chắn là một thủ thuật gọn gàng. Tôi tự hỏi về chi phí sử dụng các định lượng phổ quát và các hàm không diễn giải. Các ràng buộc của tôi trong hình thức LIAs định lượng giờ đây biến thành công thức UFLIA được định lượng. Sự thay đổi này có ảnh hưởng lớn đến thời gian giải quyết Z3 không? – pad
Có, công thức sẽ nằm trong 'UFLIA', nhưng nó nằm trong một phân đoạn có thể giải mã được của UFLIA. Nếu bạn sử dụng tùy chọn 1 ('MACRO_FINDER = true'), thì tác động hiệu suất sẽ rất nhỏ. Z3 sẽ phát hiện các định lượng này dưới dạng macro và sẽ loại bỏ các định lượng và tất cả các lần xuất hiện của các hàm phụ trợ không được giải thích. Do đó, sau khi tiền xử lý vấn đề kết quả sẽ ở trong 'QF_LIA'. Tác động hiệu suất của tùy chọn 2 ('MBQI') không rõ ràng, trong một số vấn đề Z3 có thể nhanh hơn, nhưng ở những người khác chậm hơn nhiều. –
Cảm ơn! Chỉ cần làm rõ, công thức ban đầu của tôi là LIA với số lượng, và tôi muốn sử dụng loại bỏ lượng tử LIA để giải quyết chúng. Tùy chọn 1 dường như hấp dẫn hơn với tôi và tôi sẽ sớm thử nghiệm nó. – pad