我要删除序言列表中的连续重复项。我是该语言的新手,所以我很难理解所有内容。到目前为止,这是我想出的:
remove_con_dups([X],L) :- L = X.
remove_con_dups([X,Y|_],L) :- X \= Y, L = X.
remove_con_dups([_|T],L) :- remove_dups(T,L).
到目前为止,如果我查询remove_con_dups([a,a,a,b,b,a,c],X),它将为我提供这些值
X = a,
X = b,
X = a,
X = c.
我想要的是
X = [a,b,a,c].
我似乎无法解决这个问题。有帮助吗?
谢谢
答案 0 :(得分:1)
remove_con_dups([X,Y|_], L) :- X \= Y, L = X.
相对于第二个参数L
与第一个参数的联系,完全定义了它;
remove_con_dups( [X,Y|_], LL) :- X \= Y, L = X, LL = [L|T].
部分将第二个参数LL
定义为列表,其中L
位于头处。
剩下的就是对它们的 tail T
说些什么:
remove_con_dups( [X,Y|R], LL) :- X \= Y, L = X, LL = [L|T],
remove_con_dups( R, T).
以上可能不太正确。是R
吗?是[Y|R]
吗?这是您要定义的。
答案 1 :(得分:1)
我认为可能会更简单,如果只处理肯定的情况,则丢弃通过模式匹配看到的第一个重复项(即,头部的参数形状):
remove_con_dups([],[]).
remove_con_dups([X,X|T],R) :- remove_con_dups([X|T],R).
remove_con_dups([H|T],[H|R]) :- remove_con_dups(T,R).
该片段需要在某处进行剪切,我将通过一个简单的练习来查找插入片段的位置。