用于评估条件的所有可能组合

时间:2014-01-25 17:07:14

标签: programming-languages combinations conditional-statements stateflow

示例:

if(A & B)
{
    if(C)
    {
    }

    if(D)
    {
    }
}

此代码中的所有条件都有四种不同的状态。 0表示False,1表示真实状态。 *表示该状态流中的条件无效。 所以在这种情况下,所有可能的状态都列在下面。

A B C D

0 * * *

1 0 * *

1 1 1 0

1 1 0 1

说明: 在第一状态(0 * * *)中,条件A为真。因此,代码中没有B的作用。在评估A本身之后,如果情况失败了。因此,也不评估条件C和D. 同样也是其他三个可能的状态。

但是有没有任何已经实现的算法可以通过它找到特定输入的所有这些状态。因为当我们尝试解决更复杂的嵌套代码时,这个问题变成了巨大的复杂问题。 我认为编写一个应用程序来提供这样的结果非常困难。

如果有人知道某些可能对我有帮助的事情,请告诉我相同的事情。

1 个答案:

答案 0 :(得分:0)

我很遗憾成为持有者或坏消息,但这个算法因两个非常有名的原因是不可能的。

暂停问题

要在Turing-Complete language中解决此问题,您需要解决Halting problem。如果您的示例程序如下所示:

if(A & B & maybeAnInfiniteLoop())
{
    if(C)
    {
    }

    if(D)
    {
    }
}

然后我们没有理论上的方法知道函数mayAnInfiniteLoop是否终止,因此如果C和D完全重要,或者布尔的唯一有效状态是00 * ,10 * ,或01 * ,因为11 *永远不会完成,C和D永远不会到达。

NP完全

现在让我们假设您能够将问题简化为布尔表达式。在您的语言的一个子集中,您只有IF,AND,OR,NOT和布尔语,语言不是图灵完全。这就是所谓的strongly normalizing。布尔表达式的语言就是这种有用语言的一个例子。

然而,即使我们可以保证程序停止,用该语言决定布尔值的所有有意义状态的算法也是NP-complete问题。事实上,它是最着名的。它被称为Boolean Satisfiability Problem。请注意,在您的示例中,当A或B为假时,您说C和D无意义。这是因为您知道只有满足表达式“A& B”的A和B的值集合是(1,1)。你可以这样做,因为它是一个非常简单的表达式,但在一般情况下解决这个问题的算法可能无法在你的生命周期内完成一些非常合理的输入。

有希望吗?

P=NP的问题没有一个已知的答案。事实上,它可能是今天最重要的公开数学问题。如果P = NP,那么你很幸运,但我不会满怀希望。 P上的智能资金不等于NP。