数据构造函数haskell的递归案例表达式

时间:2018-12-12 20:04:59

标签: haskell recursion

在使用数据构造函数进行递归时,我遇到了一个小问题。

data Proposition = Const Bool | Var [Char] | And Proposition Proposition | Or Proposition Proposition | Not Proposition deriving (Show, Eq)

simplify prop = whether (whether prop)
 where whether x = case x of (Const a)             -> x
                         (Var b)                   -> x
                         (And (Const y) (Const z)) -> if y && z then         Const True else Const False
                         (And y z)                 -> And (simplify y)(simplify z)
                         (Or (Const y) (Const z))  -> if y || z then Const True else Const False
                         (Or y z)                  -> Or (simplify y)(simplify z)
                         (Not (Const c))           -> Const (not c)
                         (Not (Var b))             -> Not (Var b)
                         (Not (Not (Const c)))     -> Const c
                         (Not x)                   -> Not (whether x)

这是代码。该函数应该简化包含And,Or和Not的表达式。 函数本身对单个表达式执行应做的事情。 但这不适用于包含多个“或”或“或”或“不”的表达式。

例如

simplify (Not (Const False)) == Const True

是正确的,但是

simplify (Not (Var "var2" `Or` Const True))

仅计算为

Not (Or (Var "var2") (Const True))

代替Const False

我无法全神贯注地找到解决方案,因此有关如何递归获取函数的提示可能会很好。 谢谢!

2 个答案:

答案 0 :(得分:3)

您需要添加一些显式匹配项以减少常量:

   private void updateSystemMessage() {
    JRadioButton jrb = (JRadioButton)this.bGroup.getSelection();
    this.system =jrb.getText();
}

还有一些可以类似的方式应用。

答案 1 :(得分:3)

这是一个非常具体的问题,但我将尝试解释我将如何做。

首先,您无法处理足够的案件。您的程序将“ (Var "var2" `Or` Const True)”简化为“ (Var "var2" `Or` Const True)”,因为它不在乎第二个值是否为Const True,而第一个值不是Const _

我将编写另一个程序,该程序将以三值逻辑评估您的Proposition

eval :: Proposition -> Maybe Bool
eval (Val _) = Nothing
eval (Const x) = Just x
eval (Or a b) = case (eval a, eval b) of
  (Just True, _) -> Just True
  (_, Just True) -> Just True
  (Just False, Just False) -> Just False
  _ -> Nothing -- because we don't know the resulting value
-- ...etc

然后进行简化,例如

simplify o@(Or a b) = case (eval o) of
  Just v -> Const v
  Nothing -> Or (simplify a) (simplify b) -- we cannot simplify the `Or` usage
-- ...etc

这将大大减少您需要检查的案例,并为您的命题提供副作用的口译和口译服务。我相信使用某些Haskell的魔术可以使它写得更优雅,但让我们将其作为练习留给读者