如何删除列表中的连续重复原子

时间:2018-08-06 11:23:49

标签: prolog declarative

我要删除序言列表中的连续重复项。我是该语言的新手,所以我很难理解所有内容。到目前为止,这是我想出的:

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

我似乎无法解决这个问题。有帮助吗?

谢谢

2 个答案:

答案 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).

该片段需要在某处进行剪切,我将通过一个简单的练习来查找插入片段的位置。