尺寸大小的类型

注释

这是一个存根。

大小通过跟踪数据结构的深度帮助终止检查器跨越定义边界。

尺寸的内置组合器如所述尺寸大小的类型.

示例:有限语言

请参见Traytel 2016年.

可判定语言可以表示为无限树。每个节点都有儿童作为字母表中的字符数A类。根的每条路径从树到节点的关系确定了语言中可能的单词。每个节点具有布尔标签,即真实的当且仅当单词对应到该节点的语言。尤其是树的根节点已标记真实的当且仅当单词属于语言时。

这些无限树可以表示为以下共性数据类型:

记录冗长的(:大小) (A类: 设置) : 设置 哪里
  共性的
  领域
    ν :布尔δ : {j个:尺寸<i} A类郎杰A打开冗长的

正如我们之前所说,给定一种语言 : 冗长的 A类,ν 真实的若(iff)ε 另一方面,语言δ x个 : 冗长的 A类布尔佐夫斯基导数关于字符的x个也就是说,w个 δ x个若(iff)x周 .

使用此数据类型,我们可以定义一些正则语言。第一个空洞的语言,不包含任何单词;所以所有节点都被标记了:

 :  {i答}  Langi A语言ν ∅=δ ∅ _=

第二种是包含单个单词的语言;空单词。这个根节点已标记真实的,所有其他的都有标签:

ε :  {i答} Langi A语言ν ε=真实的δ ε _=

为了计算两种语言的并集(或和),我们做了一个点式对节点标签的操作:

_+_ :  {i答} Langi A语言Langi A语言Langi A语言ν(a+b) =νa∨νbδ(a+b)x个=δa x+δb x中缀 10_+_

现在,让我们定义串联。基本情况(ν)简单明了:ε a·b若(iff)ε ε b条.

对于衍生产品(δ),假设我们有一个词w个,w个 δ (a) · b) x个。这意味着w个 = αβ,使用α β b条.

我们必须考虑两种情况:

  1. ε 。然后,要么:*α = ε、和w个 = β = x个 · β’,其中β’ δ b条 x个.*α = xα',使用α’ δ x个.
  2. ε 那么,只有上述第二种情况是可能的:*α = xα',使用α’ δ x个.
_·_ :  {i答} Langi A语言语言i ALangi A语言ν(a·b) =νa∧νbδ(a·b)x个=如果νa,则δa x·b+δb x,否则δa x•b中缀 20_·_

这里是尺寸大小的字体真正闪耀的地方。如果没有大小合适的类型,终端检查员无法识别_+_如果(T)hen_else不是检查树,这可能会导致定义无效。相比之下,对于尺寸类型,我们知道 + b条定义相同深度asb条是。

本着类似的精神,我们可以定义克莱恩星:

_* :  {i答} Langi A语言Langi A语言ν(一个*) =真实的δ(一个*)x个=δa x·a*中缀 30_*

同样,因为类型告诉我们_·_保留了它的大小输入,我们可以递归调用 *在函数下呼叫_·_.

测试

首先,我们想给出一种语言成员的精确概念。我们认为单词是列表共个字符。

_∈_ :  {} {A类} 列表i ALangi A语言布尔[]∈a=νa(x|w)∈a=w∈δa x

请注意,我们测试成员资格的单词的大小不能是大于定义语言树的深度。

如果我们想使用常规的非大小列表,我们需要要求语言要有大小ω.

_∈_ :  {A类} 列表A朗ωA布尔[]∈a=νa(x|w)∈a=w∈δa x

直觉上,ω是一个大小大于任何术语的大小超过了阿格达的定义。

现在,让我们将二进制字符串视为单词。首先,我们定义包含长度为1的单个单词的语言:

⟦_⟧ :  {} 布尔朗吉·布尔ν ⟦ _ ⟧=δ⟦假⟧假=εδ⟦真⟧真=εδ假真=δ⟦真⟧假=

现在我们可以定义bip-bop语言,由偶数字符串组成长度以“true”开头,其中每个“true反之亦然。

双顶式= (⟦真⟧·\10214»假\10215»)*

我们现在可以测试单词在该语言中的成员资格双顶式

测试¦Β : (真|假|真|伪|真)∈bip-bop≡true测试=回流测试 : (真|假|真|伪|真)∈bip-bop≡false测试=回流测试 : (真|真|假|[])∈bip-bop≡false测试=回流