Prolog练习:过滤连续元素的序列

时间:2013-11-18 21:56:24

标签: list prolog

我生气了。我必须做一个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保持不变只是连续的元素。

提前致谢。

2 个答案:

答案 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参数。

  1. 从列表中获取第一个元素
  2. 与列表中的第二个元素比较
  3. 如果两个元素相等:
    1. 将两个元素放在输出中
    2. 以及任何相同的后续元素
  4. 否则丢弃第一个元素
  5. 重复直到列表用尽。
  6. 在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)).