SMT约束求解器Z3——java绑定

Z3是由微软公司开发的一个优秀的SMT求解器(也就定理证明器),它能够检查逻辑表达式的可满足性。

1.下载

准备必要的组件:下载对应版本的Z3 编译文件,版本下载链接https://github.com/z3prover/z3/releases

2.解压缩

SMT约束求解器Z3——java绑定_第1张图片

3.项目导入


在Java项目中新建一个libs文件夹(如果没有的话),将z3\bin目录下的com.microsoft.z3.jar这个JAR包复制进去,并且在eclipse中导入。

导入方法:

(1)绝对路径引用:右键工程-->properties-->java Build Path-->Libraries-->Add external JARs... ,在弹出的对话框中选择要引入的jar包,OK即可。

(2)相对路径引用:首先在工程目录下,新建一个libs文件夹,将要导入的jar包放入其中,然后右键工程-->properties-->java Build Path-->Libraries-->Add JARs... ,在弹出的对话框中选择libs文件夹下的jar包即可。

SMT约束求解器Z3——java绑定_第2张图片

4.组件复制

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

SMT约束求解器Z3——java绑定_第3张图片

(此图片最后两个文件即是需要复制的.dll文件)

5.代码导入

在需要z3的java文件导入jar包,代码如下:

import com.microsoft.z3.*; 

6.例子

原代码:http://read.pudn.com/downloads792/sourcecode/java/3126846/src/demo.java__.html

package testZ3;
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 Test {  
  
      
    public static void main(String[] args){  
        try{  
            HashMap cfg = new HashMap();  
            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();  
        }  
          
    }  
}  

结果截图:

SMT约束求解器Z3——java绑定_第4张图片

项目目录结构:

SMT约束求解器Z3——java绑定_第5张图片

你可能感兴趣的:(Java,求解器)