程序验证(七):可满足性模理论(Satisfiability Modulo Theories)

本文主要是介绍程序验证(七):可满足性模理论(Satisfiability Modulo Theories),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

程序验证(七):可满足性模理论(Satisfiability Modulo Theories)

SMT

Satisfiability Modulo Theories(SMT)是以下情况的公式的判定问题:

  • 一些一阶理论的复合
  • 具有任意的布尔结构

DPLL( T T T): DPLL Modulo Theories

这是现代SMT求解器的基础技术
将SMT问题分解为我呢吧可以高效求解的子问题:

  • 使用SAT求解技术来处理布尔结构(宏观)
  • 使用专门的理论求解器(theory solver)来判定背景理论的可满足性(微观)

布尔结构

布尔结构

通过 T T T-公式的语义,我们递归定义公式 F F F的布尔结构:

原式布尔结构定义
B ( ℓ T ) B(\ell_T) B(T) P i P_i Pi
B ( ¬ F ) B(\neg F) B(¬F) ¬ B ( F ) \neg B(F) ¬B(F)
B ( F 1 ∧ F 2 ) B(F_1\wedge F_2) B(F1F2) B ( F 1 ) ∧ B ( F 2 ) B(F_1)\wedge B(F_2) B(F1)B(F2)
B ( F 1 ∨ F 2 ) B(F_1\vee F_2) B(F1F2) B ( F 1 ) ∨ B ( F 2 ) B(F_1)\vee B(F_2) B(F1)B(F2)
B ( F 1 → F 2 ) B(F_1 \to F_2) B(F1F2) B ( F 1 ) → B ( F 2 ) B(F_1)\to B(F_2) B(F1)B(F2)
B ( F 1 ↔ F 2 ) B(F_1\leftrightarrow F_2) B(F1F2) B ( F 1 ) ↔ B ( F 2 ) B(F_1) \leftrightarrow B(F_2) B(F1)B(F2)

这里 P i P_i Pi是布尔变量
举例:
考虑以下公式:
F : g ( a ) = c ∧ ( f ( g ( a ) ) ≠ f ( c ) ∨ g ( a ) = d ) ∧ c ≠ d F:g(a)=c\wedge (f(g(a))\ne f(c)\vee g(a)=d)\wedge c\ne d F:g(a)=c(f(g(a))=f(c)g(a)=d)c=d
F F F的布尔抽象:
B ( F ) = B ( g ( a ) = c ) ∧ ( B ( f ( g ( a ) ) ≠ f ( c ) ) ∨ B ( g ( a ) = d ) ) ∧ B ( c ≠ d ) = P 1 ∧ ( ¬ P 2 ∨ P 3 ) ∧ ¬ P 4 B(F)=B(g(a)=c)\wedge (B(f(g(a))\ne f(c))\vee B(g(a)=d))\wedge B(c\ne d)=P_1 \wedge (\neg P_2\vee P_3)\wedge \neg P_4 B(F)=B(g(a)=c)(B(f(g(a))=f(c))B(g(a)=d))B(c=d)=P1(¬P2P3)¬P4
我们也可以定义 B − 1 B^{-1} B1,比如 B − 1 ( P 1 ∧ P 3 ∧ P 4 ) B^{-1}(P_1 \wedge P_3 \wedge P_4) B1(P1P3P4)就是 g ( a ) = c ∧ g ( a ) = d ∧ c = d g(a)=c\wedge g(a)=d\wedge c=d g(a)=cg(a)=dc=d

布尔抽象

为什么称为抽象?因为它实际上是一个过度简化
几个事实:

  • 如果 F F F s a t sat sat,那么 B ( F ) B(F) B(F)总是 s a t sat sat
  • 如果 B ( F ) B(F) B(F) s a t sat sat,那么 F F F一定是 s a t sat sat吗?不是,如:KaTeX parse error: Undefined control sequence: \wedgef at position 22: … x\wedge x\le 2\̲w̲e̲d̲g̲e̲f̲(x)\ne f(1)\wed…
  • 如果 F F F u n s a t unsat unsat,那么 B ( F ) B(F) B(F)一定是 u n s a t unsat unsat吗?不是,举例同上。
  • 如果 B ( F ) B(F) B(F) u n s a t unsat unsat,那么 F F F呢?是。

T T T与SAT求解器的结合

基本算法
  1. 构造 F B : = B ( F ) F_B:=B(F) FB:=B(F)
  2. 如果 F B F_B FB u n s a t unsat unsat,那么返回 u n s a t unsat unsat
  3. 否则,获得一个 F B F_B FB的赋值 α \alpha α
  4. 构造 C = ⋀ i = 1 n P i ↔ α ( P i ) C=\bigwedge^n_{i=1} P_i\leftrightarrow \alpha (P_i) C=i=1nPiα(Pi)
  5. B − 1 ( C ) B^{-1}(C) B1(C)发送到 T T T-求解器
  6. 如果 T T T-求解器判断为 s a t sat sat,那么返回 s a t sat sat
  7. 否则,更新 F B : = F B ∧ ¬ C F_B :=F_B\wedge \neg C FB:=FB¬C,重复以上步骤

最后一步更新的解释:

  • 如果不更新,我们的 F B F_B FB会得到同样的 u n s a t unsat unsat模型
  • ¬ C \neg C ¬C叫做理论冲突子句(theory conflict clause)
  • 更新之后,可以防止求解器未来搜索同样的路径
举例

判断以下公式的可满足性:
F : g ( a ) = c ∧ ( f ( g ( a ) ) ≠ f ( c ) ∨ g ( a ) = d ) ∧ c ≠ d F:g(a)=c\wedge (f(g(a))\ne f(c)\vee g(a)=d)\wedge c\ne d F:g(a)=c(f(g(a))=f(c)g(a)=d)c=d

  • 构造布尔抽象: B ( F ) = P 1 ∧ ( ¬ P 2 ∨ P 3 ) ∧ ¬ P 4 B(F)=P_1\wedge (\neg P_2\vee P_3)\wedge \neg P_4 B(F)=P1(¬P2P3)¬P4
  • 找到一个 s a t sat sat赋值(通过SAT求解器): α = { P 1 ↦ 1 , P 2 ↦ 0 , P 3 ↦ 1 , P 4 ↦ 0 } \alpha =\{P_1\mapsto 1,P_2\mapsto 0,P_3\mapsto 1,P_4\mapsto 0\} α={P11,P20,P31,P40}
  • 构造 C = P 1 ∧ ¬ P 2 ∧ P 3 ∧ ¬ P 4 C = P_1\wedge \neg P_2\wedge P_3\wedge \neg P_4 C=P1¬P2P3¬P4
  • T T T-求解器中搜索 B − 1 ( C ) B^{-1}(C) B1(C): g ( a ) = c ∧ f ( g ( a ) ) ≠ f ( c ) ∧ g ( a ) = d ∧ c ≠ d g(a)=c\wedge f(g(a))\ne f(c)\wedge g(a)=d\wedge c\ne d g(a)=cf(g(a))=f(c)g(a)=dc=d u n s a t unsat unsat
  • 更新 F B F_B FB: P 1 ∧ ( ¬ P 2 ∨ P 3 ) ∧ ¬ P 4 ∧ ( ¬ P 1 ∨ P 2 ∨ ¬ P 3 ∨ P 4 ) P_1\wedge (\neg P_2\vee P_3)\wedge \neg P_4\wedge (\neg P_1\vee P_2\vee\neg P_3 \vee P_4) P1(¬P2P3)¬P4(¬P1P2¬P3P4)
  • 找到一个 s a t sat sat赋值(通过SAT求解器): α = { P 1 ↦ 1 , P 2 ↦ 1 , P 3 ↦ 1 , P 4 ↦ 0 } \alpha =\{P_1\mapsto 1,P_2\mapsto 1,P_3\mapsto 1,P_4\mapsto 0\} α={P11,P21,P31,P40}
  • 构造 C = P 1 ∧ P 2 ∧ P 3 ∧ ¬ P 4 C=P_1\wedge P_2\wedge P_3\wedge \neg P_4 C=P1P2P3¬P4
  • T T T-求解器中搜索 B − 1 ( C ) B^{-1}(C) B1(C): g ( a ) = c ∧ f ( g ( a ) ) = f ( c ) ∧ g ( a ) = d ∧ c ≠ d g(a)=c\wedge f(g(a))=f(c)\wedge g(a)=d\wedge c\ne d g(a)=cf(g(a))=f(c)g(a)=dc=d u n s a t unsat unsat
  • 更新 F B F_B FB: P 1 ∧ ( ¬ P 2 ∨ P 3 ) ∧ ¬ P 4 ∧ ( ¬ P 1 ∨ P 2 ∨ ¬ P 3 ∨ P 4 ) ∧ ( ¬ P 1 ∨ ¬ P 2 ∨ ¬ P 3 ∨ P 4 ) P_1\wedge (\neg P_2\vee P_3)\wedge \neg P_4\wedge (\neg P_1\vee P_2\vee\neg P_3\vee P_4)\wedge (\neg P_1\vee\neg P_2\vee\neg P_3\vee P_4) P1(¬P2P3)¬P4(¬P1P2¬P3P4)(¬P1¬P2¬P3P4)
  • 找到一个赋值: α = { P 1 ↦ 1 , P 2 ↦ 0 , P 3 ↦ 0 , P 4 ↦ 0 } \alpha = \{P_1\mapsto 1,P_2\mapsto 0,P_3\mapsto 0,P_4\mapsto 0\} α={P11,P20,P30,P40}
  • 构造 C = P 1 ∧ ¬ P 2 ∧ ¬ P 3 ∧ ¬ P 4 C=P_1\wedge \neg P_2\wedge \neg P_3\wedge \neg P_4 C=P1¬P2¬P3¬P4
  • T T T-求解器中搜索 B − 1 ( C ) B^{-1}(C) B1(C): g ( a ) = c ∧ f ( g ( a ) ) ≠ f ( c ) ∧ g ( a ) ≠ d ∧ c ≠ d g(a)=c\wedge f(g(a))\ne f(c)\wedge g(a)\ne d\wedge c\ne d g(a)=cf(g(a))=f(c)g(a)=dc=d
  • 更新 F B F_B FB: P 1 ∧ ( ¬ P 2 ∨ P 3 ) ∧ ¬ P 4 ∧ ( ¬ P 1 ∨ P 2 ∨ ¬ P 3 ∨ P 4 ) ∧ ( ¬ P 1 ∨ ¬ P 2 ∨ ¬ P 3 ∨ P 4 ) ∧ ( ¬ P 1 ∨ P 2 ∨ P 3 ∨ P 4 ) P_1\wedge (\neg P_2\vee P_3)\wedge \neg P_4\wedge (\neg P_1\vee P_2\vee\neg P_3\vee P_4)\wedge (\neg P_1\vee\neg P_2\vee \neg P_3\vee P_4)\wedge (\neg P_1\vee P_2\vee P_3\vee P_4) P1(¬P2P3)¬P4(¬P1P2¬P3P4)(¬P1¬P2¬P3P4)(¬P1P2P3P4)
  • 注意,这个布尔抽象已经是 u n s a t unsat unsat了,所以我们说 F F F u n s a t unsat unsat了。
另一个例子

考虑这样的 T Z T_Z TZ-公式 F F F:
F : 0 < x ∧ x < 1 w e d g e ( x < 2 ∨ ⋯ ∨ x < 99 ) F:0<x\wedge x<1wedge (x<2\vee\dots\vee x<99) F:0<xx<1wedge(x<2x<99)
布尔抽象:
P 0 ∧ P 1 ∧ ( P 2 ∨ ⋯ ∨ P 9 9 ) P_0\wedge P_1\wedge (P_2\vee\dots\vee P_99) P0P1(P2P99)
一共有 2 98 − 1 2^{98}-1 2981个可满足的赋值,但是没有一个满足 F F F。然而,我们每次只能添加一个冲突子句!所以我们需要改进。

真正的DPLL( T T T)

思路:

  • 不要把SAT求解器看做一个黑箱
  • 当构造出赋值的时候,渐进的查询理论求解器
  • 在之前的例子中,添加 { 0 < x , x < 1 } \{0<x,x<1\} {0<x,x<1}后会立刻停止

举例

还是之前的例子

  • 布尔抽象: B ( F ) = { { P 1 } , { ¬ P 2 , P 3 } , { ¬ P 4 } } B(F)=\{\{P_1\},\{\neg P_2,P_3\},\{\neg P_4\}\} B(F)={{P1},{¬P2,P3},{¬P4}}
  • DPLL从 P 1 P_1 P1 ¬ P 4 \neg P_4 ¬P4开始
  • 此时,根据公理,我们有更多的逻辑传递: g ( a ) = c ⇒ f ( g ( a ) ) = f ( c ) g(a)=c\Rightarrow f(g(a))=f(c) g(a)=cf(g(a))=f(c) g ( a ) = c ∧ c ≠ d ⇒ g ( a ) ≠ d g(a)=c\wedge c\ne d\Rightarrow g(a)\ne d g(a)=cc=dg(a)=d
  • 判定 ¬ P 2 \neg P_2 ¬P2 P 3 P_3 P3过于冗长,所以我们可以添加一些引理(theory lemmas): P 1 → P 2 P_1\to P_2 P1P2 P 1 ∧ ¬ P 4 → ¬ P 3 P_1\wedge \neg P_4\to \neg P_3 P1¬P4¬P3

核(unsat core)

我们之前是把 ¬ C \neg C ¬C添加到原式
一个不满足核(unsatisfiable core) C ∗ C^{*} C C C C的一个子集,满足:

  • C ∗ C^{*} C依然是不可满足的
  • 删除 C ∗ C^{*} C的任何元素,都使它可满足
    比如, F : 0 < x ∧ x < 1 ∧ x < 2 ∧ ⋯ ∧ x < 99 F:0<x\wedge x<1\wedge x<2\wedge \dots\wedge x<99 F:0<xx<1x<2x<99的不满足核是 0 < x ∧ x < 1 0<x\wedge x<1 0<xx<1,所以我们添加 ¬ C ∗ \neg C^{*} ¬C而不是 ¬ C \neg C ¬C

这篇关于程序验证(七):可满足性模理论(Satisfiability Modulo Theories)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/766454

相关文章

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

系统架构师考试学习笔记第三篇——架构设计高级知识(19)嵌入式系统架构设计理论与实践

本章考点:         第19课时主要学习嵌入式系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分)。在历年考试中,案例题对该部分内容都有固定考查,综合知识选择题目中有固定分值的考查。本课时内容侧重于对知识点的记忆、理解和应用,按照以往的出题规律,嵌入式系统架构设计基础知识点基本来源于教材内。本课时知识架构如图19.1所示。 一、嵌入式系统发展历程

西方社会学理论教程复习重点

一.名词解释 1.社会静力学:旨在揭示人类社会的基本秩序。它从社会的横断面,静态的考察人类社会的结构和制度,寻找确立和维护人类社会的共存和秩序的原则。 2.社会动力学:纵观人类理性和人类社会发展的先后必要阶段,所叙述的是这一基本秩序在达到实证主义这一最终阶段之前所经过的曲折历程。 3.社会事实:一切行为方式,不论它是固定的还是不固定的,凡是能从外部给予个人以约束的,或者说是普遍存在于该社会各

行政组织理论-第十一章:创建学习型组织

章节章节汇总第一章:绪论第二章:行政组织的演变第三章:科层制行政组织理论第四章:人本主义组织理论第五章:网络型组织理论第六章:行政组织目标第七章:行政组织结构第八章:行政组织体制第九章:行政组织设置与自身管理第十章:组织激励第十一章:创建学习型组织第十二章:政府再造流程第十三章:行政组织变革 目录 第一节 学习型组织理论的产生1. 学习型组织的源起2. 学习型组织的定义3. 学习型组织与组

系统架构师考试学习笔记第三篇——架构设计高级知识(18)面向服务架构设计理论与实践

本章考点:         第18课时主要学习面向服务架构设计理论与实践。根据考试大纲,本课时知识点会涉及单选题型(约占2~5分)和案例题(25分),本课时内容偏重于方法的掌握和应用,根据以往全国计算机技术与软件专业技术资格(水平)考试的出题规律,概念知识的考查内容多数来源于实际应用,还需要灵活运用相关知识点。         本课时知识架构如图18.1所示。 一、SOA的相关概念 (

Leetcode3258. 统计满足 K 约束的子字符串数量 I

Every day a Leetcode 题目来源:3258. 统计满足 K 约束的子字符串数量 I 解法1:暴力 暴力枚举每一个子字符串,看是否满足 k 约束。 代码: /** @lc app=leetcode.cn id=3258 lang=cpp** [3258] 统计满足 K 约束的子字符串数量 I*/// @lc code=startclass Solution{publ

计算机操作员理论基础

计算机操作员理论基础 理论基础 计算机主频指的是时钟频率。14=23+22+21=(0)1110OS是运行其他系统软件的平台。215=27+26+24+22+21+20=(0)11010111(0)1111=(0)10000-1=24-1=15计算机理论知识,存贮是最基本是字节计算机产权在我国是受法律保护的12=23+22=(0)1100存贮程序是计算机能够自动连续工作的理论基础软盘中病毒

代码随想录算法训练营第十九天| 回溯理论、77. 组合、216. 组合总和Ⅲ、17. 电话号码的字母组合

今日内容 回溯的理论基础leetcode. 77 组合leetcode. 216 组合总和Ⅲleetcode. 17 电话号码的字母组合 回溯理论基础 回溯法也叫回溯搜索法,它是一种搜索的方式,而且只要有递归就会有回溯,回溯就是递归的副产品。 回溯说到底并不是什么非常高深的搜索方式,本质上仍然是穷举,穷举所有可能然后选择出我们要的答案。剪枝会使回溯法更加高效一点,但改变不了回溯本质就是穷举

分布式系统理论基础三-时间、时钟和事件顺序

GitHub:https://github.com/wangzhiwubigdata/God-Of-BigData 关注公众号,内推,面试,资源下载,关注更多大数据技术~大数据成神之路~预计更新500+篇文章,已经更新50+篇~ 现实生活中时间是很重要的概念,时间可以记录事情发生的时刻、比较事情发生的先后顺序。分布式系统的一些场景也需要记录和比较不同