Upgrade to Pro — share decks privately, control downloads, hide ads and more …

There's a Prolog in your Scala!

There's a Prolog in your Scala!

Video is available here: http://skillsmatter.com/podcast/scala/theres-a-prolog-in-your-scala

Visualizations from slides 33-34 are available here:
slide 33 (scala -> prolog): https://db.tt/pjVwnQuj
slide 34 (prolog -> scala): https://db.tt/R5NSJF5g

document from slide 7: http://www.foia.cia.gov/search-results?search_api_views_fulltext=SW+90-10029X&field_collection=

paper from slide 9: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.34.3972

DEMO repository: https://github.com/folone/scalaeXchange

Copyrights:
The photo of Battersea Power station: http://www.flickr.com/photos/stephenwalford/8420082569/
The photo of hanoi towers: http://www.flickr.com/photos/46268742@N00/8455144986/
The photo of Buran is taken from the following article: http://englishrussia.com/2006/09/14/buran-the-first-russian-shuttle/
Photo of Spock, played by Zachary Quinto, is presumably copyrighted by Paramount Pictures, Skydance Productions, and Bad Robot.

George Leontiev

December 02, 2013
Tweet

More Decks by George Leontiev

Other Decks in Technology

Transcript

  1. A language that doesn't affect the way you think about

    programming, is not worth knowing. — Alan J. Perlis
  2. What > How Relations > Functions Facts Rules (to generate

    more facts) Main principles It's all about formulating the question. Expressed with
  3. Predicates > Functions Map inputs to outputs Run Return some

    output Define constraints Match Only return yes or no* *If "yes", they may add bindings to variables. log(2, 16, 4). log(2, 16) = 4
  4. Questions ?- talk_about(milessabin, webdev). no ?- talk_about(larsr_h, typelevel). yes ?-

    talk_about(dpp, X). X = webdev. ?- talk_about(milessabin, X). X = typelevel ; X = macros.
  5. Questions ?- talk_about(Who, What). Who = dpp, What = webdev

    ; Who = milessabin, What = typelevel ; Who = milessabin, What = macros ; Who = larsr_h, What = typelevel ; Who = xeno_by, What = macros ; Who = sirthias, What = webdev.
  6. Rules same_topic(Person1, Person2) :- talk_about(Person1, Topic), talk_about(Person2, Topic), Person1 \==

    Person2. ?- same_topic(milessabin, Who). Who = larsr_h ; Who = xeno_by.
  7. same_topic(Person1, Person2) :- talk_about(Person1, Topic), talk_about(Person2, Topic), Person1 \== Person2.

    same_topic(Person1, Person2) :- works_in(Person1, Area), works_in(Person2, Area), Person1 \== Person2.
  8. topic(Topic, Res) :- findall(Person, talk_about(Person, Topic), L1), Res = (Topic,

    L1). environment(Area, Res) :- findall(Person, works_in(Person, Area), L1), Res = (Area, L1). ?- topic(webdev, List). List = (webdev, [dpp, sirthias]). ?- environment(academia, List). List = (academia, [milessabin, larsr_h, xeno_by]).
  9. topics(L) :- findall(Topic, talk_about(_, Topic), L1), list_to_set(L1, L). tracks(L) :-

    topics(L1), member(Topic, L1), topic(Topic, L). ?- topics(L). L = [webdev, typelevel, macros]. ?- tracks(L). L = (webdev, [dpp, sirthias]) ; L = (typelevel, [milessabin, larsr_h]) ; L = (macros, [xeno_by, milessabin]).
  10. Prolog gcd(X, X, X). gcd(X, Y, Out) :- X <

    Y Z is Y - X gcd(X, Z, Out). gcd(X, Y, Out) :- Y < X, gcd(Y, X, Out).
  11. trait GCD[X <: Nat, Y <: Nat] { type Out

    <: Nat } object GCD def gcd[N<:Nat](x:Nat,y:Nat)(implicit gcd:Aux[x.N,y.N,N],wn:Witness.Aux[N]):N = wn.value type Aux[X <: Nat, Y <: Nat, Z <: Nat] = GCD[X, Y] { type Out = Z } Scala { implicit def gcd0[X <: Nat]: Aux[X, X, X] = new GCD[X, X] { type Out = X } implicit def gcd1[X <: Nat, Y <: Nat, Z <: Nat, Out0 <: Nat] (implicit ev0 : LT[X, Y], ev1 : Diff.Aux[Y, X, Z], ev2 : Aux[X, Z, Out0]): Aux[X, Y, Out0] = new GCD[X, Y] { type Out = Out0 } implicit def gcd2[X <: Nat, Y <: Nat, Out0 <: Nat] (implicit ev0 : LT[Y, X], ev1 : Aux[Y, X, Out0]): Aux[X, Y, Out0] = new GCD[X, Y] { type Out = Out0} }
  12. Facts — implicit vals. Rules — implicit defs taking implicit

    vals as parameters. Implication is the other way around.
  13. Gotchas: • Scala does not perform the DFS. In case

    of multiple implicits, it does not compile. Prioritizing implicits via inheritance. • Diverging implicit expansion -Xlog-implicits. • Extremely hard to debug (pen and paper style). • Peculiar exceptions (SO in compiler, Method too large, etc.)
  14. — So now I need to redefine all the goodness

    from prolog stdlib?! Lists, naturals, etc. Shapeless: stdlib for logic programming in scala.