2011-01-31 52 views
0

如果可能的話用下面的問題我需要一些幫助....幫助哈斯克爾

  1. atomsClause :: Clause ! [Atom]此功能必須採取條款並返回一套條款的原子。請注意,該集合不應包含任何重複項。
  2. atoms :: Formula![Atom]該函數必須採用公式返回公式的原子集。 請注意,該設置不應包含任何重複項。
  3. isLiteral :: Literal ! Clause ! Bool如果在子句中可以找到給定的字面值 ,則此函數返回True。
  4. flipSymbol :: Model ! Atom ! Model該函數必須採用模型和原子,並翻轉模型中原子的真值。

下面是代碼:

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

您的功能不正確。

您匹配的模式只是一個單例列表。你實際上想匹配整個列表來處理它。它可能看起來像這樣:

atomsClause clauses = [a|(b,a)<-clauses] 

這個函數做了什麼?讓我們看看......它需要每個子句的原子,但沒有過濾。您可以使用Data.Listnub功能將您想要的文件存檔。所以你的功能看起來像這樣:

atomsClause clauses = nub [a|(b,a)<-clauses] 

現在,我們可以擺脫使用地圖的理解。我們只是將函數snd映射到子句上:

atomsClause clauses = nub (map snd clauses) 

就是這樣!如果你喜歡它的短,你可以改用這個毫無意義的功能:

atomsClause = nub . map snd 
+0

我已經做到了這樣,它返回確定.... atomsClause XS =小塊[A |(B,A)< - XS ] ...謝謝你的回覆...但是我真的需要一些建議第二個...對不起,但我沒有在haskell很長時間編程 – TKFALS 2011-01-31 15:35:07