//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: /** @author John Miller * @version 1.6 * @date Tue Jun 4 17:01:54 EDT 2019 * @see LICENSE (MIT style license file). */ package scalation.analytics.srl import scala.collection.mutable.Set //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: /** The `Predicate` abstract class provides basic methods for predicate onjects. */ abstract class Predicate { val s = Set [Seq [Int]] () def add (a: Int) { s += Seq (a) } def adds (a: Int*) { a.map (add (_)) } def add (a: Seq [Int]) { s += a } def addss (a: Seq [Int]*) { s ++= a } def apply (a: Seq [Int]): Boolean = s contains a def apply (a: Int): Boolean = s contains Seq (a) override def toString: String = s.toString } // Predicate class //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: /** The `ExampleTraffic` object defines structure of the KB suitable for translation * to LoMRF. Captures the LA Interstates. Should add GPS coordinates. * @see github.com/anskarl/LoMRF/blob/develop/docs/0_quick_start.md * > runMain scalation.analytics.srl.ExampleTraffic */ object ExampleTraffic extends App { // 1. Domain Type Definitions val time = 0 until 1000 // t val mile = 0 until 1000 // m // 2. Predicates Definitions object Interstate extends Predicate // (r) object Interchange extends Predicate // (r1, r2, m) object Volume extends Predicate // (r, v) object Speed extends Predicate // (r, p) object Car extends Predicate // (c) object On extends Predicate // (c, r, t) object CarSpeed extends Predicate // (c, p, t) object Sensor extends Predicate // (s) object At extends Predicate // (s, r, m) // 3. Function Definitions // 4. Formulas in FOL // 5. Rules def moveTo (c: Int, r1: Int, r2: Int, t: Int) = { if (Car (c) & Interstate (r1) & Interstate (r2) & On (Seq (c, r1, t)) & Interchange (Seq (r1, r2, 3))) { println ("fire moveTo rule") On.add (Seq (c, r2, t+1)) } // if } // moveTo // 6. Populated KB Interstate.adds (5, 10, 15, 105, 110, 210, 405, 605, 710) Interchange.addss (Seq (5, 210, 1), Seq (5, 405, 2), Seq (5, 10, 3), Seq (5, 710, 4), Seq (5, 605, 5), Seq (5, 405, 6)) Volume.addss (Seq (5, 829), Seq (10, 722), Seq (15, 697), Seq (105, 583), Seq (110, 609), Seq (210, 471), Seq (405, 562), Seq (605, 507), Seq (710, 484)) Speed (Seq (5, 65)) Car.add (1) On.add (Seq (1, 5, 1)) CarSpeed.add (Seq (1, 55, 1)) Sensor.adds (1, 2) At.addss (Seq (1, 5, 2), Seq (2, 10, 1)) println (s"Interstate = $Interstate") println (s"Interchange = $Interchange") println (s"Volume = $Volume") println (s"Speed = $Speed") println (s"Car = $Car") println (s"On = $On") println (s"CarSpeed = $CarSpeed") println (s"Sensor = $Sensor") println (s"At = $At") // Test formuals and rules moveTo (1, 5, 10, 1) println (s"after moveTo: On = $On") } // ExampleTraffic object