使用z3 api解决LRA的速度比在终端中使用z3要慢

时间:2016-09-22 02:41:39

标签: c z3 smt

我正在尝试使用Z3来解决随机广义条带打包问题(LRA),我在一个c程序中调用Z3 api,这是代码。

Z3_context ctx;
Z3_ast fs;
LOG_MSG("smt2parser_example");
FILE *fp = fopen("smttest","r");  
if(fp == NULL)  
{
    perror("fopen()");
    return;
}
int file_size;
fseek(fp,0,SEEK_END);
file_size = ftell( fp );

char *tmp;
fseek( fp , 0 , SEEK_SET);
tmp =  (char *)malloc( (file_size+1) * sizeof( char ) );
tmp[file_size]='\0';
fread( tmp , file_size , sizeof(char) , fp);

ctx = mk_context();
fs  = Z3_parse_smtlib2_string(ctx, tmp, 0, 0, 0, 0, 0, 0);
Z3_assert_cnstr(ctx, fs);

Z3_model m      = 0;

Z3_check(ctx);

Z3_del_context(ctx);

我也尝试通过命令“z3 smttest”来解决终端中的smttest。但是,在终端中,它比在c程序中调用api运行得更快。我想知道是否需要设置任何配置以使其在api模式下快速运行?(顺便说一下,z3在终端上运行速度比调用api快两倍。)

1 个答案:

答案 0 :(得分:0)

功能“Z3_assert_cnstr(ctx,fs);”不再可用,因此您必须使用非常旧版本的Z3。使用“solver”对象来断言表达式,并使用C ++ API来提高可靠性。您可以为指定的逻辑创建求解器,例如“QF_LRA”,在这种情况下,初始设置被强制适用于该逻辑。默认情况下,Z3会尝试通过在第一次检查之前分析断言的公式来自动找到好的设置。