--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scala/recs.scala Thu Feb 21 16:07:40 2013 +0000
@@ -0,0 +1,46 @@
+package object recs {
+
+
+//Recursive Functions
+abstract class Rec {
+ def eval(ns: List[Int]) : Int
+}
+case object Z extends Rec {
+ override def eval(ns: List[Int]) = ns match {
+ case n::Nil => 0
+ case _ => throw new IllegalArgumentException("Z: args")
+ }
+}
+case object S extends Rec {
+ override def eval(ns: List[Int]) = ns match {
+ case n::Nil => n + 1
+ case _ => throw new IllegalArgumentException("S: args")
+ }
+}
+case class Id(n: Int, m: Int) extends Rec {
+ override def eval(ns: List[Int]) =
+ if (ns.length == n && m < n) ns(m)
+ else throw new IllegalArgumentException("Id: args")
+}
+case class Cn(n: Int, f: Rec, gs: List[Rec]) extends Rec {
+ override def eval(ns: List[Int]) =
+ if (ns.length == n) f.eval(gs.map(_.eval(ns)))
+ else throw new IllegalArgumentException("Cn: args")
+}
+case class Pr(n: Int, f: Rec, g: Rec) extends Rec {
+ override def eval(ns: List[Int]) =
+ if (ns.length == n - 1) {
+ if (ns.last == 0) f.eval(ns.init)
+ else {
+ val r = Pr(n, f, g).eval(ns.init ::: List(ns.last - 1))
+ g.eval(ns.init ::: List(ns.last - 1, r))
+ }
+ }
+ else throw new IllegalArgumentException("Cn: args")
+}
+case class Mn(n: Int, f: Rec) extends Rec {
+ override def eval(ns: List[Int]) = 0
+
+}
+
+}