我想用 Haskell 编写一个逻辑公式求解程序。到目前为止,我已经成功地将给定的公式打印为字符串,例如公式
(I (N (Z 'p')) (A (C (Z 'p') (Z 'q')) (Z 'r')))
结果
"(~p => ((p & q) | r))"
其中 I 是蕴涵,A 是替代,C 是连词,N 是否定,Z 是字符。
我的数据类型是这样的:
data Formula = Z Char | V Bool | N Formula
| K Formula Formula | A Formula Formula
| C Formula Formula | Join Formula Formula
我的问题是我不知道如何编写一个函数,它将使用给定的字符映射和 bool 值来计算公式,我的意思是,例如: [('p', True), ('q', False), ('r', False)] 我无法想出一种方法来用一些 True/False 值替换这些字母并检查它。有什么简单的方法可以做到这一点吗?
最佳答案
您可以只传递字符和 bool 值列表并使用 lookup
来自 Data.List
的函数:
import Data.List
evaluate :: [(Char, Bool)] -> Formula -> Bool
evaluate mapping (Z sym) =
case lookup sym mapping of
Just v -> v
Nothing -> error $ "Undefined symbol " ++ show v
evaluate _mapping (V v) = v
evaluate mapping (N formula) = not (evaluate mapping formula)
...
为了更有效地表示映射,请使用 Data.Map
模块而不是关联列表。
关于haskell - 使用自己的数据类型和映射求解逻辑公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21343542/