управление списками в прологе - PullRequest
0 голосов
/ 22 ноября 2011

Я новичок в Прологе и искал некоторую помощь. То, что я пытаюсь сделать, это в основном получить список L, состоящий из элементов, которые повторяются по крайней мере дважды в данном списке L '

Пример L '= [1,2,1,3,4,3,2] => L = [1,2,3].

Пока я могу вычислить вхождение каждой последовательной переменной

% pack(L1,L2) :- the list L2 is obtained from the list L1 by packing
%    repeated occurrences of elements into separate sublists.
%    (list,list) (+,?)

pack([],[]).
pack([X|Xs],[Z|Zs]) :- transfer(X,Xs,Ys,Z), pack(Ys,Zs).

% transfer(X,Xs,Ys,Z) Ys is the list that remains from the list Xs
%    when all leading copies of X are removed and transfered to Z

transfer(X,[],[],[X]).
transfer(X,[Y|Ys],[Y|Ys],[X]) :- X \= Y.
transfer(X,[X|Xs],Ys,[X|Zs]) :- transfer(X,Xs,Ys,Zs).

% encode(L1,L2) :- the list L2 is obtained from the list L1 by run-length
%    encoding. Consecutive duplicates of elements are encoded as terms [N,E],
%    where N is the number of duplicates of the element E.
%    (list,list) (+,?)

encode(L1,L2) :- pack(L1,L), transform(L,L2).

transform([],[]).
transform([[X|Xs]|Ys],[[N,X]|Zs]) :- length([X|Xs],N), transform(Ys,Zs).

, который вернет следующий список ходов

?- encode([a,a,a,a,b,c,c,a,a,d,e,e,e,e],X).
X = [[4,a],[1,b],[2,c],[2,a],[1,d][4,e]]

Но все еще остается проблема создания списка, который будет содержать отдельные элементы, которые повторяются по крайней мере дважды.

Если кто-нибудь может мне помочь или указать мне общее направление, это было бы здорово.

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 22 ноября 2011
an element E of list L should:
   be a member of list L',
   be a member of list L'' where L'' is list L' if we remove element E.

проверка выбор / 3 , член / 2 , поиск / 3 и / или setof / 3

0 голосов
/ 22 ноября 2011

Вы можете написать процедуру:

% E it's the list of are elements from L that repeat at least twice
elements_that_repeat_at_least_twice(L, E) :-
  elements_that_repeat_at_least_twice(L, [], E).

elements_that_repeat_at_least_twice([H|Ls], Dupl, E) :-
  ...

В elements_that_repeat_at_least_twice добавленный список Dupl будет сохранять каждый элемент, который вы проверяете, присутствует несколько раз. Изучите каждый элемент L, используя [H | Ls]. Используйте memberchk / 2, чтобы проверить, находится ли H в L: тогда это, по крайней мере, дубликат. Если это еще не в Dupl, добавьте к нему, и повторить. Не забудьте написать базовый вариант рекурсии (остановитесь на пустом списке []).

Теперь я вижу, что вы добавили некоторый код: тогда я завершаю предложение:

elements_that_repeat_at_least_twice([], Dupl, Dupl).
elements_that_repeat_at_least_twice([H|Ls], Dupl, E) :-
  (  memberchk(H, Ls)
  -> ( \+ memberchk(H, Dupl)
     -> Dupl1 = [H|Dupl]
     ;  Dupl1 = Dupl
     )
  ;  Dupl1 = Dupl
  ),
  elements_that_repeat_at_least_twice(Ls, Dupl1, E).

Не забудьте перевернуть список дубликатов, когда закончите.

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