我生气了。我必须做一个filter_Sequences(N,L1,L2)
的练习,然后SWI Prolog将在L2
中回答L1
中连续元素的结果,我举一个例子来解释它:< / p>
?- 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 b的3 a和4 b以及更多数字的列表,但L2
保持不变只是连续的元素。
提前致谢。
答案 0 :(得分: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.
看,Prolog很有趣。
答案 1 :(得分:1)
更新:正如Will Ness所指出的,此解决方案错过了N参数。
在Prolog:
% 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)).