[英]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.