P-NP问题解决了吗? FindBugs解决了停止问题?

时间:2013-11-19 08:50:50

标签: algorithm findbugs halting-problem p-np

有一个名为FindBugs的工具可以检测给定程序/代码库中的无限永不停止循环。

这意味着FindBugs可以通过分析代码来检测程序是否结束。 暂停问题是定义该问题的问题:

  

给出任意计算机程序的描述,决定是否   程序完成运行或继续运行

这是否意味着停止问题得到解决或停止问题的一部分得到解决?

3 个答案:

答案 0 :(得分:6)

不,它没有解决。 Findbugs只找到一些无限永不停止循环的情况,例如:

public void myMethod() {
    int a = 0;
    while (true) {
        a++;
    }
}
如果上面的方法myMethod从未被调用过,那么它遭受的唯一假阴性是唯一的错误否定,在这种情况下,你仍然希望删除它,因为它是死代码。

它确实遭受误报:很多情况下,findbugs都无法检测到非结束程序。

答案 1 :(得分:1)

想象一下,你有一个总是检测无限循环的工具。

假设存在 unievrsal计算机 HALT(CODE, INPUT)暂停 iff CODE暂停INPUT。现在考虑一下:

  1. if HALT(CODE, CODE),永远循环
  2. else halt
  3. 如果CODE暂停CODE,则会产生矛盾,如果不是,则会产生矛盾。的为什么

    假设CODE暂停CODE,那么程序将永远循环...意味着...它不会停止...
    现在假设CODE <强>没有
    暂停CODE,你会得到它......它会停止..

答案 2 :(得分:0)

如果您要制作一个程序来分析同一平台的程序,并且与分析程序具有相同的限制,则此类分析器不可能存在。这被称为暂停问题。

如果这样说,对于内存消耗和代码长度比分析程序可以拥有的程序少得多的程序,可以解决暂停问题。例如。我可以停下来吗?所有2字节BrainFuck的程序 - 这样的程序:

;; takes a valid 2 byte BF-program
;; and returns if it will halt
(define (halt? x)
  (cond ((equal? x "[]") #f)
        (else #t)))

一个更大的例子是通过制作解释器和散列内存状态以及pc-location。如果发现先前的状态,则它是无限循环。即使使用非常好的数据模型,解释器使用的内存也必须比它解释的内存大得多。

我正在考虑通过执行不断的折叠程序,停止问题成为一个问题。我的想法是建立一个数据结构,该结构具有AST中特定分支的可见次数,并具有非常大的截止限制。因此,如果解释器位于超过截止点的分支处,它将最终出现在已编译的程序中而不是它的计算中。它需要更少的内存,并确定程序的某些或所有部分肯定会返回(停止)。

想象一下这段代码:

(define (make-list n f)
   (if (zero? n)
       '()
       (cons (f) (make-list (- n 1) f))))

(define (a)
  (b))

(define (b)
  (c))

(define (c)
  (b))

(display (make-list 4 read))
(display (make-list 4 a))

这实际上是非常糟糕的代码,因为您不知道输入可能获得的顺序。编译器最好选择什么,它可能变成:

(display-const "(")
(display (read))
(display-const " ")
(display (read))
(display-const " ")
(display (read))
(display-const " ")
(display (read))
(display-const ")")
(display (cons (b) (cons (b) (cons (b) (cons (b) '())))) ; gave up on (b)