haskell - 使用自己的数据类型和映射求解逻辑公式

标签 haskell functional-programming

我想用 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/

相关文章:

haskell - 让 GHC 产生 "Add With Carry (ADC)"指令

haskell - 通用类型默认规则

haskell /米兰达 : Find the type of the function

haskell - 如何使用记录设计扩展

haskell - marshaller 中的 c2hs 与 gtk2hsC2hs

performance - 编译器优化的函数式代码比命令式代码执行得更好的示例

javascript - 有没有更好的方法来模仿 JS 中的 do 表示法?

javascript - 对象的映射函数(而不是数组)

Haskell 类型变量

functional-programming - D中的纯函数式编程