自动机模型:从双栈自动机到线程自动机
在计算理论和形式语言处理中,自动机是一种重要的工具,用于识别和处理各种语言。本文将介绍几种自动机模型,包括双栈自动机(2 - SA)、强驱动双栈自动机(SD - 2SA)和线程自动机(TA),并详细阐述它们的工作原理、定义和应用。
1. 双栈自动机(2 - SA)
双栈自动机是一种具有两个栈的自动机模型,可用于处理树邻接文法(TAG)等复杂的语法结构。下面是一个2 - SA的示例:
M = ⟨{q}, {a, b, c}, Γ, δ, q, ∅, #⟩
其中 Γ = {#, Rα, Rβ, F, A, B, C}
转移函数 δ:
⟨q, R⊤α , ε⟩∈δ(q, ε, #, #) 开始初始树
⟨q, R⊥α , X⟩∈δ(q, ε, R⊤α , X) Rα 处无邻接
⟨q, C, X⟩∈δ(q, ε, R⊥α , X) 向下移动
⟨q, R⊥α R⊤β , X⟩∈δ(q, ε, R⊤α , X) 在 Rα 处预测 β 的邻接
⟨q, R⊥β R⊤β , X⟩∈δ(q, ε, R⊤β , X) 在 Rβ 处预测 β 的邻接
⟨q, R⊥β , X⟩∈δ(q, ε, R⊤β , X) Rβ 处无邻接
⟨q, FA, XB⟩∈δ(q, ε, R⊥β , X) 在 β 中向下移动
⟨q, ε, X⟩∈δ(q, ε, F, X) F 处无邻接,返回
⟨q, ε, X⟩∈δ(q, a, A, X) 将 a 与输入匹配
⟨q, ‡, ε⟩∈δ(q, b, ‡, B) 将 b 与输入匹配
⟨q, ε, X⟩∈δ(q, c, C, X) 将 c 与输入匹配
其中 X ∈Γ ∪{‡}
接受条件:栈为空
下面是该2 - SA的一个示例运行过程:
| 栈1 | 栈2 | 剩余输入 | 操作说明 |
| — | — | — | — |
| ‡# | ‡# | aacbb | 初始状态 |
| ‡R⊤α | ‡ | aacbb | 开始遍历 α |
| ‡R⊥α R⊤β | ‡ | aacbb | 预测 β 的邻接 |
| ‡R⊥α R⊥β R⊤β | ‡ | aacbb | 预测 β 的邻接 |
| ‡R⊥α R⊥β R⊥β | ‡ | aacbb | 预测无邻接 |
| ‡R⊥α R⊥β FA | ‡B | aacbb | 在 β 中向下移动 |
| ‡R⊥α R⊥β F | ‡B | acbb | 扫描 a |
| ‡R⊥α R⊥β | ‡B | acbb | 离开 β |
| ‡R⊥α FA | ‡BB | acbb | 在 β 中向下移动 |
| ‡R⊥α F | ‡BB | cbb | 扫描 a |
| ‡R⊥α | ‡BB | cbb | 离开 β |
| ‡C | ‡BB | cbb | 在 α 中向下移动 |
| ‡ | ‡BB | bb | 扫描 c |
| ‡ | ‡B | b | 扫描 b |
| ‡ | ‡ | ε | 扫描 b |
2. 强驱动双栈自动机(SD - 2SA)
强驱动双栈自动机是2 - SA的一种变体,旨在为TAG和线性索引文法(LIG)提供不同解析策略(自顶向下和自底向上)的优雅表示。
2.1 工作原理
SD - 2SA的核心思想是为两个栈分配不同的角色。主栈(MS)用于大部分操作,辅助栈(AS)用于“记账”。具体来说,AS是一个会话栈的栈,在任何时刻,只能访问最顶层的栈。
SD - 2SA呈现线性行为,在每个会话中,首先处于“写入”模式,将元素压入主栈MS。在某个时刻,切换到“擦除”模式,开始从MS中弹出元素。一旦进入擦除模式,在同一会话中不能再返回写入模式。退出会话的唯一方式是达到擦除模式、辅助栈顶部的会话栈为空且主栈元素是启动该会话的元素。
2.2 定义
一个强驱动双栈自动机(SD - 2SA)M是一个元组 ⟨Σ, M, X, $0, $f, Θ⟩,其中:
- Σ 表示有限的终结符集合。
- M 表示主栈元素的有限集合。
- X 表示辅助栈元素的有限集合。
- $0, $f ∈M 是两个特殊的主栈元素,分别是初始符号和最终符号。
- Θ 是有限的转移集合。
主栈由M中的元素组成,每个元素前面都有一个动作标记。动作标记 D = {↗, ↘, →, |=} 具有以下含义:
- ↗ 表示一个元素已被压入AS。
- ↘ 表示一个元素已从AS中弹出。
- → 表示未对AS执行任何操作。
- |= 表示启动了一个新会话,一个新的空会话栈被压入AS。
在AS上,新会话的开始用 |=w 或 |=e 标记,取决于相应会话是在写入模式还是擦除模式下启动。
SD - 2SA的一个配置是一个元组 (m, i, M, A),其中 m ∈{w, e} 是当前模式,i 是当前输入位置,M 和 A 分别是主栈和辅助栈。初始配置是 (w, 0, |= $0, |=w),最终配置是 (e, n, |= $f, |=w),其中 n 是输入的长度。
2.3 复杂度
Villemonte de la Clergerie和Pardo(1998)提出了一种使用所谓的逃逸上下文无关推导的子推导紧凑表示方法,实现了SD - 2SA的表格化,从而达到了 O(n^6) 的时间复杂度和 O(n^5) 的空间复杂度。
3. 线程自动机(TA)
线程自动机是一种强大的自动机模型,由Villemonte de la Clergerie(2002)提出,可接受所有线性上下文无关递归语言(LCFRL)。
3.1 基本思想
TA的总体思想是有一组线程,其中一个是活动线程。每个线程都有一个唯一的路径,用于在树形线程结构中定位它。当启动一个新线程时,其路径是父线程路径和一个新符号的连接。
自动机的操作包括:更改活动线程的内容、启动一个新的子线程、移动到现有的子线程或移动到父线程,并最终终止活动线程。
以TAG为例,在相应的TA中,每个推导的基本树都有一个线程,该线程的内容是该基本树中的一个带点节点。当预测邻接时,启动一个子线程;当到达脚节点的左侧时,暂停子线程并返回父线程;当到达父线程中邻接位置下方部分的右侧时,继续被邻接树的子线程,当辅助树完全遍历后,终止该子线程并返回父线程。
TA提供的操作包括:
- SWAP:更改活动线程的内容,可能同时扫描一个终结符。
- PUSH:创建一个新的子线程,同时暂停其父线程。
- POP:结束活动线程,将控制返回给其父线程。
- SPUSH:恢复一个暂停的子线程。
- SPOP:恢复活动线程的父线程,同时更改其父线程的内容。
下面是一个TAG的TA示例运行过程:
线程集合 操作
[1 : •Rα]
[1 : •Rα], [11 : •Rβ] PUSH
[1 : •Rα], [11 : •Rβ], [111 : •Rβ] PUSH
[1 : •Rα], [11 : •Rβ], [111 : •Rβ] SWAP
[1 : •Rα], [11 : •Rβ], [111 : •a] SWAP
[1 : •Rα], [11 : •Rβ], [111 : a•] SWAP (扫描 a)
[1 : •Rα], [11 : •Rβ], [111 : •F] SWAP
[1 : •Rα], [11 : •Rβ], [111 : •F] SPOP
[1 : •Rα], [11 : •a], [111 : •F] SWAP
[1 : •Rα], [11 : a•], [111 : •F] SWAP (扫描 a)
[1 : •Rα], [11 : •F], [111 : •F] SWAP
[1 : •Rα], [11 : •F], [111 : •F] SPOP
[1 : •c], [11 : •F], [111 : •F] SWAP
[1 : c•], [11 : •F], [111 : •F] SWAP (扫描 c)
[1 : Rα•], [11 : •F], [111 : •F] SWAP
[1 : Rα•], [11 : F •], [111 : •F] SPUSH
[1 : Rα•], [11 : •b], [111 : •F] SWAP
[1 : Rα•], [11 : b•], [111 : •F] SWAP (扫描 b)
[1 : Rα•], [11 : Rβ•], [111 : •F] SWAP
[1 : Rα•], [11 : Rβ•], [111 : F •] SPUSH
[1 : Rα•], [11 : Rβ•], [111 : •b] SWAP
[1 : Rα•], [11 : Rβ•], [111 : b•] SWAP (扫描 b)
[1 : Rα•], [11 : Rβ•], [111 : Rβ•] SWAP
[1 : Rα•], [11 : Rβ•], [111 : Rβ•] SWAP
[1 : Rα•], [11 : Rβ•], [111 : ret] SWAP
[1 : Rα•], [11 : Rβ•] POP
[1 : Rα•], [11 : ret] SWAP
[1 : Rα•] POP
[1 : ret] SWAP
这个TA模拟了自顶向下的识别过程,因为它对派生树进行了自顶向下、从左到右的遍历。
3.2 一般定义
一个线程自动机是一个元组 ⟨N, T, S, F, κ, K, δ, U, Θ⟩,其中:
- N 和 T 是非终结符和终结符字母表,S, F ∈N 是起始符号和结束符号。
- κ 是触发函数,是从N到某个有限集合K的部分函数。
- U 是用于标识线程的有限标签集合。
- δ 是从N到 U ∪{⊥} 的部分函数,用于指定在某个点可以创建或恢复的线程。
- Θ 是有限的转移集合。
每个线程都有一个线程路径 p ∈U,其内容是一个非终结符符号。
TA的转移有以下几种形式:
- B α→C (SWAP操作),其中 B, C ∈N,α ∈T ∗。
- b →[b]C (PUSH操作),其中 b ∈K,C ∈N。
- [B]C →D (POP操作),其中 B, C, D ∈N。
- b[C] →[b]D (SPUSH操作),其中 b ∈K,C, D ∈N。
- [B]c →D[c] (SPOP操作),其中 c ∈K,B, D ∈N。
TA的语言是从初始线程集合 {ε : S} 开始,在扫描完整个输入后能够到达集合 {ε : S, δ(S) : F} 的单词集合。
3.3 为TAG构造TA
对于一个TAG,可以构造相应的TA。例如,对于前面提到的TAG,其TA M = ⟨N, T, S, ret, κ, K, δ, U, Θ⟩ 如下:
- N 包含所有符号 •X, •X, X•, X•,其中 X 是某个基本树中的节点,即 X ∈{Rα, c, Rβ, a, F, b}。此外,N 还包含一个特殊符号 ret 和一个特殊符号 S。
- T = {a, b, c}。
- S 是初始线程符号,ret 是最终线程符号。
- K = N,κ(A) = A 对于所有 A ∈N。
- U = {1},δ(X) = 1 对于所有 A ∈N \ {•F, ret},δ(ret) = ⊥,δ(•F) = ⊥。
- 转移 Θ:
S →[S]•Rα 开始初始树
•Rα →•Rα, •Rβ →•Rβ 预测无邻接
•Rα →•c, •Rβ →•a 向下移动
•c c→c•, •a a→a•, •b b→b• 扫描
a• →•F, F • →•b 向右移动
c• →Rα•, b• →Rβ• 向上移动
Rα• →Rα•, Rβ• →Rβ• 如果无邻接,向上移动
•Rα →[•Rα]•Rβ, •Rβ →[•Rβ]•Rβ 预测被邻接树
[•Rα]•F →•Rα[•F], [•Rβ]•F →•Rβ[•F] 返回邻接位置
Rα•[•F] →[Rα•]F •, Rβ•[•F] →[Rβ•]F • 恢复被邻接树
Rα• →ret, Rβ• →ret 完成基本树
[Rα•]ret →Rα•, [Rβ•]ret →Rβ• 终止邻接,返回
这个TA遍历了原始TAG的树语言中的有效派生树,并执行了前缀有效的Earley识别。
3.4 为有序简单RCG构造TA
对于一个有序简单的树邻接文法(SRCG),也可以构造相应的TA。其总体思路是模拟自顶向下、从左到右的前缀有效识别。
为了跟踪在某个子句 c 的左侧参数中的位置,引入了新符号 ck,i,表示即将处理 c 的第 k 个参数的第 (i + 1) 个元素。
TA的非终结符符号N包含所有谓词名称、一个特殊符号 ret 和所有新符号 ck,i。
U = {1, …, m},其中 m 是RCG子句中右侧谓词的最大数量。
K 和函数 κ 和 δ 用于指示,对于左侧的一个变量(由其位置符号 ck,i 表示),右侧的哪个元素包含该变量作为参数。
最终线程符号是 ret,δ(ret) = ⊥;起始符号是一个新符号 S′,δ(S′) = 1,因此最终配置必须包含线程集合 {ε : S′, 1 : ret}。
TA的转换一般包括以下几种:
-
Call
:启动一个新线程,要么是为起始谓词,要么是为子谓词:
- S′ →[S′]S (初始调用)
- γk,i →[γk,i]A 如果 κ(γk,i) = A
-
Predict
:为预测的谓词预测一个新子句:
- A →γ1,0 对于所有 A - 子句 γ
-
Scan
:在左侧扫描一个终结符时,将点移动到该终结符上:
- γk,i γ(k,i+1)→ γk,i+1 如果 γ(k, i + 1) 是一个终结符
-
Publish
:标记一个谓词的结束:
- γk,j ε→ret 其中 γ 中左侧谓词的元数为 k,左侧的第 k 个参数长度为 j
-
Suspend
:暂停一个子线程并恢复其父线程:
- [γk,i]ret →γk,i+1 如果 γ(k, i + 1) 是一个变量,并且是 γ 中右侧谓词的最后一个参数
- [γk,i]βl,j →γk,i+1[βl,j] 如果 γ(k, i + 1) 是一个变量 X,β 是一个 B - 子句,并且 X 是 γ 中右侧 B 的第 l 个参数,但不是其最后一个参数,并且 β 中左侧的第 l 个参数长度为 j
-
Resume
:恢复一个已经存在的子线程:
- γk,i[βl,j] →βl+1,0 如果 γ(k, i+1) 是一个变量 X,β 是一个 B - 子句,并且 X 是 γ 中右侧 B 的第 (l + 1) 个参数,并且 β 中左侧的第 l 个参数长度为 j
下面是一个小的SRCG及其对应的TA和示例运行的过程:
SRCG的子句:
α : S(XY Z) →A(X, Y, Z)
β : A(aX, aY, aZ) →A(X, Y, Z)
γ : A(b, b, b) →ε
对应的TA的转换(起始符号 S′):
Call:
S′ →[S′]S
α1,0 →[α1,0]A
β1,1 →[β1,1]A
Predict:
S →α1,0
A →β1,0
A →γ1,0
Scan:
β1,0 a→β1,1
β2,0 a→β2,1
β3,0 a→β3,1
γ1,0 b→γ1,1
γ2,0 b→γ2,1
γ3,0 b→γ3,1
Suspend:
[α1,0]β1,2 →α1,1[β1,2]
[α1,1]β2,2 →α1,2[β2,2]
[α1,2]ret →α1,3
[α1,0]γ1,1 →α1,1[γ1,1]
[α1,1]γ2,1 →α1,2[γ2,1]
[β1,1]β1,2 →β1,2[β1,2]
[β2,1]β2,2 →β2,2[β2,2]
[β3,1]ret →β3,2
[β1,1]γ1,1 →β1,2[γ1,1]
[β2,1]γ2,1 →β2,2[γ2,1]
Resume
α1,1[β1,2] →[α1,1]β2,0
β2,1[β1,2] →[β2,1]β2,0
α1,1[γ1,0] →[α1,1]γ2,0
β2,1[γ1,0] →[β2,1]γ2,0
α1,2[β2,2] →[α1,2]β3,0
β2,1[β2,2] →[β2,1]β3,0
α1,2[γ2,0] →[α1,2]γ3,0
β3,1[γ2,0] →[β3,1]γ3,0
Publish:
α1,3 →ret
β3,2 →ret
γ3,1 →ret
对于输入 w = ababab 的配置:
线程集合 剩余输入 操作说明
ε : S′ ababab 初始状态
ε : S′, 1 : S ababab 初始化
ε : S′, 1 : α1,0 ababab 预测
ε : S′, 1 : α1,0, 11 : A ababab 调用
ε : S′, 1 : α1,0, 11 : β1,0 ababab 预测
ε : S′, 1 : α1,0, 11 : β1,1 babab 扫描
ε : S′, 1 : α1,0, 11 : β1,1, 111 : A babab 调用
ε : S′, 1 : α1,0, 11 : β1,1, 111 : γ1,0 babab 预测
ε : S′, 1 : α1,0, 11 : β1,1, 111 : γ1,1 abab 扫描
ε : S′, 1 : α1,0, 11 : β1,2, 111 : γ1,1 abab 暂停
ε : S′, 1 : α1,1, 11 : β1,2, 111 : γ1,1 abab 暂停
ε : S′, 1 : α1,1, 11 : β2,0, 111 : γ1,1 abab 恢复
ε : S′, 1 : α1,1, 11 : β2,1, 111 : γ1,1 bab 扫描
ε : S′, 1 : α1,1, 11 : β2,1, 111 : γ2,0 bab 恢复
ε : S′, 1 : α1,1, 11 : β2,1, 111 : γ2,1 ab 扫描
ε : S′, 1 : α1,1, 11 : β2,2, 111 : γ2,1 ab 暂停
ε : S′, 1 : α1,2, 11 : β2,2, 111 : γ2,1 ab 暂停
ε : S′, 1 : α1,2, 11 : β3,0, 111 : γ2,1 ab 恢复
ε : S′, 1 : α1,2, 11 : β3,1, 111 : γ2,1 b 扫描
ε : S′, 1 : α1,2, 11 : β3,1, 111 : γ3,0 b 恢复
ε : S′, 1 : α1,2, 11 : β3,1, 111 : γ3,1 ε 扫描
ε : S′, 1 : α1,2, 11 : β3,1, 111 : ret ε 发布
ε : S′, 1 : α1,2, 11 : β3,2 ε 暂停
ε : S′, 1 : α1,2, 11 : ret ε 发布
ε : S′, 1 : α1,3 ε 暂停
ε : S′, 1 : ret ε 发布
综上所述,这些自动机模型为处理复杂的语法结构提供了强大的工具。双栈自动机和强驱动双栈自动机适用于处理树邻接文法和线性索引文法,而线程自动机则更强大,能够接受所有线性上下文无关递归语言。通过合理的设计和优化,可以提高这些自动机的效率,使其在实际应用中发挥更大的作用。
自动机模型:从双栈自动机到线程自动机
4. 自动机模型的对比与应用场景
4.1 对比分析
| 自动机类型 | 栈结构 | 复杂度 | 适用文法 | 识别策略 |
|---|---|---|---|---|
| 双栈自动机(2 - SA) | 两个栈 | 未提及通用复杂度 | 树邻接文法(TAG) | 未明确特定策略 |
| 强驱动双栈自动机(SD - 2SA) | 主栈和辅助栈(辅助栈为会话栈的栈) | 时间复杂度 O(n^6),空间复杂度 O(n^5) | 树邻接文法(TAG)、线性索引文法(LIG) | 自顶向下和自底向上 |
| 线程自动机(TA) | 无传统栈结构,基于线程 | 未直接提及通用复杂度,结合技术可多项式 | 所有线性上下文无关递归语言(LCFRL) | 自顶向下 |
从栈结构来看,2 - SA 和 SD - 2SA 都依赖栈来存储信息,而 TA 则采用线程的概念,通过线程路径来组织和管理信息。复杂度方面,SD - 2SA 给出了明确的复杂度分析,而 TA 本身非确定性可能导致指数复杂度,但通过一些技术可实现多项式复杂度。适用文法上,TA 适用范围最广,能处理所有 LCFRL,而 2 - SA 和 SD - 2SA 主要针对 TAG 和 LIG。识别策略上,SD - 2SA 支持两种常见策略,TA 模拟自顶向下识别。
4.2 应用场景
- 自然语言处理 :在自然语言处理中,这些自动机可用于语法分析、语义理解等任务。例如,对于复杂的句子结构,TA 可以通过模拟推导过程,识别句子是否符合某种语法规则。SD - 2SA 可以根据不同的解析策略,从不同角度分析句子,提高分析的准确性。
- 编译器设计 :编译器在处理程序代码时,需要对代码进行语法检查和语义分析。2 - SA 和 SD - 2SA 可以用于处理特定的编程语言语法,而 TA 可以处理更复杂的语法结构,确保代码的正确性。
- 生物信息学 :在生物信息学中,DNA 序列的分析可以看作是一种语言处理任务。自动机可以用于识别 DNA 序列中的特定模式,帮助研究人员理解基因的结构和功能。
5. 自动机模型的优化与改进
5.1 线程自动机的优化
线程自动机直接应用转换可能导致指数时间复杂度和循环问题。为了提高效率,Villemonte de la Clergerie(2002)使用了一种紧凑表示某些子推导的方法,将其存储起来以便后续重用。这种方法类似于动态规划,通过避免重复计算,减少了时间和空间开销。
具体操作步骤如下:
1.
子推导的识别
:在运行线程自动机的过程中,识别出可能重复出现的子推导。例如,在处理多个相似的基本树时,某些子树的推导过程可能是相同的。
2.
紧凑表示
:将这些子推导用一种紧凑的方式表示,例如使用某种数据结构(如哈希表)来存储。
3.
存储和检索
:将紧凑表示的子推导存储起来,当再次遇到相同的子推导时,直接从存储中检索结果,而不是重新计算。
5.2 强驱动双栈自动机的优化
Villemonte de la Clergerie 和 Pardo(1998)提出的逃逸上下文无关推导的子推导紧凑表示方法,实现了 SD - 2SA 的表格化。这种方法将推导过程存储在表格中,通过查找表格来获取中间结果,避免了重复计算。
具体操作步骤如下:
1.
表格的构建
:根据输入的文法和自动机的规则,构建一个表格,表格的行和列可以表示不同的状态和输入位置。
2.
推导的记录
:在自动机运行过程中,将每次推导的结果记录在表格中。例如,当进行一次转移时,将转移前后的状态和输入信息记录在表格的相应位置。
3.
表格的查询
:当需要进行相同的推导时,直接在表格中查询结果,而不是重新进行推导。
6. 未来发展趋势
6.1 与机器学习的结合
随着机器学习技术的发展,自动机模型可以与机器学习算法相结合,提高处理复杂语言和模式的能力。例如,可以使用神经网络来学习自动机的转移规则,从而更好地适应不同的输入数据。
下面是一个简单的流程图,展示了自动机与机器学习结合的可能过程:
graph LR
A[输入数据] --> B[自动机预处理]
B --> C[机器学习模型训练]
C --> D[模型预测]
D --> E[结果输出]
6.2 处理更复杂的语言结构
未来的自动机模型可能会进一步扩展,以处理更复杂的语言结构,如超上下文无关语言。这需要对现有的自动机模型进行改进,引入新的机制和算法。
6.3 并行计算的应用
随着计算机硬件的发展,并行计算技术越来越成熟。自动机模型可以利用并行计算来提高处理速度,特别是对于大规模的输入数据。例如,可以将自动机的不同线程或栈操作分配到不同的处理器核心上并行执行。
7. 总结
本文介绍了三种自动机模型:双栈自动机(2 - SA)、强驱动双栈自动机(SD - 2SA)和线程自动机(TA)。2 - SA 是一种基本的双栈模型,可用于处理树邻接文法。SD - 2SA 是 2 - SA 的变体,通过为两个栈分配不同角色,实现了不同的解析策略,并通过紧凑表示方法提高了复杂度。TA 是最强大的模型,能够接受所有线性上下文无关递归语言,通过线程的概念模拟推导过程。
这些自动机模型在自然语言处理、编译器设计、生物信息学等领域有广泛的应用。通过优化和改进,如线程自动机的子推导紧凑表示和强驱动双栈自动机的表格化,它们的效率得到了显著提高。未来,自动机模型有望与机器学习结合、处理更复杂的语言结构并应用并行计算技术,为解决更复杂的问题提供支持。
在实际应用中,需要根据具体的问题和需求选择合适的自动机模型,并结合优化技术来提高效率。同时,随着技术的不断发展,自动机模型也将不断演进,为各个领域的发展做出更大的贡献。
超级会员免费看
31

被折叠的 条评论
为什么被折叠?



