Prolog压缩列表与数量 - 重复的答案

Awe*_*Guy 3 compression list prolog

我有一个元素列表,其中包含一个人的朋友数量.

[friends(mike, 4), friends(joe, 3), friends(mike, 1), friends(mike, 2)]
Run Code Online (Sandbox Code Playgroud)

我想压缩此列表并获取以下内容

[friends(mike, 7), friend(joe, 3)]
Run Code Online (Sandbox Code Playgroud)

我创建了成员,并删除了第一个外观.

member(E, [E|_]).
member(E, [_|Y]) :- 
    member(E, Y).

delete_first([], _, []).
delete_first([X|Y], X, Y).
delete_first([X|Y], E, [X|L]) :- 
    X \= E, 
    delete_first(Y, E, L).

compress([], []).
compress([friends(P, C)|R], S) :- 
    member(friends(P, X), R), 
    delete_first(R, friends(P, X), E), 
    N is C + X, 
    compress([friends(P, N)|E], S).
compress([friends(P, C)|R], [friends(P, C)|S]) :- 
    not(member(friends(P, _), R)), 
    compress(R, S).
Run Code Online (Sandbox Code Playgroud)

我的答案是正确的,但Prolog会多次回答相同的答案.为什么会这样?

例:

?- compress([friends(mike, 4), friends(joe, 3), friends(mike, 1), 
             friends(mike, 2), friends(joe,4), friends(mike, 3)],X).
X = [friends(mike, 10), friends(joe, 7)] ;
X = [friends(mike, 10), friends(joe, 7)] ;
X = [friends(mike, 10), friends(joe, 7)] ;
X = [friends(mike, 10), friends(joe, 7)] ;
X = [friends(mike, 10), friends(joe, 7)] ;
X = [friends(mike, 10), friends(joe, 7)] ;
false.
Run Code Online (Sandbox Code Playgroud)

joe*_*l76 5

另一种方法是使用aggregate/3(适用于SWI-Prolog):

compress(In, Out) :-
     aggregate(set(friends(P,S)), aggregate(sum(X), member(friends(P,X), In), S), Out).
Run Code Online (Sandbox Code Playgroud)

结果:

?- compress([friends(mike, 4), friends(joe, 3), friends(mike, 1),friends(mike, 2), friends(joe,4), friends(mike, 3)],X).
X = [friends(joe, 7), friends(mike, 10)].
Run Code Online (Sandbox Code Playgroud)