P301: Truth tables for logical expression
构造逻辑表达式的真值表。定义二元逻辑运算and
, or
, nand
, nor
, xor
, impl
和equ
。逻辑表达式可以是单个逻辑运算,也可以是嵌套的逻辑运算。求完整的真值表,真值表可以以包含三元组的列表表示。例如,以下真值表
A | B | 表达式值 |
---|---|---|
True | True | True |
True | False | True |
False | True | False |
False | False | False |
可表示为列表[(True, True, True), (True, False, True), (False, True, False), (False, False, False)]
。照例先写测试用例:
from python99.logic_codes.p301 import table, and_, or_, nand, nor, xor, impl, equ
def test_table():
la = [True, False]
lb = [True, False]
assert table(la, lb, lambda a, b: and_(a, b)) == [
(True, True, True),
(True, False, False),
(False, True, False),
(False, False, False)
]
assert table(la, lb, lambda a, b: or_(a, b)) == [
(True, True, True),
(True, False, True),
(False, True, True),
(False, False, False)
]
assert table(la, lb, lambda a, b: nand(a, b)) == [
(True, True, False),
(True, False, True),
(False, True, True),
(False, False, True)
]
assert table(la, lb, lambda a, b: xor(a, b)) == [
(True, True, False),
(True, False, True),
(False, True, True),
(False, False, False)
]
assert table(la, lb, lambda a, b: nor(a, b)) == [
(True, True, False),
(True, False, False),
(False, True, False),
(False, False, True)
]
assert table(la, lb, lambda a, b: impl(a, b)) == [
(True, True, True),
(True, False, False),
(False, True, True),
(False, False, True)
]
assert table(la, lb, lambda a, b: equ(a, b)) == [
(True, True, True),
(True, False, False),
(False, True, False),
(False, False, True)
]
assert table(la, lb, lambda a, b: nand(and_(a, b), or_(a, b))) == [
(True, True, False),
(True, False, True),
(False, True, True),
(False, False, True)
]
在Python中,lambda表达可以当值传递,用以传递逻辑表达式再好不过了。
Python内建了「与(and)」、「或(or)」和「非(not)」三个逻辑运算符,及True
和False
两个逻辑值。使用内建的三个逻辑运算符可以构建其它逻辑运算符。
- and
a and b
- or
a or b
- nand
not (a and b)
- nor
not (a or b)
- xor
nand(nand(a, nand(a, b)), nand(b, nand(a, b)))
- impl
(not a) or b
- equ
a == b
完整的代码实现:
# Truth tables for logical expressions
def table(la, lb, expr):
return [(a, b, expr(a, b)) for a in la for b in lb]
def and_(a, b):
return a and b
def or_(a, b):
return a or b
def nand(a, b):
return not (a and b)
def nor(a, b):
return not (a or b)
def xor(a, b):
return nand(nand(a, nand(a, b)), nand(b, nand(a, b)))
def impl(a, b):
return (not a) or b
def equ(a, b):
return a == b
table(la, lb, expr)
使用双重List Comprehension构造真值表。双重List Comprehension等价于双重循环。for a in la for b in lb
等价于:
for a in la:
for b in lb:
...