如何制作两个嵌套循环?
我希望例如执行两个嵌套循环,它们执行列表元素的所有可能总和,并将结果与另一个列表的元素进行比较。
例如
问题:
? - 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 :(得分: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).
这也会消除一些歧义...