我想缩短这段代码:
if (a+b+c == 1000 and a**2 + b**2 == c**2) or (a+b+c == 1000 and a**2 + c**2 == b**2) or (a+b+c == 1000 and b**2 + c**2 == a**2)
成:
if a+b+c == 1000 and (a**2 + b**2 == c**2 or a**2 + c**2 == b**2 or b**2 + c**2 == a**2)
或更简单:
(A and B) or (A and C) or (A and D) <=> A and (B or C or D)
这合理吗?它似乎在我运行代码时起作用,但我不确定它是否正确。有没有更好的方法来缩短这个?
答案 0 :(得分:0)
你是对的。
在数学符号中,以下等式将成立:
(A ∧ B) ∨ (A ∧ C) ∨ (A ∧ D) = A ∧ (B ∨ C ∨ D)
这通常称为CNF或DNF形式的标准化。
答案 1 :(得分:0)
布尔逻辑说它是等价的。 但更好的方法是测试驱动开发&#34; :首先编写所有可能结果的测试。然后针对您的第一个实现运行它们,然后针对您的重构实现。
更新,基于Cireo的回答:
import itertools
for a, b, c, d in itertools.product([True, False], repeat=4):
print('%5s | %5s | %5s | %5s || %5s || %5s') % (a, b, c, d, (a and b) or (a and c) or (a and d), a and (b or c or d))
True | True | True | True || True || True
True | True | True | False || True || True
True | True | False | True || True || True
True | True | False | False || True || True
True | False | True | True || True || True
True | False | True | False || True || True
True | False | False | True || True || True
True | False | False | False || False || False
False | True | True | True || False || False
False | True | True | False || False || False
False | True | False | True || False || False
False | True | False | False || False || False
False | False | True | True || False || False
False | False | True | False || False || False
False | False | False | True || False || False
False | False | False | False || False || False
证明了这两个陈述对于所有变量的所有值都是等价的。
答案 2 :(得分:0)
是的!正如Uriel所提到的,这在数学上是合理的。此外,您已经注意到python中支持该表示法。下面的真值表显示它也按预期进行评估:
>>> for a, b, c in itertools.product([True, False], repeat=3):
... print('%5s | %5s | %5s || %5s') % (a, b, c, (a or b or c))
...
True | True | True || True
True | True | False || True
True | False | True || True
True | False | False || True
False | True | True || True
False | True | False || True
False | False | True || True
False | False | False || False