繁体   English   中英

删除列表中的重复元素,Prolog

[英]Remove repeating elements in list, Prolog

我想知道是否有任何方法可以删除 prolog 中的重复元素,前提是它们彼此靠近。

目前我只能这样做:

输入:

([z,z,z,z,z,x,x,x,c,c,c,z,z,z], R)

我得到 output:

R = [x,c,z].

但我想像这样看到 output :

R = [z,x,c,z].

有没有办法做到这一点?

This is essentially run length encoding , where you might compress [a,a,a,b,c,c,c,c,c] to [a:3,b,c:5] or a similar representation. 除了我们不关心跑步的长度(或者我们不关心?)

collapse([],[]).
collapse([X|Xs], Ys ) :- collapse(X,Xs,Ys).

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

[运行长度的计算留给读者作为练习]。

你可以每次看下一个元素是否可以与当前元素统一。 如果是这种情况,我们跳过元素,否则我们开始一个新的“组”,所以:

uniqs([], []).
uniqs([H|T], R) :-
    uniqs(T, H, R).

uniqs([], X, [X]).
uniqs([X|T], X, R) :-
    uniqs(T, X, R).
uniqs([Y|T], X, [X|R]) :-
    dif(X, Y),
    uniqs(T, Y, R).

对于给定的样本输入,这给了我们:

?- uniqs([z,z,z,z,z,x,x,x,c,c,c,z,z,z], R).
R = [z, x, c, z] ;
false.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM