这是我的问题(例如,因为它更快):
?- enum_list([alpha, beta, gamma, beta, beta, delta, epsilon, alpha], L).
L = [alpha1, beta1, gamma, beta2, beta3, delta, epsilon, alpha2].
当我被允许重新排序列表时,问题很简单(只需对列表进行排序,将相同的元素分组到列表中,如果列表超过1则枚举列表)。但我想保持秩序。有什么想法吗?
答案 0 :(得分:2)
怎么样:
enum_list(L, E):-
enum_list(L, E, [], _).
enum_list([], [], B, B).
enum_list([X|Tail], [Y|NTail], B, NB):-
select(X-C, B, MB),
succ(C, C1),
atom_concat(X, C1, Y),
!,
enum_list(Tail, NTail, [X-C1|MB], NB).
enum_list([X|Tail], [Y|NTail], B, NB):-
enum_list(Tail, NTail, [X-1|B], NB),
(member(X-1, NB) -> Y=X ; atom_concat(X, 1, Y)).
它遍历列表并保留每个项目的一组事件计数,以便它知道每个项目的附加时间和内容以获取名称。