SMT约束求解器Z3 Prover的Java绑定

1
Z3是由微软公司开发的一个优秀的SMT求解器(也就定理证明器),它能够检查逻辑表达式的可满足性。
最近要在Java代码使用Z3,走了很多弯路,费了大约一周时间才搭好环境,所以写下此经验帖,对于其他语言的绑定应该同理:

下载

准备必要的组件:下载对应版本的Z3 编译文件,我的电脑是WIN10 64位版本的,所以下载了z3-4.8.1.016872a5e0f6-x64-win.zip【注意:这个编译文件是JDK11编译的,所以需要JDK11以上才能运行,否则会报java.lang.UnsupportedClassVersionError错误】。

解压缩

解压缩第1步下载的压缩包,暂时称为文件夹z3吧
2

项目导入

在Java项目中新建一个libs文件夹(如果没有的话),将z3\bin目录下的com.microsoft.z3.jar这个JAR包复制进去,并且在eclipse中导入。(不会导入请看:eclipse中的java工程项目如何引用外部jar包和dll动态链接库?,不需要导入dll文件)
3

组件复制

将z3\bin目录下libz3java.dll和libz3.dll文件复制到jdk\bin目录下,也就是你的JAVA_HOME\bin里。

代码导入

在需要z3的java文件导入jar包:

import com.microsoft.z3.*; 

代码编写

编写z3相应代码,运行即可。
在这里插入图片描述

Demo

附上网上找的一段Demo,作者dingbao

import java.util.HashMap;  

import com.microsoft.z3.*;  
  
/** 
 * a simple example 
 * solve equation: x + y*c*e = d + a using z3 
 * @author dingbao 
 *  
 */  
public class z3Demo {  
  
      
    public static void main(String[] args){  
        try{  
            HashMap<String, String> cfg = new HashMap<String, String>();  
            cfg.put("model", "true");  
            Context ctx = new Context(cfg);  
            Solver s = ctx.mkSolver();  
            RealExpr a = ctx.mkRealConst("a");  
            RealExpr c = ctx.mkRealConst("c");  
            RealExpr d = ctx.mkRealConst("d");  
            RealExpr e = ctx.mkRealConst("e");  
            RealExpr x = ctx.mkRealConst("x");  
            RealExpr y = ctx.mkRealConst("y");  
            ArithExpr left = ctx.mkAdd(x, ctx.mkMul(y, c, e));  
            ArithExpr right = ctx.mkAdd(d, a);  
            BoolExpr equation = ctx.mkEq(left,  right);  
            s.add(equation);  
            s.add(ctx.mkGt(a, ctx.mkReal(0)));  
            Status result = s.check();  
            if (result == Status.SATISFIABLE){  
                System.out.println("model for: x + y*c*e = d + a, a > 0");  
                System.out.print(s.getModel());  
                System.out.println(a.toString());  
                Expr a_value = s.getModel().evaluate(a, false);  
                System.out.println(a_value.toString());  
            }  
            else if(result == Status.UNSATISFIABLE)  
                    System.out.println("unsat");  
            else   
                System.out.println("unknow");  
              
        }catch(Exception e){  
            System.out.println("z3 exception");  
            e.printStackTrace();  
        }  
          
    }  
}  

如果你有什么疑问,可以在下面留言。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值