如何删除简单列表中的重复成员 [序言]
How to remove the repeated members in a simple list [ prolog ]
编辑:
如何删除简单列表中的重复成员
例如:
[a,b,b,b,c,c,e] 在这个列表中有 2 c 和 3 b
我想删除所有重复的成员
结果应该是这样的
[a,e]
请记住,我只是为了作业而学习基础知识,并且我正在使用 swish 在线编译器
我也是最近才开始学prolog的。所以我使用基本功能实现了上述问题。
来到我使用的逻辑。
假设列表是 [1,2,2,3,3,4],创建名为 Duplicate 的列表(最初为空)。
1。我们将检查 Head 元素是否存在于列表或重复列表的尾部。
2。如果存在于任一列表中,则将 Head 元素添加到 List Duplicate,现在取出 Head 元素。
3。否则,如果尾部和重复项中不存在,则取出 Head 元素并将其添加到列表答案中。
4。重复以上步骤,直到原来的列表变空。
takeout(X,[X|R],R).
takeout(X,[F|Fs],[F|S]):- takeout(X,Fs,S).
/* takeout function is used to delete
given element from the list.*/
ap([],L,L).
ap(L,[],L).
ap([H|T],L,[H|Z]):- ap(T,L,Z).
/* ap function is used to append
elements to a list. */
unique([],_,Z):- write(Z),!.
unique([H|T],X,Z):- ( member(H,T) ; member(H,X) ) , ap([H],X,Xs) , takeout(H,[H|T],B) , unique(B,Xs,Z).
unique([H|T],X,Z):- \+member(H,T) , \+member(H,X) , ap([H],Z,Zs) , takeout(H,[H|T],Ts) , unique(Ts,X,Zs).
输出
我已经编辑了我以前的代码。
我之前的代码以相反的顺序给出了输出。
我这里使用了cut,这样就不会回溯所有可能的外卖功能了。
希望对你有帮助。
我认为这就是您正在寻找的解决方案。
takeout(X,[X|R],R).
takeout(X,[F|Fs],[F|S]):- takeout(X,Fs,S).
/* takeout function is used to delete
given element from the list.*/
ap([],L,L).
ap(L,[],L).
ap([H|T],L,[H|Z]):- ap(T,L,Z).
/* ap function is used to append
elements to a list. */
unique([X],_,[X]).
unique([H|T],X,Z):- ( member(H,T) ; member(H,X) ) , ap([H],X,Xs) , takeout(H,[H|T],B) ,!, unique(B,Xs,Z).
unique([H|T],X,[H|Z]):- \+member(H,T) , \+member(H,X) , takeout(H,[H|T],Ts) ,!, unique(Ts,X,Z).
输出
?- unique([1,2,2,3,3,4],[],M).
M= [1,4]
false
用于添加列表的元素
sum([H,H1|T],Z):- Z1 is H+H1 , sum([Z1|T],Z).
sum([X],X).
?- sum([1,2,3],Z).
Z=6
false
编辑: 如何删除简单列表中的重复成员
例如:
[a,b,b,b,c,c,e] 在这个列表中有 2 c 和 3 b 我想删除所有重复的成员 结果应该是这样的 [a,e]
请记住,我只是为了作业而学习基础知识,并且我正在使用 swish 在线编译器
我也是最近才开始学prolog的。所以我使用基本功能实现了上述问题。 来到我使用的逻辑。
假设列表是 [1,2,2,3,3,4],创建名为 Duplicate 的列表(最初为空)。
1。我们将检查 Head 元素是否存在于列表或重复列表的尾部。
2。如果存在于任一列表中,则将 Head 元素添加到 List Duplicate,现在取出 Head 元素。
3。否则,如果尾部和重复项中不存在,则取出 Head 元素并将其添加到列表答案中。
4。重复以上步骤,直到原来的列表变空。
takeout(X,[X|R],R).
takeout(X,[F|Fs],[F|S]):- takeout(X,Fs,S).
/* takeout function is used to delete
given element from the list.*/
ap([],L,L).
ap(L,[],L).
ap([H|T],L,[H|Z]):- ap(T,L,Z).
/* ap function is used to append
elements to a list. */
unique([],_,Z):- write(Z),!.
unique([H|T],X,Z):- ( member(H,T) ; member(H,X) ) , ap([H],X,Xs) , takeout(H,[H|T],B) , unique(B,Xs,Z).
unique([H|T],X,Z):- \+member(H,T) , \+member(H,X) , ap([H],Z,Zs) , takeout(H,[H|T],Ts) , unique(Ts,X,Zs).
输出
我已经编辑了我以前的代码。 我之前的代码以相反的顺序给出了输出。
我这里使用了cut,这样就不会回溯所有可能的外卖功能了。 希望对你有帮助。
我认为这就是您正在寻找的解决方案。
takeout(X,[X|R],R).
takeout(X,[F|Fs],[F|S]):- takeout(X,Fs,S).
/* takeout function is used to delete
given element from the list.*/
ap([],L,L).
ap(L,[],L).
ap([H|T],L,[H|Z]):- ap(T,L,Z).
/* ap function is used to append
elements to a list. */
unique([X],_,[X]).
unique([H|T],X,Z):- ( member(H,T) ; member(H,X) ) , ap([H],X,Xs) , takeout(H,[H|T],B) ,!, unique(B,Xs,Z).
unique([H|T],X,[H|Z]):- \+member(H,T) , \+member(H,X) , takeout(H,[H|T],Ts) ,!, unique(Ts,X,Z).
输出
?- unique([1,2,2,3,3,4],[],M).
M= [1,4]
false
用于添加列表的元素
sum([H,H1|T],Z):- Z1 is H+H1 , sum([Z1|T],Z).
sum([X],X).
?- sum([1,2,3],Z).
Z=6
false