P46 - 二元逻辑真值表

2026-09-07 00:00    #Haskell   #99题   #逻辑  

P46 - 二元逻辑真值表

Truth tables for logical expressions of two variables

官方模块:Problems.P46 核心函数:table


← P45 二平方定理 | P47 通用逻辑门 →


题目描述

不用内置布尔运算符定义常见二元逻辑函数,并为任意二元布尔表达式生成四行真值表。

函数签名

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

参考