如何制作两个嵌套循环?

时间:2013-09-16 11:16:49

标签: prolog

如何制作两个嵌套循环?

我希望例如执行两个嵌套循环,它们执行列表元素的所有可能总和,并将结果与​​另一个列表的元素进行比较。

例如

问题:

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

有人可以帮助我吗?

感谢。

1 个答案:

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

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