“Copyless SST 是流式字符串转导器的语法子类。对每个控制状态和输入字母,把这一轮所有寄存器更新的右式放在一起;若每个旧寄存器变量在这些右式中总计至多出现一次,更新就是 copyle…”
形式陈述 ​
流式字符串转导器(SST)由有限控制
所有右式都用更新前的寄存器值求值,再一次性写回;赋值次序不参与语义。寄存器初值均为
本页允许同一个旧寄存器在一轮更新的多个位置出现,即 copyful SST。它继承有限状态转导器的有限控制与确定输入扫描,但寄存器内容可随输入增长,所以不是把每个寄存器估值当成有限状态。禁止复制旧寄存器会得到 copyless 子类。
直觉
SST 像一位只读一遍输入、同时维护若干可伸长文本片段的编辑者。更新只能连接常量和已有片段,不能检查寄存器内部字符、按长度分支或删除中间某一位;有限控制负责所有条件判断。
同步赋值是模型的核心。如果写
例如更新前
输出通常延迟到输入结束,由一个表达式规定片段顺序。这不等于机器把任意操作留到最后:扫描过程中每个更新已经不可逆地构造寄存器表达式,终态只做一次有限拼接。
例子与边界
取单寄存器
输入 abc 时,寄存器依次为
若终态表达式为 aabaabc。长度递推
这个例子也是一般 SST 与 copyless SST 的明确分界。有限字母表上的固定 copyless SST 输出长度至多是输入长度的常数倍加常数,因而不可能实现上述族。反过来,寄存器虽可无限增长,SST 仍不能根据“
部分性由缺失输入转移或未定义终态表达式给出。若输入读完但
推论与应用
一般 copyful SST 能以很小控制图描述指数输出,因此表达力超过 regular string functions。其代数语义可看作由输入驱动的一串字符串代换;这也使等价问题与 HDT0L 序列等价等深层判定问题相连,而不是普通 DFA 等价的状态对搜索。
字符串寄存器适合构造嵌套转义、字段重排和多份派生视图。实现时可用 rope 或表达式 DAG 延迟物化,避免每轮真实复制长字符串;但 DAG 共享只是运行优化,不会把 copyful 语义变成 copyless。
若任务需要正则、线性大小的字符串变换,copyless 流式字符串转导器提供更稳健的限制,并恰好对应确定双向转导器。若确实需要指数展开,则应明确接受输出本身已占指数空间,任何实现都无法用次线性于输出长度的时间打印结果。
寄存器更新也可视为对表达式 DAG 的代换。求值器可以一直保留节点共享,到终态再展开输出;若某个旧节点被 copyful 更新引用两次,共享 DAG 仍很小,但最终打印会遍历它两次。表示压缩与语义输出长度必须分开报告。
参考资料
- Rajeev Alur and Pavol Černý, “Streaming Transducers for Algorithmic Verification of Single-Pass List-Processing Programs,” POPL 2011, §§2–3.
- Rajeev Alur and Pavol Černý, “Expressiveness of Streaming String Transducers,” FSTTCS 2010, LIPIcs 8, 2010, §2.
- Emmanuel Filiot and Pierre-Alain Reynier, “Transducers, Logic and Algebra for Functions of Finite Words,” ACM SIGLOG News 3(3), 2016, §5.