Scala で論理式っぽいことやってみた

論理式をscala&utf8で書くならどうするかなーって感じで表示だけするコードを書いてみた。
ソースコード(Formula.scala)

class Formula(name:String=""){
override def toString():String=name
def ∧(f2:Formula):Formula=Formula(s"($this ∧ $f2)")
def ∨(f2:Formula):Formula=Formula(s"($this ∨ $f2)")
def →(f2:Formula):Formula=Formula(s"($this → $f2)")
}
object Formula{
	def apply(name:String)=new Formula(name)
def main(args: Array[String]){
		val f = ¬(Bool("p")) ∧ Bool("q") ∨ True //中置記法で記述
		println(f.toString)
	}
}
case class ¬(f1:Formula) extends Formula{
	override def toString=s"(¬$f1)"
}
object False extends Formula{
	override def toString ="False"
}
object True extends Formula{
	override def toString ="True"
}
case class Bool(name:String) extends Formula{
	override def toString = name
}

実行結果

$ scalac Formula.scala 
$ scala Formula
(((¬p) ∧ q) ∨ True)

否定"¬"をscalaで書くのは面倒だね。
unary_¬みていな書き方できると楽なんだけど。
参考:ソフトウェア科学特論: Scalaと命題論理