帮助Haskell

时间:2011-01-31 15:00:54

标签: haskell

如果可能,我需要一些帮助以解决以下问题......

  1. atomsClause :: Clause ! [Atom]此函数必须使用子句并返回该子句的原子集。请注意,该集不应包含任何重复项。
  2. atoms :: Formula![Atom]此函数必须使公式返回公式的原子集。 请注意,该集不应包含任何重复项。
  3. isLiteral :: Literal ! Clause ! Bool如果可以找到给定的文字,则此函数返回True 在条款中。
  4. flipSymbol :: Model ! Atom ! Model此函数必须使用模型和Atom并翻转 模型中原子的真值。
  5. 以下是代码:

    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)]
    

    ......这样可以吗?

1 个答案:

答案 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)