使用自己的数据类型和地图解决逻辑公式

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值的字母并检查它.有没有简单的方法来做到这一点?

GS *_*ica 6

您只需传递字符和布尔值列表,然后使用以下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模块而不是关联列表.