好吧,我把我的巨大问题集分成了小部分,我一次只尝试一个。使用Haskell从公式中删除重言式
我正在写一个函数,它将从公式中删除重言式。基本思想是,如果在一个子句中找到了一个文字及其否定词,那表示该子句将是真实的,而不管最终的值分配给该命题变量。我的任务是创建一个函数,将删除这个,但为一个条款和映射到公式。当然,我必须在开始时删除重复项。
module Algorithm where
import System.Random
import Data.Maybe
import Data.List
type Atom = String
type Literal = (Bool,Atom)
type Clause = [Literal]
type Formula = [Clause]
type Model = [(Atom, Bool)]
type Node = (Formula, ([Atom], Model))
removeTautologies :: Formula -> Formula
removeTautologies = map tC.map head.group.sort
where rt ((vx, x) : (vy, y) : clauses) | x == y = rt rest
| otherwise = (vx, x) : rt ((vy, y) : clauses)
现在我有问题,当我尝试给它一个式(例如(A V B)(V-A)^(B)(V(C V)A))。考虑到例如第一子句包含文字甲和-A。这意味着该条款永远是真实的,在这种情况下,它可以简化整个集合(B v C v A)。但我得到以下
Loading package old-locale-1.0.0.2 ... linking ... done.
Loading package time-1.1.4 ... linking ... done.
Loading package random-1.0.0.2 ... linking ... done.
[[(True,"A"),(True,"B")*** Exception: Algorithm.hs:(165,11)-(166,83): Non-exhaustive patterns in function rt
我该怎么办?
你只是改变了现有的问题。我的意思是让你按下右上角的“问问题”按钮并创建一个*新问题。这将把它放在头版,让其他人也帮助你。此外,我的答案不会看起来不合适:)只要确保在新问题中包含已更改的代码,并显示该函数正在生成的输入和输出的示例以及您期望的内容。你可以在[http://tinyurl.com/so-hints]找到其他提示问题的提示。 – 2011-02-11 18:30:23