“若任务需要正则、线性大小的字符串变换,copyless 流式字符串转导器提供更稳健的限制,并恰好对应确定双向转导器。若确实需要指数展开,则应明确接受输出本身已占指数空间,任何实现都无法用次线…”
形式陈述 ​
Copyless SST 是流式字符串转导器的语法子类。对每个控制状态和输入字母,把这一轮所有寄存器更新的右式放在一起;若每个旧寄存器变量在这些右式中总计至多出现一次,更新就是 copyless。终态输出表达式也要求每个寄存器至多出现一次。
例如
是 copyless,因为旧
在有限字、确定控制、同步更新、寄存器初值为空以及终态表达式产生偏函数的标准假设下,copyless SST 与正则字符串传导表达能力等价。若允许复制、数据寄存器测试、非确定更新或无限字输出,等价范围都会改变。
直觉
Copyless 规则把每段已经积累的文本当成线性资源:一轮中可以移动、连接或丢弃,但不能同时送往两个去处。新读到的字符是常量,可以分别追加到多个寄存器;被禁止的是复制整个历史片段。
因此寄存器内容可以任意长,模型并非常数内存的实际流算法。它保存的是固定数量的无界字符串,只是这些字符串的“血统”不会分叉。固定寄存器数和每步有限常量共同推出输出长度对输入长度的线性上界。
该限制是可静态检查的:扫描每个更新表,计数右式中的变量出现次数即可。无需分析输入或求不动点,因而适合作为语言设计和验证系统中的语法纪律。
更细地看,每轮更新都诱导一张“旧寄存器到新寄存器”的变量流图。Copyless 要求每个旧变量的出度至多为一;一个新变量仍可接收若干不同旧变量并按指定次序连接。随着输入推进,历史片段可以汇合,却不会分叉成越来越多副本,这正是线性长度界背后的机制,而非单纯的实现建议。
例子与边界
反转可由一个寄存器完成。令
终态输出 cab 时,轨迹为
最终正是 cab 的反转。旧
模型甚至能输出两份输入:用
相反,单寄存器更新
需要注意,copyless 是逐条转移的联合条件,不是分别检查每个赋值。例如
推论与应用
Copyless SST 单向读输入,却可通过“向寄存器左端或右端追加”模拟双向读头最终会以何种顺序输出各片段。反过来,确定 2DFT 可用 crossing sequence 追踪每个输入边界的有限穿越方式,从而模拟寄存器片段的组合。两向构造给出 regular function 等价定理。
该类对函数复合封闭,但直接把一台 SST 的寄存器表达式代入另一台,可能迅速增大控制状态和更新式;保持 copyless 需要结构化地追踪变量流,而非文本式反复展开。表达能力闭包不等于构造没有指数代价。
在流式数据清洗、字段重排和程序验证中,copyless 纪律提供两项可用保证:输出大小线性受控,变量来源可追踪。若需求确实包含指数展开,应改用一般 SST 并显式评估输出成本,而不是悄悄放宽一条赋值。
参考资料
- Rajeev Alur and Pavol Černý, “Expressiveness of Streaming String Transducers,” FSTTCS 2010, LIPIcs 8, 2010, Definition 1 and §§3–4.
- Rajeev Alur and Pavol Černý, “Streaming Transducers for Algorithmic Verification of Single-Pass List-Processing Programs,” POPL 2011, §§2–4.
- Emmanuel Filiot and Pierre-Alain Reynier, “Transducers, Logic and Algebra for Functions of Finite Words,” ACM SIGLOG News 3(3), 2016, §5.