实现逻辑命题求值函数有没有更简便的模式匹配方案?
优化实现方案
你不需要枚举所有表达式结构的组合,只需要通过递归对嵌套的子表达式逐层求值即可,思路是不管当前运算符的子表达式是什么结构,先递归计算出子表达式的布尔结果,再做当前层的逻辑运算。
首先先定义命题公式的代数数据类型:
data Prop = X | Y | Tr | Fa | Not Prop | Prop :&;: Prop | Prop :|: Prop | Prop :->: Prop deriving (Eq, Show)
对应的eval函数实现如下:
eval :: Bool -> Bool -> Prop -> Bool -- 处理原子命题和常量 eval xVal yVal X = xVal eval xVal yVal Y = yVal eval _ _ Tr = True eval _ _ Fa = False -- 处理一元逻辑非 eval xVal yVal (Not p) = not $ eval xVal yVal p -- 处理二元逻辑运算,先递归计算左右子表达式的值再运算 eval xVal yVal (p :&;: q) = eval xVal yVal p && eval xVal yVal q eval xVal yVal (p :|: q) = eval xVal yVal p || eval xVal yVal q eval xVal yVal (p :->: q) = not (eval xVal yVal p) || eval xVal yVal q
这个实现可以处理任意嵌套深度的命题公式,你给出的测试用例运行结果完全符合预期:
> eval False False ((X :->: Y) :&;: (Not Y :|: X)) True > eval False True ((X :->: Y) :&;: (Not Y :|: X)) False > eval True False ((X :->: Y) :&;: (Not Y :|: X)) False > eval True True ((X :->: Y) :&;: (Not Y :|: X)) True
内容的提问来源于stack exchange,提问作者user17548651
相关产品推荐
相关产品推荐

