如何使用z3 c api来解决数组理论

时间:2015-06-02 13:02:10

标签: arrays theory z3

我想用z3 c api来解决这样的数组理论问题,一个数组中有五个元素,即数组[5],select(a,i,v1)= select(a,j,v2) ),v1不等于v2且i等于j,所以这应该是不可满足的,由z3解决。 问题是如何表达v1不等于v2?来自C api的例子只给出了一个令人满意的例子,当不满足的实例例如在同一个数组索引中给出不同的值时,我试图使用无法编译的Z3_mk_neq(ctx, sel1, sel2),,有人知道怎么做吗?

Z3_context ctx;    Z3_sort int_sort,array_sort;

ctx = mk_context();
Z3_ast array[5];
for(i=0; i<5; i++){
Z3_symbol s = Z3_mk_int_symbol(ctx,i);
array[i] = Z3_mk_const(ctx,s,array_sort);
}
array[i]         = Z3_mk_store(ctx, array[i], i, v1);
array[j]         = Z3_mk_store(ctx, array[j], j, v2);

sel1        = Z3_mk_select(ctx, array[i], i);
sel2        = Z3_mk_select(ctx, array[j], j);
antecedent  = Z3_mk_eq(ctx, array[i], array[j]);
ds[0]       = Z3_mk_eq(ctx, i, i1);
ds[1]       = Z3_mk_eq(ctx, j, i1);
ds[2]       = Z3_mk_eq(ctx, sel1, sel2);
consequent  = Z3_mk_or(ctx, 3, ds);

2 个答案:

答案 0 :(得分:0)

Z3_mk_const(ctx, s, array_sort)声明一个(Array Int Int)类型的变量,你在数组[i]和数组[j]上做选择,这两个是不同的数组。如果你想证明选择(a,i, v1)= select(a,j,v2),你应该使用相同的变量。

v1不等于v2,你可以试试这个:Z3_mk_not(ctx, Z3_mk_eq(ctx, v1, v2)); 以下用于证明结果的代码是&#34;不良&#34;。

(declare-const a (Array Int Int))
(declare-const i Int)
(declare-const j Int)
(declare-const v1 Int)
(declare-const v2 Int)
(assert (= i j))
(assert (not (= v1 v2)))
(assert (= (store a i v1) a))
(assert (= (store a j v2) a))
(assert (= (select a i) (select a j)))
(check-sat)

答案 1 :(得分:0)

最好使用c ++ api来解决它。代码如下

context c;
unsigned i=0,j;
expr_vector T(c);
solver s(c);

for(; i<20; i++){
    std::stringstream Tname;
    Tname<<"Tname_"<<i;
    T.push_back(c.int_const(Tname.str().c_str()));
}

for(i=0; i<20; i++){
    for(j=0; j<20;j++){
        if(j == i){
            s.add(T[i] != T[j]);

        }
    }
}
std::cout<<s<<"\n"<<s.check()<<std::endl;