0

ネストされた 2 つのループを作成するにはどうすればよいですか?

たとえば、リストの要素のすべての可能な合計を実行し、結果を別のリストの要素と比較する 2 つのネストされたループを実行したいと思います。

例えば

質問に:

? - 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ます。

変数の名前が意図を説明していることを願っています。関係を満たすペアがさらに多く存在する可能性があるため、仕様は少しあいまいであることに注意してください。それらすべてを表示するには、再帰呼び出しの前にカットを削除します...

の要素をToMatch1 回だけ「使用」できる場合は、

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

これにより、多少のあいまいさも解消されます...

于 2013-09-16T12:11:52.037 に答える