Scala中的命题逻辑

Scala中的命题逻辑,scala,artificial-intelligence,Scala,Artificial Intelligence,类型Prop为命题句(或者更简洁地说,命题)建模。命题符号(变量)被编码为形式P(n)的项,其中n是整数标识符。Interpr类型将命题解释实现为命题符号id的Scala列表(没有重复)。命题符号P(n)在解释i中是真的当且仅当n出现在i中 编写一个Scala方法means(i:Interpr,p:Prop):布尔值,它接受解释i和命题p,如果根据命题逻辑的语义解释满足命题,则返回Scala布尔值true,否则返回值false 我对如何使用模式匹配和递归实现这一点感到困惑。任何指导都将不胜感激

类型Prop为命题句(或者更简洁地说,命题)建模。命题符号(变量)被编码为形式P(n)的项,其中n是整数标识符。Interpr类型将命题解释实现为命题符号id的Scala列表(没有重复)。命题符号P(n)在解释i中是真的当且仅当n出现在i中

编写一个Scala方法means(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
}
//示例案例
意思(列表(1,2)和(P(1),P(2))是真的
//例
含义(列表(1)和(P(1),P(2))为假
类型PVar=Int
类型Interpr=List[PVar]
密封抽象类道具
case对象True扩展属性
case对象False扩展属性
案例类P(id:PVar)扩展了Prop//命题变量
案例类别非(子:道具)扩展道具
案例类或(sub1:Prop,sub2:Prop)扩展了Prop//inclusive或
case类Xor(sub1:Prop,sub2:Prop)扩展了Prop//异或
案例类和(sub1:Prop,sub2:Prop)扩展了Prop
case类Impl(sub1:Prop,sub2:Prop)扩展了Prop//简单蕴涵=>
case类Iff(sub1:Prop,sub2:Prop)扩展了Prop//双重蕴涵
密封抽象类答案
案例对象是扩展了答案
案例对象没有扩展答案
定义含义(i:Interpr,p:Prop):布尔=p匹配{
//这里的解决方案
}

我不清楚您到底需要什么。方法意义是否也应该能够评估复合命题?
列表(1,2)
的计算结果如何精确到true

然而,关于你关于使用递归进行计算的问题,我建议你看看Philip Wadler的《函数编程单子》一文


这是用函数式语言编写表达式求值器的最佳示例之一。

“//解决方案在这里”堆栈溢出,新的“做你的家庭作业”服务来吧,告诉我们你尝试了什么或你在想什么解决方案。这是一项任务,你应该从中学习。提交其他人的解决方案有什么意义?高级抱怨:)我不同意你的答案,如果问题真的是关于如何进行表达式求值,这是一个很好的答案,因为它应该是这样的。不过,对于Scala的初学者来说,这将是完全无法理解的。所以投票结果是“列表(1,2)的评估结果到底是怎样的?”。不是。这是第二个被评估为真的参数——这是一个关于“解释”的陈述——也就是说,这个列表。这个回答并不意味着是一个巨魔。但是一个指向某个方向的指针。我承认你不是有意这样做的,这确实是一篇有趣的论文。如果op发现它有用,我会感到惊讶。但他们似乎只想有人来帮他们回答任务。。。