module Rbprolog

Simulate the prolog logic processing partially by using ruby based DSL

Representations (Conventions)

rule - class level
  • name arg0, arg1, …, {:if => [deduction0, deduction1, …]}

  • name: defined in the keywords

  • arg: use const to present the variable, and non-const for value

  • deduction: see below

fact - class level
  • name: arg0, arg1, …

deduction - class level
  • name? arg0, arg1, …

  • return: true or false

question - instance level
  • name? arg0, arg1, …

enumerator - instance level
  • name! arg0, arg1, …

  • Deduce all possible answers

Example

class FriendLogic
  include Rbprolog

  keywords :likes, :friends

  likes 'p1', 's1'
  likes 'p1', 's2'
  likes 'p2', 's2'
  likes 'p3', 's1'
  likes 'p4', X

  friends 'p1', W, :if => likes?(W, 's2')
  friends X, Y, :if => [likes?(X, Z), likes?(Y, Z)]
end

l = FriendLogic.new
l.likes?('p1', 's1') #=> true
l.friends?('p1', 'p4') #=> true

Constants

VERSION

Public Class Methods

included(mod) click to toggle source
# File lib/rbprolog.rb, line 54
def self.included(mod)
  class << mod
    include ClassMethods
    attr_accessor :rules, :syms
  end
end
new(string = nil, &block) click to toggle source

Initialize the rbprolog instance, each instance can have its own fact and rules. The definition can be passed in as string or block. string is required when variable such as X is used.

l = FriendLogic.new do
  likes 'p5', 's1'
end

or

l = FriendLogic.new %q{
  friends 'p2', X, :if => likes?(X, 's1')
}
# File lib/rbprolog.rb, line 73
def initialize(string = nil, &block)
  if string || block
    self.extend(Rbprolog)

    self.singleton_class.keywords(*self.class.syms)
    self.singleton_class.class_eval(string) if string
    self.singleton_class.class_eval(&block) if block
  end
end

Public Instance Methods

rules() click to toggle source
# File lib/rbprolog.rb, line 83
def rules
  self.class.rules + (self.singleton_class.rules || [])
end