我们的框架有一个简单的业务逻辑表达式语言。不幸的是,这不支持括号,也不支持运算符优先级。相反,它使用从左到右的评估。
所以表达式如下:
a & b | c & d
将被评估为
((a & b) | c) & d
是否可以将带括号的任何条件表达式转换为具有从左到右分组的所有括号的等效表达式?
更具体地说:这个公式的正确转换是什么?
(a & b) | (c & d)
答案 0 :(得分:2)
我认为一般来说这是不可能的。为了明白原因,我们来看看
p := a & b
并首先假设存在q
取决于a,b,c,d
或<{1}}
p | (c & d) = q | c
然后c
会暗示p | (c & d)
或c -> (p | d)
。所以c -> p
或c -> d
都是不可能的,因为c
不在p
且c
不在d
(一般而言)。
同一论点适用于d
而不是c
。
现在为&
而不是|
。我们假设
p | (c & d) = q & c
某些q
的。在这种情况下,c=false
意味着p | (c & d) = false
,这意味着p = false
。换句话说,~c -> ~p
或p -> c
,这是不可能的,因为c
不在p
。
d
而不是c
的相同参数。
一些澄清
用左到右括号(例如((a & b) | c) & d
)编写的公式在括号之间的每个子表达式都有以下形式:
(<expr>) & x
或
(<expr>) | x
其中<expr>
递归相同的方面,x
布尔变量。在上面的例子中,我们有:
((a & b) | c) & d = (<expr>) & d
,其中
<expr> = (a & b) | c
又是同一类:
(a & b) | c = <expr> | c
<expr> = a & b
,再次a & b = <expr> & b
,这次是<expr> = a
。
换句话说,您要查找的公式类型都是以下两种类型:<expr> | x
或<expr> & x
。
我的主张是,一般的布尔表达式不能总是转换为所需的方式。如果我错了,则给出任何布尔表达式p
,可以重写组合p | (c & d)
。让我们看看这是不可能的。有两种情况:
p | (c & d) = <expr> & x
或
p | (c & d) = <expr> | x
现在放置q = <expr>
并再次阅读上面的原始解释,看看无法以上述两种方式重写p | (c & d)
。特别是(a & b) | (c & d)
的声明是正确的。
答案 1 :(得分:1)
简短的回答是否定的。您的语言强制执行ltr评估,只能在前一个表达式和一个新变量之间执行操作。
你的括号表达式很好地表明了这一点:
((a & b) | c) & d
所以你要问你是否可以将任何表达式分解为更小的表达式* / +一个变量。当将一个优先级的多于1个表达式与另一个具有不同优先级的表达式混合时,这是不可能的(通常),这是您的示例。从现在开始,我使用* for&amp;和+为|。
如果你想要证明,我会尝试使用草图证明来解释Leandro(我认为他遇到了什么)。我们证明假设是否定的,你的表达式可以用你想要的形式写出来,并假设它以d
结尾。所以其中一个:
A*d or B+d
其中A
和B
可以是您想要的任何表单形式。那么,我们对A
和B
了解多少?假设A*d=ab+cd
。让我们尝试分解选项(再次) -
A*d=ab+cd=1
,d=0
。但是,如果d=0
然后A*d=0
并且我们有矛盾,那么这是不可能的。 (注意我们的新表达式必须适用于ab+cd
的每个可能选项,并且此处不会,因此它被取消资格。所以,我们尝试第二种选择:
B+d=ab+cd=0
,d
= 1。显然B
中的任何表达都不能再将我们留在这里,所以我们还有另一个矛盾。假设表达式以a,b,c
结尾,我将其留给您。同样的事情。
但是,如果你们必须使用你的语言并进行复杂的评估,那就有一个解决方法 - 在侧面执行所有乘法,然后添加。我在这里假设您可以将所有陈述作为ab + cd + ef + ......等等。除了否定,这是一个完整的系统,所以你应该能够。您需要使用某些功能单独解析每个产品对,所以
A=ab,B=cd,C=ef....
最后总结一下:
A+B+C+D...
这是一种解决方法。
答案 2 :(得分:0)
您可能正在寻找类似Reverse Polish notation的内容。
中缀表达式“5 +((1 + 2)×4) - 3”可以在RPN中这样写下: 5 1 2 + 4×+ 3 -