class Rubylog::Predicate

Attributes

arity[R]
functor[R]

Public Class Methods

new(functor, arity) click to toggle source
# File lib/rubylog/predicate.rb, line 5
def initialize functor, arity
  @functor = functor
  @arity = arity
end

Public Instance Methods

add_functor_to(subjects) click to toggle source
# File lib/rubylog/predicate.rb, line 15
def add_functor_to subjects
  if arity == 0
    # We treat nullary predicates differently. Do not even create functors.
    Rubylog::NullaryPredicates[functor] = self
    return
  end

  predicate = self

  [subjects].flatten.each do |subject|
    raise ArgumentError, "#{subject.inspect} is not a class or module" unless subject.is_a? Module
    subject.class_eval do
      f = predicate.functor
      define_method f do |*args, &block|
      args << block if block
      Rubylog::Structure.new predicate, f, self, *args 
      end

      f_bang = :"#{f}!"
      define_method f_bang do |*args, &block|
      args << block if block
      predicate.assert Rubylog::Structure.new(predicate, f, self, *args), :true
      self
      end

      f_qmark = :"#{f}?"
      define_method f_qmark do |*args, &block|
      args << block if block
      Rubylog::Structure.new(predicate, f, self, *args).true?
      end
    end
  end

end
call(*args) click to toggle source

Yields for each solution of the predicate

# File lib/rubylog/predicate.rb, line 11
def call *args
  raise "abstract method called on #{self.inspect}"
end