learn(Predicate, VarsIndex, Rules) :- collect_objects(Objects), findall(pos(Args), (known_fact(Fact), Fact =.. [Predicate|Args]), PosExamples), gen_neg_examples(Objects, PosExamples, VarsIndex, NegExamples), write_ln(PosExamples), write_ln(NegExamples), learn_rules(PosExamples, NegExamples, Predicate, VarsIndex, Rules). collect_objects(Objects) :- findall(Args, (known_fact(Fact), Fact =.. [_|Args]), ArgList), conc_lists(ArgList, RawArgList), setof(X, member(X, RawArgList), Objects). conc_lists([], []). conc_lists([First | Rest], RawList) :- append(First, Result, RawList), conc_lists(Rest, Result). gen_neg_examples(Objects, PosExamples, N, NegExamples) :- findall(P, permute(Objects, N, P), Permutations), extract_args(PosExamples, PosList), build_neg_examples(Permutations, PosList, NegExamples). permute(_, 0, []). permute(Objects, N, [X | Result]) :- M is N - 1, member(X, Objects), delete(Objects, X, RestObjects), permute(RestObjects, M, Result). extract_args([], []). extract_args([Example | RestExamples], [Args | Result]) :- Example =.. [_ | Args], extract_args(RestExamples, Result). build_neg_examples([], _, []). build_neg_examples( [Permutation | RestPermutations], PosList, [Out | Result]) :- not(member(Permutation, PosList)), Out =.. [neg | Permutation], build_neg_examples(RestPermutations, PosList, Result). build_neg_examples( [Permutation | RestPermutations], PosList, Result) :- member(Permutation, PosList), build_neg_examples(RestPermutations, PosList, Result).