模特haskell初学者

时间:2013-11-17 21:18:15

标签: haskell logic models

嗨,我是新来的haskell和我坚持这个问题,给出一个公式,它返回该公式的模型,其中模型是使公式为真的估值。一个例子是模型,例如==[[("p",True),("q",True)],[("p",True),("q",False)]]

使用这个Prop的定义:

          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)

估值:

valuations ::[Variable]->[Valuation]
valuations [] = [[]]
valuations (v:vs) = map ((v,True):) ds ++ map ((v,False):) ds 
 where ds = valuations vs 

到目前为止,我有这段代码:

models :: Prop-> Prop-> Bool
models p q = and $ valuations (p == q)

然而它似乎没有起作用,我已经坚持了一段时间,所以想知道是否有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

这是我想回答的同样的家庭作业问题。看来你对这个问题的理解有点不正确。他们的模型类型应该是:

models :: Prop - > [评估]

您尝试仅返回总体评估为True的公式。

example =和p(或q(非q))

当'example'传递给models函数时,它会产生以下列表:

[[( “P”,真),( “Q”,真)],[( “P”,真),( “Q”,假)]]

这是因为如果两个输入都为True,则And语句只能评估为True。 And语句的第二个输入(或q(非q))总是求值为True,如果其中一个输入为True,Or语句总是求值为True。在我们的例子中总是如此,因为我们的Or可以是(Or True(Not True))或(或False(Not False))并且两者总是评估为True。因此,只要第一个输入的计算结果为True,那么整个And语句将评估为True。

必须通过变量列表传递估值,并且您有一个执行此操作的函数。如果你只传递Var“p”,那么得到[[(“p”,True)],[(“p”,False)]],因为这是唯一两种可能的组合。

您(我们)想要的是传递评估列表并仅返回评估为True的那些。例如,如果您的列表只是Var“p”而您的公式是非p,则只返回第二个列表[(“p”,False)],因为当您将False赋值给非p时,p仅计算为True不是假=真。

几乎忘了,和p的所有可能组合(或q(非q)) - 记忆(或q(非q)是真的

和假(假(非假))=和假真=假 - [(“p”,假),(“q”,假)]] 和假真(真(非真)=和假真=假 - [(“p”,假),(“q”,真)]] 和真(假(非假))=和真真=真 - [(“p”,真),(“q”,假)]] 和真(真(非真)=和真真=真 - [(“p”,真),(“q”,真)]]

正如您所看到的,底部的两行是作业问题所说的将被返回的行。我自己还没有弄清楚如何完成它。我可以得到[估价]的完整清单,我只是无法弄清楚如何只得到真的那些并丢弃那些评价为假的那些。