Module: Predicate::LogicInclusion

Included in:
TestLogic
Defined in:
lib/carat-dev/predicate/predicate.rb

Instance Method Summary collapse

Instance Method Details

#predicate(st, *args) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/carat-dev/predicate/predicate.rb', line 41

def predicate( st, *args )
  spred = ( (@predicates ||= {})[st] ||= Predicate.new(st) )
  if args.any? { |a| a.is_a?(Regexp) || a.is_a?(Criterion) }
    # every arugument is a criterion probe
    cargs = args.collect { |a| (a.is_a?(Criterion) ? a : Criterion.new(a)) }
    # update criterion matches
    spred.facts.each { |f| f.each_with_index { |a,i| cargs[i].match(a) } }
    # criterion probe
    send("#{st}_?", *cargs)
    # collect the match arrays
    nargs = cargs.collect { |c| c.matches }
    # deduce
    perms = LogicExtension.permutations(nargs)
    deductions = perms.collect { |_p|
      _t = _p.collect { |v| Tester.new(v) }
      _p if send(st,*_t)
    }.compact
    return spred.facts + deductions
  elsif args.all? { |a| a.is_a?(Tester) }
    if spred.facts.include?( args.collect { |t| t.value } )
      return true
    else
      return send("#{st}_?", *args)
    end
  else
    #puts "Defining fact #{st}(" + args.join(',') + ')'
    spred << args
  end
end