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

Prolog 如何删除列表中连续重复的原子,prolog,declarative,Prolog,Declarative,我想在prolog中删除列表中的连续重复项。我不熟悉这门语言,所以我很难理解每件事是如何运作的。到目前为止,我想到的是: 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 =

我想在prolog中删除列表中的连续重复项。我不熟悉这门语言,所以我很难理解每件事是如何运作的。到目前为止,我想到的是:

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].
我就是想不通。有什么帮助吗

谢谢

完全定义第二个参数,
L
,关于它与第一个参数的连接

remove_con_dups( [X,Y|_], LL) :- X \= Y, L = X, LL = [L|T].
部分地将第二个参数“
LL
”定义为一个列表,其头部带有
L

剩下的就是说说它的尾巴,
T

remove_con_dups( [X,Y|R], LL) :- X \= Y, L = X, LL = [L|T],
      remove_con_dups( R, T).
上述观点可能并不完全正确。是
R
?是不是
[Y | R]
?这由你来定义

完全定义第二个参数,
L
,关于它与第一个参数的连接

remove_con_dups( [X,Y|_], LL) :- X \= Y, L = X, LL = [L|T].
部分地将第二个参数“
LL
”定义为一个列表,其头部带有
L

剩下的就是说说它的尾巴,
T

remove_con_dups( [X,Y|R], LL) :- X \= Y, L = X, LL = [L|T],
      remove_con_dups( R, T).

上述观点可能并不完全正确。是
R
?是不是
[Y | R]
?这由你来定义。

我认为如果你只处理正面的情况,丢弃模式匹配看到的第一个副本(即头部形状),可能会更简单:


这个片段需要在某个地方切割,我将留下一个简单的练习来找到插入它的位置。

我认为如果你只处理正面的情况,丢弃模式匹配看到的第一个副本(即头部的形状),可能会更简单:


这个片段的某个地方需要一个切口,作为一个简单的练习,我将留下来找到插入它的位置。

嗨,我仍然无法得到它,我将它重写为remove_con_dups([X,Y | | |,ll]:-X\=Y,ll=[X | Y]。移除重复(T,L):-移除重复(T,L)。当然,这并不是一个完整的解决方案,只是给你一个开始的提示。请参阅另一个答案,了解几乎完整的代码。嗨,我仍然无法获得它,我将其重写为remove_con_dups([X,Y | | | |,LL):-X\=Y,LL=[X | Y]。移除重复(T,L):-移除重复(T,L)。当然,这并不是一个完整的解决方案,只是给你一个开始的提示。请参阅另一个答案,以了解近乎完整的代码。