【问题标题】:Minimum number of statements: P or NP? [closed]最小语句数:P 还是 NP? [关闭]
【发布时间】:2012-08-26 20:24:33
【问题描述】:

编写程序以在 1 行源代码中完成任务是一种常见的程序员爱好。但这有点微不足道:我可以使用 1 000 000 行代码,删除所有换行符,瞧! 1 行!

所以为了让事情变得有趣,我们可以计算 语句。对于 C 风格的语言,计算语句的一种简单方法是计算分号:因此嵌套一百万个 if-else 就可以了。

假设您有一个带有 n 语句的程序 P。它经过一系列状态(变量值)s(其中 s 是一个向量)并产生输出x。我们可以提出两个问题:

  1. 语句少于 n 个的程序能否产生输出 x
  2. 语句少于 n 个的程序能否通过 s 的某个子集?

马上,有些事情就变得显而易见了。采取以下程序:

int sum = a+b;
float mean = sum/2.0;
return mean;

我们可以将它重构(或者我应该说“defactor”)成一个单行:

return (a+b)/2.0;

每个程序都可以分解为一行吗?参加这个程序:

string x = "";
for (int i = 0; i<a; i++)   // Should these semicolons count?
{
    x = x + ".";
}
return x;

这有点挑战性。

这个问题可以通过使用少于 n 个语句的每个可能的程序来详尽地回答,这是一个有限的数字(理论上你可以有具有无限多个可能值的常数, 但没有真正的语言有无限的内存来存储它们或无限的磁盘空间来容纳源代码。

但是:

A.是否有可能证明一个程序 P 产生 x(也许通过 s ) 与 n 语句,没有 Q 可以在 >m 语句可以找到(以有效的方式)?

B.是否可以(以有效的方式)找到最小值 n

C.最小 n 是否保证为 1?

你可以假设任何你想要的语言,虽然真正的语言会更有趣。如果您的语言不寻常,请用您的语言提供“陈述”的定义。

我假设使用命令式语言,但欢迎将问题改编为函数式语言。

有一个简单的解决方案:对于任何 P,运行 P 并记录 x。现在编写一个程序 Q,它只打印 x。对于有输入的程序,请用很长的 if-else 将每个输入映射到正确的输出。

这个解决方案不能令人满意,虽然我不完全确定为什么。首先,对于无限可能的输入,这是不可能的(但我已经说过真正的程序是有限的,所以我们可以说真正的输入是有限的)。其次,它在技术上只通过 s 的一个子集:即空集。第三,真是虎头蛇尾。

也感谢任何帮助定义这个小聪明技巧的帮助。

PS:不管我怎么说,这不是功课。我只是对这个问题感到好奇,并试图尽可能清楚地表达出来。当然,我还是会说,如果它家庭作业,那么...

【问题讨论】:

  • 听起来太像家庭作业了...
  • 那将是相当奇怪的作业:)。不,我只是好奇。
  • 如果要统计语句的数量,逗号运算符呢?在 C/C++ 中,存在初始化问题,每个类型必须至少采用一个不同的语句。但是,在那之后,您可以使用逗号运算符做任何您想做的事情。例如。 (以您的初始示例),您可以写return (sum=a+b,mean=sum/2.0,mean);
  • 如果逗号不等于额外的语句(与分号不同),那么它就是。无论您是否使用{},每个循环都需要至少一个分号(而不是逗号)来终止。但是你可以在没有额外语句的情况下使用逗号来执行伪循环。例如。而不是for (a=0;a&lt;b;a++) c+=a;,你可以说a=0,(++a&lt;b?c+=a:0),(++a&lt;b?c+=a:0),(++a&lt;b?c+=a:0),(++a&lt;b?c+=a:0),它允许伪循环迭代任意恒定次数(在本例中,最多4次)。
  • en.wikipedia.org/wiki/Kolmogorov_complexity(写函数的最短代码长度)。陈述的数量相当恶劣。

标签: computer-science theory proof


【解决方案1】:

由于语句的概念是特定于语言的,因此在某些语言中,每个程序都可以编写为单个语句或表达式。见鬼,甚至在某些语言中,每个程序必须写成一个表达式。

也就是说,假设一种语言不是这种情况(并且肯定存在这样的语言),找到解决给定问题的最少语句的问题将既不是 P 也不是 NP - 这是不可判定的。

这个问题可以通过使用少于 n 个语句的每个可能的程序来详尽地回答,这个数字是有限的

由于其中一些程序不会终止,并且无法知道哪些程序会终止(停止问题),因此这是行不通的。

在大多数语言中,少于 n 条语句的程序的数量不是有限的。例如,在大多数语言中,return foo + bar + ... + baz; 形式的语句数不胜数。

A.是否有可能证明一个程序 P 用 n 个语句产生 x(可能通过 s),不能找到可以在 m 个语句中完成的 Q(以有效的方式)?

(我假设你在这里忘记了m &lt; n,否则这个问题没有意义。)

不,根本无法证明。

B.可以找到最小的 n(以一种有效的方式)吗?

不,根本找不到。

C.最小 n 是否保证为 1?

正如我一开始所说,这取决于语言,出于上述问题的目的,我假设了一种语言,答案是否定的。

【讨论】:

  • 感谢详细的解释!我现在意识到我没有考虑某些关键问题(例如停机问题),当考虑到这些问题时,事情就变得不那么神秘了。
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 2015-03-26
  • 2012-06-17
  • 2021-03-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多