将布尔逻辑表达式简化为DNF和CNF(在Haskell中)

时间:2014-07-26 15:45:24

标签: haskell functional-programming logic boolean-logic agda

我知道有一般公认的算法可以将给定的布尔逻辑表达式减少为CNF或DNF。我找到了一些关于这种事情的网站,但我没有用它来构建围绕它的Haskell程序。

这不是家庭作业,也不是我要求别人给我写代码 - 我只是在找一些可以帮助我建立自己职能的资源。

在我看来,我必须定义一个数据类型Exp来处理Or Exp ExpAnd Exp Exp等。。然后建立标准规则' (De Morgan's, Modus Ponens Modus Tollens ,你有什么用来重复申请Exp直到我达到一定程度我没有得到任何进一步的。

(因为我一直在玩Agda 等。,在将其翻译成Agda之前,我倾向于在Haskell中写下所有内容。所以是的,如果你'我更熟悉在Agda中表达任何内容,那么我也会明白这一点。)

1 个答案:

答案 0 :(得分:3)

您实际上可以使用漂亮的hatt包。它有API用于转换为NNF,CNF等。这是一些示例代码:

import Data.Logic.Propositional
import Data.Logic.Propositional.NormalForms

a = Variable (Var 'A')
b = Variable (Var 'B')
c = Variable (Var 'C')
d = Variable (Var 'D')

expression = Conjunction a (Disjunction b (Conjunction c d))

然后您可以使用expression中的ghci

λ> expression
(A ∧ (B ∨ (C ∧ D)))
λ> toCNF expression
(A ∧ ((B ∨ C) ∧ (B ∨ D)))

我建议您查看包装的来源,因为它不是很复杂。