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) }
cargs = args.collect { |a| (a.is_a?(Criterion) ? a : Criterion.new(a)) }
spred.facts.each { |f| f.each_with_index { |a,i| cargs[i].match(a) } }
send("#{st}_?", *cargs)
nargs = cargs.collect { |c| c.matches }
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
spred << args
end
end
|