随着机器模拟轮次的不断运行,有些连续的1段在增长,有些在缩短,还有一些被无情地向右侧推开。
“单看这些长度,依然是杂乱的数值。”江临走到白板前,拿起一支黑色的白板笔,“但如果你们仔细看变化发生的位置,就会发现它隐藏着清楚的顺序。”
说着,他提笔在白板上写下一段最基础的纸带符号表示。
【0 1?? 0 1?1 0 1?2 0 …… 1?? 0】
“它没有在纸带上制造随机图案。”
江临转身在每一段连续1的上方标出一个整数。
“这些连续段是一张用一进制写出来的整数表。读写头每完成一次长程的往返扫描,看起来修改了成千上万个格子,但在宏观层面,它仅仅只修改了其中一项的数据。下一次完整的扫描,它会去修改相邻的另一项。当某一端发生进位时,它的修改方向就会发生反转。”
周述猛地站直了身体,他瞪大眼睛,目光在那列被筛选出的整数快照上快速移动,大脑在飞速运转。
十几秒钟后,他像触电一般冲到了大屏幕旁,用手指着连续八张快照的变化位置,声音因为激动而微微发颤:“零,一,零,二,零,一,零,三。”
会议桌边,刚才还在敲击键盘的几个研究员,手部的动作瞬间停滞了悬在半空。
“格雷码(Gray code)。”周述脱口而出,转头看向江临。
“对。”江临点了点头。
在计算机科学中,格雷码是一种特殊的二进制编码方式。
它最显着的特征是,相邻两个数之间,永远只有一个二进制位发生改变。这种特性常用于硬件设计中以消除毛刺。
而这台只有五个状态、简陋到极点的图灵机,竟然用它那左右往返、看似愚笨的读写头,以及纸带上一串串长短不一的1,在两百亿步的狂飙突进中,硬生生地把一整套格雷码的更新次序,天衣无缝地藏进了纸带的结构演化里!
过去十几年里,所有研究者的分析都深陷在泥潭中,因为他们都在试图追踪每一格纸带在每一纳秒里究竟发生了什么。
那是一个细节爆炸的微观地狱。
而江临,直接把观察的尺度抬高了整整一个维度。
“一轮长程扫描结束后,具体在这个区间里写过多少个1,已经不再重要了。”
江临的语速不快,但每一个字都像钉子一样敲进众人的脑海里。
“我们要剥离无关变量。需要保留的只有三类信息:作为符号参数存在的活动段索引iii,当前扫描阶段,以及边界标记的奇偶类。八个宏状态只描述控制阶段、扫描方向与奇偶类的组合,活动段索引和各段长度仍作为证书中的符号参数存在。”
叶宁作为形式化验证的老手,此时已经完全明白过来他到底想做什么。
“但是这个列表的长度是会无限增长的啊!”叶宁指着屏幕边缘,眼中闪烁着兴奋的光芒,“如果只记录活动段的位置和奇偶性,能覆盖未来所有新生成的连续段吗?”
“能。”江临毫不犹豫地回答,“因为每个新段的产生,都必然通过同一个固定的进位模板。”
说完,他在白板的右侧,刷刷刷地写出了三类局部重写规则的大纲。
1、普通翻转。
2、向右进位。
3、抵达边界后的反向扫描。
“列表可以向右无限延伸,宇宙毁灭它也不会停。但生成这无尽列表的规则,只有这三种。”
江临转过身,直视着所有人。
“所以,我们的非停机见证不需要装下整张纸带的快照,那是内存装不下的。我们只需要在数学上证明:所有合法的列表状态,在经过一次这样的宏转换之后,仍然属于我们定义的同一个集合。只要这个集合是闭合的,机器就永远逃不出去。”
“那停机条件呢?”乔闻铎从桌边霍然站起,快步走到屏幕前。
长年做学问的稳重此刻也被打破了。
江临走过去,手指直接点在转移表最后那个显眼的未定义入口上。
“这台机器要撞进停机状态,条件极为苛刻。它必须同时满足三个前提:第一,它必须在回收阶段抵达当前编码区的右端分隔符;第二,以指定状态读取空白符;第三,让边界标记落在偶类。”
“只有这三个条件同时成立,那个未定义转移才会被触发。”
江临转身,沿着刚才写出的宏转换逻辑,一层层向下推导。
笔在白板上划出一道道严密的逻辑链条。
“根据刚刚拆出的三类宏转换,活动段每向右推进一次,边界奇偶位都会随对应的进位模板翻转。这个结论来自机器自身的局部重写关系,而非格雷码的一般性质。”
“因此,我们可以得出结论:当机器抵达当前编码区的右端分隔符形成宏状态时,它的奇偶标记永远落在奇类,也就是非停机类。而如果奇偶标记碰巧符合了停机要求的偶类时,对不起,此时活动段与边界之间,至少还隔着一个不可逾越的分隔符,它根本触碰不到边界。”
“那个未定义的停机入口确实就在那里,敞开着大门。”
江临看着众人,语气平静得让人不由得冒起鸡皮疙瘩。
“却不属于任何一个从初始配置可达的宏状态。”
乔闻铎稍一思索,拿起桌上的另一支红色白板笔,走到江临身边。
在江临列出的宏状态旁,画了一个圈,加上了一个退化情况。
他敏锐地察觉到了这个宏大架构中的一个风险点。
“你的理论很精妙。但如果中间这一段连续的1缩减到零呢?两个0分隔符直接合并,活动位置会发生跳跃,直接跨过一层,方向标记也会在跨层合并的同时发生翻转。”
江临微微一笑,仿佛早就预料到了这个问题。
他接过红笔,在归并规则的下方补上了一行严密的代数推导。
“跨层发生以后,虽然发生了一次额外的翻转,但由于位置的跳跃补偿了相位的损失,新的边界奇偶类经过计算,仍然与停机类保持相反。它依然落入我们的不变量集合中。”
周述紧接着举起手,指出了系统实现层面的第二个问题。
“逻辑上成立了,但是核验器怎么识别?如果两个分隔符合并成连续的00,读写头停在其中任意一格时,左右两种编码都可能成立。核验器在匹配规则时会产生歧义,怎么避免把两个不同的宏状态识别成同一个?”
“很简单。把读写头停留在分隔符上的朝向,强制写进状态定义里。”江临在白板上画了一个带有箭头的方块,“我们不做对称归并,破除歧义。”
原本白板上的六个宏状态,因为这一调整变成了八个。
叶宁没有废话,直接从服务器里调出了之前运行的最长轨迹,从中抽取出所有发生过边界归并的极端样本。
她把这些数据打包,逐条投入到江临刚刚定义的新的宏状态逻辑中进行跑批测试。
三十七次严重的边界归并。
全部安全着陆,无一遗漏地落在江临刚写出的那两条边界路径里。
当然那,这三十七条轨迹能证明新抽象与已知数据一致,还是无法替代对全部符号参数的闭包证明。
会议室里原本同时打开的几个键盘,打字声逐渐停了下来。
所有人都停下了手头的工作,目瞪口呆地看着白板上的推导。
乔闻铎重新看向白板。
“历史样本过了,现在,怎么把无限个参数情形交给核验器?”
他此时问出的第三个问题,已经不再是怀疑这个不变量是否成立,而是已经直接跨越到了工程实施的层面。
江临在八类宏控制状态的外围,画了一个大大的方框,将其整体圈住。
“在系统中,单独建立第四类非停机见证类型——宏状态不变量见证。”
“底层的公共可信核呢?”第三方负责人立刻追问,因为这关系到整个验证架构的公信力。
“公共核保持冻结,绝对不能修改。”
江临说完在方框外写下三条冷硬的检查条件。
【条件一:验证初始配置是否安全进入宏状态集合。】
【条件二:穷举所有的局部重写规则,验证其是否能保持集合闭合。】
【条件三:验证宏状态集合是否与停机入口彻底互斥。】
“具体的工程方案是这样的:新的见证文件只负责提交宏状态的定义、符号块的划分以及局部重写的模板。公共核继续负责验证图灵机的一步转移语义和有限基例;新的宏状态核验器负责检查参数化重写模板的归纳条件、集合闭包与停机排除。两层之间只通过冻结后的机器语义接口连接。”
江临看着周述和第三方负责人,侃侃而谈。
“Rust组和oca组,分别独立实现针对这八类宏控制状态的核验器扩展模块。第三方,你们的责任是,想尽一切办法生成能击穿这八个状态边界的变异样例。”
“两组开发人员能看到你的白板推导吗?”乔闻铎问。
“只给抽象的规范文档和序列化后的证书格式。隔离必须彻底。”江临平静地说。
乔闻铎抬起腕表看了一眼时间。
晚上七点二十六分。
从江临下令关掉单步动画,到他在白板上徒手写出完整的足以镇压Skelet #17的核验边界,用了一个小时十九分钟。
乔闻铎转过身,目光如炬,扫过周述和第三方负责人。
“都听清楚了?开启新的规则编号,两套实现团队继续保持绝对隔离,切断一切私下通讯。今晚九点前封存规范文档,明天一早,开始盲测。”