假設我想從BoolExpr的類型給定的約束條件提取所有的子式(謂詞而言)和這裏有兩個例子:如何有效地提取Z3中的子公式(謂詞,術語)?
(f(x)=2 and f(y)=3) or (f(z)=1 and f(y)=3)
The output should be f(x)=2, f(y)=3 and f(z)=1.
(p and q) or (p or r) and (p and (q or r))
The output should be p, q and r.
一個天真的方式將遍歷整個AST和記錄所有獨特的子公式。當AST中有大量冗餘節點時,這是令人不快的,我們必須頻繁地執行這種提取。 我想知道是否存在一個乾淨而有效的方法來做到這一點。
我正在使用Z3的Java API。
如果我完全控制操作,比如說,連接,分離等,我可以輕鬆地緩存唯一的子表達式。問題來自於我經常調用「ctx-solver-simplify」來縮小它的大小。在簡化過程中,唯一子表達式的數量可能會縮小,我別無選擇,只能遍歷簡化的expr以再次獲取新的唯一子表達式,這是非常低效的。 – 2014-09-11 03:45:19