Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Upcoming SlideShare
Presentation1
Next
Download to read offline and view in fullscreen.

6

Share

Download to read offline

Logical Programming With ruby-prolog

Download to read offline

How to implement logical programming concepts in Ruby using the ruby-prolog gem released by OpenRain. (http://openrain.com)

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

Logical Programming With ruby-prolog

  1. 1. ruby-prolog Logical programming with Ruby declarations. 2009.02.09 - Preston Lee <preston.lee@openrain.com> - Http://prestonlee.com Tuesday, February 10, 2009
  2. 2. Logical programming paradigm. Declarative. ✤ We define the rules for the world, but not how to process them. Inherently recursive. ✤ The interpreter will automatically recurse to evaluate a query behind the scenes. Turing complete. ✤ You can program without objects or functions, if you so choose. Artificial intelligence. ✤ It’s easier to define and resolve complex logical problems when we think mathematically. Tuesday, February 10, 2009
  3. 3. Core Prolog concepts. Rules ✤ Generic semantic definitions (predicates) of how your world works via clauses. ✤ Declarations are formal mathematics (predicate logic) in programming syntax. ✤ Facts ✤ Assertions of truth about the world. ✤ Bob is Charlie’s father. ✤ Bob is Dale’s father. ✤ Queries ✤ Attempts to resolve an unknown logical statement using the rule given the facts. ✤ Tuesday, February 10, 2009
  4. 4. Project history. tiny_prolog resolver/unification implementation from teh ✤ internets. Various small additional patches. Refactored to be object-oriented, not mess with ✤ method_missing globally, play nice with garbage collection and support multiple simultaneous contexts. Test cases from scratch, and various snippets ported from ✤ Prolog. Tuesday, February 10, 2009
  5. 5. Simple family tree, in Prolog. Rules ✤ We are siblings if we share a parent. ✤ A father is a parent. ✤ sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y). A mother is a parent. ✤ parent_child(X, Y) :- father_child(X, Y). parent_child(X, Y) :- mother_child(X, Y). Facts ✤ mother_child(alice, charlie). Alice is Charlie’s mother. father_child(bob, charlie). ✤ father_child(bob, dale). Bob is Charlie’s father. ✤ /* * Who are Charle's siblings? Bob is Dale’s father. ✤ * sibling(charlie, X). * Queries ✤ * Who are Charlie's parents? * parent_child(X, sally). Who are Alice’s siblings? */ ✤ Tuesday, February 10, 2009
  6. 6. Imperative programming support. /******************************************************* * 99 Bottles of Beer * Paul J. DeMarco 9/20/2002 * beer.pro * To execute start gprolog (others may work) * consult('beer.pro'). * drink(beer,99). *******************************************************/ english(beer,0):- write('no more bottle of beer'). english(beer,1):- write('1 bottle of beer'). english(beer,X):- X >= 2, write( X ) , write(' bottles of beer'). drink(beer,X):- X >= 1, english(beer,X), write(' on the wall, '), english(beer,X), write(', take one down, pass it aroundn'), X1 is X - 1, english(beer,X1), write(' on the wall.n'), drink(beer, X1). Tuesday, February 10, 2009
  7. 7. ruby-prolog c = RubyProlog::Core.new c.instance_eval do vendor['dell'].fact vendor['apple'].fact model['ultrasharp'].fact model['xps'].fact model['macbook'].fact model['iphone'].fact manufactures['dell', 'ultrasharp'].fact manufactures['dell', 'xps'].fact manufactures['apple', 'macbook'].fact Prolog-like DSL. manufactures['apple', 'iphone'].fact ✤ is_a['xps', 'laptop'].fact is_a['macbook', 'laptop'].fact is_a['ultrasharp', 'monitor'].fact Object-oriented wrapper. ✤ is_a['iphone', 'phone'].fact kind['laptop'] kind['monitor'] Not as complete as Prolog. kind['phone'] ✤ model[:M] <<= [manufactures[:V, :M]] vendor_of[:V, :K] <<= [vendor[:V], manufactures[:V, :M], is_a[:M, :K]] p query(is_a[:K, 'laptop']) p query(vendor_of[:V, 'phone']) end Tuesday, February 10, 2009
  8. 8. Complex logical reasoning. The Towers of Hanoi Tuesday, February 10, 2009
  9. 9. Two implementations. Prolog ruby-prolog c = RubyProlog::Core.new c.instance_eval do move(1,X,Y,_) :- move[0,:X,:Y,:Z] <<= :CUT write('Move top disk from '), move[:N,:A,:B,:C] <<= [ write(X), is(:M,:N){|n| n - 1}, # reads as quot;M IS N - 1quot; write(' to '), move[:M,:A,:C,:B], write(Y), write_info[:A,:B], nl. move[:M,:C,:B,:A] ] move(N,X,Y,Z) :- write_info[:X,:Y] <<= [ N>1, write[quot;move a disc from the quot;], M is N-1, write[:X], write[quot; pole to the quot;], move(M,X,Z,Y), write[:Y], writenl[quot; pole quot;] move(1,X,Y,_), ] move(M,Z,Y,X). move[3,quot;leftquot;,quot;rightquot;,quot;centerquot;] /* move(3,left,right,center). */ end Tuesday, February 10, 2009
  10. 10. ACL Example examples/acls.rb Tuesday, February 10, 2009
  11. 11. Ideas for the future. active_prolog - Logical interface to relational ActiveRecord objects. ✤ logical_authentication - Easy custom ACL creation and enforcement. ✤ logical_search - Custom DB search query builder using English-like ✤ predicates. ... ✤ Tuesday, February 10, 2009
  12. 12. Thanks! Code: http://github.com/preston/ruby-prolog/tree/master ✤ Releases: http://rubyforge.org/projects/ruby-prolog/ ✤ Tuesday, February 10, 2009
  • ahmdrefat

    Nov. 17, 2011
  • sunandkey

    Nov. 11, 2009
  • FrescatiStory

    Aug. 14, 2009
  • sergeyzen

    Mar. 30, 2009
  • whc007

    Mar. 21, 2009
  • kapil

    Feb. 16, 2009

How to implement logical programming concepts in Ruby using the ruby-prolog gem released by OpenRain. (http://openrain.com)

Views

Total views

8,119

On Slideshare

0

From embeds

0

Number of embeds

80

Actions

Downloads

149

Shares

0

Comments

0

Likes

6

×