P301: Truth tables for logical expression

构造逻辑表达式的真值表。定义二元逻辑运算and, or, nand, nor, xor, implequ。逻辑表达式可以是单个逻辑运算,也可以是嵌套的逻辑运算。求完整的真值表,真值表可以以包含三元组的列表表示。例如,以下真值表

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)」三个逻辑运算符,及TrueFalse两个逻辑值。使用内建的三个逻辑运算符可以构建其它逻辑运算符。

  • 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:
        ...

results matching ""

    No results matching ""