【发布时间】:2013-11-18 02:07:56
【问题描述】:
我花了一段时间才弄清楚这个问题在寻找什么。我只需要返回那些对 True 进行整体评估的命题。我们的例子是 And p (Or q (Not q)) 并且我知道 p 必须是 True 并且 q 可以是 True 或 False。为了实现我们的目标,我们已经开始使用一些函数。
type Variable = String
type Valuation = [(Variable, Bool)]
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)
example = And p (Or q (Not q))
vars :: Prop -> [Variable]
vars = nub . vars'
where
vars' Falsum = []
vars' (Var v) = [v]
vars' (Not f) = vars' f
vars' (Or f g) = vars' f ++ vars' g
vars' (And f g) = vars' f ++ vars' g
vars' (Imp f g) = vars' f ++ vars' g
eval :: Valuation -> Prop -> Bool
eval val Falsum = False
eval val (Var v) = case (lookup v val) of
Nothing -> error ("Unbound variable: " ++ v)
Just t -> t
eval val (Not f) = not (eval val f)
eval val (Or f g) = (eval val f) || (eval val g)
eval val (And f g) = (eval val f) && (eval val g)
eval val (Imp f g) = eval val (Or (Not f) g)
valuations :: [Variable] -> [Valuation]
valuations [] = [[]]
valuations (v:vs) = map ((v,True):) ds ++ map ((v,False):) ds
where ds = valuations vs
我现在必须编写一个模型函数,并且我发现 typeline 必须是
models :: Prop -> [Valuations]
作为我的示例,必须返回评估为 True 的评估列表,即: 模型示例 == [[("p",True)("q",True)],[("p",True)("q",False)]]
我知道 vars 返回没有重复的变量列表,在本例中为 ["p","q"],并且将 vars 的结果传递给评估会生成将 True 和 False 应用于“p”和“q”。到目前为止,我只能使用 evals 函数获得该列表的第一个输出来评估。这是我的代码:
models :: Prop -> Bool
models form = eval v form where (v:vs) = valuations (vars form)
我尝试更改代码以评估 vs 的其余部分,但我不断收到错误消息:
Couldn't match expected type '[Bool]' with actual type 'Bool'
这是我修改后的代码:
models :: Prop -> [Bool]
models form = eval v form : eval vs form where (v:vs) = valuations (vars form)
理想情况下,我相信我想丢弃评估结果,而不是将它们保存在列表中,并且只返回那些评估为 True 的估值。我只是被困在如何递归地评估其余的 vs.
我相信,一旦我可以使用 evals 函数评估列表中的所有元素,我就可以使用某种形式的等式分配将评估为 True 的元素添加,例如:
where finalList == True =
唉,这甚至看起来都不正确。
对我的逻辑的任何帮助都会有所帮助。哦,如果我能解释一下我如何递归评估列表的其余部分,我们将不胜感激。
【问题讨论】:
-
'Haskell Beginner without a Clue' - 别担心,这很正常。有了更多的经验,事情会变得更糟:)
-
是否提供了所有功能,或者您想出了一些功能?
-
是的,我尝试将作业添加到描述行,但它不允许我将作业更改为“没有线索”。主块中的所有代码都是我们被赋予使用的,所有其余的(不起作用的东西)都是由我编写的。我真的对逻辑更感兴趣,即如何制定解决方案,而不是直接回答,因为我认为这对我有更多帮助。在尝试递归调用列表时,我似乎总是遇到同样的错误,即第一个元素求值,但其余元素通常是列表类型,即给定 [Char] 时预期的 Char。