Skip to content

Instantly share code, notes, and snippets.

@PhDP
Last active August 29, 2015 14:17
Show Gist options
  • Save PhDP/44eff0db0c07a0a5b0a2 to your computer and use it in GitHub Desktop.
Save PhDP/44eff0db0c07a0a5b0a2 to your computer and use it in GitHub Desktop.
First example of Harrison's "Handbook of Practical Logic and Automated Reasoning" in Scala
sealed abstract class Expr
case class Variable(name: String) extends Expr
case class Const(value: Int) extends Expr
case class Add(left: Expr, right: Expr) extends Expr
case class Mult(left: Expr, right: Expr) extends Expr
object Simplify {
def one(e: Expr): Expr = e match {
case Add(Const(0), r) => r
case Add(l, Const(0)) => l
case Add(Const(a), Const(b)) => Const(a + b)
case Mult(Const(0), r) => Const(0)
case Mult(l, Const(0)) => Const(0)
case Mult(Const(1), r) => r
case Mult(l, Const(1)) => l
case Mult(Const(a), Const(b)) => Const(a * b)
case _ => e
}
def all(e: Expr): Expr = e match {
case Add(l, r) => one(Add(all(l), all(r)))
case Mult(l, r) => one(Mult(all(l), all(r)))
case _ => e
}
}
object Main {
def printExpr(e: Expr) = e match {
case Const(x) => print(x)
case _ => print("The expression could not be simplified to a constant.")
}
def main(args: Array[String]) {
var e = Add(Mult(Add(Const(1), Mult(Const(0), Variable("x"))), Const(3)), Const(12))
var s = Simplify.all(e)
printExpr(s)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment