haskell: 否定范式的函数得到 "Non-exhaustive pattern" 异常
haskell: negation normal form's function get "Non-exhaustive pattern" exception
-- | data type definition of WFF: well formed formula
data Wff = Var String
| Not Wff
| And Wff Wff
| Or Wff Wff
| Imply Wff Wff
-- | Negation norm form nnf function
-- precondition: φ is implication free
-- postcondition: NNF (φ) computes a NNF for φ
nnf :: Wff -> Wff
nnf (Var p) = Var p
nnf (Not (Not p)) = (nnf p)
nnf (And p q) = And (nnf p) (nnf q)
nnf (Or p q) = Or (nnf p) (nnf q)
nnf (Not (And p q)) = Or (nnf(Not p)) (nnf(Not q))
nnf (Not (Or p q)) = And (nnf(Not p)) (nnf(Not q))
测试用例:¬(p ∨ Q)
(*** Exception:: Non-exhaustive patterns in function nnf
但是,如果我在函数中添加nnf (Not p) = Not (nnf p)
,它会显示
Pattern match(es) are overlapped
In an equation for ‘nnf’:
nnf (Not (Not p)) = ...
nnf (Not (And p q)) = ...
nnf (Not (Or p q)) = ...
我想知道我做错了什么?
您只是将行插入了错误的位置。 nnf (Not p) = ...
是一个包罗万象的否定。如果您稍后添加其他子句来处理更具体的否定,例如 Not (And p q)
,它们就不可能再触发了。
包罗万象的条款需要放在最后,即
nnf (Var p) = Var p
nnf (Not (Not p)) = (nnf p)
nnf (And p q) = And (nnf p) (nnf q)
nnf (Or p q) = Or (nnf p) (nnf q)
nnf (Not (And p q)) = Or (nnf $ Not p) (nnf $ Not q)
nnf (Not (Or p q)) = And (nnf $ Not p) (nnf $ Not q)
nnf (Not p) = Not $ nnf p
-- | data type definition of WFF: well formed formula
data Wff = Var String
| Not Wff
| And Wff Wff
| Or Wff Wff
| Imply Wff Wff
-- | Negation norm form nnf function
-- precondition: φ is implication free
-- postcondition: NNF (φ) computes a NNF for φ
nnf :: Wff -> Wff
nnf (Var p) = Var p
nnf (Not (Not p)) = (nnf p)
nnf (And p q) = And (nnf p) (nnf q)
nnf (Or p q) = Or (nnf p) (nnf q)
nnf (Not (And p q)) = Or (nnf(Not p)) (nnf(Not q))
nnf (Not (Or p q)) = And (nnf(Not p)) (nnf(Not q))
测试用例:¬(p ∨ Q)
(*** Exception:: Non-exhaustive patterns in function nnf
但是,如果我在函数中添加nnf (Not p) = Not (nnf p)
,它会显示
Pattern match(es) are overlapped
In an equation for ‘nnf’:
nnf (Not (Not p)) = ...
nnf (Not (And p q)) = ...
nnf (Not (Or p q)) = ...
我想知道我做错了什么?
您只是将行插入了错误的位置。 nnf (Not p) = ...
是一个包罗万象的否定。如果您稍后添加其他子句来处理更具体的否定,例如 Not (And p q)
,它们就不可能再触发了。
包罗万象的条款需要放在最后,即
nnf (Var p) = Var p
nnf (Not (Not p)) = (nnf p)
nnf (And p q) = And (nnf p) (nnf q)
nnf (Or p q) = Or (nnf p) (nnf q)
nnf (Not (And p q)) = Or (nnf $ Not p) (nnf $ Not q)
nnf (Not (Or p q)) = And (nnf $ Not p) (nnf $ Not q)
nnf (Not p) = Not $ nnf p