示例:有限语言
请参见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条
.
我们必须考虑两种情况:
ε ∈ 一
。然后,要么:*α = ε
、和w个 = β = x个 · β’
,其中β’ ∈ δ b条 x个
.*α = xα'
,使用α’ ∈ δ 一 x个
.
ε ∉ 一
那么,只有上述第二种情况是可能的:*α = xα'
,使用α’ ∈ δ 一 x个
.
_·_ : ∀ {i答} →Langi A语言→语言i A→Langi A语言ν(a·b) =νa∧νbδ(a·b)x个=如果νa,则δa x·b+δb x,否则δa x•b中缀 20_·_
这里是尺寸大小的字体真正闪耀的地方。如果没有大小合适的类型,终端检查员无法识别_+_
或如果(T)hen_else
不是检查树,这可能会导致定义无效。相比之下,对于尺寸类型,我们知道一 + b条
定义相同深度as一
和b条
是。
本着类似的精神,我们可以定义克莱恩星:
_* : ∀ {i答} →Langi A语言→Langi A语言ν(一个*) =真实的δ(一个*)x个=δa x·a*中缀 30_*
同样,因为类型告诉我们_·_保留了它的大小输入,我们可以递归调用一 *
在函数下呼叫_·_
.
测试
首先,我们想给出一种语言成员的精确概念。我们认为单词是列表
共个字符。
_∈_ : ∀ {我} {A类} →列表i A→Langi 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测试₃=回流