SAT和SMT介绍及求解器使用

一、SAT

1、介绍

(1)定义

SAT即命题逻辑公式的可满足性问题/布尔可满足性问题。即给定一个与或非和变量组成的命题公式,判断是否存在一些结果使得这个公式成立

它是第一个被确认为NP完全的问题。

  • 输入:析取范式(CNF)
  • 输出:布尔值,代表是否可满足(SAT/UNSAT)

以演讲是否需要打领带的例子,说明它有几个组成部分:

  • 布尔变量/文字(literal):tie(领带),shirt(衬衫)
  • 符号:~(非)、∧(与)、 ∨(或)
  • 子句(clause)-析取式
    • 演讲不能只打领带,不穿衬衫: (tie∧shirt) → ~ tie ∨ shirt
    • 演讲不能既不打领带,也不穿衬衫: ( tie∧~shirt) → tie ∨ shirt
    • 自己不喜欢既打领带,又穿衬衫: ~(tie∧shirt) → ~ tie ∨ ~ shirt
  • 约束/公式-合取式: (~ tie ∨ shirt) ∧ (tie ∨ shirt) ∧ (~ tie ∨ ~ shirt)

由文字和符号组成子句。经过变换,子句构成完整约束。则SAT求解器的输入是3个子句。

(2)求解思路

SAT的求解过程可以划分成两个阶段:第一阶段是布尔约束传播/子句传播,第二阶段是冲突分析,可以采用递归回溯(DPLL算法)或冲突子句学习(CDCL算法)。

求解过程及两个算法的差异可以在网站 https://cse442-17f.github.io/Conflict-Driven-Clause-Learning/ 上看到可视化效果。

a)布尔约束传播

子句传播就类似在做数独游戏时,在某个空格填入某一个数字之后,就会排除掉一些其它空格内数字的选项,从而减少尝试赋值的次数。如果这个过程推出一个值为假的子句,我们称为『发生冲突』。如果发生冲突,就像是走迷宫,要退回上一个岔路口,选择一条不同的路再继续走。它的运行思路如下:

  • 对一个文字赋值后,以此为条件进一步给其他文字赋值(BCP)
    • 未发生冲突,尝试为下一个赋值。
    • 直到所有变量均赋值且没有冲突 → SAT
  • 发生冲突,回溯

但这个过程也有可能在退到上一个路口后又来到同一个死胡同,我们希望找到可以避开死胡同的岔路。这就来到冲突分析环节。

b)冲突分析
  • 递归回溯(DPLL算法)

    冲突回溯也会产生两个结果:回溯到了首次赋值,这意味着这个问题横竖都是无法满足的,那么就可以宣告“UNSAT”;反之,则回溯到之前的某次赋值,撤销这次赋值之后的所有赋值,类似一个undo操作。这个就是比较经典的DPLL算法,但这样存在一些问题。一方面是,它遇到冲突的时候,只知道当前的部分赋值会导致冲突,除此之外学不到任何东西。另一方面,它每次只会回溯一层,因此可能会把大量时间浪费在一片必定会失败的搜索空间中。DPLL的运行思路如下:

    • 回溯到首次赋值 → UNSAT

    • 回溯到之前某次赋值

      • 撤销这次之后的所有赋值
      • 换一条没走过的路
  • 冲突子句学习(CDCL算法)

    CDCL的不同之处在于,我们是如何从这一步走入之前的冲突的信息,现在作为一个新的子句被加入到子句列表中,为要使这个新子句满足,我们一定不会再进入到之前的冲突了。它比DPLL多了一步操作,运行思路如下:

    • 回溯到首次赋值 → UNSAT
    • 回溯到之前某次赋值
      • 撤销这次之后的所有赋值
      • 这次冲突作为新的子句加入到条件中
      • 换一条没走过没冲突的路

在这里插入图片描述

2、Minisat求解器

官网:http://minisat.se/

Github:https://github.com/niklasso/minisat

Minisat的基本使用方法:https://blog.csdn.net/nbu_dahe/article/details/115518719

(1)安装

sudo apt install minisat
  • 使用说明:minisat --help
    • 使用格式:minisat [options] <input-file> <result-output-file>
      请添加图片描述
      请添加图片描述

(2)使用

  • 创建CNF.txt文件如下,c代表注释行
【CNF.txt】
c An example DIMACS CNF
p cnf 2 3 
-1 2 0 
1 2 0
-1 -2 0
  • 示例一

minisat调用刚才创建的CNF.txt,结果输出到answer.txt

.txt的后缀名也可以改成.cnf

minisat CNF.txt answer.txt

运行完成后会在当前目录得到一个answer.txt

【answer.txt】
SAT
-1 2 0

请添加图片描述

  • 示例二
【CNF.txt】
p cnf 2 4
-1 2 0 
1 2 0
-1 -2 0
1 -2 0
【answer.txt】
UNSAT

请添加图片描述

3、EasySAT求解器

Github: https://github.com/shaowei-cai-group/EasySAT

安装:在目录下make

4、其他求解器

CaDiCaL求解器:github

其他:GRASP、Chaff、SATO、BerkMin

二、SMT

1、介绍

这个SMT是在SAT的基础上实现的,目的是求出指定约束下的可行解。如果说SAT把注意力放在命题公式判定上,SMT就在SAT的基础上可以分析各种不等式和等式下的约束求解

SMT惰性算法流程如下:

  • 1、对SMT公式进行预处理,把公式中的命题变量替换为布尔变量,再将SMT公式转化为可满足性意义上等价的SAT公式;
  • 2、检查此SAT公式是否可满足,如果不可满足,那么SMT公式也不可满足,算法结束;
  • 3、如果SAT公式可满足,则结合SMT背景理论去判断SMT公式的可满足性,返回判断结果,算法结束。
  • 惰性算法是SAT求解器与对应的背景理论相结合的产物

2、z3-solver求解器

z3-solver是由Microsoft Research(微软)开发的SMT求解器,它用于检查逻辑表达式的可满足性,可以找到一组约束中的其中一个可行解,缺点是无法找出所有的可行解(对于规划求解问题可以是scipy) 。

z3-solver可应用于软/硬件的验证与测试、约束求解、混合系统的分析、安全、生物,以及几何求解等问题。

Z3主要由**C++**开发,提供了.NET、 C、 C++、 Java、 Python 等语言调用接口,下面以python接口展开讲解。

github:https://github.com/Z3Prover/z3

document:https://github.com/Z3Prover/z3/wiki/Documentation

  • API:C、C++、.NET、Java、Python、ML/OCaml
  • Z3 Guide
    • z3介绍
    • Python样例:Z3 API in Python(链接1);Z3 API in Python(链接2)
    • 网页端在线运行-Freeform Editing:应用SMTLIB语言
      • SMT-LIB语言介绍:https://zhuanlan.zhihu.com/p/624758007
  • Slide
  • Publications

(1)安装

pip install z3-solver importlib_resources
  • 变量
    • 整型(Int),实型(Real)、向量(BitVec)和布尔(Bool)
      • Int(name):创建一个整数变量,有名字
      • Ints(names):创建多个整数变量,有名字
      • IntVal (val):创建一个整数常量,有初始值
  • 关键函数
    • x, y = Ints(‘x y’) —设置变量
    • s=solver() —创建解对象
      • s.add(条件):为解增加一个约束
      • s.check():检查解是否存在,存在则返回“SAT”
      • s.model():返回解,即变量x和y的具体数值
      • s.assertions():查看已经添加的约束And(a,b)、Or(a,b)、Not(a)、 Implies(a,b)

(2)使用-解数独问题

请添加图片描述
请添加图片描述

from z3 import *

def solveShuDu(constraint, board: list):
    board_c = [If(board[i][j] == 0,
                  True,
                  X[i][j] == board[i][j])
               for i in range(9) for j in range(9)]

    s = Solver()
    s.add(constraint + board_c)
    if s.check() == sat:
        m = s.model()
        r = [[m[X[i][j]].as_long() for j in range(9)]
             for i in range(9)]
        return r

# 1、变量:9x9 整数变量矩阵
X = [[Int(f"x_{i}_{j}") for j in range(9)] for i in range(9)]

# 2、条件
# 每个单元格只能取1-9
cells_c = [And(1 <= X[i][j], X[i][j] <= 9) for i in range(9) for j in range(9)]

# 每行每个数字最多出现一次
rows_c = [Distinct(X[i]) for i in range(9)]

# 每列每个数字最多出现一次
cols_c = [Distinct([X[i][j] for i in range(9)]) for j in range(9)]

# 每个 3x3 方格每个数字最多出现一次
sq_c = [Distinct([X[3*i0 + i][3*j0 + j]
        for i in range(3) for j in range(3)])
        for i0 in range(3) for j0 in range(3)]
# 数独完整约束条件
constraint = cells_c + rows_c + cols_c + sq_c

# 3、求解
board = [
    [0, 0, 0, 0, 7, 0, 0, 0, 0],
    [0, 0, 0, 5, 0, 0, 0, 2, 8],
    [1, 0, 6, 0, 8, 3, 0, 0, 9],
    [9, 0, 5, 0, 0, 0, 0, 1, 2],
    [0, 0, 0, 1, 0, 0, 0, 5, 0],
    [0, 0, 1, 0, 3, 0, 0, 0, 0],
    [5, 0, 0, 2, 0, 8, 0, 3, 6],
    [7, 0, 8, 0, 5, 0, 0, 0, 0],
    [0, 0, 0, 3, 0, 0, 0, 0, 0]
]
r = solveShuDu(constraint, board)

参考样例:z3求解器(SMT)解各类方程各种逻辑题非常简单直观

3、Yices2求解器(Ubuntu)

(1)安装

  • 官网: https://yices.csl.sri.com/index.html

  • 安装

    sudo add-apt-repository ppa:sri-csl/formal-methods
    sudo apt-get update
    sudo apt-get install yices2
    

(2)使用-解方程

  • 使用格式:yices [option] <filename>

    • 参考样例:https://yices.csl.sri.com/papers/manual.pdf(P34)
  • 创建yices_example.txt

    这是一个解方程问题,对于-y<0和y-10<0、-2x-7y<0

    (define x::real)
    (assert
    (forall (y::real)
    (=> (and (< (* -1 y) 0) (< (+ -10 y) 0))
    (< (+ -7 (* -2 x) y) 0))))
    (ef-solve)
    (show-model)
    
  • 运行 yices

    yices --mode=ef yices_example.txt
    

    请添加图片描述

4、CVC5求解器

(1)安装

  • 官网: https://cvc5.github.io/
  • 在线CVC: https://cvc5.github.io/app/
  • 说明文档:https://cvc5.github.io/docs/cvc5-1.0.8/
  • 安装

请添加图片描述

(2)使用-字符串判断

  • 参考样例:
    • https://cvc5.github.io/docs/cvc5-1.0.8/examples/examples.html
    • https://smtlib.cs.uiowa.edu/examples.shtml (smtlib语言)
  • SMT-LIB语言:https://zhuanlan.zhihu.com/p/624758007

请添加图片描述

5、其他求解器

LiMbS+:SMT求解器LiMbS+基于矛盾体分离的多元协同动态

参考链接

  • SAT

SAT问题及其求解

用JavaScript写的基于CDCL的SAT求解器及学习笔记

【试译】冲突驱动子句学习 (Conflict Driven Clause Learning)

从零开始编写SAT求解器(一)

从零开始编写SAT求解器(二)

从零开始编写SAT求解器(三)

  • SAT-Minisat

知乎:miniSAT求解器(updating)

基于CDCL的SAT求解器MiniSat讲解(布尔约束传播部分)

基于CDCL的SAT求解器MiniSat讲解(冲突子句学习部分)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/459197.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新站上线了

新站上线了 由于本人自身的向往&#xff0c;以及粉丝朋友的广大呼吁。我终于抽出时间给我的新站上线了。感谢各位粉丝好友的关注。欢迎大家前来踩站~。 新站地址&#xff1a;https://jhj-coding.top/ 今后会同时维护CSDN与jhj-coding哦&#xff01;期待新站可以给大家带来更好…

穿越半个世纪,探索中国数据库的前世今生

引言 在数字化潮流席卷全球的今天&#xff0c;数据库作为 IT 技术领域的“活化石”&#xff0c;已成为数字经济时代不可或缺的基础设施。那么&#xff0c;中国的数据库技术发展经历了怎样的历程&#xff1f;我们是如何在信息技术的洪流中逐步建立起自己的数据管理帝国的呢&…

Vue3基础笔记(1)模版语法 属性绑定 渲染

Vue全称Vue.js是一种渐进式的JavaScript框架&#xff0c;采用自底向上增量开发的设计&#xff0c;核心库只关注视图层。性能丰富&#xff0c;完全有能力驱动采用单文件组件和Vue生态系统支持的库开发的复杂单页应用&#xff0c;适用于场景丰富的web前端框架。灵活性和可逐步集成…

Modbus -tcp协议使用第二版

1.1 协议描述 1.1.1 总体通信结构 MODBUS TCP/IP 的通信系统可以包括不同类型的设备&#xff1a; &#xff08;1&#xff09;连接至 TCP/IP 网络的 MODBUS TCP/IP 客户机和服务器设备&#xff1b; &#xff08;2&#xff09;互连设备&#xff0c;例如&#xff1a;在 TCP/IP…

【消息队列开发】 实现内存加载

文章目录 &#x1f343;前言&#x1f333;实现思路&#x1f6a9;读取消息长度&#x1f6a9;读取相应长度的消息&#x1f6a9;进行反序列化&#x1f6a9;判定是否有效&#x1f6a9;加入有效消息&#x1f6a9;收尾工作&#x1f6a9;代码实现 ⭕总结 &#x1f343;前言 本次开发目…

微信小程序基础面试题

1、简述微信小程序原理 小程序本质就是一个单页面应用&#xff0c;所有的页面渲染和事件处理&#xff0c;都在一个页面内进行&#xff0c;但又可以通过微信客户端调用原生的各种接口&#xff1b;它的架构&#xff0c;是数据驱动的架构模式&#xff0c;它的UI和数据是分离的&am…

【UE5】动画混合空间的基本用法

项目资源文末百度网盘自取 什么是动画混合空间 混合空间分为两种: 通过一个数值控制通过两个数值控制 下面通过演示让大家更直观地了解 在Character文件夹中单击右键,选择动画(Animation),选择旧有的混合空间1D 然后选择骨骼&#xff08;动画是基于骨骼显示的,所以需要选择…

杂七杂八111

MQ 用处 一、异步。可提高性能和吞吐量 二、解耦 三、削峰 四、可靠。常用消息队列可以保证消息不丢失、不重复消费、消息顺序、消息幂等 选型 一Kafak:吞吐量最大&#xff0c;性能最好&#xff0c;集群高可用。缺点&#xff1a;会丢数据&#xff0c;功能较单一。 二Ra…

构建用户身份基础设施,推动新能源汽车高质量发展

随着市场进入智能电动汽车时代&#xff0c;车企们发现&#xff0c;在激烈竞争的市场中不断增长&#xff0c;并不是一件容易的事。《麻省理工科技评论》&#xff0c;前段时间写了一篇报道&#xff1a;中国是如何称霸电动汽车世界的&#xff1f;“过去两年&#xff0c;中国电动汽…

项目性能优化—性能优化的指标、目标

项目性能优化—性能优化的指标、目标 性能优化的终极目标是什么 性能优化的目标实际上是为了更好的用户体验&#xff1a; 一般我们认为用户体验是下面的公式&#xff1a; 用户体验 产品设计&#xff08;非技术&#xff09; 系统性能 ≈ 系统性能 快 那什么样的体验叫快呢…

定力至上,穿越周期——哪吒汽车闯进国际大市场

近年来&#xff0c;全球气候变化和环境保护议题日益受到关注&#xff0c;环保意识逐渐深入人心。在这一背景下&#xff0c;新能源汽车作为一种低碳、环保的交通工具受到了广泛关注和青睐。各国纷纷加大对新能源汽车产业的支持力度&#xff0c;通过出台补贴政策、购车优惠以及充…

Linux学习之网络

目录 认识协议 网络协议初始 协议分层 OSI七层模型 TCP/IP的四层模型 数据包封装和分用 以太网通信 ip地址与MAC地址 网络编程套接字 端口号&#xff08;port&#xff09; 认识协议 网络字节序 socket接口 网络的产生是计算机历史的必然性&#xff0c;是计算机发展…

【闲聊】-后端框架发展史

框架&#xff0c;是为了解决系统复杂性&#xff0c;提升开发效率而产生的工具&#xff0c;主要服务于研发人员。 当然&#xff0c;框架还有更深层的作用&#xff0c;框架的沉淀是一种高级的抽象&#xff0c;会将人类的业务逐步抽象为统一标准又灵活可变的结构&#xff0c;为各行…

暴雨高性能分布式存储为AI提供坚实数据存力

随着两会的圆满落幕&#xff0c;新质生产力和人工智能的发展成为社会各界热议的焦点。总理在两会后的首次调研中&#xff0c;特别强调了新质生产力和人工智能的重要性&#xff0c;这无疑为人工智能产业的蓬勃发展注入了新的动力。 年初&#xff0c;Sora所引领的人工智能热潮更…

安卓百度地图API显示隐藏Marker

方法 BaiduMap.Marker.setVisible(boolean) 实现 List<Marker> list_marker new ArrayList<>(); boolean isShowMarker true;Override public boolean onCreateOptionsMenu(Menu menu) {String[] sm { "显隐信息", "显隐照片", "截…

YOLOv8_seg-Openvino和ONNXRuntime推理【CPU】

纯检测系列&#xff1a; YOLOv5-Openvino和ONNXRuntime推理【CPU】 YOLOv6-Openvino和ONNXRuntime推理【CPU】 YOLOv8-Openvino和ONNXRuntime推理【CPU】 YOLOv7-Openvino和ONNXRuntime推理【CPU】 YOLOv9-Openvino和ONNXRuntime推理【CPU】 跟踪系列&#xff1a; YOLOv5/6/7-O…

(二十五)Flask之MTVMVC架构模式Demo【重点:原生session使用及易错点!】

目录&#xff1a; 每篇前言&#xff1a;MTV&MVC构建一个基于MTV模式的Demo项目&#xff1a;蹦出一个问题&#xff1a; 每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领…

VScode 关闭鼠标悬停提示

设置-文本编辑&#xff0c;然后搜索&#xff1a;Hover:Enanbled,出现如下图&#xff0c;取消勾选即可&#xff1b;

2024常见性能测试工具!

一&#xff1a;如何选择性能工具 选择性能测试工具时&#xff0c;可以从以下几个方面进行考虑&#xff1a; 1. 需求匹配&#xff1a;首先要明确项目的具体需求&#xff0c;比如需要测试的应用类型、协议、负载规模等。确保所选工具能够满足这些需求。 2. 技术兼容性&#xf…

Vue3--数据和方法

data 组件的 data 选项是一个函数。Vue 在创建新组件实例的过程中会自动调用此函数。   data选项通常返回一个对象&#xff0c;然后 Vue 会通过响应性系统将其包裹起来&#xff0c;并以 $data 的形式存储在组件实例中。 <!DOCTYPE html> <html lang"en"&g…
最新文章