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と命題論理