Prolog列表操作

时间:2011-02-17 16:15:58

标签: list prolog

这是我的问题(例如,因为它更快):

?- enum_list([alpha, beta, gamma, beta, beta, delta, epsilon, alpha], L).
L  = [alpha1, beta1, gamma, beta2, beta3, delta, epsilon, alpha2].

当我被允许重新排序列表时,问题很简单(只需对列表进行排序,将相同的元素分组到列表中,如果列表超过1则枚举列表)。但我想保持秩序。有什么想法吗?

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)).

它遍历列表并保留每个项目的一组事件计数,以便它知道每个项目的附加时间和内容以获取名称。