Z3创建两个元素相同但顺序不同的IntVector

Z3创建两个元素相同但顺序不同的IntVector,z3,z3py,Z3,Z3py,我需要一个具有相同值的重复向量,但重复向量的顺序不同。 但是,我不知道如何设置此约束 目前,我正在创建如下向量: age = RealVector('age', NUM) age_med_all = RealVector('age_m_a', NUM) s.add([age[i] == age_med_all[i] for i in range(NUM)]) s.add([age_med_all[i] <= age_med_all[i + 1] for i in range(NUM -

我需要一个具有相同值的重复向量,但重复向量的顺序不同。 但是,我不知道如何设置此约束

目前,我正在创建如下向量:

age = RealVector('age', NUM)
age_med_all = RealVector('age_m_a', NUM)

s.add([age[i] == age_med_all[i] for i in range(NUM)])
s.add([age_med_all[i] <= age_med_all[i + 1] for i in range(NUM - 1)])
我这样试过:

for j in range(NUM) :
    s.add(Sum([If(age[i] == age_med_all[j], 1, 0) for i in range(NUM)]) >= 1)

但是,当我这样做时,两个向量的值并不相同。

最简单的方法是将列表转换为行李,并检查它们是否相等。(包本质上是一个数组,存储存储在其中的每个元素的多重性。)

基于此想法,下面是一个示例实现:

从z3导入*
s=解算器()
#关于10个要素的工作
尺寸=10
#a是原始arary,sortedA将是它的排序版本
a=IntVector('a',大小)
sortedA=IntVector('S',大小)
#断言sortedA确实已排序
对于范围内的i(尺寸-1):
s、 添加(sortedA[i]a[9])#故障
#获取并打印模型
r=s.检查()
如果r==sat:
m=s.模型()
finalA=[]
总决赛=[]
对于范围内的i(尺寸):
finalA.append(m.evaluate(a[i],model_completion=True))
期末考试。附加(m.evaluate(sortedA[i],model_completion=True))
打印(“A=%s”%finalA)
打印(“S=%S”%S)
其他:
打印(“解算器说:%s”%r)
我对代码进行了注释,因此应该很容易理解,但是如果有任何不清楚的地方,请随时询问

当我运行此程序时,我得到:

A = [4, 4, 4, 5, 3, 5, 3, -2, 3, -2]
S = [-2, -2, 3, 3, 3, 4, 4, 4, 5, 5]

您可以验证
S
确实是
A
的排序版本。(根据z3、random seed等的版本,您当然可能会得到不同的答案。但是
S
仍然应该是
a
的排序版本)

最简单的方法是将列表转换为行李,并检查它们是否相等。(包本质上是一个数组,存储存储在其中的每个元素的多重性。)

基于此想法,下面是一个示例实现:

从z3导入*
s=解算器()
#关于10个要素的工作
尺寸=10
#a是原始arary,sortedA将是它的排序版本
a=IntVector('a',大小)
sortedA=IntVector('S',大小)
#断言sortedA确实已排序
对于范围内的i(尺寸-1):
s、 添加(sortedA[i]a[9])#故障
#获取并打印模型
r=s.检查()
如果r==sat:
m=s.模型()
finalA=[]
总决赛=[]
对于范围内的i(尺寸):
finalA.append(m.evaluate(a[i],model_completion=True))
期末考试。附加(m.evaluate(sortedA[i],model_completion=True))
打印(“A=%s”%finalA)
打印(“S=%S”%S)
其他:
打印(“解算器说:%s”%r)
我对代码进行了注释,因此应该很容易理解,但是如果有任何不清楚的地方,请随时询问

当我运行此程序时,我得到:

A = [4, 4, 4, 5, 3, 5, 3, -2, 3, -2]
S = [-2, -2, 3, 3, 3, 4, 4, 4, 5, 5]
您可以验证
S
确实是
A
的排序版本。(根据z3、random seed等的版本,您当然可能会得到不同的答案。但是
S
仍然应该是
a
的排序版本)