Операция со списком прологов - PullRequest
1 голос
/ 17 февраля 2011

Вот моя проблема (на примере, так как это быстрее):

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

Проблема проста, когда мне разрешено изменить порядок списка (просто отсортируйте список, сгруппируйте одинаковые элементы в списки, перечислите списки, если они длиннее 1). Но я хочу сохранить порядок. Есть идеи?

1 Ответ

2 голосов
/ 17 февраля 2011

Как насчет:

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

Он выполняет итерацию по списку и сохраняет количество подсчетов каждого элемента, чтобы знать, когда и что добавлять для каждого элемента, чтобы получить имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...