簡體   English   中英

我可以通過z3 c ++接口將SMT2文件讀入求解器嗎?

[英]Can I read a SMT2 file into a solver through the z3 c++ interface?

我遇到了一個問題,即盡管有相當長的超時時間,但是嵌入較大系統中的z3代碼卻找不到針對特定約束集(通過C ++接口添加)的解決方案。 當我將約束轉儲到文件中時(在調用check()之前使用求解器上的to_smt2()方法),並通過獨立的z3可執行文件運行文件,它將在大約4秒鍾內解決系統問題(返回sat )。 就其價值而言,該文件長476,587行,因此有很多約束。

有沒有一種方法可以使用C ++接口將文件讀回到嵌入式求解器,從而替換現有的約束條件,以查看嵌入式版本是否可以從與獨立求解器完全相同的起點進行求解? (本質上,如何在Solrer類上創建對應的from_smt2(stream)方法?)

當然,它們應該與現在具有相同的約束集,但是當從文件中讀取它們時,可能會產生一些排序效果,或者在嵌入它時,在求解器中引入了一些細微的差異,或者沒有不會用to_smt2()寫出來。 因此,如果可以的話,我想嘗試將文件讀回,以縮小差異的可能來源。 關於調試長時間運行的版本時要查找的內容的建議也將很有幫助。

進一步的注意:看來另一個用戶在這里也有類似的問題。 與該用戶不同,我的問題使用所有位向量,唯一未知的結果是嵌入式代碼中的結果。 如那里所建議的,是否有一種方法可以從C ++接口調用(get-info:reason-unknown),以找出為什么嵌入式版本有問題?

您可以使用方法“ solver :: reason_unknown()”來檢索搜索失敗的說明。 有一些將文件和字符串解析為單個表達式的方法。 在有一組斷言的情況下,表達式是一個連詞。 為方便起見,直接將這種方法添加到求解器類中可能是一個好主意。 這將是:

    void from_smt2_string(char const* smt2benchmark) {
        expr fml = ctx().parse_string(smt2benchmark);
        add(fml);
    }

因此,如果要在求解器類之外編寫它,則需要:

      expr fml = solver.ctx().parse_string(smt2benchmark);
      solver.add(fml);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM