【发布时间】:2013-03-23 23:31:26
【问题描述】:
有没有办法在 Z3 中假设一组公理来简化非布尔表达式?
例如,我想断言“a==b”,然后简化表达式 "If(a == b, 1, 2)" 得到 "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) simplify_assuming(A4[a], Distinct(a, b, c))
这应该返回“1”,因为根据数组理论规则,假设所有索引都是不同的,Select 表达式可以简化为“1”。
我尝试使用“ctx-solver-simplify”策略,但它似乎只适用于布尔表达式。有没有其他方法可以简化非布尔表达式,或者以某种方式告诉数组重写器索引是不同的?
谢谢。
【问题讨论】:
-
“我尝试使用“ctx-solver-simplify”策略,但它似乎只适用于布尔表达式。”那是对的。 ctx-solver-simplify 例程不会在非布尔项下运行。这个简化器使用的算法可以推广到非布尔项下,但我并没有预料到这个应用程序。它利用了在某些地方简化了布尔表达式的假设。
标签: z3