Logical Programming With ruby-prolog

7,532 views

Published on

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

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,532
On SlideShare
0
From Embeds
0
Number of Embeds
80
Actions
Shares
0
Downloads
140
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide
  • announce: rubyology content and google group.


  • Two people are siblings if and only if they share a common parent.
    A widow is a living married female with a deceased spouse.
    Mary is a female. Mary is married to Nick. Nick is deceased.
    Who are the widows?

  • [sibling].
    sibling(charlie, X).
    parent_child(X, sally).
  • You *can* execute multiple statements in order.






  • 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

    ×