2013-11-18 2 views
1

Я злюсь на пролог. Я должен сделать упражнение, которое filter_Sequences(N,L1,L2) и затем SWI Prolog ответит в L2 результате элементов, которые являются последовательными в L1, я дам вам пример, чтобы объяснить:Пролог упражнений: последовательность фильтров последовательных элементов

?- filter_sequence(2,[a,b,b,c,a,a,b,b,b,b,c,c,d],L2). 
L2= [b,b,a,a,b,b,b,b,c,c] 

Это означает, что 3 из-за это элемент N, представляет собой целое число, которое является самой низкой скоростью последовательных элементов, а затем список с 3 бабами 3 a и 4 b и больше цифр, но L2 хранит только последовательные элементы.

Заранее благодарен.

+1

пост какой-то код, пожалуйста, не только ваша проблема – CapelliC

ответ

2

Давайте рассмотрим подход высокого уровня.

mad(N,S,L2):- nrle(N,S,L),expand(L,L2). 

Православие? nrle выполняет кодировку RLE, но сохраняет записи с не менее N дубликатами.

nrle(_,[],[]). 
nrle(N,[A|B],L):- nrle(N,B,A-1,L). 
nrle(N,[A|B],E-I,L):- 
    A = E -> I1 is I+1, nrle(N,B,E-I1,L) ; 
    I >= N -> L=[E-I|L2], nrle(N,B,A-1,L2) ; 
    nrle(N,B,A-1,L). 
nrle(N,[],E-I,[E-I]):- I >= N. 
nrle(N,[],E-I,[]):- I < N. 

испытания:

9 ?- nrle(3,[a,b,b,b,c,a,a,a,b,b,b,b,c,c,d],L2). 
L2 = [b-3, a-3, b-4] ; 
false. 

10 ?- nrle(4,[a,b,b,b,c,a,a,a,b,b,b,b,c,c,d],L2). 
L2 = [b-4] ; 
false. 

11 ?- nrle(2,[a,b,b,b,c,a,a,a,b,b,b,b,c,c,d],L2). 
L2 = [b-3, a-3, b-4, c-2] ; 
false. 

Теперь expand:

expand([A-1|C],[A|D]):- expand(C,D). 
expand([A-B|C],[A|D]):- B>1, B1 is B-1, expand([A-B1|C],D). 
expand([],[]). 

А потом,

25 ?- mad(3,[a,b,b,b,c,a,a,a,b,b,b,b,c,c,d],L2). 
L2 = [b, b, b, a, a, a, b, b, b, b] ; 
false. 

См Пролог удовольствие.

+0

это работает, то другое решение не работает, как я просил, но все равно спасибо – user3006475

+0

@ user3006475 Я понимаю, что вы будете не дольше безумный Пролог? Может быть, злиться на * Пролог даже? .. :) –

+0

Я получаю предупреждение об одноэлементной переменной E в последней строке кода nrle ... Как я могу избежать этого? – user3006475

1

Обновление: Как указано в заявлении Ness, это решение пропускает параметр N.

  1. Получить первый элемент из списка
  2. Сравнение со вторым элементом из списка
  3. Если эти два элемента равны:
    1. место два элемента в выводе
    2. и любой следующий элемент, который также равен
  4. В противном случае отбросить первый элемент
  5. Повторяйте до тех пор, пока список не будет исчерпан.

В Прологе:

% untested 
delete_singles([], []). 
delete_singles([A|T], O) :- 
    ( T = [A|T1] 
    -> O = [A, A|O1], 
      delete_singles(T1, A, O1) 
    ; delete_singles(T, O)). 

delete_singles([], _, []). 
delete_singles([H|T], A, O) :- 
    ( H = A 
    -> O = [A|O1], 
      delete_singles(T, A, O1) 
    ; delete_singles([H|T], O)). 
+0

Вы пропустили требование минимальной длины повторяющейся подпоследовательности? :) –

+0

@WillNess, opps, да, я, хотя это было всегда 2. – salva

Смежные вопросы