正如Nikolaj在上面的評論中所述,ctx-solver-simplify
不會在非布爾表達式下行走。另一個選擇是使用策略solve-eqs
,它將使用聲明的等式來重寫公式的其餘部分。例如,給定等於a == b
,Z3將用a
(或反之亦然)替換每個出現的b
。之後,if(a == b, 1, 2)
將被重寫爲1
。
但是,solve-eqs
將不會使用不平等,如Distinct(a, b, c)
。另一種選擇是使用策略propagate-values
。它用true
代替斷言P
的每一次出現。同樣,如果我們有一個斷言not P
,它將用false
代替P
的每一個其他事件。 這種策略本質上是執行單位布爾傳播。此外,它意味着速度很快,並且不會應用任何形式的理論推理。例如,如果我們有Distinct(a, b, c)
,它將不會用false
代替a == b
。所以,這種方法可能對您而言太脆弱了。 這是一個使用它的腳本。它也可以在線獲得here。在此腳本中,我使用新謂詞P
來包裝表達式A4[a]
,因爲Z3目標是一組布爾公式。 我使用blast_distinct
將Distinct
轉換爲一個不等式序列,並使用expand_select_store
將store(A, i, v)[j]
形式的項擴展爲形式if(i == j, v, A[j])
的if-then-else
。請注意,結果包含P(1)
,表示P(A4[a])
已簡化爲1
。
I = BitVecSort(32)
A = Array('A', I, I)
a = BitVec('a',32)
b = BitVec('b',32)
c = BitVec('c',32)
A2 = Store(A, a, 1)
A3 = Store(A2, b, 2)
A4 = Store(A3, c, 3)
P = Function('P', I, BoolSort())
G = Goal()
G.add(P(A4[a]))
G.add(Distinct(c, b, a))
T = Then(With("simplify", blast_distinct=True, expand_select_store=True), "propagate-values")
print(T(G))
「我試圖用‘CTX-解算器,簡化’的戰術, 但它似乎只針對布爾表達式的工作。」 這是正確的。 ctx-solver-simplify例程不會在非布爾方式下行走。 這個簡化器使用的算法可以推廣到非布爾型條件, ,但我沒有期待這個應用程序。它利用了這樣一個假設:它在一些地方簡化了布爾表達式。 – 2013-03-24 00:23:39