假设一组公理简化Z3中的非布尔表达式
假设有一组公理,有没有办法简化Z3中的非布尔表达式 例如,我想断言“a==b”,然后简化表达式 “如果(a==b,1,2)”得到“1” 特别是,我对阵列理论感兴趣: 这应该返回“1”,因为根据数组理论规则,假设所有索引都不同,Select表达式可以简化为“1” 我尝试过使用“ctx解算器简化”策略,但它似乎只适用于布尔表达式。是否有其他方法来简化非布尔表达式,或者以某种方式告诉数组重写器索引是不同的假设一组公理简化Z3中的非布尔表达式,z3,Z3,假设有一组公理,有没有办法简化Z3中的非布尔表达式 例如,我想断言“a==b”,然后简化表达式 “如果(a==b,1,2)”得到“1” 特别是,我对阵列理论感兴趣: 这应该返回“1”,因为根据数组理论规则,假设所有索引都不同,Select表达式可以简化为“1” 我尝试过使用“ctx解算器简化”策略,但它似乎只适用于布尔表达式。是否有其他方法来简化非布尔表达式,或者以某种方式告诉数组重写器索引是不同的 谢谢。正如Nikolaj在上面的评论中所描述的,ctx solver simplify不会在非布
谢谢。正如Nikolaj在上面的评论中所描述的,
ctx solver simplify
不会在非布尔表达式下运行。另一种选择是使用策略求解等式
,该策略将使用断言的等式重写公式的其余部分。例如,给定等式a==b
,Z3将用a
替换b
(反之亦然)。之后,if(a==b,1,2)
将被重写为1
但是,solve eq
不会使用诸如Distinct(a,b,c)
之类的属性。另一个选项是使用策略传播值
。它将断言P
的每次出现都替换为true
。类似地,如果我们有一个断言而不是P
,它将用false
替换P
。
这种策略实质上是执行单元布尔传播。此外,它意味着快速,不会应用任何形式的理论推理。例如,如果我们有Distinct(a,b,c)
,它不会将a==b
替换为false
。因此,这种方法对于您的目的来说可能过于脆弱。
下面是一个使用它的脚本。它也可以在网上获得。在这个脚本中,我使用一个新的谓词P
包装表达式A4[a]
,因为Z3目标是一组布尔公式。
我使用blast\u distinct
将distinct
转换为一系列质量,并使用expand\u select\u store
将表单store(a,I,v)[j]
的一个术语扩展为表单if(I==j,v,a[j])
的if-then-else
。注意,结果包含P(1)
,这表明P(A4[a])
被简化为1
I=bit向量排序(32)
A=数组('A',I,I)
a=比特向量('a',32)
b=比特向量('b',32)
c=比特向量('c',32)
A2=门店(A、A、1)
A3=仓库(A2、b、2)
A4=仓库(A3、c、3)
P=函数('P',I,BoolSort())
G=目标()
G.add(P(A4[a]))
G.添加(不同的(c、b、a))
T=然后(使用(“简化”,blast\u distinct=True,expand\u select\u store=True),“传播值”)
印刷品(T(G))
正如Nikolaj在上述评论中所述,ctx solver simplify
将不会在非布尔表达式下运行。另一种选择是使用策略求解等式
,该策略将使用断言的等式重写公式的其余部分。例如,给定等式a==b
,Z3将用a
替换b
(反之亦然)。之后,if(a==b,1,2)
将被重写为1
但是,solve eq
不会使用诸如Distinct(a,b,c)
之类的属性。另一个选项是使用策略传播值
。它将断言P
的每次出现都替换为true
。类似地,如果我们有一个断言而不是P
,它将用false
替换P
。
这种策略实质上是执行单元布尔传播。此外,它意味着快速,不会应用任何形式的理论推理。例如,如果我们有Distinct(a,b,c)
,它不会将a==b
替换为false
。因此,这种方法对于您的目的来说可能过于脆弱。
下面是一个使用它的脚本。它也可以在网上获得。在这个脚本中,我使用一个新的谓词P
包装表达式A4[a]
,因为Z3目标是一组布尔公式。
我使用blast\u distinct
将distinct
转换为一系列质量,并使用expand\u select\u store
将表单store(a,I,v)[j]
的一个术语扩展为表单if(I==j,v,a[j])
的if-then-else
。注意,结果包含P(1)
,这表明P(A4[a])
被简化为1
I=bit向量排序(32)
A=数组('A',I,I)
a=比特向量('a',32)
b=比特向量('b',32)
c=比特向量('c',32)
A2=门店(A、A、1)
A3=仓库(A2、b、2)
A4=仓库(A3、c、3)
P=函数('P',I,BoolSort())
G=目标()
G.add(P(A4[a]))
G.添加(不同的(c、b、a))
T=然后(使用(“简化”,blast\u distinct=True,expand\u select\u store=True),“传播值”)
印刷品(T(G))
“我曾尝试使用“ctx解算器简化”策略,但它似乎只适用于布尔表达式。”这是正确的。ctx解算器简化例程不会在非布尔项下运行。这个简化器使用的算法可以被推广到非布尔项下,但我并不期望有这样的应用。它利用了这样一个假设,即它在一些地方简化了布尔表达式。“我曾尝试使用“ctx解算器简化”策略,但它似乎只适用于布尔表达式。”这是正确的。ctx解算器简化例程不会在非布尔项下运行。这个简化器使用的算法可以被推广到非布尔项下,但我并不期望有这样的应用。它利用了这样一个假设,即它在某些地方简化了布尔表达式。
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))