在使用数据构造函数进行递归时,我遇到了一个小问题。
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
我无法全神贯注地找到解决方案,因此有关如何递归获取函数的提示可能会很好。 谢谢!
答案 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的魔术可以使它写得更优雅,但让我们将其作为练习留给读者