停机问题与矛盾浅论

昨天想起停机问题,一直以为是否停机只与“机”的内部构造有关,导致思索无果。今天查询一下才知,停机问题有两个因素:机和输入。 这很好理解,例如以下函数输入 0 停机,其他不停机:

1
void f(int cond) { while (cond); }

停机问题是期望找到一个工具,判断任意机在任意输入下是否停机。 停机问题已被证伪,也就是不存在这样的工具。可以用反证法证明。

「停机」更像动词,准确说是「能停机」。

假设存在这样的工具,用代码描述为

1
bool halt(any_f, any_input);

根据假设,halt 对于任意输入停机,那么 halt(f, f) 也停机。 可以构造这样一个机

1
2
3
4
5
6
7
void my_f(f) {
  if (halt(f, f)) {
    while (1);
  } else {
    return;
  }
}

也就是输入停机时不停机,输入不停机时停机。那么 my_f(my_f) 是否停机呢?

这是一个悖论,导出矛盾,假设不成立,即不存在符合要求的 halt

这个问题属于自指矛盾,与著名的“理发师悖论”、“罗素集合论悖论”同理。 细细研究自指矛盾,其实有解,核心思路是动态求解。

理发师悖论怎解?引入时间。 理发师给自己理发前,属于“不给自己理发”的人,那么他要给自己理发,理发后,属于“给自己理发”的人,那么就不再给自己理发。

理发师的属性是动态变化的,不能倒果为因,用假设未来约束现在。可能有人问,理发过程中怎么算?这个简单,理发是原子操作,不可中断。

罗素悖论同理,当集合 S 包含自身,那就不包含它;不包含自身时就包含它。

这似乎只是复述一下悖论,不错,关键在于将静态视角转到动态。通常追求静态结论,遇到冲突就成了悖论,如果以动态结论看待,悖论很平常。

矛盾是动态的,是无限的,是高能态。 矛盾是世界变化的动力根源。 遇到难解问题,不妨跳出静态和谐的幻想,追寻动态平衡的永恒。

Built with Hugo
Theme Stack designed by Jimmy