假设一组公理简化Z3中的非布尔表达式

假设一组公理简化Z3中的非布尔表达式,z3,Z3,假设有一组公理,有没有办法简化Z3中的非布尔表达式 例如,我想断言“a==b”,然后简化表达式 “如果(a==b,1,2)”得到“1” 特别是,我对阵列理论感兴趣: 这应该返回“1”,因为根据数组理论规则,假设所有索引都不同,Select表达式可以简化为“1” 我尝试过使用“ctx解算器简化”策略,但它似乎只适用于布尔表达式。是否有其他方法来简化非布尔表达式,或者以某种方式告诉数组重写器索引是不同的 谢谢。正如Nikolaj在上面的评论中所描述的,ctx solver simplify不会在非布

假设有一组公理,有没有办法简化Z3中的非布尔表达式

例如,我想断言“a==b”,然后简化表达式 “如果(a==b,1,2)”得到“1”

特别是,我对阵列理论感兴趣:

这应该返回“1”,因为根据数组理论规则,假设所有索引都不同,Select表达式可以简化为“1”

我尝试过使用“ctx解算器简化”策略,但它似乎只适用于布尔表达式。是否有其他方法来简化非布尔表达式,或者以某种方式告诉数组重写器索引是不同的


谢谢。

正如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))