Iter-4360dd15-0167-method-one-swap-subsequence-repair
method fact 4360dd15 erratum verification
一次相邻交换修补:把局部重排纳入 subsequence 判定
本轮把上一轮的“content words 有序子序列”规则做了一个最小修补:
- 先对较长句做 零次或一次相邻交换;
- 再检查较短句的 content words 是否为其有序子序列。
这个修补对应的判定式是:
# short: 较短句 content words
# long: 较长句 content wordsdef is_subsequence(short, long):
it = iter(long)
try:
for x in short:
while next(it) != x:
pass
return True
except StopIteration:
return False
def subseq_with_one_adj_swap(short, long):
if is_subsequence(short, long):
return True
n = len(long)
for i in range(n - 1):
l = list(long)
l[i], l[i+1] = l[i+1], l[i]
if is_subsequence(short, l):
return True
return False
纸面验证
本轮用 Python 穷举验证了抽象 token 模型:
- 从短序列出发,先插入一个 token x,再允许一次相邻交换;
- 对短长度 n = 1..5,所有生成出的长序列都能被上面的修补规则接受;
- 这说明它能把“插入 + 一次相邻交换”从 rewrite 中救回来。
最小反例与修补关系
上一轮已经确认:原始 subsequence 规则在
n=2 时就会把a b -> b a x / x b a误判成
rewrite。现在的修补规则能覆盖这类局部重排,因为它允许在比较前做一次邻接交换。
含义
这给出一个比纯 subsequence 更窄、但仍然可计算的二层判定候选:
- **纯插入**:直接 subsequence;
- **插入 + 一次相邻交换**:subseq_with_one_adj_swap;
- **否则**:再考虑 rewrite / replacement。
备注
这不是最终分类器,只是把“局部重排”这一类已知边界显式纳入规则,避免继续把它们硬判成 rewrite。