gpt4 book ai didi

list - Prolog 用数量压缩列表——重复答案

转载 作者:行者123 更新时间:2023-12-04 20:00:34 25 4
gpt4 key购买 nike

我有一个元素列表,其中包含一个人拥有的 friend 数量。

[friends(mike, 4), friends(joe, 3), friends(mike, 1), friends(mike, 2)]

我想压缩这个列表并获得以下内容
[friends(mike, 7), friend(joe, 3)]

我创建了成员,并删除了第一次出现。
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).

我得到了正确的答案,但 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.

最佳答案

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

compress(In, Out) :-
aggregate(set(friends(P,S)), aggregate(sum(X), member(friends(P,X), In), S), Out).

结果 :
?- 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)].

关于list - Prolog 用数量压缩列表——重复答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54615654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com