Coq学习——FRAP阅读笔记Chap3
CHAPTER 3 Data Abstraction
Algebraic Interfaces for Abstract Data Types
举队列为例,在一般编程中,我们构造出数据结构就 ok 了。但是如果我们要遵照形式化正确证明,我们还要补充一个规则集合,并用 data type 的操作量化。还是讲队列,需要满足两条:
\[dequeue(empty) = \cdot\]
\[\forall q.dequeue(q) = \cdot \Rightarrow q = empty\]
给出两个比较明显的实现:
- enqueue to list fronts and dequeue from listbacks
- enqueue to list backs and dequeuefrom list fronts
上述两个实现不够效率,这里有一个著名的,更聪明的实现,它实现了平摊常数时间(线性时间覆盖整个操作序列),但是我们需要扩展我们的代数风格来适应它。
Algebraic Interfaces with Custom Equivalence Relations
我们发现用一个新的数学操作来扩展队列的基本接口是很有用的。
引入等价关系(自反,对称,传递)
Here is its implementation, relying on list-reversal function rev
??
双 list 实现队列,不够时反转添加至弹出 stack,形式化等价的证明。
\[rep((l_1,l_2)) = l_1 \bowtie rev(l_2)\]
\[q_1 \approx q_1 = rep(q_1) = rep(q_2)\]
为什么我们需要经历引入自定义等价语句的麻烦呢?思考后面的等价问题。一个为\(([],[2])\)一个为\(([2],[])\)。这个数据结构是不规范的,因为相同的逻辑值可能有多个物理表示。等价关系让我们指出哪些物理表示是等价的。
Representation Functions
基于representation functions
风格的表示方法。我们可以强制。只要存在任何兼容的函数就足以显示队列实现的正确性,而且这种方法基本上可以将所有其他数据结构转换为抽象数据类型。
感觉就是把具备的性质用rep()
表示出来。
修正队列的类型定义
修正的 Axiom(公理)
Fixing Parameter Types for Abstract Data Types
这是另一种经典的抽象数据类型:有限集(finite sets),我们在这里写布尔集合。
\[ \begin{aligned} t(a) & \quad : \quad Set \\ empty & \quad : \quad t(a) \\ add & \quad : \quad t(a) \times a \rightarrow t(a) \\ member & \quad : \quad t(a) \times a \rightarrow \mathbb{B} \end{aligned} \]
一种简单的实现方法是使用 data type unsorted lists。
我们可以为特定的元素类型和使用模式构建专门的有限集。对于仅构建连续数字集的工作负载,此实现可能比基于泛型列表的实现快得多,它将次方转换为线性时间复杂度。!!给了一个 Range。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!