Your SlideShare is downloading. ×
  • Like
There's a Prolog in your Scala!
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

There's a Prolog in your Scala!

  • 225 views
Published

Video is available here: http://skillsmatter.com/podcast/scala/theres-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.

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
225
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. There is a Prolog in your Scala! @folone Scala eXchange ‘13
  • 2. One particular approach
  • 3. 8+ implicits FnHipsterAux
  • 4. Logic Programming
  • 5. programmation en logique, 1972, 5GL Lingua franca
  • 6. A language that doesn't affect the way you think about programming, is not worth knowing. — Alan J. Perlis
  • 7. Buran
  • 8. IBM Watson
  • 9. What > How Relations > Functions Facts Rules (to generate more facts) Main principles It's all about formulating the question. Expressed with
  • 10. 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
  • 11. — How many Prolog programmers does it take to change a lightbulb?
  • 12. — How many Prolog programmers does it take to change a lightbulb? NO.
  • 13. Scala eXchange tracks planning https://github.com/folone/scalaeXchange/
  • 14. Facts talk_about(dpp, webdev). talk_about(milessabin, typelevel). talk_about(larsr_h, typelevel). talk_about(xeno_by, macros). talk_about(milessabin, macros). talk_about(sirthias, webdev).
  • 15. 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.
  • 16. 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.
  • 17. 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.
  • 18. Facts works_in(dpp, industry). works_in(milessabin, industry). works_in(milessabin, academia). works_in(larsr_h, academia). works_in(xeno_by, academia). works_in(sirthias, industry).
  • 19. 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.
  • 20. Questions ?- same_topic(dpp, Who). Who = sirthias ; Who = milessabin ; Who = sirthias.
  • 21. Rules exactly_same_topic(Person1, Person2) :-   talk_about(Person1, Topic),   talk_about(Person2, Topic),   works_in(Person1, Area),   works_in(Person2, Area),   Person1 == Person2.
  • 22. Questions ?- exactly_same_topic(dpp, Who). Who = sirthias. ?- exactly_same_topic(milessabin, Who). Who = larsr_h ; Who = xeno_by.
  • 23. 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]).
  • 24. 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]).
  • 25. Functional is imperative without state. Logic is functional without manual search*. * DFS
  • 26. Scala is a logic programming language...
  • 27. in type system! Scala is a logic programming language...
  • 28. TYPELEVEL programming in Scala is... in type system! programming language...
  • 29. logic programming TYPELEVEL programming in Scala is... in type system! in Scala!
  • 30. 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).
  • 31. 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} }
  • 32. Facts — implicit vals. Rules — implicit defs taking implicit vals as parameters. Implication is the other way around.
  • 33. 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.)
  • 34. — So now I need to redefine all the goodness from prolog stdlib?! Lists, naturals, etc. Shapeless: stdlib for logic programming in scala.
  • 35. DEMO https://github.com/folone/scalaeXchange/
  • 36. Functional in the small, OO in the large, logic in the type system!
  • 37. http://mitpress.mit.edu/books/art-prolog shapeless (and all the typelevel.scala libraries) metascala https://www.assembla.com/spaces/metascala/wiki Links
  • 38. @milessabin @xeno_by @travisbrown @larsr_h @killnicole Thanks
  • 39. ?- (λx.folonexlambda-calcul.us)@