author | Christian Urban <christian dot urban at kcl dot ac dot uk> |
Thu, 21 Feb 2013 16:07:40 +0000 (2013-02-21) | |
changeset 193 | 317a2532c567 |
child 194 | fc2a5e9fbb97 |
permissions | -rw-r--r-- |
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 } }