我试图创建一个将命题改为析取范式的函数。
通过阅读估价清单
来完成此操作type Valuation = [(Variable, Bool)] -- Valuation of variables to truth values
并使用这些:
findBool :: (Variable, Bool)->Bool
findBool (_,x) = x
findVar :: (Variable, Bool)->Variable
findVar (x,_) = x
命题也是:
data Prop = Falsum -- a contradiction, or
| Var Variable -- a variable, or
| Not Prop -- a negation of a formula, or
| Or Prop Prop -- a disjunction of two formulae, or
| And Prop Prop -- a conjunction of two formulae, or
| Imp Prop Prop -- a conditional of two formulae.
deriving (Eq, Show)
我认为到目前为止我所拥有的内容非常可靠,但我无法看清空白案例。 这就是我到目前为止所拥有的:
minterm :: Valuation -> Prop
minterm [] = ?
minterm (x:xs) = if (findBool x) then (And (findVar x) (minterm xs)) else (And (Not(findVar x) (minterm xs))
我的目标是:minterm [("p",True),("q",False)]
返回:And (Var "p") (Not (Var "q"))
修改 不是Falsum有效,但我更喜欢它,如果它没有返回任何东西。无论如何我可以排除它将被退回的情况,所以我可以得到这样的东西:
minterm [("p",True),("q",False)]
== And (Var "p") (Not (Var "q"))
答案 0 :(得分:2)
不返回任何内容的标准方法是返回Nothing
。
minterm :: Valuation -> Maybe Prop
minterm [] = Nothing
minterm (x:xs) =
Just $ case minterm xs of
Nothing -> y
Just mt -> And y mt
where
y = if (findBool x)
then findVar x
else Not $ findVar x
请注意,现在您的顶级类型签名将反映出这种失败的概念。
答案 1 :(得分:1)
根据您的编辑,您是否可能只想要特殊情况下的结尾来整理它?
minterm :: Valuation -> Prop
minterm [] = Not Falsum
minterm [x] = oneTerm x
minterm (x : xs) = And (oneTerm x) (minterm xs)
oneTerm (x, True) = Var x
oneTerm (x, False) = Not (Var x)
答案 2 :(得分:1)
您可以更改minterm
函数以返回子句列表而不是术语:
minterm :: Valuation -> [Prop]
minterm [] = []
minterm (x:xs) = if (findBool x) then findVar x : minterm xs else Not (findVar x) : minterm xs
然后编写另一个函数将其转换为Prop:
and :: [Prop] -> Prop
and [] = Not Falsum
and xs = foldr1 And xs