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).

有人能帮我吗?

谢谢。

4

1 回答 1

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).

这也将消除一些歧义......

于 2013-09-16T12:11:52.037 回答