2012-09-19 37 views
9

Tóm lại, tôi cần có khả năng đi qua cây Z3_ast và truy cập dữ liệu liên kết với các nút của nó. Có vẻ như không tìm thấy bất kỳ tài liệu/ví dụ nào về cách thực hiện điều đó. Bất kỳ con trỏ nào cũng hữu ích.Di chuyển cây Z3_ast trong C/C++

Chiều dài, tôi cần phải phân tích công thức loại smt2lib thành Z3, thực hiện một số biến để thay thế liên tục và sau đó tạo lại công thức trong cấu trúc dữ liệu tương thích với một liên kết SMT không liên quan khác. suy nghĩ chi tiết về mistral là quan trọng đối với câu hỏi này nhưng vui vẻ, nó không có giao diện dòng lệnh, nơi tôi có thể cho nó công thức văn bản. Nó chỉ có một API C). Tôi đã tìm ra rằng để tạo ra công thức trong định dạng của mistral, tôi sẽ cần phải đi qua cây Z3_ast và xây dựng lại công thức theo định dạng mong muốn. Tôi dường như không thể tìm thấy bất kỳ tài liệu/ví dụ nào chứng minh cách thực hiện điều này. Bất kỳ con trỏ nào cũng hữu ích.

Trả lời

6

Xem xét sử dụng các lớp phụ trợ C++ được xác định tại z3++.h. Bản phân phối Z3 cũng bao gồm một ví dụ sử dụng các lớp này. Đây là một đoạn mã nhỏ đi qua một biểu thức Z3. Nếu công thức của bạn không chứa số lượng, thì bạn thậm chí không cần xử lý các chi nhánh is_quantifier()is_var().

void visit(expr const & e) { 
    if (e.is_app()) { 
     unsigned num = e.num_args(); 
     for (unsigned i = 0; i < num; i++) { 
      visit(e.arg(i)); 
     } 
     // do something 
     // Example: print the visited expression 
     func_decl f = e.decl(); 
     std::cout << "application of " << f.name() << ": " << e << "\n"; 
    } 
    else if (e.is_quantifier()) { 
     visit(e.body()); 
     // do something 
    } 
    else { 
     assert(e.is_var()); 
     // do something 
    } 
} 

void tst_visit() { 
    std::cout << "visit example\n"; 
    context c; 

    expr x = c.int_const("x"); 
    expr y = c.int_const("y"); 
    expr z = c.int_const("z"); 
    expr f = x*x - y*y >= 0; 

    visit(f); 
} 
Các vấn đề liên quan