2 Haskell问题

时间:2011-02-01 11:13:40

标签: haskell

我有2个关于2个haskell函数的问题

  1. flipSymbol :: Model - >原子 - >模型此函数必须采用模型和Atom并翻转模型中原子的真值。现在我正在考虑像这样编写这个函数:...

    flipSymbol m a = map f m
      where
      f (atom, value) = if a == atom then (atom, not value) else (atom, value)

    有更好的方法吗?

  2. 第二个是更复杂的东西,如果可能我需要一些帮助.. 为了检查给定模型中公式的可满足性,我们传播了为公式中的原子指定真值的效果。假设我们为其赋值True的原子。以下效果 可以应用于公式:

    • 正文字具有相同的True值,因此,从公式中删除包含它们的任何子句。这表明这些条款可以得到满足,因此不再影响公式的可满足性。
    • 否定的文字的值为False,因此从它们所处的任何子句中删除。这是为了表明这些条款仍然不满足,只能通过其中一个获得值的文字来实现真的。在为原子分配False的情况下,正文字现在将为假,应该被删除 从他们的条款中,否定的文字将变为真实,并将其条款从公式中删除。
      例如,在公式(P _ Q _ R)^(:P _ Q _:R)^(P _:Q)中,假设我们将True赋给P.然后包含P的子句,即。 (P _ Q _ R)和(P _:Q)从公式中删除,而:P从其所在的任何子句中删除,即。 (:P _ Q _:R)。这导致公式(Q _:R)。另一方面,如果我们将False赋值为P,则从公式中删除(:P _ Q _:R),从子句中删除P,从而得到(Q _ R)^(:Q)。
      如果可以将整个公式简化为空列表,那么整个公式是可以满足的,因为在这种情况下所有条款都被满足。如果整个公式中有一个空列表,则表示不满足条款,因此导致此状态的赋值不能满足公式。
    • assign :: (Atom,Bool) -> Formula -> Formula assign函数应该采用(Atom,Bool)对和公式,并传播将给定的真值赋给公式中的原子的效果,如上所述。
  3. 代码(我也从这里获得了帮助):

    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?
    

1 个答案:

答案 0 :(得分:2)

乍一看,我看不出任何方法来改进你的第一个公式,也许你可以使用逻辑函数而不是if-then-else,它更快:

flipSymbol m a = map f m where
    f (atom, value) = (atom, value /= (a == atom))

注意:/=的{​​{1}}基本上是xor。

到你的上一个问题: 基本思想是比较原子,将Bool值和fiddeling与逻辑运算结合起来得到你的结果。基本上,它看起来像这样:

Bool