Is this not almost how logic programming (prolog, etc.) works? You tell the language some things which are true, and then it'll be able to infer answers to "questions" you ask:
rev([1], [1])
rev([1, 2, 3], [3, 2, 1])
And maybe also that the following clauses are false: rev([1, 2], [1, 2])
rev([], [1])
rev([1, 1], [1])
Is Prolog able to infer, from the above, that rev([4, 5], [5, 4]) ? Or to synthesize the general form rev([H|T],R) :- rev(T, RT), concat(RT,[H],R) ?