Shortcircuit Prefix布尔表达式

时间:2012-11-05 21:09:02

标签: algorithm language-agnostic short-circuiting postfix-notation

我有一堆用前缀表示法编写的布尔表达式(也称为Polish notation)。这种格式的嵌套表达式非常容易评估(请参阅维基百科文章中的算法)。

然而,维基百科页面上给出的算法不会发生短路(评估and f() g()时,如果g()为假,则不会跳过f()的评估。有没有办法修改算法以包括短路?

2 个答案:

答案 0 :(得分:1)

您可以使用相同的算法构建表达式树:而不是评估operand1 operator operand2,而是创建一个节点operand1operand2作为子节点,operator作为父节点

获得树后,您可以对其进行评估(从上到下)。您可以通过不评估其中一个孩子来缩短评估范围(例如,如果左孩子评估为False且操作员是and)。

您会注意到给定的算法等同于从下到上的评估。虽然这很简单(并节省了内存),但您不能应用短路,因为您永远不知道您所在的分支是否应该被评估。

答案 1 :(得分:1)

我最近需要这样做,并想出了一个似乎有用的算法:

  1. 使用调车场解析表达式,产生一个后缀术语系列。

  2. 找到每个术语的父运算符并存储偏移量。

    for term in terms:
        count = 0
        for next in remaining terms:
            if next type is function:
                count = count - (argument count - 1)
            else if next type is operator:
                count = count - 1
            else:
                count = count + 1
            if count is 0:
                next is term's parent
                offset = next - term
    
  3. 评估通常的方法并在每次操作后检查是否有短路。如果适用,请在父母任期后跳至学期。

    for term in terms:
        if term is operator:
            pop 2 values
            evaluate (in reverse order)
            push result value
            if short-circuit (result is 0 and parent is AND, or result is non-zero and parent is OR):
                term = term + offset
        else if term is function:
            pop arguments
            evaluate (in reverse order)
            push result value
        else:
            push term value