我正在测试当我将随机值传递给Python中的任意布尔条件时会发生什么。我运行了一个循环10次并且每次向A和B随机选择True或False。然后我看到条件返回True或False并输出A和B的值。
for i in range(10):
A = random.choice([True, False])
B = random.choice([True, False])
if (A and (A or B)) == True:
print("Pass:")
print("A: {} B: {}".format(A, B))
else:
print("Fail:")
print("A: {} B: {}".format(A, B))
输出:
Pass: Fail: Pass: Pass:
A: True B: True A: False B: True A: True B: False A: True B: False
Pass: Pass: Pass:
A: True B: True A: True B: False A: True B: True
Pass: Pass: Fail:
A: True B: True A: True B: True A: False B: False
我选择的布尔条件是随机写的(意味着没有特定的原因),但我在输出中找到了一种模式。
在所有Passes
中B的值是不同的(Fails
相同),但是在Passes
中A的值始终为True而在Fails
中为False。请记住,Pass
是条件为True的结果,因此似乎条件恰好返回一个与输入A相同的布尔值。
由于我发现这个特殊情况很奇怪,我又进行了另一次测试。这次我检查了这个布尔表达式是否始终与A的初始输入相同。我还运行了20次以获得更多输入的随机值。
for i in range(20):
A = random.choice([True, False])
B = random.choice([True, False])
if (A and (A or B)) == A:
print("Pass")
else:
print("Fail")
输出:
Pass
Pass
Pass
. . .
Pass
Pass
Pass
我已经简化了输出,但是当我运行代码时,它提供了所有20次传递,并且在代码运行几次时也是如此。
我的问题是为什么这个条件,我猜“简化”,只是输入A?并且布尔表达式可以“简化”(因为在这种情况下,如果结果总是只是A,则整个表达式呈现无意义)以缩短条件吗?
这是符号逻辑的一个微不足道的结果。
如果A
为true,那么表达式的计算结果如下:
True and (True or B)
True or B
True
这个数学领域被称为布尔代数。您的具体示例是吸收定律,例如,形式10a或“X•(X + Y)= X”:
https://www.mi.mun.ca/users/cchaulk/misc/boolean.htm
(在布尔代数中,“和”有时写为•和“或”有时写为+。这使得整数代数的类比更加明显,例如X + 0 = X和X•0 = 0。)
你的“可以简化布尔表达式”这个更大的问题取决于表达式!它们通常可以,但某些形式是完全简化的。完整的讨论超出了Stack Overflow的范围 - 有各种Web资源或在线类。这并不是特别困难,但它是一个比一个答案所涵盖的更大的主题。