bar*_*kmp 3 haskell functional-programming
我想在Haskell中编写一个逻辑公式求解程序.到目前为止,我已经设法将给定的公式打印为字符串,例如公式
(I (N (Z 'p')) (A (C (Z 'p') (Z 'q')) (Z 'r')))
Run Code Online (Sandbox Code Playgroud)
结果是
"(~p => ((p & q) | r))"
Run Code Online (Sandbox Code Playgroud)
我暗示,A是替代,C是连接,N是否定,Z是字符.
我的数据类型如下:
data Formula = Z Char | V Bool | N Formula
| K Formula Formula | A Formula Formula
| C Formula Formula | Join Formula Formula
Run Code Online (Sandbox Code Playgroud)
我的问题是我不知道如何编写一个函数,它将使用给定的字符映射和布尔值来计算公式,我的意思是,例如:[('p',True),('q',False ),('r',False)]我无法想出一种方法来替换那些带有某些True/False值的字母并检查它.有没有简单的方法来做到这一点?
您只需传递字符和布尔值列表,然后使用以下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)
...
Run Code Online (Sandbox Code Playgroud)
为了更有效地表示映射,请使用Data.Map模块而不是关联列表.