1
我有2問題約2 Haskell函數2 Haskell的問題
flipSymbol ::模型 - >原子 - >模型該功能必須採取模型和原子和翻轉在原子的真值模型。現在我想寫這樣的功能是這樣的:...
flipSymbol m a = map f m where f (atom, value) = if a == atom then (atom, not value) else (atom, value)
有沒有更好的方法?
第二個是一個更復雜的東西,我需要一些幫助,但如果可能的話.. 爲了檢查一個公式的可滿足在我們傳播到原子分配真值的影響,給定模型在一個公式中。假設我們爲其指定值True的原子。以下效果 可以應用到下式:
- 正文字具有相同的真值,因此,包含它們的任何條款從式除去。這表明這些條款可以得到滿足,因此不再影響公式的可滿足性。
- 否定字面值爲False,因此從它們所在的任何子句中移除。這表示這些子句仍然不滿足,只能通過其他文字之一才能獲得值的真實。如果將False指定給原子,則正文本現在將是錯誤的,應從其子句中刪除 ,否定文字將變爲true,並將其子句從公式中刪除。例如,在公式(P_Q_R)^(:P_Q_R)^(P_:Q)中,假設我們將真分配給P.然後,包含P的子句,即。 (P _ Q _ R)和(P _:Q)從公式中移除,而:P從它所在的任何子句中移除,即。 (:P _ Q _:R)。這導致公式(Q_:R)。另一方面,如果我們將假賦予P,則我們從公式中去掉(:P _ Q _:R),從它的子句中去掉P,從而得到(Q_R)^(:Q)。
如果可以將整個公式縮減爲空列表,則整個公式是可以滿足的,因爲在這種情況下,所有條款都滿足了。如果在整個公式中有一個空列表,那麼這意味着一個條款不被滿足,因此公式不能滿足導致這個狀態的任務。 assign :: (Atom,Bool) -> Formula -> Formula
賦值函數應該採用(Atom,Bool)對和一個公式,並將給定的真值分配給公式中的原子,如上所述。
的代碼(關於這一點我收到的幫助從這裏也可以):
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))
-- This function takess a Clause and return the set of Atoms of that Clause.
atomsClause :: Clause -> [Atom]
atomsClause = undefined
-- This function takes a Formula returns the set of Atoms of a Formula
atoms :: Formula -> [Atom]
atoms = nub . map snd
-- This function returns True if the given Literal can be found within
-- the Clause.
isLiteral :: Literal -> Clause -> Bool
isLiteral = isLiteral = any . (==)
-- this function takes a Model and an Atom and flip the truthvalue of
-- the atom in the model
flipSymbol :: Model -> Atom -> Model -- is this ok?
flipSymbol m a = map f m where
f (atom, value) = if a == atom
then (atom, not value)
else (atom, value)
assign :: (Atom,Bool) -> Formula -> Formula
assign = undefined --any advice here?
請使用4個縮進來格式化您的代碼。 – 2011-02-01 11:17:06
atomsClause = nub。 map snd被定義爲 – TKFALS 2011-02-01 11:17:43