主要观点:Dafny 支持 5 种类型参数变异性和基数保持模式,解释了这些模式及基数保持的需求,包括子类型、类型参数、声明变异性、正负位置、五种类型参数模式、内置类型构造函数的模式等内容,还提及了避免基数矛盾的相关规则和其他相关语言的处理方式。
关键信息:
- Dafny 中类型可被其他类型参数化,如
Cell<Data>
和datatype PS<X, Y>
。 - 类型参数有协变、逆变、不变三种变异性,分别对应不同的子类型关系。
- 可通过前缀
+
、-
、无标记来声明类型参数的变异性,且右值定义需与左值声明的变异性一致。 - 存在正负位置概念,用于判断类型参数的使用是否符合变异性。
- Dafny 有 5 种类型参数模式,包括默认的不变且基数保持模式等。
- 内置类型构造函数如
set<+A>
等有特定的类型参数模式。 - 为避免基数矛盾,需满足基数要求,即定义类型时要注意左右值的基数关系。
重要细节: - 如
seq<nat>
是seq<int>
的子类型,而seq<bool>
不是seq<real>
的子类型,说明seq
在其参数上是协变的。 - 以
Coloring<X>
为例说明逆变,每个Coloring<int>
的值都是Coloring<nat>
的值。 - 对于
datatype
等声明,可自由选择类型参数的变异性,若不一致可能导致逻辑矛盾。 - 用
List
的定义说明datatype
构造函数在其参数上是单射的,且有逆函数(解构函数)。 - 通过
F
和D
的类型声明及相关函数定义,展示了可能出现的基数矛盾及 Dafny 的处理方式。 - 介绍了基数要求的定义及在类型理论中的表示,以及如何通过标记来声明类型参数的基数保持性。
- 详细说明了内置类型构造函数如
iset
、map
等的类型参数模式及其背后的原因和一些微妙的后果。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。