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

时间:2014-08-29 08:39:26

标签: z3 smt

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

(declare-datatypes () ((A (mk_A (key Int) (var1 Int) (var2 Int)))))

其中key应该像数据库中的主键一样,即A的每个不同实例应具有不同的key值。 不同实例(函数)的容器如下所示:

(declare-const A_instances (Array Int A))

到目前为止一切顺利。我尝试创建一个断言,以便A_instances中的所有实例都有一个不同的key字段。因此,对于A_instances i中的每个索引(key (select A_instances i))应该是不同的。但是它返回unknown

有人有什么建议吗?

1 个答案:

答案 0 :(得分:2)

一种可能的解决方案是

(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