我开始读一本关于计算复杂性和图灵机的书。这是报价:
一旦确定某种规范编码,就可以将算法(即机器)表示为位字符串。
提供此断言只是一个简单的事实,但我无法理解。
例如,如果我有一个算法,将作为输入并计算或:(x + 1 )2
int function (int x){
x = x + 1;
return x**2;
}
如何使用字母将其表示为字符串?
我开始读一本关于计算复杂性和图灵机的书。这是报价:
一旦确定某种规范编码,就可以将算法(即机器)表示为位字符串。
提供此断言只是一个简单的事实,但我无法理解。
例如,如果我有一个算法,将作为输入并计算或:(x + 1 )2
int function (int x){
x = x + 1;
return x**2;
}
如何使用字母将其表示为字符串?
Answers:
您已经将该功能表示为文本。使用ASCII编码将每个字符转换为一个字节的值。那么结果是一个字节序列,即,比特的序列,即,一个字符串在字母表。那是编码的一个例子。
我无法抗拒...
⡂⡀⣀⢀⣄⡀⣰⡉⡀⠀⡀⡀⣀⠀⢀⣀⢀⣄⡀⡂⢀⣀⡀⢀⢀⡀⠀⡰⣀⠀⣀⠀⡂⡀⣀⢀⣄⡰⡀⢠⠂
⡇⡏⠀⡇⡇⠀⢸⠀⡇⢀⡇⡏⠀⡇⣏⠀⠀⡇⠀⡇⣏⠀⣹⢸⠁⢸⠀⡇⢈⠷⡁⠀⡇⡏⠀⡇⡇⠀⡇⢼⠀
⠁⠁⠀⠁⠈⠁⠈⠀⠈⠁⠁⠁⠀⠁⠈⠉⠀⠈⠁⠁⠈⠉⠁⠈⠀⠈⠀⠱⠉⠀⠉⠀⠁⠁⠀⠁⠈⠱⠁⠘⠄
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⢤⡀⡤⠀⣀⣀⣀⠀⢤⡀⡤⠀⠀⢰⠀⠀⢹⠠⠀
⠀⠀⠀⣠⠛⣄⠀⠒⠒⠒⠀⣠⠛⣄⠀⠉⢹⠉⠁⢸⢀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠀
⠀⠀⠀⣄⢄⠤⢄⢴⠤⢠⠀⢠⢠⡠⢠⡠⢄⠀⢤⡀⡤⢺⡖⠐⣷⠂⠊⢉⡆
⠀⠀⠀⡇⠸⣍⣉⠸⣀⠸⣀⢼⢸⠀⢸⠀⢸⠀⣠⠛⣄⠀⠀⠀⠀⠀⣴⣋⡀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢱⠀
⢸⠁
⠊
(上面的点代表一个,空白代表零)。
该概念背后的基本假设是“ 教堂-图灵”理论。很难看到任何算法都可以表示为一串比特,因为术语“算法”可能是用非常非正式的术语来考虑的。在Church-Turing论文中,他们使用非常严格的概念定义了什么是算法(甚至那时还存在一些有关单词的问题)。然而,他们的术语变得如此多的晃动,它有时会认为,这些定义对于喜欢“算法”的话是如此有效,我们简单地接受他们成为了定义。
Church-Turing指出,每种算法都可以在Turing Machine上实现为计算。鉴于图灵机的描述是一组有限的值,因此很容易看到如何将该描述映射到一个数字序列,然后再映射到一个0和1的序列。
正如其他答案提到的那样,使用ASCII编码或其他编码来表示示例算法很简单。
我认为您的书之所以说这句话是事实,是因为许多人只是简单地使用Church-Turing论文作为其算法定义的基础。如果使用这样的定义,则事实与“ 5是数字”一样明显,因为您基本上是这样定义的。
该声明基于通用TM的存在。这些基本上是可编程的TM,可以模拟最多具有多边形开销的任何其他TM。因此,您的程序只是输入中编码为零和一的一部分。
好吧,让我们谈谈对于任何类型的编码都不能表示为有限位字符串的算法。
让我为您键入一个这样的算法...啊,但是如果这样做,我可以使用我输入的文本的编码来表示该算法。
如何用一些“模拟方式”来表示我的算法,比如说我桌子上几个硬币的位置。尽管这些硬币的位置可以用一些实数建模(在某些编码中不可能有限地表示),但整个描述仍可以视为我的算法的代表,并且可以再次编码为位串!
我希望这些示例可以清楚地表明,如果某些算法不能用有限的位字符串表示,那么我们根本就无法描述该算法!
那么,为什么我们要考虑存在一个我们不能说的东西呢?也许对哲学很有趣,但对科学却不有趣。因此,我们定义算法的概念,以便可以用位字符串表示它,因为我们至少知道我们能够谈论所有算法。
尽管上面的问题回答了问题,但我认为对给出的示例的困惑主要是由于这样的事实,即表示只需要唯一地表示某种算法。表示方式不需要涉及算法调用的实际计算!这非常有用,因为这意味着我们也可以表示无争议的算法!