可满足性模块理论(SMT)基础 - 01 - 自动机和斯皮尔伯格算术

前言

如果,我们只给出一个数学问题的(比如一道数独题)约束条件,是否有程序可以自动求出一个解?
可满足性模理论(SMT - Satisfiability Modulo Theories)已经可以实现这个需求。

因此,最近想搞明白z3的实现原理。源代码没有读两句,还是找了本教材来看。
Vijay Ganesh (PhD. Thesis 2007), Decision Procedures for Bit-Vectors, Arrays and Integers
现在的任务是:

  • 看懂这本书,搞清楚求解逻辑
  • 再搞清楚,如何使用SMT来求解各种问题?

可满足性模理论(SMT - Satisfiability Modulo Theories)

基本概念

数学上,这个问题属于逻辑的范畴。

一阶逻辑(First-Order Logic)及其语法

一阶逻辑: 逻辑函数的参数可以是变量,但是不能是函数。
书中把一阶逻辑看成一种数学语言。
这种语言的语法(Syntax)由字母系统(Alphabet)和构造法则(formation rules)组成。

字母系统(Alphabet)

包括逻辑符号和非逻辑符号。

  1. Logical Symbols

    • Parentheses: (, )
    • Quantifier: \(\forall\)(for all), \(\exists\)(there exists)
    • Boolean Connectives: \(\lnot\)(not), \(\land\)(and), \(\lor\)(or)
    • Constant formulas: true, false
    • Equality: =
  2. Non-logical Symbols
    • Variables: usually represented by letters x, y, z...
    • Function Symbols: 函数符号通常使用小写字母来表示,f, g, h,...
      函数符号的返回类型一般不是Boolean类型。比如:f(x)可以表示为"x的父亲"。
    • Relation Symbols(关系符号) or predicate symbols(谓词符号): Each relation symbol also has an associated arity
      谓词符号一般使用大写字母来表示,P, Q, R, ...
      谓词符号代表一个返回值为Boolean类型的函数。比如:P(x)可以表示"x是否是一个人"。

构造法则(Formation Rules)

包括术语(terms)和公式(formulas)。

  • 术语(terms)
    包括变量(variables)和函数(functions)。
  • 公式(formulas)
    包括:谓词符号,等式(equality),逻辑运算符号(\(\lnot, \land, \lor\)), 修饰符(quantifiers)

其它概念

  • 原子公式(atomic formula)
    由谓词符号和等式组成的公式。原子公式不包含逻辑运算符号和修饰符。
  • 文字(literals)
    包括:原子公式和其否定。
  • 无修饰公式(quantifier-free formulas)
    由谓词符号、等式和逻辑运算符号组成的公式。比如: \(p(x)\)。
  • 量化公式(quantified formulas)
    带修饰符号的公式。比如: \(\forall x p(x)\)。
  • 自由变量(free variable)
    比如: \(p(x)\)中的\(x\)。
  • 界限变量(bound variables)
    量化公式中被限定的变化。比如: \(\forall x p(x)\)中的\(x\)。

一阶逻辑的理论和模型

这里说的理论是一个需要求解的推测.

  • 理论(theories)
    一个理论是一套一阶命题(sentence),这些命题,在一套公理(axioms)的基础上,是可以被推理出来的.
    我们的目的是求解出命题中变量的值,以满足所有的命题.

  • 模型(model)
    模式是一个满足一个给定理论(所有命题)的一阶结构,表示为\(dom(M)\).
    \(\phi\)是一个赋值方法,给\(\theta(\bar{x})\)的每个变量赋值一个M的元素.
    \(M \models_\rho \theta(\bar{x})\)表示\(M\)和\(\phi\)满足(satisfy)\(\theta(\bar{x})\).

Theory -> signature(\(\Sigma\)) -> dom(m)

  • 稳固性(soundness)
    论证的每一步在数学上都是正确的。如果返回值为"不可满足(unsatisfiable)",则确实是不可满足。

  • 完备性(completeness)
    如果返回值为“可满足”,则确实为可满足。并可以生成用于得出结论的所有事实。

  • 在线(online)
    决策程序以一种递增的方式接受处理新的输入,而不需要重新处理之前已经处理过的输入。

  • 证明生成(proof-producing)
    指决策程序可以对处理过程产生一个数学证明。

  • SAT(boolean satisfiability problem) - 布尔可满足性问题
    给定一个逻辑公式,判断是否存在解。

现有的各种方法

皮尔斯伯格算术(Presburger arithmetic)

皮尔斯伯格算术公式的定义

\[
f \equiv a^T \cdot x \sim c \text{, atomic formulas} \\
f ::= \lnot f_1 | f_1 \land f_2 | f_1 \lor f_2 \\
where \\
a \text{: a column vector of integer constants} \\
c \text{: an integer constants} \\
x \text{: a column vector of integer variables} \\
a^T \text{: a row vector} \\
\sim \text{: an operator from } \{=, \ne, <, \le, >, \ge\} \\
\]

解决方案(solution)的数学表达

一个_解决方案_是一个使得公式\(\phi\)为true的变量赋值w。
\(Sol(\phi)\)为公式\(\phi\)所有的解决方案。

注:\(\phi\)应该就是皮尔斯伯格算术定义的公式。
下面是解决方案\(Sol(\phi)\)的递归定义:
\[
if \ \phi \text{ is atomic, then } Sol(\phi) = \{ w \in \mathbb{Z^n} | a^T \cdot w \sim c \} \\
if \ \phi \equiv \lnot \phi_1 \text{, then } Sol(\phi) = \mathbb{Z}^n - Sol(\phi1_1) \\
if \ \phi \equiv \phi_1 \land \phi_2 \text{, then } Sol(\phi) = Sol(\phi1_1) \cap Sol(\phi1_2) \\
if \ \phi \equiv \phi_1 \lor \phi_2 \text{, then } Sol(\phi) = Sol(\phi1_1) \cup Sol(\phi1_2) \\
where \\
\mathbb{Z} \text{: the set of integers} \\
w \text{: n-vector of integers} \\
\mathbb{Z^n} \text{: n integers} \\
\]
\(\{ a | b \}\)为满足\(b\)条件下的\(a\)。

自动化的思路

  • 确定性有限状态自动机DFA(deterministic finite-state automaton)
    \(A_{\phi}\)
  • 一个解决方案w的数学表达
    \[
    w =
    \begin{Bmatrix}
    w_1 \\
    \cdots \\
    w_n
    \end{Bmatrix} \\
    =
    \begin{Bmatrix}
    b_{10} & \cdots & b_{1m} \\
    \cdots & \cdots & \cdots \\
    b_{n0} & \cdots & b_{nm} \\
    \end{Bmatrix} \text{, binary matrix} \\
    =
    \begin{Bmatrix}
    b_{10} \cdots b_{1m} \\
    \cdots \\
    b_{n0} \cdots b_{nm} \\
    \end{Bmatrix} \text{, a vector binary strings} \\
    =
    \begin{Bmatrix}
    b_{0} & \cdots & b_{m} \\
    \end{Bmatrix} \text{, a vector of languages} \\
    where \\
    w_x = \begin{Bmatrix}
    b_{x0} & \cdots & b_{xi} \\
    \end{Bmatrix} \text{, 2's complement form, } b_{x0} \text{: sign bit} \\
    b_{xy} \in \mathbb{B} \\
    \mathbb{B} = \{0, 1 \} \\
    b_x =
    \begin{Bmatrix}
    b_{1x} \\
    \cdots \\
    b_{nx} \\
    \end{Bmatrix} , \ b_x \text{ is denoted as a letter}\\
    \]

  • 2补数(2's complement)
    一种使用2进制表示有符号数的方法。
    第一位为符号位,
    如果是0,则记做0;
    如果为1,则记做\(-2^{n-1} \text{, n is the size of the number}\)。
    例如: 0010为2; 1010为-6。

  • 语言\(L_f\)
    是公式f的所有解决方案形成的所有字符串的集合。

自动机的正式描述

自动机\(A_f\)可以理解为一个类的实例,
属性:
formula
state
方法:
read(),
transition(),
satisfied()
output()
无限自动机\(A_f\)的数学描述:
\[
A_f = (S, \mathbb{B}^n, \delta, s_{initial}, S_{acc}) \\
where \\
S = \mathbb{Z} \cup \{ s_{initial} \} \text{ is the set of states, } \mathbb{Z} \text{ is the set of integers and } s_{initial} \notin \mathbb{Z} \\
s_{initial} \text{ is the start state} \\
\mathbb{B}^n \text{ is the alphabet, which is the set of n-bit vectors, } \mathbb{B} = \{0, 1\} \\
\text{The transition function } \delta : S \times \mathbb{B}^n \to S \text{ is defined as follows:} \\
\quad \delta(s_{initial}, b) = -a^T \cdot b \\
\quad \delta(l, b) = 2l + a^T \cdot b \\
\quad where \ l \in \mathbb{Z} \text{ is a non-initial state} \\
S_{acc} \text{: the set of accepting states}:
S_{acc} = \{ l \in \mathbb{Z} | l \sim c \} \cup
\begin{cases}
\{ s_{initial} \} & if \ a^T \cdot 0 \sim c \\
\emptyset & otherwise
\end{cases}
\]

  • 自动机的状态
    \(l\)是自动机\(A_f\)的状态。
    \[
    l_{initial} = -a^T \cdot b_0 \text{, since } b_0 \text{ are sign bits} \\
    l_{x+1} = a^T \cdot
    \begin{Bmatrix}
    b_{10} & \cdots & b_{1x+1} \\
    \cdots & \cdots & \cdots \\
    b_{n0} & \cdots & b_{nx+1} \\
    \end{Bmatrix} \\
    \ \ = 2l_x + a^T \cdot b_{x+1}
    \]

  • 自动机的接受条件
    \(l \sim c\)

  • 自动机的结果
    当满足接受条件时,\(b\)的值。

为什么是无限的?

这里说的无限是指状态\(l\)的可能性。基本上存在于所有的整数\(\mathbb{Z}\)中了。

转变为有限自动机,需要的过程。

2个定义: 对系数\(a^T = (a_1, \cdots, a_n)\):
\[
\lVert a^T \rVert_{-} = \sum_{\{i | a_i < 0\}} \vert a_i \vert \\
\lVert a^T \rVert_{+} = \sum_{\{i | a_i > 0\}} \vert a_i \vert
\]

推论
\[
-a^T \cdot b = \lVert a^T \rVert_{-} - \lVert a^T \rVert_{+} \leq \lVert a^T \rVert_{-} \\
a^T \cdot b = \lVert a^T \rVert_{+} - \lVert a^T \rVert_{-} \leq \lVert a^T \rVert_{+}
\]

引理1:给定一个原子的皮尔斯伯格算术公式\(a^T \cdot x \sim c\), a对应的自动机\(A_f\),a当前这个自动机的状态\(l \in \mathbb{Z}\),有下面断言:

  1. 如果\(l > \lVert a^T \rVert_{-}\), 则下一个状态\(l'\),有\(l' > l\)。
  2. 如果\(l < \lVert a^T \rVert_{+}\), 则下一个状态\(l'\),有\(l' < l\)。

根据引理,自动机的状态的可能性为:
\[
S = [\min(-\lVert a^T \rVert_{+}, c), max(\lVert a^T \rVert_{-}, c)] \cup \{ s_{initial}, s_{-\infty}, s_{+\infty} \}
\]
这就可以变成有限自动机。

有限自动机的正式描述

有限自动机\(A_f\)的数学描述:

\[
A_f = (S, \mathbb{B}^n, \delta, s_{initial}, S_{acc}) \\
where \\
S = [\min(-\lVert a^T \rVert_{+}, c), max(\lVert a^T \rVert_{-}, c)] \cup \{ s_{initial}, s_{-\infty}, s_{+\infty} \} \\
s_{initial} \notin \mathbb{Z} \\
s_{initial} \text{ is the start state} \\
\mathbb{B}^n \text{ is the alphabet, which is the set of n-bit vectors, } \mathbb{B} = \{0, 1\} \\
\text{The transition function } \delta : S \times \mathbb{B}^n \to S \text{ is defined as follows:} \\
\quad \delta(s_{initial}, b) = -a^T \cdot b \\
\quad \delta(s_{+\infty}, b) = s_{+\infty} \\
\quad \delta(s_{-\infty}, b) = s_{-\infty} \\
\quad \delta(l, b) =
\begin{cases}
s_{+\infty} & if \ 2l + a^T \cdot b > max(\lVert a^T \rVert_{-}, c) \\
s_{-\infty} & if \ 2l + a^T \cdot b > max(-\lVert a^T \rVert_{+}, c) \\
2l + a^T \cdot b & otherwise \\
\end{cases} \\
S_{acc} \text{: the set of accepting states}: \\
S_{acc} = \{ l \in \mathbb{Z} | l \sim c \} \\
\quad \cup \\
\begin{cases}
\{ s_{initial} \} & if \ a^T \cdot 0 \sim c \\
s_{+\infty} & if \ \sim \in \{ >, \geq, \neq \} \\
s_{-\infty} & if \ \sim \in \{ <, \leq, \neq \} \\
\emptyset & otherwise
\end{cases}
\]

References

可满足性模块理论(SMT)基础 - 01 - 自动机和斯皮尔伯格算术的更多相关文章

  1. javascript基础01

    javascript基础01 Javascript能做些什么? 给予页面灵魂,让页面可以动起来,包括动态的数据,动态的标签,动态的样式等等. 如实现到轮播图.拖拽.放大镜等,而动态的数据就好比不像没有 ...

  2. Androd核心基础01

    Androd核心基础01包含的主要内容如下 Android版本简介 Android体系结构 JVM和DVM的区别 常见adb命令操作 Android工程目录结构 点击事件的四种形式 电话拨号器Demo ...

  3. java基础学习05(面向对象基础01)

    面向对象基础01 1.理解面向对象的概念 2.掌握类与对象的概念3.掌握类的封装性4.掌握类构造方法的使用 实现的目标 1.类与对象的关系.定义.使用 2.对象的创建格式,可以创建多个对象3.对象的内 ...

  4. linux设备驱动归纳总结(二):模块的相关基础概念【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-59415.html linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10 ...

  5. Linux基础01 学会使用命令帮助

    Linux基础01 学会使用命令帮助 概述 在linux终端,面对命令不知道怎么用,或不记得命令的拼写及参数时,我们需要求助于系统的帮助文档:linux系统内置的帮助文档很详细,通常能解决我们的问题, ...

  6. NPOI操作EXCEL----------NPOI基础01

    来源地址:http://www.cnblogs.com/csqb-511612371/p/4878059.html 先来介绍一下NPOI基本的东西: 1.下载地址:http://npoi.codepl ...

  7. LibreOJ 2003. 「SDOI2017」新生舞会 基础01分数规划 最大权匹配

    #2003. 「SDOI2017」新生舞会 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  8. java基础 01

    java基础01 1. /** * JDK: (Java Development ToolKit) java开发工具包.JDK是整个java的核心! * 包括了java运行环境 JRE(Java Ru ...

  9. 【Linux开发】linux设备驱动归纳总结(二):模块的相关基础概念

    linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10.04 开发平台:S3C2440开发板 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

随机推荐

  1. PHP面向对象之解释器模式

    在博客园逛了1年多,从来都是看文章但没发表过什么文章.主要是因为技术太菜了,只有学习的份,自己那点水平实在也没什么好去分享的.但是最近在看 “深入PHP面向对象模式与实践” ,学习书中的内容后瞬间觉得 ...

  2. Python—课时ONE

    说实话第一次接触Python还是在我刚上班的时候,听说很多人这个开发语言很吊,应用的领域很多.but这些东西还不能够吸引我,真正的原因是因为这个开发语言很是简单,比较适合我这种2B学的.但是越往后越觉 ...

  3. redis 清空缓存

    redis 清空缓存 Redis 命令: flushall --> 清空整个 Redis 服务器的数据(删除所有数据库的所有 key ) flushdb --> 清空当前数据库中的所有 k ...

  4. Docker 镜像小结 - 每天5分钟玩转 Docker 容器技术(21)

    本节我们对 Docker 镜像做个小结. 这一部分我们首先讨论了镜像的分层结构,然后学习了如何构建镜像,最后实践使用 Docker Hub 和本地 registry. 下面是镜像的常用操作子命令: i ...

  5. 深入理解Java常用类-----时间日期

    除了String这个类在日常的项目中比较常用之外,有关时间和日期的操作也是经常遇到的,本篇就讲详细介绍下Java API中对时间和日期的支持.其实在Java 8之前时间日期的API并不是很好用,以至于 ...

  6. Error getting nested result map values for 'company'. Cause: java.sql.SQLException: Invalid value for getInt() - 'NFHK188'

    我今天遇到一个我不解的问题,是mybatis多对一关系查询出问题了,但是我自己还是解决了,在网上也查过那个错误,可是找不到我想要的.不知道你们遇到过没有,我接下来分享给大家.希望我这个第一篇博客能帮助 ...

  7. 【Python的迭代器,生成器】

    一.可迭代对象和迭代器 1.迭代的概念 上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值 注:循环不是迭代 while True: ...

  8. 7.ReadWriteLock接口及其实现ReentrantReadWriteLock

    Java并发包的locks包里的锁基本上已经介绍得差不多了,ReentrantLock重入锁是个关键,在清楚的了解了同步器AQS的运行机制后,实际上再分析这些锁就会显得容易得多,这章节主讲另外一个重要 ...

  9. python标准库]Hashlib

    hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, sha512等算法. 在学习hashlib模块之前,先来看 ...

  10. [转]tomcat部署(1)

      阅读目录 1 目录结构 2 部署 3 发布 4 测试 本篇参考Tomcat官方文档:<First Webapp>翻译,并结合自己的开发经验介绍关于tomcat部署以及发布的相关内容. ...