P46 - 二元逻辑真值表
Truth tables for logical expressions of two variables
官方模块:
Problems.P46核心函数:table
题目描述
不用内置布尔运算符定义常见二元逻辑函数,并为任意二元布尔表达式生成四行真值表。
函数签名
1type BoolFunc = Bool -> Bool -> Bool
2
3and', or', nand', nor', xor', impl', equ' :: BoolFunc
4table :: BoolFunc -> [(Bool, Bool, Bool)]
实现
方法一:模式匹配 + 列表推导
1and' True True = True
2and' _ _ = False
3
4or' False False = False
5or' _ _ = True
6
7nand' True True = False
8nand' _ _ = True
9
10nor' False False = True
11nor' _ _ = False
12
13xor' True False = True
14xor' False True = True
15xor' _ _ = False
16
17impl' True False = False
18impl' _ _ = True
19
20equ' True True = True
21equ' False False = True
22equ' _ _ = False
23
24table :: BoolFunc -> [(Bool, Bool, Bool)]
25table f = [(a, b, f a b) | a <- bools, b <- bools]
26 where bools = [False, True]
方法二:查真值表
1and' = fromTruthTable [False, False, False, True]
2or' = fromTruthTable [False, True, True, True]
3nand' = fromTruthTable [True, True, True, False]
4nor' = fromTruthTable [True, False, False, False]
5xor' = fromTruthTable [False, True, True, False]
6impl' = fromTruthTable [True, True, False, True]
7equ' = fromTruthTable [True, False, False, True]
8
9fromTruthTable :: [Bool] -> BoolFunc
10fromTruthTable values a b = values !! (2 * bit a + bit b)
11 where
12 bit False = 0
13 bit True = 1
四个表项依次对应 (False,False)、(False,True)、(True,False)、(True,True)。这个版本没有使用待实现的内置二元布尔运算符,而是把逻辑函数当作有限查找表。
方法三:显式列出输入顺序
1table :: BoolFunc -> [(Bool, Bool, Bool)]
2table f = map evaluate
3 [(False, False), (False, True), (True, False), (True, True)]
4 where
5 evaluate (a, b) = (a, b, f a b)
显式输入表可以确保行顺序与查表版本一致,也避免嵌套列表推导。
测试
1>>> table (\a b -> and' a (or' a b))
2[(False,False,False),(False,True,False),(True,False,True),(True,True,True)]
3>>> xor' True False
4True
5>>> impl' True False
6False