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