Это постановка задачи:Получить все подмножества, что сумма до значения N в Прологе
Учитывая список целых чисел L и целое число S, порождают все подсписки , элементы которого складываются в S.
Это мое решение:
domains
list=integer*
clist=list*
predicates
sum(list,integer)
check(clist,clist,integer)
gensub(list,list)
getsub(list,clist,integer)
clauses
%gets all possible subsets with gensub and findall, binds them to
%and then checks the subsets to see if the elements add up to S
%and adds the correct ones to Rez.
%Goal example: getsub([1,2,5,6],X,7)
getsub([], [], _).
getsub(L, Rez, S):-
findall(LR, gensub(L,LR), X),
check(X, Rez, S).
%generates all possible subsets of the given set
gensub([], []).
gensub([E|Tail], [E|NTail]):-
gensub(Tail, NTail).
gensub([_|Tail], NTail):-
gensub(Tail, NTail).
%checks if the sum of the elements of a list is S
sum([], S):-S=0.
sum([H|T], S):-
N=S-H,
sum(T, N).
%checks if each sublist of a given list of lists, has the sum of elements S
check([], [], S).
%the LR variable here gives a warning after entering the goal
check([H|T], [H|LR], S):-
sum(H, S).
Так после того, как я запускаю его, и я попросил цели, я пытаюсь сделать getsub([1,2,5,6],X,7)
, так что я получаю все подмножества, элементы которых составляют до 7, но я получаю No Solution
и предупреждение в переменной LR
в предложении проверки, переменная не связана. Я не уверен, что я делаю неправильно, или если есть более легкое решение этого. Любая помощь приветствуется.
@dasblinkenlight Это действительно турбо-Prolog, я использую версию Борланд. –
Рассмотрите возможность изменения алгоритма: вместо того, чтобы генерировать все пары и проверять суммы, пройдите через первые элементы списка 'E' и сохраните элементы второго списка, равные' S-E'. – dasblinkenlight