Class: Rbprolog::Rule

Inherits:
Object
  • Object
show all
Defined in:
lib/rbprolog/rule.rb

Overview

when fail at one predicate, the output values need be reset, and remove from the parent rule/s context

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(sym, *args, deductions) ⇒ Rule

Returns a new instance of Rule.



6
7
8
9
10
# File 'lib/rbprolog/rule.rb', line 6

def initialize(sym, *args, deductions)
  @sym = sym
  @args = args
  @deductions = [deductions].flatten.map {|deduction| Deduction === deduction ? deduction : Evaluation.new(deduction.call)}
end

Instance Attribute Details

#argsObject

Returns the value of attribute args.



4
5
6
# File 'lib/rbprolog/rule.rb', line 4

def args
  @args
end

#symObject

Returns the value of attribute sym.



4
5
6
# File 'lib/rbprolog/rule.rb', line 4

def sym
  @sym
end

Instance Method Details

#each_match(rules, *args, id) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/rbprolog/rule.rb', line 12

def each_match(rules, *args, id)
  print "#{"\t" * id.size}#{id.join('.')} #{@sym}(#{@args.join(', ')}).deduce(#{args.join(', ')})"

  context = Context.new
  context.scope(self) do |scoped_args|
    if self.match!(context, args)
      puts " => #{@sym}(#{@args.map {|arg| context.deduce(arg)}.join(', ')})"
      deduce_deductions(context, rules, *@deductions, id) do
        yield context.binds
      end
    else
      print "\n"
    end
  end
end

#match!(context, args) ⇒ Object



32
33
34
35
36
# File 'lib/rbprolog/rule.rb', line 32

def match!(context, args)
  match = match?(context, args)
  @args.zip(args).each {|v1, v2| context.match!(v1, v2)} if match
  match
end

#match?(context, args) ⇒ Boolean

Returns:

  • (Boolean)


28
29
30
# File 'lib/rbprolog/rule.rb', line 28

def match?(context, args)
  @args.size == args.size && @args.zip(args).all? {|v1, v2| context.match?(v1, v2)}
end