2013-09-16 3 views
0

как вы можете сделать две вложенные петли?Как сделать два вложенных цикла?

Я хотел бы, например, выполнить два вложенных цикла, которые выполняют все возможные суммы элементов списка и сравнивают результат с элементами другого списка.

, например

на вопрос:

? - Total_sum ([2,34,3,21,4,7,9], [10,3,6], Result, L). 

Я хотел бы ответ:

Result = [[3,7], [2,4]]. 
L = [34,21,9]. 

я в состоянии выполнять только простую проверку. , но я не могу запустить вложенные циклы.

Код выглядит следующим образом:

total_sum([],_,[],[]). 

total_sum(_,[],[],[]). 

total_sum([A,B|L],[X|Y],Result,L2):- 
    X is A + B, 
    R = [A,B], 
    total_sum(L,Y,Res,L2), 
    append([R],Res,Result). 

total_sum([A,C|L],[X|Y],Result,C2):- 
    total_sum([A|L],[X|Y],Result,C1), 
    append([C],C1,C2). 

кто-то может мне помочь?

Спасибо.

+0

Под «всеми возможными суммами элементов списка» вы действительно имеете в виду «все возможные суммы * пар элементов * списка»? – lurker

ответ

2

этот фрагмент может удовлетворить ваши требования

total_sum(Available, ToMatch, [[N,M]|PairsSatisfing], Remains) :- 
    select(N, Available, A1), 
    select(M, A1, Rest), 
    X is N + M, 
    memberchk(X, ToMatch), 
    !, total_sum(Rest, ToMatch, PairsSatisfing, Remains). 
total_sum(Rest, _ToMatch, [], Rest). 

дает

?- total_sum([2,34,3,21,4,7,9], [10,3,6], Result, L). 
Result = [[2, 4], [3, 7]], 
L = [34, 21, 9]. 

Вы могли бы нужно обратить PairsSatisfing список.

Надеюсь, что имена переменных описывают намерение. Обратите внимание, что спецификация немного неоднозначна, так как может быть гораздо больше пар, удовлетворяющих соотношению. Удалить разрез перед рекурсивным вызовом, чтобы увидеть их все ...

Если элемент в ToMatch можно «использовать» только один раз, использовать

... 
select(X, ToMatch, ToMatchRem), 
!, total_sum(Rest, ToMatchRem, PairsSatisfing, Remains). 

Это будет также удалить немного двусмысленности ..

+0

спасибо большое! – Vincenzoni

Смежные вопросы