摘要
题目 1-7 来自作业 1;
题目 8-12 来自作业 2;
13 及之后是考前划重点。
迁移系统
迁移系统表示为
性质定义:
- Action-Deterministic:
,其中 表示状态 通过动作 能到达的后继状态集合; - AP-Deterministic:
。其中 表示状态 的所有后继状态集合。

在图 1 所示的迁移系统中,显然对于每个状态节点,对于每个动作,从该节点出发的边都是唯一的,因此满足 Action-Deterministic 性质。
该迁移系统没有任何一个节点有标签相同的后继节点,该迁移系统满足 AP-Deterministic 性质。
进程执行
图 2 是一个进程执行的简单模型,其描述了进程执行的状态变化:
- 创建:进程被创建后,进入就绪状态,等待 CPU 分配。
- 分配 CPU:进程调度器选择某个就绪进程,将其分配到 CPU,进入运行状态。
- 时间片耗尽:进程由于时间片用尽,被抢占,回到就绪队列,等待下次调度。
- I/O 操作:进程需要执行 I/O 操作(如读取磁盘、网络通信等),进入等待状态。
- I/O 完成:进程的 I/O 操作完成,重新进入就绪队列。
- 执行结束:进程完成所有任务或遇到异常,进入终止状态,系统释放其占用的资源。

基于该模型,回答以下问题:
a. 给出两个无穷执行序列。
以下是两个无穷执行序列:
b. 针对问题 a 中的每个执行序列,写出两个其满足的 LTL 公式。
执行序列
满足的 LTL 公式: 执行序列
满足的 LTL 公式:
LTL 小结
LTL 符号 | 含义 |
---|---|
always | |
eventually | |
nexttime | |
until |
CTL 小结
并发程序
假设程序
1 |
|
其中,x
为共享变量且初始值为 0,k_i
和 r_i
为
a. 使用 Transition System 建模该程序。
用迁移系统
刻画程序 的执行: 状态集合
中的状态用元组 表示,其中 表示循环内下一步要执行的赋值语句编号。特别地,初始状态 , 表示终止状态集合。 迁移规则
中应当包括: 对每个状态节点
,根据 分情况讨论 。 以下是
的情况,对于 ,同理。
- 若
,不存在 ,不需要添加新的迁移; - 否则,添加新的迁移
,其中:
- 若
, ; - 若
, ; - 若
, 。
b. 当程序 P 执行结束,变量 x
的值是否可能为 2?若可能,给出一个对应的执行,否则给出简要说明。
x
的值可能为 2。下表是一个可能的执行。
原子操作编号 1 2 3 4 5 6 7 8 9 10
算法建模

针对图 3 所示互斥算法,完成以下问题:
a. 使用 Transition System 建模该算法。
用迁移系统
刻画算法执行: 状态集合
中的状态用元组 表示,其中 表示 下一行要执行的原子代码编号。特别地,初始状态 。 迁移规则
中应当包括(其中 ):
b. 在问题 a 的基础上,使用逻辑公式表达:两个进程不会同时进入临界区。
两个进程不会同时进入临界区表示为:
c. 判断问题 b 中的逻辑公式是否成立,若成立,请简要说明,否则给出反例(一个执行)。
b 中的逻辑公式不成立。
在下面这个反例执行中,两个进程同时进入临界区。
原子操作 1 2 3 4 5
逻辑公式等价性判断
判断下列逻辑公式是否等价。若等价,给出证明,否则给出反例:
a.
两者等价。
b.
二者等价。
对于任何一个序列,若
为真,显然 为真。 对于任何一个序列,若
为真,该序列必然形式为 ,该序列满足 ,因此 为真。
Büchi 自动机
Büchi 自动机概念
Büchi 自动机 (Büchi Automaton) 是一种理论计算机科学中的有限自动机,但它与我们常见的确定性有限自动机 (DFA) 或非确定性有限自动机 (NFA) 的核心区别在于其处理的输入。
- 传统自动机 (DFA/NFA): 处理有限长度的字符串。如果字符串处理完毕后,自动机停在一个接受状态,则该字符串被接受。
- Büchi 自动机: 处理无限长度的字符串(也称为 ω-串 或 ω-语言)。它的目的不是判断一个有限过程的结果,而是判断一个永不停止的无限过程的性质。
由于其处理无限序列的能力,Büchi 自动机在模型检测 (Model Checking) 和形式化验证 (Formal Verification) 领域至关重要,常被用来描述和验证系统的“活性属性”(Liveness Properties),例如“一个进程最终总会获得资源”或“一个请求最终总会被响应”。
一个 Büchi 自动机可以由一个五元组
: 一个有限的状态集合。 : 一个有限的字母表,即输入符号的集合。 : 状态转移函数(或关系),形式为 。即根据当前状态和输入的符号,决定下一个可能的状态集合(因为它是非确定性的)。 : 初始状态,是 中的一个状态。 : 接受状态集,是 的一个子集 ( )。
一个无限输入串
作业题目

考虑以图 4 为基础的 Büchi 自动机,对于下列不同的接收状态集,判断该自动机的语言是否空:
a.
语言为空,不可接受无穷字符串。
b.
语言不为空,可接受无穷字符串
。
c.
语言不为空,可接受无穷字符串
。
广义 Büchi 自动机转换
概念
对于广义 Büchi 自动机的接收集
例如,若
特性 | 标准 Büchi 自动机 (BA) | 广义 Büchi 自动机 (GBA) |
---|---|---|
接受状态集 F 的结构 | 一个单一的状态集合。 |
一个由多个接受状态集组成的集合族。 |
接受条件 | 一个无限运行 (run) 被接受,当且仅当它无限次访问 |
一个无限运行 (run) 被接受,当且仅当对于每一个接受集 |
直观理解 | 只需要满足一个“活性”目标(无限次进入 |
需要同时满足多个“活性”目标(无限次进入每一个 Fi)。 |
广义 Büchi 自动机转化为简单 Büchi 自动机
难以用语言描述,请自行询问大模型。
作业题

图 5 为以
在上图中的广义 Büchi 自动机,一个运行被接受,当且仅当该运行无限次访问
和 。 下图是转化后的简单 Büchi 自动机,其中粗边框节点为接受状态集。
> stateDiagram direction LR classDef endState font-weight:bold,stroke-width:3px,stroke:red %% 定义结束状态样式 [*] --> q00 q00 --> q10 : a q10 --> q11 : a q10 --> q01 : c q11 --> q11 : a q11 --> q01 : c q01 --> q11 : a q01 --> q01 : c q01 --> q21 : b q21 --> q01 : c q21 --> q00 : c q00 --> q20 : b q20 --> q00 : c class q10 endState %% 将q10标记为结束状态
公平性(Fairness)
公平性的理论基础
公平性主要用于排除那些在交错模型中可能出现,但与系统实际行为不符的执行序列 。它约束了哪些序列可以被认为是有效的执行。
本题中的术语“转换(transition)”相当于 PL 或 DB 中所说的“原子操作”,而进程是比转换更大的粒度。
以下是这四种公平性的具体含义:
- 弱转换公平性(Weak transition fairness):It cannot happen that a transition is enabled indefinitely, but is never executed.
- 弱进程公平性(Weak process fairness):It cannot happen that a process is enabled indefinitely, but non of its transitions is ever executed
- 强转换公平性(Strong transition fairness):If a transition is infinitely often enabled, it will get executed.
- 强进程公平性(Strong process fairness):If at least one transition of a process is infinitely often enabled, a transition of this process will be executed.
四者的强弱关系为:
在一个不公平的执行中,某个进程可能因为一直没有机会执行而被“饿死” 。公平性约束就是为了防止这种情况的发生,从而更准确地对系统行为进行建模和分析。
作业题
进程 A 和 B 分别使用如图 1 和图 2 所示方法申请被调度执行,图 3 所示调度器则用来调度进程 A 和 B。假设进程 A 和 B 可以同时执行,请问分别在哪些公平性(fairness)条件下,A 和 B 不会被“饿死”。
进程 A
1 |
|
进程 B
1 |
|
调度器
1 |
|
- 进程 A:就绪后多次申请执行,仅在强转换公平性下不会饿死;
- 进程 B:就绪后等待被调度执行,在四种公平性下都不会被饿死。
Binary Decision Diagram(BDD)
-
针对布尔函数 $$f(a,b,c) = (a \land b \land c) \lor (a \land (\lnot b) \land c) \lor ((\lnot a) \land b \land (\lnot c)) \lor ((\lnot a) \land (\lnot b) \land (\lnot c))$$ ,完成以下问题:
a. 以
为顺序,写出对应的 BDD;
graph TD A[a] A0[b] A1[b] A -->|a=0| A0 A -->|a=1| A1 A00[c] A01[c] A10[c] A11[c] A0 -->|b=0| A00 A0 -->|b=1| A01 A1 -->|b=0| A10 A1 -->|b=1| A11 A000["1"] A001["0"] A010["1"] A011["0"] A100["0"] A101["1"] A110["0"] A111["1"] A00 -->|c=0| A000 A00 -->|c=1| A001 A01 -->|c=0| A010 A01 -->|c=1| A011 A10 -->|c=0| A100 A10 -->|c=1| A101 A11 -->|c=0| A110 A11 -->|c=1| A111
b. 写出该 BDD 的 reduced form。
观察可知,函数可化简为
graph TD A[a] C0[c] C1[c] A -->|a=0| C0 A -->|a=1| C1 C0 -->|c=0| C00["1"] C0 -->|c=1| C01["0"] C1 -->|c=0| C01 C1 -->|c=1| C00
- 对于布尔函数
和 ,回答下列问题:
a. 分别写出对应的 BDD;
graph TD X[x] Y[y] X -->|x=0| Y X -->|x=1| X1["1"] Y -->|y=0| Y0["0"] Y -->|y=1| X1
graph TD X[x] Y[y] X -->|x=0| X0["0"] X -->|x=1| Y Y -->|y=0| X0 Y -->|y=1| Y1["1"]
b. 执行
合并后的 BDD 与
graph TD X[x] Y[y] X -->|x=0| X0["0"] X -->|x=1| Y Y -->|y=0| X0 Y -->|y=1| Y1["1"]
霍尔三元组(Hoare Tripe)
在下列霍尔三元组的空白处填写恰当的前置条件,使得对应的三元组成立。注意,前置条件应尽可能弱。
完全正确性
请证明图 4 所示函数的完全正确性,即部分正确性和终止性。
我们在代码中添加循环不变式辅助证明:
1 |
|
部分正确性证明:在整个循环过程中,有循环不变量 y == fact(n)
,且循环结束时循环变量 x - n == 0
。因此返回值 y == fact(n)
是正确的。
终止性:循环变量 x - n
随着 n
的增大而减小,最终会减小到 0。因此函数必然会结束。
上述 ACSL 注解通过了 Frama-C 的验证。
证明完全正确性一般需要画流程图!
推理规则
Rust 是一种系统编程语言,旨在提供内存安全、并发支持和高性能,同时避免 C/C++ 中常见的安全问题(如空指针、数据竞争等)。Rust 通过所有权(Ownership)、借用(Borrowing)和生命周期(Lifetimes)等特性,在编译期防止空指针、悬垂引用和数据竞争,无需垃圾回收器。
在本题中,请针对图 5 所定义的程序,给出恰当的推理规则,进行“类型”和“借用”的检查。
示例:以
图 5:MiniRust
变量
整数值
布尔值
类型
表达式
语句
下面给出针对图 5(MiniRust)中表达式与语句的“类型检查”(Type Checking)和“借用检查”(Borrow Checking)推理规则。记程序上下文为
:表达式 的类型为 ; :语句 在上下文 下类型与借用均合法; :变量 在 中的类型为 ; :在 中 尚未声明; - 额外在
中维护借用信息,如对每个变量记录可变借用次数与不可变借用次数(这里用注释说明,不在形式化中具体展开)。
表达式的类型检查规则
- 整数与布尔常量
- 变量
- 不可变借用
- 可变借用
- 解引用
- 算术与比较
语句的类型与借用检查规则
- 跳过
- 普通变量赋值
- 解引用左值赋值
- 局部变量绑定(let)
- 顺序组合
- 条件分支
考点
这是什么东西?看不懂
4.1 前面加一部分操作语义和等价性证明,参考 gotsman 2015
每一节前面有 general 的帽子
EDDG 的 general 的描述
找找实现 PC 的文献作为引用
Related Wrok:
一类工作:
第二类 定义 IS
第三类 对比鲁棒性
beyond the work:看鲁棒性 benchmark,准备跑 demo