编写用于完成一行源代码任务的程序是一种常见的程序员爱好。但这有点微不足道:我可以获取1 000 000行代码,删除所有换行符,瞧! 1行!
为了让事情变得有趣,我们可以计算语句。对于C风格的语言,一种简单的计算语句的方法是计算分号:所以嵌套一百万个if-elses就好了。
假设您使用 n 语句获得了 P 程序。它经历了一系列状态(变量值) s (其中 s 是一个向量)并产生输出的 X 即可。我们可以提出两个问题:
立即,有些事情变得明显。采取以下计划:
int sum = a+b;
float mean = sum/2.0;
return mean;
我们可以将(或者我应该说“反应器”)重构为一个内容:
return (a+b)/2.0;
每个程序都可以针对一行进行制作吗?采取这个计划:
string x = "";
for (int i = 0; i<a; i++) // Should these semicolons count?
{
x = x + ".";
}
return x;
这更具挑战性。
通过尝试使用少于 n 语句的每个可能程序,可以详尽地回答这个问题,这个数字是有限的(理论上你可以使用具有无限多个可能值的常量) ,但没有真正的语言有无限的内存来存储它们或无限的磁盘空间来容纳源代码)。
然而:
一个。是否有可能证明 P 的程序产生 x (可能通过 s ) n 语句没有 Q ,可以在 m 语句(以有效的方式)?
B中。可以找到最小的 n (以有效的方式)吗?
℃。最低 n 保证为1?
你可以假设你想要的任何语言,虽然真正的语言会更有趣。如果您的语言不正常,请以您的语言提供“声明”的定义。
我已经假设了命令式语言,但欢迎将问题调整为函数式语言。
有一个简单的解决方案:对于任何 P ,运行 P 并记录 X 即可。现在编写一个程序 Q ,它只打印 x 。对于带有输入的程序,使用非常长的if-else将每个输入映射到正确的输出。
这个解决方案并不令人满意,虽然我不完全确定原因。首先,对于无限可能的输入,它是不可能的(但我已经通过说实际程序是有限的,我们可以说实际输入是有限的,已经覆盖了我的屁股)。其次,它只在技术上通过 s 的子集:即空集。第三,它真的是虎头蛇尾。
任何帮助定义这个小聪明的技巧也值得赞赏。
PS:无论我的言论是什么,这都不是功课。我只是对这个问题感到好奇并试图尽可能清楚地说出来。当然,我仍然会说如果是作业,那么......
答案 0 :(得分:3)
由于语句的概念是特定于语言的,因此有些语言可以将每个程序编写为单个语句或表达式。地狱,甚至还有一些语言,每个程序必须写成一个单独的表达式。
那就是说,假设一种语言不是这种情况(并且肯定有这样的语言),找到解决给定问题的最小语句的问题既不是P也不是NP - 它是判定的。
通过尝试少于n个语句的每个可能的程序,一个有限的数字,可以详尽地回答这个问题
由于其中一些程序不会终止,而且无法知道哪些程序会停止(停止问题),但这并不起作用。
在大多数语言中,少于n个语句的程序数量不有限。例如,在大多数语言中,return foo + bar + ... + baz;
形式的语句数量无限。
一个。是否有可能证明一个程序P产生x(可能是通过s),其中n个语句可以找到m语句中没有Q可以找到它(以有效的方式)?
(我假设你在这里忘了m < n
,否则这个问题没有用。)
不,它根本无法证明。
B中。可以找到最小的n(以有效的方式)吗?
不,它根本找不到。
℃。最小n是否保证为1?
正如我在开头所说,这取决于语言,出于上述问题的目的,我采用了一种语言,其答案是否定的。