z3 SMT解算器中的不同数组值

z3 SMT解算器中的不同数组值,z3,smt,Z3,Smt,我花了一段时间尝试完成一个相当简单的要求: 我声明了一个新的数据类型 (声明数据类型()((A(mk_A(key Int)(var1 Int)(var2 Int ')) 其中,key应与数据库中的主键类似,即,a的每个不同实例应具有不同的key值。 不同实例(函数)的容器如下所示: (声明常量A_实例(数组Int A)) 到目前为止还不错。我试图创建一个断言,这样A_instances中的所有实例都有一个不同的key字段。因此,对于A_实例中的每个索引i(键(选择A_实例i))应该是不同的。但是

我花了一段时间尝试完成一个相当简单的要求: 我声明了一个新的数据类型

(声明数据类型()((A(mk_A(key Int)(var1 Int)(var2 Int '))

其中,
key
应与数据库中的主键类似,即,
a
的每个不同实例应具有不同的
key
值。 不同实例(函数)的容器如下所示:

(声明常量A_实例(数组Int A))

到目前为止还不错。我试图创建一个断言,这样
A_instances
中的所有实例都有一个不同的
key
字段。因此,对于A_实例中的每个索引
i
(键(选择A_实例i))应该是不同的。但是,它返回
未知


有人有什么建议吗?

一个可能的解决方案是

(declare-datatypes () ((A (mk_A (key Int) (var1 Int) (var2 Int)))))
(declare-const A_instances (Array Int A))
(declare-fun j () Int)
(assert (forall ((i Int))  (implies (distinct i j) 
                           (distinct (key (select A_instances i))  
                                     (key (select A_instances j)))        )   ))
(check-sat)
相应的输出是

sat