繁体   English   中英

您如何证明一个简单的无意义代码是否可计算?

[英]How do you prove whether a simple unmeaningful code is computable or not?

可计算问题的特征是:

  • 完整意味着它涵盖了所有情况;
  • 机械意味着它是精确的;
  • 确定性意味着如果输入相同的输入,将提供相同的 output。

如果我错了,请纠正我,我发现通过研究,除了deterministic之外,我并不完全知道它的实际含义。

所以,我试图证明一个简单的代码,例如:

int i = 0;
do{
    int j = 0;
    do{
        printf("Hello\n");
        j++;
    }while (j < n);
    printf("Hello\n");
    i++;
}while (i < n);

是可计算的。

我知道如何证明它是确定性的,因为它相当明显,但我不确定如何证明它是机械的或完整的。

Complete特征,据我了解,它更像是“有没有什么方法可以使代码无法执行或作为错误返回?” 例如打开一个文本文件有可能文件不存在,因为输入了错误的文件名或输入了错误的位置等。

但是对于上面的代码片段,我应该如何证明它是完整的呢?

至于机械论“是否 1 + 1 = 2 而不是 3?”。

同样,对于上面的代码片段,我如何证明它是精确的,因为代码本身并没有解决任何问题,它只是根据 n 值打印“hello”? 在这种情况下,n^2 + n 个“你好”。

你混淆了一些东西。

首先,你提供了一段代码,问如何证明它是可计算的。 但这没有任何意义 - 一段代码无法计算或不可计算。

一个(数学)集合可以是可计算的,也可以是不可计算的。 基于此,其他所有内容也是一个集合:例如语言(一组字符串)、决策问题(一组接受的输入)或function (一组键值对)。

其次,您提到的“特征”没有定义可计算的问题。 我不知道你从哪里得到它们,但它们充其量只是对用于解决可计算问题的算法的某些方面的非常非正式的描述。 所以我认为你不是在谈论可计算的问题,而是在谈论算法 但鉴于您的特征是非正式的,您无法证明它们。

因此,这里有一些可能会有所帮助的稍微更精确(但仍不正式)的陈述:

  • 一个问题是可计算的,当且仅当存在解决它的算法。
  • 算法解决问题当且仅当
    • 它可以在标准的 model 计算中表达(例如图灵机或标准编程语言);
    • 就问题而言是合理的:算法产生的任何答案都属于问题的答案集;
    • 就问题而言是完整的:问题答案集的任何元素都由算法生成;
    • 算法在所有输入上停止。

现在这些特征足够精确,您可以实际使用它们来证明问题是可计算的,或者算法可以解决特定问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM