Prolog 序言:只保留给定列表中未重复的元素,以便(a b a c c)和get(a b)

Prolog 序言:只保留给定列表中未重复的元素,以便(a b a c c)和get(a b),prolog,Prolog,它的工作方式是,如果我找到一个C,C,那么它是一个重复的,并且被完全删除,如果我找到a,a,a,那么它会删除它们,因为我们创建了一个列表,我们比较了该列表中的值,所以我们有一个a,所以如果我们放置a,a,a,它将是一个重复的。 我试着把它编码成这样。 第一基本情况: adj_dups([],[]). % if list is empty, return empty list adj_dups([X],[]). % if list contains only one element, return

它的工作方式是,如果我找到一个C,C,那么它是一个重复的,并且被完全删除,如果我找到a,a,a,那么它会删除它们,因为我们创建了一个列表,我们比较了该列表中的值,所以我们有一个a,所以如果我们放置a,a,a,它将是一个重复的。 我试着把它编码成这样。 第一基本情况:

adj_dups([],[]). % if list is empty, return empty list
adj_dups([X],[]). % if list contains only one element, return empty list (no duplicates).
递归部分:

adj_dups([X,X|T],[X|R]):- adj_dups([X|T],R). % if the list starts with duplicates
adj_dups([X,Y|T],R):- X \= Y, adj_dups([X|T],R). % if the list doesn't start wih duplicates
当我尝试adj_dups[a,b,a,a,c,c],R时,当我尝试得到[a,b]时,我得到R=[aaa]


非常感谢您的帮助,谢谢

让我们将由两个或多个重复元素组成的子序列称为统一序列。请注意,均匀序列的最小长度为2。因此,首先定义如果列表太短而无法包含统一的序列会发生什么

 adj_dups([],[]). % 1. stop clause
 adj_dups([X],[X]). % 2. stop clause
接下来,我们继续讨论可能包含统一序列的较长列表。 第一种情况:列表以两个相同的元素开始:我们的列表以一个统一的序列开始,但我们还不知道它会有多长。因此,我们删除前两个相同的元素,并将剩余列表传递给rem_head/3,rem_head/3将负责删除这些元素的进一步出现。rem_head/3在T2中返回删除开头的统一序列后剩余的列表。我们必须循序渐进地处理t2adj_dupsT2,T1

 adj_dups([X,X|T],T1):- !,rem_head(X,T,T2),adj_dups(T2,T1).
第二种情况:我们的列表不是以两个相同的元素开始的:由于上述子句中的剪切,只有当列表不是以两个相同的元素开始时,才会处理此子句

  adj_dups([X|T],[X|T1]):- adj_dups(T,T1).
rem_head/3从列表的头部删除所有X。 如果列表的第一个元素是X,则会将其删除,并递归处理其余的列表T:

 rem_head(X,[X|T],T1):- !, rem_head(X,T,T1).
如果不是,则返回列表:

 rem_head(_,T,T).

在你的第4条中,当你不应该失去Y的时候,你失去了Y。是的,先生,这就是我想要的,非常感谢,能为我解释一下代码吗我想了解这个想法