prolog:只保留给定列表中不重复的元素(a b a a c c)并得到(a b)

时间:2017-05-02 16:26:48

标签: 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 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,a,c,c],R)时。当我想要[a,b]

时,我得到R = [aaa]

感谢任何帮助,谢谢

1 个答案:

答案 0 :(得分:-1)

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

 adj_dups([],[]). % 1. stop clause
 adj_dups([X],[X]). % 2. stop clause

接下来,我们继续讨论可能包含统一序列的更长列表。 第一种情况:列表以两个相同的元素开头:我们的列表以统一的序列开头,但我们还不知道它会持续多长时间。因此,我们删除前两个相同的元素,并将剩余列表传递给rem_head / 3,它将负责删除这些元素的进一步出现。 rem_head / 3在T2中返回在开头删除统一序列后剩余的列表。我们必须以递归方式继续工作并使用T2(adj_dups(T2,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).
相关问题