Last active
August 29, 2015 14:17
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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