Prop类型模仿命题句(或者更简洁地说,命题)。命题符号(变量)被编码为P(n)形式的项,其中n是整数标识符。 Interpr类型将命题解释实现为命题符号id的Scala列表(没有重复)。当且仅当n出现在i中时,命题符号P(n)在解释i中才是真实的。
写一个Scala方法含义(i:Interpr,p:Prop):布尔值,它接受解释i和命题p,如果解释根据命题逻辑的语义满足命题,则返回Scala布尔值true,并返回值false。
我很困惑如何使用模式匹配和递归来实现它。任何指导将不胜感激!
// Example case
meaning(List(1,2), And(P(1), P(2))) is true
// Example case
meaning(List(1), And(P(1), P(2))) is false
type PVar = Int
type Interpr = List[PVar]
sealed abstract class Prop
case object True extends Prop
case object False extends Prop
case class P(id: PVar) extends Prop // propositional variable
case class Not(sub: Prop) extends Prop
case class Or(sub1: Prop, sub2: Prop) extends Prop // inclusive or
case class Xor(sub1: Prop, sub2: Prop) extends Prop // exclusive or
case class And(sub1: Prop, sub2: Prop) extends Prop
case class Impl(sub1: Prop, sub2: Prop) extends Prop // simple implication =>
case class Iff(sub1: Prop, sub2: Prop) extends Prop // double implication <=>
sealed abstract class Answer
case object Yes extends Answer
case object No extends Answer
def meaning(i: Interpr, p: Prop): Boolean = p match {
// solution here
}
答案 0 :(得分:1)
我对你究竟需要什么感到困惑。该方法是否应该能够评估复合命题? List(1,2)
到底是如何评估为真的?
但是关于使用递归进行评估的问题,我建议您查看Philip Wadler的论文 Monads进行函数式编程
这是在函数式语言中编写表达式求值程序的最佳示例之一。