📜  TOC 中的可计算和不可计算问题

📅  最后修改于: 2021-09-28 11:02:27             🧑  作者: Mango

可计算的问题 –
您熟悉许多可计算(或可判定)的问题(或函数),这意味着存在一些算法可以计算出任何问题实例(或函数的任何输入)的有限数量的答案(或输出)简单的步骤。一个简单的例子是整数递增操作:

f(x) = x + 1 

给定任何整数 x,我们可以在有限步数内计算 x + 1 应该是直观的。因为 x 是有限的,所以它可以用有限的数字字符串来表示。使用我们在学校都学过的加法(或算法),我们可以清楚地计算出另一个数字字符串,表示等效于 x + 1 的整数。

然而,也存在不可计算(或不可判定或不可计算)的问题和函数,这意味着不存在可以在有限数量的简单步骤中为所有输入计算答案或输出的算法。 (不可判定仅意味着在决策问题的上下文中不可计算,其答案(或输出)为“真”或“假”)。

不可计算的问题——
不可计算的问题是没有可用于解决它的算法的问题。不可计算性(或不可判定性)最著名的例子是停机问题。给定图灵机及其初始输入的描述,确定程序在此输入上执行时是否停止(完成)。

另一种选择是它永远运行而不会停止。停机问题是关于查看机器是否会在给它某个输入时停止或者它是否会完成运行。这个输入本身可以是永远调用自己的东西,这意味着它会导致程序永远运行。

另一个不可计算问题的例子是:确定计算机程序是否在某些输入上永远循环。如果您了解图灵机,可以将“计算机程序”替换为“图灵机或算法”。

证明可计算性或不可计算性 –
我们可以通过描述一个过程并证明该过程总是终止并总是产生正确的答案来证明一个问题是可计算的。提供一个令人信服的论点就足够了,这样的过程存在发现实际过程是不必要的(但通常有助于使论点更有说服力)。

为了证明一个问题是不可计算的,我们需要证明不存在解决这个问题的算法。由于可能的程序有无数种,我们不能只列出所有可能的程序并说明为什么每个程序都不能解决问题。相反,我们需要构建一个论证,表明如果存在这样的算法,它将导致矛盾。

我们论证的核心是基于知道停机问题是不可计算的。如果某个新问题 P 的解可以用来解决停机问题,那么我们知道 P 也是不可计算的。也就是说,不存在可以解决 P 的算法,因为如果存在这样的算法,它也可以用来解决我们已经知道是不可能的停机问题。解决不同的问题 Q 被称为归约。如果 P 的解决方案可以用来解决 Q,那么问题 Q 可以简化为问题 P。这意味着问题 Q 并不比问题 P 难,因为问题 Q 的解决方案导致问题 P 的解决方案。

关于可计算问题的一些例子 –
以下是可计算问题的四个简单示例:

  1. 计算一对整数的最大公约数。
  2. 计算一对整数的最小公倍数。
  3. 在有限图中寻找一对节点之间的最短路径。
  4. 确定命题公式是否是重言式。

可计算问题的一些例子——状态输入问题。
考虑确定是否将字符串’w’ 提供给某个图灵机 ‘M’ 的问题,它是否会进入某个状态 ‘q’(其中 q 属于图灵机 M 中所有状态的集合,字符串w 不等于空字符串)。它是可计算的还是不可计算的?

解释 –
我们通过证明状态进入问题与停机问题一样困难来证明状态进入问题是不可计算的,我们已经知道它是不可计算的。

状态进入问题是在给定的字符串w 上询问我们是否从图灵机的初始状态开始,它是否会到达状态 q。现在这个状态进入问题可以转化为停机问题。停止问题是我们的图灵机是否曾经停止过,状态进入问题也在问同样的事情,如果我们将字符串w 作为图灵机 M 的输入,这个图灵机是否在某个状态 q 停止。所以状态进入问题是不可计算的,因为我们将其转换为停机问题,我们已经知道它是不可计算的问题。所以通过这种方式我们可以证明不可计算性。