我正在写一个函数,它将从一个公式中删除重言式,问题是它只适用于连续重复。基本思想是如果在一个子句中,一个文字及其否定被发现,它意味着无论最终分配给该命题变量的值如何,子句都是正确的。我的建议是创建一个函数来删除它但是对于一个子句并将其映射到公式。当然我必须在开头删除重复项。 / p>
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)
现在我遇到了问题,因为我只是检查连续的文字,我不知道如何更改,因为我是haskell的新手(不是借口,我知道),所以当我试着给它一个公式(例如(A v B v -A)^(B v C v A))它只返回确切的输入。考虑到该示例,第一个子句包含文字A和-A。这意味着该子句将始终为true,在这种情况下,它可以简化整个集合(B v C v A)。
我应该为我的功能编写哪些更改,以便我能以正确的方式删除重言式? 我可以实现sortBy吗?如果是,怎么做?map head.group.sortBy snd?
答案 0 :(得分:1)
试试这个:制作一个[你选择的结构]元素
这与nubBy
基本相同,了解如何实现它!