【发布时间】:2019-02-11 04:06:15
【问题描述】:
我有一个元素列表,其中包含一个人的朋友数量。
[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.
【问题讨论】:
-
@WillNess 添加了查询和结果。
-
承诺:将尽快为不需要实例化错误以防止出现错误情况的纯版本提供赏金。
标签: list prolog compression