我有2个关于2个haskell函数的问题
flipSymbol :: Model - >原子 - >模型此函数必须采用模型和Atom并翻转模型中原子的真值。现在我正在考虑像这样编写这个函数:...
flipSymbol m a = map f m where f (atom, value) = if a == atom then (atom, not value) else (atom, value)
有更好的方法吗?
第二个是更复杂的东西,如果可能我需要一些帮助.. 为了检查给定模型中公式的可满足性,我们传播了为公式中的原子指定真值的效果。假设我们为其赋值True的原子。以下效果 可以应用于公式:
assign :: (Atom,Bool) -> Formula -> Formula
assign函数应该采用(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?
答案 0 :(得分:2)
乍一看,我看不出任何方法来改进你的第一个公式,也许你可以使用逻辑函数而不是if-then-else
,它更快:
flipSymbol m a = map f m where
f (atom, value) = (atom, value /= (a == atom))
注意:/=
的{{1}}基本上是xor。
到你的上一个问题: 基本思想是比较原子,将Bool值和fiddeling与逻辑运算结合起来得到你的结果。基本上,它看起来像这样:
Bool