嗨,我是新来的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)
然而它似乎没有起作用,我已经坚持了一段时间,所以想知道是否有人可以帮忙吗?
答案 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”,真)]]
正如您所看到的,底部的两行是作业问题所说的将被返回的行。我自己还没有弄清楚如何完成它。我可以得到[估价]的完整清单,我只是无法弄清楚如何只得到真的那些并丢弃那些评价为假的那些。