我想用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);
答案 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;