我知道有一般公认的算法可以将给定的布尔逻辑表达式减少为CNF或DNF。我找到了一些关于这种事情的网站,但我没有用它来构建围绕它的Haskell程序。
这不是家庭作业,也不是我要求别人给我写代码 - 我只是在找一些可以帮助我建立自己职能的资源。
在我看来,我必须定义一个数据类型Exp
来处理Or Exp Exp
,And Exp Exp
,等。,等。然后建立标准规则' (De Morgan's, Modus Ponens , Modus Tollens ,你有什么用来重复申请Exp
直到我达到一定程度我没有得到任何进一步的。
(因为我一直在玩Agda 等。,在将其翻译成Agda之前,我倾向于在Haskell中写下所有内容。所以是的,如果你'我更熟悉在Agda中表达任何内容,那么我也会明白这一点。)
答案 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)))
我建议您查看包装的来源,因为它不是很复杂。