39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
# File 'lib/bparity/synthesis.rb', line 39
def detect(callable, samples)
return [] if samples.empty?
relations = []
relations << "idempotent" if holds? do
samples.all? do |sample|
callable.call(callable.call(sample)) == callable.call(sample)
end
end
relations << "permutation_invariant" if samples.all?(Array) && holds? do
samples.all? { |sample| callable.call(sample.reverse) == callable.call(sample) }
end
if samples.all?(Numeric)
relations << "additive" if holds? do
samples.product(samples).all? do |left, right|
callable.call(left + right) == callable.call(left) + callable.call(right)
end
end
relations << "monotonic" if holds? do
samples.sort.each_cons(2).all? do |left, right|
callable.call(left) <= callable.call(right)
end
end
end
relations
end
|