如果可能,我需要一些帮助以解决以下问题......
atomsClause :: Clause ! [Atom]
此函数必须使用子句并返回该子句的原子集。请注意,该集不应包含任何重复项。atoms :: Formula![Atom]
此函数必须使公式返回公式的原子集。
请注意,该集不应包含任何重复项。isLiteral :: Literal ! Clause ! Bool
如果可以找到给定的文字,则此函数返回True
在条款中。flipSymbol :: Model ! Atom ! Model
此函数必须使用模型和Atom并翻转
模型中原子的真值。以下是代码:
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))
atomsClause :: Clause -> [Atom]
atomsClause = undefined
atoms :: Formula -> [Atom]
atoms = undefined
isLiteral :: Literal -> Clause -> Bool
isLiteral = undefined
flipSymbol :: Model -> Atom -> Model
flipSymbol = undefined
谢谢。
我在想第一个像这样写的......
atomsClause :: Clause -> [Atom]
atomsClause [(Bool,Atom)] =[a|(b,a)<-(Bool,Atom)]
......这样可以吗?
答案 0 :(得分:1)
你的功能不对。
您匹配的模式只是一个单例列表。您实际上希望匹配整个列表以使用它。它看起来像这样:
atomsClause clauses = [a|(b,a)<-clauses]
这个功能有什么作用?让我们看看......它需要每个子句的原子,但没有过滤。您可以使用nub
的{{1}}功能归档所需内容。所以你的函数看起来像这样:
Data.List
现在,我们可以使用地图摆脱理解。我们只是将函数atomsClause clauses = nub [a|(b,a)<-clauses]
映射到子句:
snd
就是这样!如果你喜欢它,你可以使用这个毫无意义的功能:
atomsClause clauses = nub (map snd clauses)