我正在使用一些工具,并且它能够确定特定事务是否成功的唯一方法是它是否通过了各种检查。但是,它的限制方式是它一次只能进行一次检查,并且必须是顺序的。一切都必须从左到右计算。
例如,
A || C && D
首先使用A || C
进行计算,然后使用AND
对结果进行D
编译。
括号越来越难。我无法计算这样的表达式,因为B || C需要先计算。我无法处理任何操作顺序;
A && ( B || C)
我想我已经将这个用于这个顺序布尔表达式,
C || B && A
首先计算C || B
,然后AND
与A
是否可以将所有布尔表达式成功地转换为顺序布尔表达式? (就像我的例子一样)
答案 0 :(得分:5)
答案是否定的:
考虑具有真值表的A || B && C || D
:
A | B | C | D |
0 | 0 | 0 | 0 | 0
0 | 0 | 0 | 1 | 0
0 | 0 | 1 | 0 | 0
0 | 0 | 1 | 1 | 0
0 | 1 | 0 | 0 | 0
0 | 1 | 0 | 1 | 1
0 | 1 | 1 | 0 | 1
0 | 1 | 1 | 1 | 1
1 | 0 | 0 | 0 | 0
1 | 0 | 0 | 1 | 1
1 | 0 | 1 | 0 | 1
1 | 0 | 1 | 1 | 1
1 | 1 | 0 | 0 | 0
1 | 1 | 0 | 1 | 1
1 | 1 | 1 | 0 | 1
1 | 1 | 1 | 1 | 1
如果有可能按顺序进行评估,则必须有一个最后一个表达式,这是两种情况之一:
案例1:
X || Y
,Y
是A,B,C,D
之一,X是任何连续的布尔表达式。
现在,因为A,B,C,D
中没有变量,只要该变量为真,整个表达式就为真,不包括:
X || A
X || B
X || C
X || D
可能是表达式中的最后一个操作(对于任何X)。
案例2:
X && Y
:Y
是A,B,C,D
之一,X是任何连续的布尔表达式。
现在,因为A,B,C,D
中没有变量,只要该变量为false,整个表达式就为false,不包括:
X && A
X && B
X && C
X && D
可能是表达式中的最后一个操作(对于任何X)。
因此,您无法以这种方式撰写(A || B) && (C || D)
。
你能够为某些表达式执行此操作的原因,例如:A && ( B || C)
成为C || B && A
,因为该表达式可以从具有以上两个属性之一的表达式递归构建:
IE。
A && ( B || C)
的真值表是:
A | B | C |
0 | 0 | 0 | 0
0 | 0 | 1 | 0
0 | 1 | 0 | 0
0 | 1 | 1 | 0
1 | 0 | 0 | 0
1 | 0 | 1 | 1
1 | 1 | 0 | 1
1 | 1 | 1 | 1
我们可以很快看到它的属性,只要A为0,它就是假的。所以我们的表达式可能是X && A
。
然后我们从事实表中取出A,只查看A是1的行是原始的:
B | C
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 1
只要B为1(或C,我们可以在这里选择),其属性为True。所以我们可以把表达式写成
X || B
,整个表达式变为X || B && A
然后我们将表再次缩小到B为0的部分,我们得到:
C
0 | 0
1 | 1
X只是C.所以最后的表达式是C || B && A
答案 1 :(得分:1)
这是重写表达式的问题,因此右侧不会出现括号。逻辑AND(∧)和OR(∨)都是可交换的:
因此,您可以将“X a(Y)”形式的任何表达式重写为“(Y)a X”:
根据以下法律,它们也是分配的:
所以许多布尔表达式可以在右边没有括号的情况下重写。但是,作为一个反例,由于缺乏共同因素,如果A≠C,则无法重写诸如(A∧B)∨(C∧D)的表达式。
答案 2 :(得分:0)
你不能这样做:
(( A || C ) && D)
并为您的第二个例子:
((( A && C ) || B ) && A )
这会对你有用吗?
希望有帮助...
答案 3 :(得分:0)
如果您需要执行(A || B) && (C || D)
之类的操作,则会遇到问题,除非您可以存储中间值供以后使用。
如果您被允许构建多个链并尝试所有链,直到其中任何一个通过或者它们全部失败(因此每个链实际上OR
与下一个链接在一起)然后我认为你可以处理任何组合。上面的例子将成为(其中每一行是一个单独的查询):
(A && C) ||
(A && D) ||
(B && C) ||
(B && D)
然而,对于非常复杂的检查,这很容易失控!