将条件表达式 w/parenthesis 转换为从左到右求值 w/o 括号
Transform conditional expression w/parenthesis to left to right evaluation w/o parenthesis
我们的框架有一个简单的业务逻辑表达语言。不幸的是,这不支持括号,也不支持运算符优先级。相反,它使用从左到右的评估。
所以下面的表达式:
a & b | c & d
将被评估为
((a & b) | c) & d
是否可以将任何带括号的条件表达式转换为所有括号从左到右分组的等价表达式?
更具体地说:这个公式的正确变换是什么?
(a & b) | (c & d)
我觉得一般情况下是不可能的。看看为什么,让我们把
p := a & b
并首先假设存在 q
依赖或 a,b,c,d
使得
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)
.
的声明是正确的
简短的回答是否定的。你的语言,强制 ltr 评估,只能在前一个表达式和一个新变量之间执行操作。
你括号中的表达式很好地显示了这一点:
((a & b) | c) & d
所以你问的是是否可以将任何表达式分解为更小的表达式 */+ 一个变量。当将某个优先级的多个表达式与另一个具有不同优先级的表达式混合时,这(通常)是不可能的,这就是您的示例。从现在开始,我将 * 用于 &,将 + 用于 |。
如果你想要证明,我会尝试使用草图证明来解释莱安德罗(我认为他遇到了什么)。我们证明假设否定,你的表达式可以写成你想要的形式,并假设它以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...
这是一个解决方法。
您可能正在寻找类似 Reverse Polish notation 的内容。
中缀表达式“5 + ((1 + 2) × 4) − 3”在RPN中可以这样写:
5 1 2 + 4 × + 3 −
我们的框架有一个简单的业务逻辑表达语言。不幸的是,这不支持括号,也不支持运算符优先级。相反,它使用从左到右的评估。
所以下面的表达式:
a & b | c & d
将被评估为
((a & b) | c) & d
是否可以将任何带括号的条件表达式转换为所有括号从左到右分组的等价表达式?
更具体地说:这个公式的正确变换是什么?
(a & b) | (c & d)
我觉得一般情况下是不可能的。看看为什么,让我们把
p := a & b
并首先假设存在 q
依赖或 a,b,c,d
使得
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)
.
简短的回答是否定的。你的语言,强制 ltr 评估,只能在前一个表达式和一个新变量之间执行操作。
你括号中的表达式很好地显示了这一点:
((a & b) | c) & d
所以你问的是是否可以将任何表达式分解为更小的表达式 */+ 一个变量。当将某个优先级的多个表达式与另一个具有不同优先级的表达式混合时,这(通常)是不可能的,这就是您的示例。从现在开始,我将 * 用于 &,将 + 用于 |。
如果你想要证明,我会尝试使用草图证明来解释莱安德罗(我认为他遇到了什么)。我们证明假设否定,你的表达式可以写成你想要的形式,并假设它以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...
这是一个解决方法。
您可能正在寻找类似 Reverse Polish notation 的内容。
中缀表达式“5 + ((1 + 2) × 4) − 3”在RPN中可以这样写: 5 1 2 + 4 × + 3 −